Skip to content

Commit d1acbf7

Browse files
committed
docs(record): ecosystem sign-off, written against what shipped
Section 9. Four findings that are about the ecosystem rather than about any one change: * A proxy check refused correct output TWICE IN TWO REPOSITORIES on the same day -- the MSI size ratio and, earlier, the AppImage size bound. Both are now direct questions: the AppImage is run and its output asserted, the MSI is installed and the extracted program compared byte for byte. * The #599 fix reproduced the shape of the defect it fixed. It reasoned about which shard runs 233 instead of enumerating the jobs that run the suite, and the macOS lane caught the third one. The correction is an enumeration, which can be re-checked. * The ecosystem rule cost one new payload and otherwise only declarations. The interesting case is `xim:python`: its x86_64-only table was the STATED reason emsdk could not declare an interpreter -- an argument that was true and was a request for a package, not a licence to use the host. `/dev/kvm` is where the rule stops, and a test asserts it is the only warning left. * The rule composes with the licence, not above it: the ecosystem supplies what it may, and the licence says what it may. Getting that order wrong is asymmetric -- three GitCode objects were uploaded before the licence was checked, GitCode assets cannot be deleted, and the only remedy is that no recipe references them. Also states what is still open rather than implying it: the four target rows are the next PR with their size named, and `xim:wix` is a gap with a known shape.
1 parent d925b6f commit d1acbf7

1 file changed

Lines changed: 116 additions & 0 deletions

File tree

