Skip to content

Commit 03b5074

Browse files
2026.9.5.3: a feature-selected rule collection, mcpp.rules.* naming, and a variant switch the fast path no longer replays (#566)
* feat: 2026.9.5.3 -- a feature-selected rule collection, mcpp.rules.* naming, and a variant switch the fast path no longer replays A host-module package contributes every module interface unit among its feature-resolved sources, the lib root first; only listed sources take part. This is what lets mcpp:plugins carry mcpp.rules.cuda and mcpp.rules.spirv, selected by features. The rule packages leave examples/; examples 09 and 10 consume the index package. The prefix is mcpp.rules.* for rules and mcpp.tools.* for utilities; mcpp.build.* is the engine's own module family and the specification is corrected accordingly. The graph header records whether --accel/--no-accel chose the variant, and the fast paths decline a graph an override wrote: a plain build after --no-accel used to report Finished in 0.00s and run the CPU variant. The device-source table is by compiler, not by vendor: 18 extensions, none in the default globs, all a hard error before. Chapter 20 is renamed to Heterogeneous Builds; docs 05 and 07 gain the collection and naming sections in both languages. * style: remove decorative symbols from documentation, comments and workflow comments Table cells whose value was carried by a symbol alone now carry a word (yes, no, partial, planned); three comment lists that distinguished accepted from refused forms keep the distinction in words. --------- Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
1 parent 3a9656e commit 03b5074

267 files changed

Lines changed: 3806 additions & 2570 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.agents/docs/2026-08-29-build-rule-package-spec.md

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
> reading anything: `role = "check"` could not be written portably, and that is
2727
> fixed here (§9, open question 4).
2828
>
29-
> ⚠️ A sixth is about this document's own method. The descriptor count was
29+
> A sixth is about this document's own method. The descriptor count was
3030
> first taken from `mcpp-community/mcpp-index`, while `mcpp index list` reports
3131
> `mcpplibs/mcpp-index` as the default — the right question asked of the wrong
3232
> object. The conclusion survived (one rule package either way) and the number
@@ -223,7 +223,12 @@ behaviour without using a new API, is left uncovered deliberately.
223223

224224
### I8. `mcpp.*` is reserved for official plugins, and using it produces a warning
225225

226-
Official rule packages are named `mcpp.build.<x>`. In C++ this creates no
226+
Official rule packages are named `mcpp.rules.<x>` and official build-time
227+
utilities `mcpp.tools.<x>`; both live in the collection `mcpp:plugins`
228+
(repository `mcpp-community/mcpp-plugins`), each member selected by a feature
229+
(2026-09-05 revision; the first revision of this section said `mcpp.build.<x>`,
230+
which is the engine's own module family -- `mcpp.build.plan`,
231+
`mcpp.build.prepare` -- and was withdrawn for that reason). In C++ this creates no
227232
relationship with the bundled `mcpp` module — a dot in a module name carries no
228233
hierarchy — but to a reader the prefix reads as an endorsement, and that is a
229234
supply-chain statement.
@@ -537,7 +542,12 @@ hazard.
537542
10.1 row 4: the `mcpp.rules.*` decision is withdrawn. It was unimplementable
538543
under the rule that the module name is the bare package name. It is replaced
539544
by `mcpp.build.*` as a **module name** prefix — the distinction the original
540-
decision lacked.
545+
decision lacked. *Revised 2026-09-05:* with I1 implemented the objection no
546+
longer holds, and `mcpp.build.*` names the engine's own modules; the prefix
547+
is `mcpp.rules.*` for rules and `mcpp.tools.*` for utilities, as I8 now
548+
states. A package may contribute every module interface unit among its
549+
feature-resolved sources (mcpp 2026.9.5.3+), which is what lets one
550+
collection carry them all.
541551
2. `docs/05-mcpp-toml.md:1605` and its Chinese counterpart: the paragraph
542552
stating that the module name is the package's `name`, and that `grpc-rules`
543553
is therefore illegal, is rewritten under I1 and I2.
@@ -611,7 +621,7 @@ own.
611621
needs no shell, no `touch`, and no per-platform spelling. A command that
612622
already writes its own stamp is unaffected — existing files are left alone.
613623

614-
⚠️ **The obvious assertion does not discriminate.** Measured: ninja does NOT
624+
**The obvious assertion does not discriminate.** Measured: ninja does NOT
615625
fail when a declared output goes unproduced. It leaves the file absent and
616626
re-runs that edge on every subsequent build, so the build stays green and
617627
the only symptom is work silently redone. `tests/e2e/312` therefore asserts
@@ -1176,7 +1186,7 @@ subsystem that has quietly come to rely on something it does not declare
11761186
compiles in the root build and fails there, which is the reason to run both
11771187
rather than pick one.
11781188

1179-
⚠️ `mcpp test -p <member>` exits 0 for a member with no tests, so the CI loop is
1189+
`mcpp test -p <member>` exits 0 for a member with no tests, so the CI loop is
11801190
green either way and "has no tests" reads exactly like "tests pass".
11811191
`check_modules_wiring.sh` therefore prints which members have none. It does not
11821192
fail on them: a package of vendored parsers legitimately has nothing of its own

.agents/docs/2026-09-05-heterogeneous-build-ecosystem-design-v2.md

Lines changed: 351 additions & 0 deletions
Large diffs are not rendered by default.

.agents/docs/2026-09-05-multi-device-ecosystem-design.md

Lines changed: 146 additions & 146 deletions
Large diffs are not rendered by default.

.github/actions/bootstrap-mcpp/action.yml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ runs:
4242
uses: actions/cache@v4
4343
with:
4444
path: ~/.mcpp
45-
# ⚠️⚠️ `runner.arch` IS PART OF EVERY KEY, AND WAS NOT.
45+
# `runner.arch` IS PART OF EVERY KEY, AND WAS NOT.
4646
#
4747
# These caches hold INSTALLED BINARIES — `~/.xlings`, `~/.mcpp`, and
4848
# `target/`. Keyed on `runner.os` alone, `Linux` names two machines, and
@@ -52,7 +52,7 @@ runs:
5252
# Cache hit for: xlings-Linux-v2-xl2026.8.17.2-…
5353
# …/bin/xlings: cannot execute binary file: Exec format error
5454
#
55-
# AND IT SURVIVED THE FIX ONE LAYER DOWN. Reading `uname -m` to pick
55+
# AND IT SURVIVED THE FIX ONE LAYER DOWN. Reading `uname -m` to pick
5656
# the right tarball is correct and was not enough: the download never
5757
# happened, because a cache from the other architecture was already
5858
# there. A key that does not name the machine is a key that lets one
@@ -88,7 +88,7 @@ runs:
8888
REPO_DIR="$(pwd)"
8989
# Always install the pinned version — the cache may hold an older
9090
# xlings whose sysroot/packages are incompatible.
91-
# ⚠️⚠️ THE ARCHITECTURE IS READ, NOT ASSUMED. This branched on the OS
91+
# THE ARCHITECTURE IS READ, NOT ASSUMED. This branched on the OS
9292
# alone and named `linux-x86_64` for every non-Darwin host, which is
9393
# invisible until a Linux runner is not x86_64. Measured on
9494
# `ubuntu-24.04-arm`, the first time this repo scheduled one:
@@ -117,7 +117,7 @@ runs:
117117
"https://github.com/d2learn/xlings/releases/download/v${XLINGS_VERSION}/${tarball}" \
118118
"${WORK}/${tarball}"
119119
tar -xzf "${WORK}/${tarball}" -C "${WORK}"
120-
# ⚠️⚠️ THE TWO LINUX TARBALLS DO NOT HAVE THE SAME SHAPE, and this line
120+
# THE TWO LINUX TARBALLS DO NOT HAVE THE SAME SHAPE, and this line
121121
# named one of them. Measured on the 2026.8.17.2 assets:
122122
#
123123
# linux-x86_64 → subos/default/bin/xlings (513 entries)
@@ -126,12 +126,12 @@ runs:
126126
# so fetching the right architecture — the fix immediately above — got
127127
# as far as `No such file or directory`, exit 127.
128128
#
129-
# FOUND RATHER THAN ASSUMED, AND THE SEARCH IS BOUNDED. `-maxdepth 5`
129+
# FOUND RATHER THAN ASSUMED, AND THE SEARCH IS BOUNDED. `-maxdepth 5`
130130
# keeps it from wandering into the payload tree, and an empty result is
131131
# a hard error: a bootstrap that silently continues without xlings fails
132132
# forty lines later on something that reads like a different problem.
133133
#
134-
# ⚠️ CHECKED BEFORE CHANGING THE THREE HOSTS THAT ALREADY WORKED. On
134+
# CHECKED BEFORE CHANGING THE THREE HOSTS THAT ALREADY WORKED. On
135135
# x86_64 this now resolves `bin/xlings` where the line before named
136136
# `subos/default/bin/xlings` — and those are the same file:
137137
#
@@ -212,7 +212,7 @@ runs:
212212
uses: actions/cache@v4
213213
with:
214214
path: target
215-
# ⚠️ `modules/**` belongs here as much as `src/**` does. mcpp's own
215+
# `modules/**` belongs here as much as `src/**` does. mcpp's own
216216
# source lives in both since the subsystem split, and a key that hashed
217217
# only one of them would restore a target/ built from different sources
218218
# and report success — the failure mode a cache key exists to prevent,

.github/tools/check_aarch64_llvm_deferral.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
#!/usr/bin/env bash
2-
# ⭐⭐ A DEFERRAL'S PREMISE, RECHECKED.
2+
# A DEFERRAL'S PREMISE, RECHECKED.
33
#
44
# `available_toolchain_indexes()` omits llvm on non-x86_64 Linux because no
55
# linux-aarch64 llvm exists — not in xlings-res, and not upstream since 19.x.
66
# That is a deferral, and a deferral nobody rechecks is indistinguishable from
77
# a defect.
88
#
9-
# ⚠️ THIS FAILS WHEN THE REASON STOPS HOLDING, which is the opposite of what a
9+
# THIS FAILS WHEN THE REASON STOPS HOLDING, which is the opposite of what a
1010
# check usually does. The day an aarch64 llvm is published, it goes red and
1111
# names the gate to remove — see
1212
# `.agents/docs/2026-08-26-aarch64-linux-ecosystem-closure.md` §P1.
1313
#
14-
# ⚠️ Network trouble must not be read as "it appeared". An unreadable asset list
14+
# Network trouble must not be read as "it appeared". An unreadable asset list
1515
# leaves the premise alone and says so: a check that turns a flaky API into a
1616
# claim about the world is worse than no check.
1717
set -uo pipefail

.github/tools/check_modules_wiring.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ done
122122
# report success -- the exact failure a cache key exists to prevent, arriving
123123
# silently. Found by sweeping for stale paths after the split, not by a test.
124124
#
125-
# ⚠️ THE UNIT IS THE LINE, NOT THE FILE. The first version asked whether the
125+
# THE UNIT IS THE LINE, NOT THE FILE. The first version asked whether the
126126
# FILE mentioned `modules/**`, and passed — satisfied by the comment sitting
127127
# above the key explaining why `modules/**` belongs there. A check that a
128128
# comment can satisfy is checking the prose.

.github/tools/check_narrow_conversions.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ cd "$REPO_DIR" || { echo "FAIL: cannot cd to $REPO_DIR" >&2; exit 1; }
7676
# So: a pass here does NOT mean "the tree is audited". It means no NEW direct
7777
# narrowing was written where this class originates.
7878
#
79-
# ⚠️ `modules/manifest/src/glob.cppm` is in scope even though the rest of that
79+
# `modules/manifest/src/glob.cppm` is in scope even though the rest of that
8080
# package is not. It is the glob walker itself -- the file this guard's
8181
# background note names -- and it moved out of `src/modgraph/` in the subsystem
8282
# split. A scope written as directory names shrinks silently when a file moves,

.github/tools/fetch_release.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
# every unexplained red on this branch, always inside 12 seconds, always with no
1717
# test name in the log.
1818
#
19-
# ⚠️ `curl --retry` ALONE DOES NOT COVER IT. `--retry` handles timeouts and a
19+
# `curl --retry` ALONE DOES NOT COVER IT. `--retry` handles timeouts and a
2020
# specific list of 5xx responses; an empty reply is a *transport* error and is
2121
# not on that list. `--retry-all-errors` (curl 7.71+) is the flag that does, and
2222
# it is the one that was missing. The outer loop below is not redundant with it:

.github/tools/install_released_mcpp.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
# the version under test — and failing outright, because only the latter was
2121
# installed:
2222
#
23-
# 1 package(s) installed
23+
# 1 package(s) installed
2424
# [error] xlings: version '2026.8.3.2' not found for 'mcpp'
2525
# [error] available: 2026.8.3.4
2626
#

.github/tools/mirror_res.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ hosts=()
287287
[[ "${GTC_ENABLED:-0}" == 1 ]] && hosts+=("gitcode.com/$GTC_DST")
288288
for host in "${hosts[@]}"; do
289289
for a in "${ASSETS[@]}"; do
290-
# ⚠️ RETRIED, BECAUSE A MIRROR CAN ANSWER 502 FOR AN ASSET IT HOLDS.
290+
# RETRIED, BECAUSE A MIRROR CAN ANSWER 502 FOR AN ASSET IT HOLDS.
291291
# v2026.8.25.1 failed here twice: every one of the 16 assets reported
292292
# "already mirrored, skipping", and the gate then failed one of them on a
293293
# single 502 from GitCode's edge. Fetched by hand a minute later it was
@@ -297,7 +297,7 @@ for host in "${hosts[@]}"; do
297297
# HTTP codes but not the transport-layer failures this path also sees, and
298298
# this repository has paid for that distinction before (ci-curl-52).
299299
#
300-
# ⚠️ `|| echo ERR` APPENDS, it does not replace — `-f` makes curl exit
300+
# `|| echo ERR` APPENDS, it does not replace — `-f` makes curl exit
301301
# non-zero on 502 while `-w` has already written the code, so the variable
302302
# read `502ERR` and the log could not be grepped for a status. Substituted
303303
# only when curl printed nothing at all.

0 commit comments

Comments
 (0)