You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(pack): staging is a service to the provider, not a precondition for dispatch (2026.9.11.2)
`mcpp pack --format <name>` staged unconditionally before dispatching, and a
staging failure failed the whole command. For `--format tar` and `--format dir`
that is right -- the staged tree IS the product. For a DISPATCHED format it is
an input the provider may or may not want, and treating it as a precondition
made EVERY dispatched format unreachable on any target whose built-in bundling
is refused.
Measured on macos-15 with 2026.9.11.1: `mcpp pack --format app` never reached
the dispatch at all, because `pack::run` refuses a Mach-O PROGRAM outright --
the built-in closure walk is `LD_TRACE_LOADED_OBJECTS`, which is glibc's, and
dyld ignores it and simply runs the program. That refusal is correct about the
built-in archive and says nothing about whether a `.app` bundler can work: a
bundler that names one program needs no closure walk. THE ENGINE WAS ANSWERING
A QUESTION THE PROVIDER HAD NOT BEEN ASKED.
The failure is now reported and CARRIED rather than fatal or swallowed. The
reason is printed as a warning, `pack_stage_dir` stays empty, and
`${mcpp.stage_dir}` refuses at expansion naming that reason. A provider that
reads the tree gets a precise diagnostic; one that does not proceeds. Nothing
is silently degraded -- what changes is who decides.
`BuildOverrides::pack_stage_reason` is that channel. Without it a build that is
plainly packaging would read "this build is not packaging", which sends a member
author looking in the wrong place -- the refusal has to distinguish "you did not
ask for a format" from "no tree could be staged for this target".
`638_pack_format_dispatch.sh` gains the case macOS found, held on every
platform. Linux cannot reproduce the Mach-O refusal, so the leg asserts the
property the fix rests on instead: a provider that reads no staged tree is
dispatched and reported, and gains no dependency on the stage manifest. Nine
cases now, each paired with the wrong answer it excludes.
WHAT FOUND THIS IS WORTH RECORDING. `dist-apple` had only plan-level assertions
behind it until CI ran it on a real macOS runner for the first time. A
plan-level assertion says the gate is right and says nothing about whether the
tool accepts what the member renders -- which is why the two platform-specific
CI steps were added, and why the first thing they did was fail.
109 unit tests pass. `266_pack_refuses_a_macho_program` still fails on this
machine and was A/B'd against released 2026.9.10.2: byte-identical logs, so
this change does not touch it. Plain `mcpp pack` keeps the fatal refusal, since
`opts.format != Dispatched` there.
0 commit comments