.agents/docs/2026-09-11-six-open-issues-analysis.md

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,3 +531,119 @@ refuted for every build the vendor manifest currently serves, measured across
531531
all four Linux host entries rather than the pinned one. So both remaining
532532
platform rows are executable on an x86_64 Linux runner with no device and no
533533
virtualization, which is what a CI lane needs.
534+
535+
## 9. Ecosystem sign-off
536+
537+
Written after the work landed, across four repositories, against what shipped
538+
rather than against the plan. The question this section answers is not "is each
539+
change correct" -- section 8 and the tests answer that -- but "does the
540+
ecosystem hold together with these changes in it".
541+
542+
### 9.1 The one thing that went wrong twice, in two repositories
543+
544+
A check that asks a **proxy** question refuses correct output, and it did so
545+
twice in one day in two repositories:
546+
547+
* `mcpp-plugins` CI refused a correct MSI. WiX 6 ran with no warnings and
548+
produced 32768 bytes for a 114688-byte program; the floor was
549+
`size > exesize / 2`, and its own comment admitted the ratio was invented.
550+
32768 is what a stripped hello-world looks like after a cabinet has had it.
551+
* The same repository had already done this with a 16 KB AppImage bound
552+
refusing a correct 14999-byte bundle.
553+
554+
Both are now direct questions. The AppImage is **run** and its output asserted;
555+
the MSI is **installed** (`msiexec /a`) and the extracted program compared byte
556+
for byte. The pattern to carry forward: when a check reasons "X should be
557+
roughly as large as Y", the artifact can almost always be opened instead.
558+
559+
### 9.2 The one thing that went wrong twice in the same change
560+
561+
`#599` was fixed by reasoning about which shard runs `233`, and the answer was
562+
"whichever one the round-robin puts it in" -- so both Linux shards got the
563+
submodules. `233` runs in every job that invokes the whole suite, of which
564+
there are **three**. The macOS lane caught it, which is the same shape as the
565+
defect being fixed: a rule reasoned about against one object and applied to
566+
all of them.
567+
568+
The correction was to **enumerate**: the three unfiltered
569+
`bash tests/e2e/run_all.sh` jobs are named, and the two jobs that invoke the
570+
suite with a filter or name tests directly are named as not needing it. An
571+
enumeration can be re-checked; a piece of reasoning about sharding cannot.
572+
573+
### 9.3 What the ecosystem rule turned out to cost, and what it did not
574+
575+
The rule is the user's: every tool and every library comes from the ecosystem,
576+
and anything missing is added until the loop closes. Applied to the Android
577+
and Web payloads it cost **one new payload** and otherwise only declarations:
578+
579+
| escape | closed by | new package |
580+
|---|---|---|
581+
| host `debugfs` | `xim:e2fsprogs` | no -- already in the index |
582+
| host `libX11` chain (6 libraries) | declared `deps` | no -- all six already there |
583+
| host `python3` for `em++` | `xim:python@>=3.12` | no, but **aarch64 payload added** |
584+
| `/dev/kvm` | nothing | it is a kernel device |
585+
586+
The interesting entry is the third. `xim:python` was x86_64-only, and that was
587+
the *stated reason* `xim:emsdk` could not declare an interpreter -- an argument
588+
that was true when written and was an argument for adding the missing payload
589+
rather than for depending on the host. Adding it closed the loop for both
590+
arches. The general form: a dependency declined because the ecosystem cannot
591+
serve it is a request for a package, not a licence to use the host.
592+
593+
`/dev/kvm` is the boundary the rule has, and stating where a rule stops is part
594+
of stating the rule. A test now asserts it is the **only** remaining warning in
595+
that recipe, so a second one cannot appear quietly.
596+
597+
### 9.4 Where the ecosystem rule is overruled, and by what
598+
599+
By the licence, and this is the second time the same framework decided a
600+
packaging question. `xim:iphoneos-sdk` carries no CN mirror because a `CN`
601+
entry would mean xlings-res holds a copy of Apple's SDK. The four Android
602+
packages reach the same conclusion from the same field -- all four declare
603+
`licenses = {"Android Software Development Kit License Agreement"}` -- and keep
604+
one upstream URL each. `xim:emsdk` (MIT / NCSA) and `xim:python` (PSF) are
605+
mirrored because their licences permit it.
606+
607+
So the rule composes as: **the ecosystem supplies what it may, and the licence
608+
says what it may.** A recipe that declines a mirror should say which of the two
609+
reasons applies, because a reader who cannot tell "not permitted" from "not
610+
done yet" will eventually do the wrong one.
611+
612+
The cost of getting this order wrong is asymmetric and worth recording: a
613+
mirror that should not exist cannot be withdrawn. Three objects were uploaded
614+
to GitCode before the licence was checked, GitCode assets cannot be deleted,
615+
and the only available remedy is that no recipe references them. The check is
616+
cheap and comes first.
617+
618+
### 9.5 The cross-repository order, re-derived from what happened
619+
620+
mcpp engine ──► 2026.9.11.2 the only thing on the critical path
621+
622+
├──► xim payloads independent; merged first
623+
624+
└──► mcpp-plugins pins a RELEASE, so it cannot precede one
625+
626+
└──► mcpp-index needs the plugins tag's sha256
627+
628+
This was already written in the distribution record's section 11.10, and the
629+
release cycle confirmed it in the sharpest possible way: `mcpp-plugins` #16 has
630+
Linux and Windows green and macOS red on `error: cannot package the Mach-O
631+
program`, which is precisely the defect 2026.9.11.2 fixes. The dependency is
632+
not a convention -- the red lane *is* the dependency.
633+
634+
### 9.6 What is still open, stated rather than implied
635+
636+
* **The four target rows.** `wasm32-emscripten`, `aarch64-ios`,
637+
`aarch64-linux-android` and `x86_64-linux-android` remain `planned`. Both
638+
execution routes are now measured -- `em++` compiles and links `import std`
639+
and `node` runs the result; `qemu-aarch64 -L <extracted system image root>`
640+
executes the default dynamic Android configuration -- and both payloads are
641+
published. What remains is engine work of the same size as the distribution
642+
batch: toolchain resolution for two drivers whose target is fixed by their
643+
payload, an implicit `.wasm` output on the link edge, `runner` defaults per
644+
row, 48 matrix cells, and a CI lane per row. That is the next PR, not a
645+
loose end in this one.
646+
* **`xim:wix`** is a legitimate gap with a known shape: MS-RL, a NuGet flat
647+
container, needing `xim:dotnet`. Version 6 and not 7, because 7 refuses to
648+
run without an out-of-band licence acceptance -- a package pinning it would
649+
install a tool that cannot work.

0 commit comments

Comments
 (0)