Round 5 shipped the framework tier and recorded four items as open, each with a stated reason for being open. This round closed three of them, released the engine change and its consumer together, and found five defects. Four of the five were in CHECKS rather than in features, and that is the finding worth keeping.
| repository | change | released as |
|---|---|---|
| mcpp | cxx_stdlib, the curriculum in CI, device names, two machine-dependent criteria |
2026.9.6.3 |
| mcpp | naming the std-module-precompile refusal | on main, a8f5b359 |
| mcpp-plugins | mcpp.rules.sycl names the C library |
0.2.1 |
| llama.cpp-m | backend-vulkan refuses a libc++ toolchain by name |
b10069.2 |
| mcpp-index | plugins 0.2.1 (#360); llamacpp b10069.1 and .2 with the CI pin (#361) | — |
| xim-pkgindex | mcpp latest -> 2026.9.6.2, then 2026.9.6.3 | #771, #773 |
mcpp::cxx_stdlib() returns which C++ standard library resolved. The engine
had that value in the cache key, the ABI tag, the toolchain fingerprint and
resolution.json; it was never given to the layer that has to decide on it.
compiler() cannot substitute. clang links libc++ on one machine and libstdc++
on another and answers clang in both cases, and the two differ in what they
accept. llama.cpp-m had the case waiting: its Vulkan backend does not compile
under libc++, because upstream destroys a unique_ptr to an incomplete type,
and b10069.1 documented that while explicitly declining to refuse it, on the
ground that refusing by compiler name would also refuse the configuration that
works.
The accessor and its consumer shipped in the same round on purpose. An accessor without a consumer is a recorded field with no reader, which is the shape this ecosystem keeps finding; a consumer without the accessor is what b10069.1 was.
| # | where | what |
|---|---|---|
| 1 | mcpp e2e 206 | asserted inconclusive on the assumption that the private loader cannot reach a host libtinfo. xim:ncurses is an ordinary ecosystem package, and a sub-OS that has it puts libtinfo.so.6 on the artifact's RPATH, where the closure genuinely closes |
| 2 | mcpp e2e 168 | selected its musl payload with ls | head -1, which is lexicographic order, hence the OLDEST of three installed versions -- one predating the std module |
| 3 | mcpp refusal taxonomy | Code::StdModulePrecompile was declared, named, and had ZERO writers, so every std-module refusal reported other |
| 4 | llama.cpp-m CI | the new refusal check ran under bash -e and aborted before any assertion; a trailing grep -q ... && {...} would then have failed it in the other direction; and its "before anything compiles" test searched for a filename the REFUSAL ITSELF NAMES |
| 5 | mcpp examples | all four device islands printed the same four numbers as their CPU fallback, so a silent fallback was indistinguishable from a device run |
1 and 2 were green on every CI runner, and for one reason: a runner installs exactly one of anything. Neither criterion was wrong about the engine; both were wrong about the machine, and only a machine with several versions of the same payload could say so.
3 is the same family seen from the other side. The taxonomy comment says an
unnamed branch reports other, "a visible admission rather than a silent merge
into a neighbouring reason", and scan.sh prints those admissions on every run.
The admission was visible for as long as the code existed and nothing forced
anyone to read it. expected.tsv carried exactly one other row out of 176.
4 is three faults in one twenty-line step, all mine, and the third is the
instructive one: the criterion's object contained the thing that produces it.
The refusal message names ggml-vulkan.cpp because naming it is how the message
explains the cause, and the check read that explanation as evidence that the
compiler had run.
- e2e 617 compares
mcpp::cxx_stdlib()againstresolution.jsonand against the compiler family. Verified by removing the wiring and rebuilding: red. .github/tools/build_examples.shenumerates the example ROOTS from the tree and compares them against a build list and a skip table. A root in neither fails the job, so adding an example forces a decision. Six of fifteen build; every skip names its reason and where the coverage is..github/tools/check_matrix_reasons.shrefuses anotherormismatchrow in the target matrix, and refuses a reason thatrefusal.cppmdoes not define. Both directions verified by breaking them.- The Vulkan example is built AND RUN on the lavapipe payload in CI, and the assertion is the device name, not the four numbers.
- llama.cpp-m's refusal check asserts the STAGE (
build.mcpp exited with 2 (build aborted)) and the absence of aCompilingprogress line, which is independent of message wording. Replayed against the real failing output plus four controls.
Run in xlings subos use verify-963 --sandbox with the CN mirror configured,
addressing mcpp by its store path, against the PUBLISHED 2026.9.6.3:
- A identity and mirror:
mcpp 2026.9.6.3, mirror CN, index snapshot. - B
compat:spirv-headersdelivers the Khronos layout and definitions. - G
mcpp::cxx_stdlib()answerslibstdc++and matches that binary's ownresolution.json. This section exists because themcppmodule a build program imports is EMBEDDED IN THE BINARY: a release whose module source did not travel would compile every project in this repository, which uses a checkout, and fail for the first user who wrote the new call. - C, D, E listed as NOT RUN, each with the reason. A sandbox has no source checkout and no model.
- F red until the index carries the version, which is what its own header predicts: the release order is the reverse of the dependency order.
ggml-org:llamacpp@b10069.1 failed three workspace jobs with
'toolchain_sysroot' is not a member of 'mcpp', because validate.yml pinned
an mcpp about ten releases old.
index.toml min_mcpp governs descriptor GRAMMAR -- the oldest mcpp able to
resolve every descriptor. validate.yml MCPP_VERSION governs which mcpp the
index builds its members with. A build program's API belongs to the second.
Raising the floor would refuse the WHOLE index to a client on it, over one
package's build-program call that client may never reach.
The cost is paid once per move and it is large: the members' caches key on
MCPP_VERSION, so the first run after it changes rebuilds every member on every
platform. That is why mcpp:plugins 0.2.1 went as its own PR -- it needed no
pin change, so select picked nothing for it and its CI was eight checks -- and
why b10069.1 and b10069.2 landed together in one pin move rather than two.
Every criterion this round was checked by breaking it. That found three checks that would have passed while measuring nothing, and one control of mine that silently mutated a comment line because I reused a line number after adding eleven lines above it. The rule the round produced:
A check written against a failing command must be run under the shell that
will run it, with the success path and every failure path exercised. Local
bash script.sh has no -e; the runner's does, and the difference is invisible
until the step aborts before its first assertion.