Repository navigation
D73-C downstream: 21 launcher descriptors + trigger/ still name the deleted launcher-standard.a2ml #960
Description
Activity
- added 3 commits that reference this issue
on Sep 22, 2026 Status: AC3 and AC4 are done and merged. AC1 is done for
triggeronly. AC2 is an owner decision and is the one thing outstanding.AC3 — ✅ MERGED
trigger/scripts/trigger-launcher.shnow citeslauncher-standard_praxis.deed, DEED clause notation, and the current version. Landed ashyperpolymath/trigger#14, merged 2026-09-22T13:13:56Z.AC4 — ✅ MERGED
scripts/check-launcher-standard-currency.shfails a repo that claims compliance while naming a version or filename that no longer exists upstream. Landed as #983, squashedac0d6aonmain.Verified against the merged tree (
git archive origin/main), not just the PR branch:check-launcher-standard-currency: canonical=launcher-standard_praxis.deed expected=v0.4.0 No stale launcher-standard references. gate rc=0 === summary: 19 passed, 0 failed ===⚠ Vocabulary, per AGENTS.md §6 —
implementedandtested, but NOTwired.- Its 19 controls do run in CI:
scripts/tests/…-test.shis discovered byscripts/run-shell-test-suite.sh, whichself-test.ymlinvokes. Green onedac0d6aitself. - The gate is invoked by no workflow in any repo. It is a tool that works and is tested; it is not yet enforcing anything on anybody. Wiring it is separate work and is not claimed here.
The historical-record exemption is a path allowlist, never a content heuristic. Test section 7 asserts the allowlist absorbs exactly the four in-tree occurrences (the conversion mapping doc, two dated audit records, the deed's own
;;provenance header) and has not been widened into a blanket.AC1 — ✅ for
trigger, ❌ for the descriptorstrigger's remaining occurrence is indev-notes/HANDOVER.adoc, which carries:revdate: 2026-08-13— a dated historical record that says so on its face, which is exactly what AC1 exempts.The 26 citing descriptor paths are not exempt and are the open part of AC1.
The census — this issue's own figure of 21 was right
I published a corrected figure of "23 distinct descriptors" in #983 and in the conversion mapping doc. That was wrong and this issue was right. #984 corrects it on
main, in place and dated. Measured scoped tohyper-repos+meta-repos, with nested worktrees verified absent:metric value *.launcher.a2mlpaths on disk31 distinct descriptor basenames 21 ← matches this issue paths citing the deleted launcher-standard.a2ml26 distinct descriptors citing it 17 distinct upstream repositories affected 18 ← this is the PR count citing lines 66 Path counts are dated and decay as clones are added; the distinct counts do not.
The 18 repos:
hyperpolymath/the-nash-equilibrium, and undermetadatastician/—688-attack-hub,berrywiki,boj-server-mk2,burble,cadastra,canonical-ums,cerro-torre,chronicles-of-slavia,enaction-engine,f117a-stealth-glider,f19-stealth-glider,gossamer,idaptik-ums,paint-type,progblocks,stapeln,universal-modding-studio.⭐ The fact that makes AC2 decidable: every citation is a
#commentAll 66 lines, in six shapes:
25 × # Compliant with launcher-standard.a2ml v0.3.0 17 × # Per launcher-standard.a2ml [version-output] section 17 × # Per launcher-standard.a2ml [runtime] section: 2 × # Use standard defaults from launcher-standard.a2ml §integration.linux. 2 × # Standard: launcher-standard.a2ml v0.2.0 2 × # (developer-ecosystem/standards/launcher/launcher-standard.a2ml)Nothing structural. Verified that no template or emitter in
launch-scaffolderwrites any of these strings, so hand-edits would not be regenerated away — this is not the generator-defect shape.Two further defects visible in the text, fixable in the same pass:
[version-output]/[runtime]is doubly wrong — wrong file and wrong clause notation. The deed uses s-expression heads;(version-outputand(runtimeare real clause heads inlauncher-standard_praxis.deedat lines 115 and 122.developer-ecosystem/standards/launcher/launcher-standard.a2mlis a path that does not exist.
This separates AC2 into two things one framing conflates
blocked? (a) the file extension .launcher.a2ml→ something elseYes — by R-G's dual-accept rule, until the @a2ml-metadatacompat reader lands (launch-scaffolder#40)(b) the citation text inside them No — comment-only, independent of the extension, structurally identical to the triggerfix already merged in AC3AC2 as written asks whether the 21 descriptors migrate to the
.deedform or are declared out of scope for D73-C with a reason recorded here — decided, not left to decay. Note that a.deedfilename is a closed dispatch set of four (estate_chora/ATLAS/*_praxis/*_chora), so "convert<app>.launcher.a2mlto.deed" cannot yield<app>.launcher.deed; and a deed admits nokey = valueand no[section], so converting these TOML-shaped descriptors is a rewrite, not a rename.Both halves are now going to the owner through the selection UI. Nothing further is blocked on measurement.
Also out of scope, recorded so it is not lost
docs/UX-standards/launcher-standard.adocdeclares no version, yet two files cite it atv0.2.0—docs/audits/launcher-standard-review-2026-05-26.adoc:33anddocs/UX-standards/LM-LA-LIFECYCLE-STANDARD.adoc:61. Deliberately outside AC4's scope.Related: #983, #984, launch-scaffolder#40, launch-scaffolder#41,
hyperpolymath/trigger#14.🤖 Generated with Claude Code
- Its 19 controls do run in CI:
⚠ Correction to the line-shape table in my comment above
The six shapes and the total of 66 are right; four of the six counts were not. I derived them by subtracting the worktree duplicates rather than re-measuring, and they sum to 65. Measured:
25 × # Compliant with launcher-standard.a2ml v0.3.0 19 × # Per launcher-standard.a2ml [version-output] section 19 × # Per launcher-standard.a2ml [runtime] section: 1 × # Use standard defaults from launcher-standard.a2ml §integration.linux. 1 × # Standard: launcher-standard.a2ml v0.2.0 1 × # (developer-ecosystem/standards/launcher/launcher-standard.a2ml) sum = 66 ✓Two things this makes clearer than the wrong table did:
- The three one-off lines are all in the same file —
the-nash-equilibrium.launcher.a2ml, the singlehyperpolymath/-owned descriptor and the only one still at v0.2.0. It is the sole outlier; the other 17 descriptors are uniform. - The wrong
[version-output]/[runtime]bracket notation appears 19 times each, in 19 of the 26 citing paths — so the doubly-wrong clause notation is the bulk of the work, not an edge case.
Nothing else in the comment above changes: 31 paths, 21 distinct descriptors, 26 citing paths, 17 distinct citing, 18 upstream repos.
🤖 Generated with Claude Code
- The three one-off lines are all in the same file —
- added a commit that references this issue
on Sep 22, 2026 ⚖ Owner rulings 2026-09-22 — AC1 and AC2 are both decided
Both outstanding decisions on this issue have been ruled through the owner selection UI. With these, all four acceptance criteria are settled in principle; what remains is execution on AC1.
AC state after these rulings AC1 — no file outside standardsnameslauncher-standard.a2mlexcept in a dated historical recordRULED: fix now. ✅ done for trigger; execution pending for the descriptorsAC2 — the 21 descriptors either migrate to .deedor are declared out of scope for D73-C✅ CLOSED by this ruling: migrate to .deedAC3 — trigger-launcher.shciteslauncher-standard_praxis.deed+ DEED clause notation + current version✅ MERGED (trigger#14, 2026-09-22T13:13:56Z) AC4 — a check that fails if a repo claims compliance while naming a version/filename that no longer exists upstream ✅ MERGED (#983 → squash edac0d6a)⚠ AC4 vocabulary, per AGENTS.md §6: the gate is
implementedandtested— its 19 controls run green inself-test.ymlviascripts/run-shell-test-suite.sh— but it is notwired. No workflow in any repo invokes the gate itself. It is a tool that works and is tested; it enforces nothing yet. That is a separate piece of work and is not claimed here.
Ruling 1 — AC2: migrate all 21 descriptors to
.deedAC2 asks for a decision, not for a conversion. Its own wording is "decided, not left to decay" — so this comment closes AC2. The conversion is a separate, gated workstream.
The gate is already ruled, and this is consistent with it
The earlier owner ruling on the emitted
@a2ml-metadatalauncher header was "compat reader, then convert." This ruling has the same shape: the destination is.deed, and the conversion runs after the compat reader lands (launch-scaffolder#40), under the dual-accept rule — do not migrate extensions before dual-accept, and a dry-run manifest first, never a bulk pass.Two design questions the migration must answer before a single file moves
Both are measured, not speculative:
- The name. A
.deedfilename is a closed dispatch set of four —estate_chora.deed,ATLAS.deed,*_praxis.deed,*_chora.deed. So<app>.launcher.a2ml→<app>.launcher.deedis not an available name. The migration needs either a fifth dispatch case or a mapping onto<app>_chora.deed. - The grammar. A deed admits no
key = valueand no[section]; tabs are invalid; uuid5 only. The descriptors are TOML-shaped ([runtime],[version-output]). This is a rewrite, not a rename — andlaunch-scaffolderhas no per-app config deed grammar today.
These will be filed as one design issue on
launch-scaffolderwith acceptance criteria, cross-referenced from #40 and #41 and from here, per the standing rule that a new finding becomes an issue rather than a blocker. It sequences behind #40.
Ruling 2 — AC1: fix the citation lines now, one small PR per repo
The citation fix is comment-only and entirely independent of the file extension, so it does not wait on the compat reader — which is undated, and coupling a ready fix to an undated one is exactly the decay AC2 forbids. It is structurally identical to the already-merged trigger#14.
The census these rulings act on — final, measured 2026-09-22
Scoped to
hyper-repos+meta-repos, with nested worktrees verified absent from the result:metric value *.launcher.a2mlpaths on disk31 distinct descriptor basenames 21 — matches this issue's own figure exactly paths citing the deleted launcher-standard.a2ml26 distinct descriptors citing it 17 distinct upstream repos affected 18 citing lines 66 Publish the distinct counts; date the path counts. Fixing a silently-failing worktree exclusion moved only the path counts (36→31, 29→26, 71→66) and left 21 / 17 / 18 unchanged — which is exactly what removing duplicate checkouts should do.
The edit, per line shape
All 66 are
#comments. The complete replacement table:from to # Compliant with launcher-standard.a2ml v0.3.0# Compliant with launcher-standard_praxis.deed v0.4.0# Per launcher-standard.a2ml [version-output] section# Per launcher-standard_praxis.deed (version-output ...) clause# Per launcher-standard.a2ml [runtime] section:# Per launcher-standard_praxis.deed (runtime ...) clause:# Use standard defaults from launcher-standard.a2ml §integration.linux.# Use standard defaults from launcher-standard_praxis.deed (integration ...) clause, linux.# Standard: launcher-standard.a2ml v0.2.0# Standard: launcher-standard_praxis.deed v0.4.0# (developer-ecosystem/standards/launcher/launcher-standard.a2ml)# (hyperpolymath/standards launcher/launcher-standard_praxis.deed)The bracket notation is doubly wrong — wrong file and wrong clause notation. The correct s-expression heads are verified present in
launcher/launcher-standard_praxis.deed:(version-outputat line 115,(runtimeat 122,(integrationat 184.developer-ecosystem/standards/launcher/launcher-standard.a2mlis a path that does not exist at all.v0.4.0 is earned, not asserted. Each PR body will state the same delta trigger#14 used: these descriptors do not resolve the standard — the standard's own resolution clause does not apply to them — so citing the current version is a statement of conformance, not of a resolution path.
✅ No generator defect
No template or emitter in
launch-scaffolderwrites any of these strings. Positive control: the same search restricted by extension fires on five Rust files (deed.rs,standard.rs,lib.rs,metadata_block.rs,deed_corpus.rs), none of which is an emitter;template.rswrites no such string. ⚠ The control was necessary —src/is absent at that repo's root (the crate lives undercrates/), so an unguarded search there would have returned a false negative. Hand-edits to these 26 paths will not be regenerated away.Scope: 17 PRs + 1 issue
⚠
hyperpolymath/the-nash-equilibriumgets an issue, not a PR. It is on the do-not-merge list (two corrupt remote branches, guard-defective), so a PR there is motion that cannot land. It is also the sole outlier in the corpus: the onlyhyperpolymath/-owned descriptor, the only one still at v0.2.0, and the carrier of all three one-off line shapes. AC1 will record that one exemption with its reason rather than leaving it as an unexplained residue.Definition of done for AC1
rg --no-ignore-vcs --hidden -l 'launcher-standard\.a2ml' \ -g '!**/.claude/worktrees/**' -g '!**/worktrees/**' \ hyper-repos meta-reposreturns exactly the
the-nash-equilibriumpaths and the dated historical records (trigger/dev-notes/HANDOVER.adoc,:revdate: 2026-08-13) — nothing else.⚠ Put a positive control on the filter itself, not only on the query: the output must contain zero
worktrees/paths. A ripgrep-gexclude without a leading**/matches only at the search root and fails silently — that trap corrupted two generations of this census before it was caught by reading the output rather than trusting the count.🤖 Generated with Claude Code
- The name. A
⚠ CORRECTED 2026-09-22. This comment originally cited
standards/deed/spec/abnf/deed.abnf:24. That file is a v0.1.0 DRAFT in a peer branch's working tree; the sole normative grammar is1-formats/deed/spec/abnf/deed.abnf(v1.0.0) onorigin/main. The closed-set conclusion is unchanged, but two substantive points below were wrong and are corrected in place. The original text is preserved beneath the corrections.What changed
1. The recommended name is now
<app>.launcher_praxis.deed, not<app>_praxis.deed.deed.abnf:71isstem = 1*( ALPHA / DIGIT / "-" / "." / "_" )— dots are legal in a stem — and:62-64says so explicitly: "Do NOT split on.— the stem may contain dots." Somyapp.launcher_praxis.deedis a legal deed filename with stemmyapp.launcher. That makes the rename a suffix swap (.launcher.a2ml→.launcher_praxis.deed) with the existing.launcherinfix preserved, rather than a reshaping of every descriptor name. Strictly better than what this comment first proposed, and I missed it only because I read the draft.2. "Needs no grammar change and is semantically correct" was an overstatement.
That is true of the filename and head only. It is not true of the document.
DEED-GRAMMAR-SPEC.adoc:379-414makes:beholding-choraa required field on a praxis deed, as a uuid5 — "a tool may not declare its own vocabulary, so it must name the chora it reads. A UUID, never a bare filename — a bare filename resolves against nothing." And a WARNING at:405-414marks the praxis field set provisional for v0.1: fields beyond the required three are "a v0.2 question", because "inventing them is precisely the failure this document exists to stop."A launcher descriptor's actual substance —
[runtime],[version-output],[integration]— has no specified praxis fields. So arm B does not walk in for free; it needs a field vocabulary ruled once.What makes it tractable anyway:
origin/main:launcher/launcher-standard_praxis.deedalready beholds#u5"estate/chora"and already carries:standard-version,:standard-dateand:compliancebeyond the required three. So the question is not whether a praxis deed may carry more fields — it demonstrably does — but which fields, named once, for all 21. That is now the substance of launch-scaffolder#42, and #42's body has been rewritten accordingly.Net effect on AC2: none. AC2 is closed by the ruling, and the conversion stays gated behind #40. What moved is the design recommendation inside #42.
Original comment, as posted
AC2 follow-through: the design issue is filed as
hyperpolymath/launch-scaffolder#42.Writing it up sharpened the naming constraint into something better evidenced than I stated above, and in a way that changes the recommended route — so recording it here rather than only in the issue.
The closed-set claim is confirmed normative, not convention.
standards/deed/spec/abnf/deed.abnf:24carries a closed filename production:deed-filename = estate-file / atlas-file / praxis-file / repo-file
and the spec marks filename dispatch normative in its own right — the
chora-dispatch-exclusionside condition exists precisely becauseestate_chora.deedalso matches*_chora.deed, and it notes that "the grammar alone is not sufficient to dispatch a filename." So<app>.launcher.deedis genuinely unavailable.What changed is the recommended arm. Above I framed the options as "a fifth dispatch case or a mapping onto
<app>_chora.deed". The stem→head table makes_chorathe wrong choice:repo-deedmeans "Noun. What a repo IS. A record." A launcher descriptor is not that.*_praxis.deed→praxis-deedmeans "Verb. What a tool DOES. Rules." — which is exactly what a per-app launcher descriptor is. So<app>_praxis.deedneeds no grammar change and is semantically correct, and it composes with what already exists:launcher-standard_praxis.deedstates the general rules,<app>_praxis.deedstates that app's conforming praxis. That is the ⭐ arm in #42.For completeness, the honest cost of the fifth-head alternative is six sites across three repos — the spec, the ABNF,
deed/README.adoc,deed-ecosystem's validator regex and conformance corpus, andlaunch-scaffolder'spub const DOC_HEADS: [&str; 4](a fixed-size array, so a typed change in one repo and a silent one in the others). It would also need an owner ruling, since all four existing heads are owner rulings —praxis-deedwas ruled on #752 as "a genuine fourth head, not a facet ofrepo-deed."None of this affects AC1, which is comment-only and proceeding independently.
🤖 Generated with Claude Code
⚠ CORRECTION — the AC1 census published on this issue is superseded
The figures I posted earlier (18 repos / 26 files / 66 lines, scoped as
"17 PRs + 1 issue") are wrong in both directions. Measured scope is
25 repos / 30 files / 63 lines, of which 19 repos are actually PR-able.Recording the correction rather than silently patching, per estate practice.
Why the published figures were wrong — three independent defects
1. Scope error — the sweep was narrower than the criterion.
AC1 says no file nameslauncher-standard.a2ml. My census ran
rg -g '*.launcher.a2ml', counting only launcher descriptors.sweep paths -g '*.launcher.a2ml'(what I ran)26 unrestricted (what AC1 says) 76 The 50 extra paths held the damaging citations. A descriptor comment is
inert; live prose is an instruction. The worst example —
hyperpolymath/claude-memory/launch-scaffolder-architecture.adoc— tells future
agents, in the imperative:How to apply: when editing the prose launcher-standard.adoc, edit
standards/launcher/launcher-standard.a2mlin the same commit.That instructs an edit to a file standards#952 deleted. No descriptor
citation was ever that harmful.2. Working-tree error — the census measured peer branches, not
main.
Of 34 clone directories holding a citation, exactly one was onmain.
Every other sat on a peer session's WIP branch. The tell:
trigger/scripts/trigger-launcher.shshowed 8+ stale citations on disk while
AC3 was recorded MERGED — both were true. The clone was on
chore/bump-standards-pinsatc5afab9;origin/mainwas7ff9c0awith
0 a2ml mentions and 18_praxis.deedones. AC3 is genuinely merged.Every figure below is now
git grep <pattern> origin/main, never a checkout.3. Repo-identity errors — two archived repos and one rename-redirect.
Found only by probing every repo in the list rather than the two I suspected:repo defect hyperpolymath/tma-mark2archived — read-only, no PR possible metadatastician/canonical-umsarchived — read-only, no PR possible metadatastician/idaptik-umsredirects to universal-modding-studio— one repo double-counted as twoThe historical-record exemption is larger than assumed — and it inverts the ranking
AC1 exempts a dated historical record. Read in context, two repos are already
AC1-compliant, and both are repos a naive count ranked as offenders:hyperpolymath/trigger— both hits are indev-notes/HANDOVER.adoc,
:revdate: 2026-08-13.hyperpolymath/launch-scaffolder— all three hits are provenance:
standards/launcher-standard_praxis.deed:7names the translation authority
("Translated from launcher/launcher-standard.a2ml under the authority of …
standards#837, owner ruling D73-C"), and both.machine_readable/6a2/META.a2ml
hits sit inside dated ADRs — ADR-003 (status = "accepted", superseded)
and ADR-008 (date = "2026-09-22",supersedes = "ADR-003"), whose own
text narrates that A2ML was retired and standards#952 deleted the path.
Editing any of those five lines would destroy the record of the migration.
The repo that performed the conversion correctly is the one that looks worst to
agrep -c. Count is not compliance — the exemption has to be decided by
reading context, never by a content heuristic.Corrected scope
published measured on origin/mainrepos citing 18 25 files 26 30 lines 66 63 PRs 17 19 issues 1 1 recorded exemptions 1 5 19 PRs · 22 files · 44 lines. The five exemptions:
repo f/L reason hyperpolymath/trigger1/2 dated historical record — already AC1-compliant hyperpolymath/launch-scaffolder2/3 dated ADRs + translation provenance — already AC1-compliant hyperpolymath/tma-mark22/5 archived, read-only metadatastician/canonical-ums1/3 archived, read-only hyperpolymath/the-nash-equilibrium1/3 DO-NOT-MERGE list (2 corrupt remote branches) — issue, not PR The two archived repos cannot be brought into AC1 compliance without
unarchiving them. That is an owner call, not mine; flagging rather than acting.Line shapes — the replacement table was also incomplete
Of the 63 lines, 41 are the six descriptor comment shapes my table covers.
The other 22 are shapes no table existed for: URLs to
standards/tree/main/launcher/launcher-standard.a2ml(now 404), AsciiDoc prose,
aDEBT.adocgovernance claim, an emitted# @a2ml standards-compliance
header, and three absolute/var/mnt/eclipse/...paths that never existed at
that path. Those are being classified line by line, not swept by pattern.⚠ The emitted
@a2mlheader intma-mark2/scripts/etma-handler-launcheris
moot here — that repo is archived — but the same header shape is gated behind
the compat reader (launch-scaffolder#40), so its value is a citation fix
while its key stays untouched under the dual-accept rule.Unchanged
AC2 remains closed by the ruling above (migrate all 21 to
.deed, gated behind
launch-scaffolder#40). AC3 ✅ merged and re-verified onorigin/main.
AC4 ✅ merged. Only AC1 execution remains.🤖 Generated with Claude Code
- added 6 commits that reference this issue
on Sep 22, 2026 8 remaining items
AC1 — swept and closed. 19 PRs merged, 5 exemptions recorded.
Following the ruling above (fix the citation lines now, one small PR per upstream repo), the AC1 sweep is executed and landed.
Measurement
⚠ The scope published earlier in this issue (18 repos / 26 files / 66 lines) was measured against working trees. 33 of 34 estate clones sit on peer or WIP branches, so that figure was wrong in both directions. Re-measured with
git grep <pat> origin/mainper repo, the true pre-sweep scope was 24 repos / 29 files / 60 lines. ⚠ A first re-measure said 25 / 30 / 63; that double-countedmetadatastician/idaptik-ums, which redirects tometadatastician/universal-modding-studio— one upstream reached by two clone paths. Corrected here. 24 = 19 swept + 5 exempt, 29 = 22 + 7, 60 = 44 + 16; the parts now reconcile with the totals.The sweep therefore covered 19 upstream repos / 22 files / 44 lines, plus 1 issue and 5 exemptions.
The 19 merged PRs
repo PR hyperpolymath/claude-memory#34 hyperpolymath/betlang#128 hyperpolymath/neurophone#255 hyperpolymath/valence-shell#208 metadatastician/688-attack-hub#27 metadatastician/boj-server-mk2#46 metadatastician/burble#228 metadatastician/cadastra#50 metadatastician/cerro-torre#55 metadatastician/chronicles-of-slavia#97 metadatastician/enaction-engine#75 metadatastician/f117a-stealth-glider#30 metadatastician/f19-stealth-glider#26 metadatastician/gossamer#173 metadatastician/paint-type#72 metadatastician/progblocks#35 metadatastician/project-ovine#25 metadatastician/stapeln#74 metadatastician/universal-modding-studio#91 All 19 are MERGED. Each was branched off
origin/main, staged explicitly by path, and verified to0 remainingwith a line count matching the census exactly before pushing.Verification — the measurement that defines done
Re-measured after the merges, one clone per upstream,
git grep 'launcher-standard\.a2ml' origin/main:All 19 swept repos return 0 files / 0 lines.
Every remaining hit in the estate is one of the six recorded exemptions below, and nothing else. There is no unaccounted-for citation anywhere in
hyper-reposormeta-repos.The 5 exemptions (+
standardsitself)repo files/lines why it is exempt hyperpolymath/standards6 / 40 AC1 exempts this repo by its own wording — "no file outside hyperpolymath/standards". These are the mapping spec, the dated 2026-05-26 audit, the translation-provenance header, and the AC4 gate's own fixtures, all of which must name the retired filename to do their job.hyperpolymath/trigger1 / 2 dev-notes/HANDOVER.adoc,:revdate: 2026-08-13. A dated historical record that says so on its face — already AC1-compliant as written.hyperpolymath/launch-scaffolder2 / 3 Translation provenance ( standards/launcher-standard_praxis.deed:7, naming the file it was translated from) plus ADR-003 (status = "accepted", superseded) and ADR-008'ssupersedes = "ADR-003"context, dated2026-09-22. Editing any of these would destroy the migration record.hyperpolymath/tma-mark22 / 5 Archived, read-only. Cannot be fixed without unarchiving — owner call, see below. metadatastician/canonical-ums1 / 3 Archived, read-only. Same. hyperpolymath/the-nash-equilibrium1 / 3 On the DO-NOT-MERGE list (2 corrupt remote branches, guard-defective). A PR there is motion that cannot land, so the fix is recorded as an issue with acceptance criteria instead: hyperpolymath/the-nash-equilibrium#117. Also the sole v0.2.0 outlier, carrying all three one-off line shapes. ⚠ Count is not compliance
launch-scaffolderandtriggerranked worst on a naivegrep -cprecisely because they are the two repos that documented the retirement properly — a translation-provenance header and a dated ADR supersession chain. A retired name inside a dated record is correct; silence is not evidence of compliance. Any future gate on this criterion must be a path/structure allowlist decided by reading context, never a count and never a content heuristic.⚠ Two corrections to this issue's body
- The body says
hyper-repos/triggerhas 3 files naming the retired filename, listingscripts/trigger-launcher.sh,dev-notes/HANDOVER.adocanddocs/IMPLEMENTATION-STATUS.adoc. Onorigin/maintoday it has 1 — AC3's fix (trigger#14) cleared the other two. The three-file figure was a working-tree reading. - The 18 repos / 26 files / 66 lines figure is superseded by 24 / 29 / 60, for the same reason. (An intermediate 25 / 30 / 63 double-counted the
idaptik-ums→universal-modding-studioredirect; see above.)
⛔ One owner decision remains on AC1
hyperpolymath/tma-mark2andmetadatastician/canonical-umsare archived. Neither can reach AC1 compliance while read-only, and unarchiving a repo to fix a comment line is a judgement I should not make unilaterally. Three options:- unarchive, land the one-line fix, re-archive;
- leave them and record archived-and-frozen as a standing AC1 exemption in this issue;
- treat an archived repo as out of AC1's scope by definition, and say so in the criterion's wording.
Until that is ruled, AC1 is met for every writable repo in the estate and these two are the only open items.
Status of the four criteria
AC state 1 ✅ met for every writable repo — 19 PRs merged, 5 exemptions recorded, 0 unaccounted citations. Pending only the archived-repo ruling above. 2 ✅ closed by ruling — migrate all 21 descriptors to .deed. AC2 asked for a decision, not a conversion; the conversion is a separate gated workstream behind launch-scaffolder#40 (compat reader) under R-G's dual-accept rule, designed in launch-scaffolder#42.3 ✅ merged (trigger#14). Re-verified on origin/main: 0 mentions of the retired name inscripts/anddocs/, and 19 oflauncher-standard_praxis.deed. (The repo total is 1 file / 2 lines — the dateddev-notes/HANDOVER.adoc, exempt by AC1's own wording. See the exemption table above.)4 ✅ implemented and tested (#983 → edac0d6a). ⚠ Per AGENTS.md §6 it is notwired: its 19 controls run green in CI via the shell-test suite, but no workflow in any repo invokes the gate itself.Refs #837 · #952 · #983 · #984 · launch-scaffolder#40 · launch-scaffolder#42 · owner ruling D73-C in #787
🤖 Generated with Claude Code
- The body says
AC1 — owner ruling on the two archived repos, and the criterion amended
The last open item on AC1 is settled. Ruling: an archived repository is out of AC1's scope by definition, and the criterion's wording has been amended in this issue's body rather than the artefact being changed.
AC1 now reads:
- No file in a writable repository outside
hyperpolymath/standardsnameslauncher-standard.a2mlexcept in a dated historical record that says so on its face. An archived repository is out of scope by definition — it is read-only, so the criterion would demand an impossible write (AGENTS.md §6: refusing an impossible operation is required, not optional).
Why this arm rather than the other two
A criterion that demands a write to a read-only repository is an impossible operation as stated. The two candidates were to unarchive→fix→re-archive, or to record a standing exemption. The first churns repo state and reopens a deliberately frozen repo for a comment line — and can silently regress if the re-archive step is ever skipped, which is the same missing-apply-step failure this estate has already hit. The second leaves the criterion reading as violated on its face, so every future reader re-derives this same question, and a twentieth archived repo needs a twentieth exemption line.
Amending the wording fixes the criterion instead of the artefact. It needs no repo-state change, and it cannot be vacuously failed again by the next archived repo.
What leaves scope
repo files / lines now hyperpolymath/tma-mark22 / 5 out of scope — archived=truemetadatastician/canonical-ums1 / 3 out of scope — archived=trueThese were previously listed as exemptions 3 and 4. They are not exemptions under the amended wording — they are outside the criterion. The three genuine exemptions that remain (
trigger,launch-scaffolder,the-nash-equilibrium) andhyperpolymath/standardsitself are unchanged, and each is a dated historical record, a translation-provenance header, a superseded ADR, or the AC4 gate's own fixtures.⚠ If either repo is ever unarchived, it re-enters scope and the one-line citation fix becomes owed. That is the correct behaviour, and it is why the amendment is keyed on the archived flag rather than on a hard-coded repo list.
Status of the four criteria
AC state 1 ✅ MET. 19 PRs merged; git grep origin/mainreads 0 files / 0 lines on all 19; 3 exemptions +standardsitself, all legitimate; 2 archived repos now out of scope. No unaccounted-for citation anywhere inhyper-reposormeta-repos.2 ✅ CLOSED by the record — "migrate all 21 to .deed". The conversion is a separate gated workstream behind launch-scaffolder#40, designed in launch-scaffolder#42.3 ✅ MERGED (trigger#14). 4 ✅ MERGED (standards#983 → squash edac0d6a). ⚠implementedandtested— its 19 controls run green inself-test.yml— but notwired: no workflow in any repo invokes the gate itself.This issue stays open on one item only: wiring the AC4 gate. Until a workflow invokes it, the check cannot fail a repo that drifts, and AGENTS.md §6 forbids reading
testedasdeployed. That work is now scheduled; when it lands, #960 closes.Refs: AC1 closure comment above · trigger#14 · standards#983 · launch-scaffolder#40, #42
🤖 Generated with Claude Code
- No file in a writable repository outside
AC4 detour: the gate had three false positives. Fixed in #990.
AC4's gate merged as
implemented+tested, notwired. Before wiring it I ran it
against 27 estate trees onorigin/main, and it drew four false defects on
launch-scaffolder— the repo that documented the retirement best. Three distinct
defects, all now cured in #990.G1 — version conflation. The regex accepted any version within 24 non-digit chars
after the filename.launch-scaffolder/EXPLAINME.adoc:138reads
| Standard: `launcher-standard_praxis.deed` (DEED v1.0.0). Per-app config:— so it
captured 1.0.0, the grammar version (:schema-version), not the document version
(:standard-version= 0.4.0). The gate's own header warns about exactly this two-version
confusion and the implementation below it commits it.G2 — the allowlist was keyed to
standards' own layout. The entry was the literal
pathlauncher/launcher-standard_praxis.deed, so a consumer that vendors the canon at
any other depth drew a false defect on the canon's own translation-provenance header.G3 — no exemption for dated ADR carriers.
META.a2mlunder a descriptiles directory
holds superseded ADRs that name the retired file on their face. AC1 exempts dated
historical records; the gate did not. The allowlist now carries both spellings —
canonicaldescriptiles/and the deprecated6a2/— because the rename is chartered
separately and both are on disk today (measured 2026-09-22: 164 vs 770 dirs).The acceptance control was stated before the fix was written
The fix must silence
launch-scaffolder's 4 and still report nash 4 / tma-mark2 7 /
canonical-ums 4. A cure that spares a true positive is worse than the false positive.Re-measured against the amended script, 27 trees on
origin/main:repo before after archived? hyperpolymath/launch-scaffolder4 0 no hyperpolymath/the-nash-equilibrium4 4 no hyperpolymath/tma-mark27 7 yes metadatastician/canonical-ums4 4 yes the other 23 0 0 — total 19 15 Every true positive survived; only the four false ones went. The narrowness is proved by
mutant-kill, not by a green: the self-test seeds a live descriptor
(.machine_readable/launcher/demo-app.launcher.a2ml) inside the very directories G3
exempts and requires it to still be detected, so the exemptions cannot have been
written too wide.A defect in my own first commit is worth recording here, since it is the estate's own
recurring pattern: the self-test printed a hardcoded2 controls cleanwhile seven
false-positive controls were present — a gate misreporting its own coverage. The counters
now increment inside the check functions, and a tier-empty guard aborts if a whole check
tier is ever emptied; the guard was proved live with a meta-mutant.What this changes for wiring — and what it does not
AC4 remains the one item keeping this issue open, and #990 does not wire the gate.
Wiring changes what every consumer ofgovernance-reusable.ymlsees, so it gets its own
blast-radius measurement and its own warn-tier/fail-tier decision, following the split-gate
precedent already set bycheck-docs-presence.sh— arm immediately only the part that reds
nobody, warn the rest until a baked-in cutoff.One measured input to that decision is already in: two of the three repos still carrying
true defects are archived (tma-mark2,canonical-ums), so they never run CI and cannot
go red. Full estate scan and the arming proposal to follow.
🤖 Generated with Claude Code
AC4 — status, measured live, with a retraction
AC4 is
implemented+tested+wired+ genuinely executing — inside this repository's own tree.
It reaches zero of the 351 consumer repositories. Both halves are measured below.- A check that fails if a repo claims launcher-standard compliance while naming a version or filename that no longer exists upstream.
⚠ Retraction first
An earlier note on this track recorded the AC4 consumer path as proven. That was false, and it is withdrawn.
It rested on a census of local clones that had not been fetched, so it described the estate as it was days
earlier. The corrected figures below come from the GitHub contents API, not from disk. The internal task record
has already been amended; this comment puts the retraction on the issue.What is true: the gate runs, and it passes on a clean tree
From the most recent
governancerun onmain— run35786279918, headfaed4dd195, job106943755094
(governance / Code quality + docs, conclusionsuccess):check-launcher-standard-currency: canonical=launcher-standard_praxis.deed expected=v0.4.0 No stale launcher-standard references.scripts/check-launcher-standard-currency.sh— 15,516 B onmainscripts/tests/check-launcher-standard-currency-test.sh— 6,384 B onmain
Its 19 controls do run in
self-test.yml. They are not named there: the suite globstests/*.shand
scripts/tests/*.sh, and the test file matches. ⚠ A by-name grep is the wrong coverage probe against a glob
runner — that check nearly produced a false "untested" verdict here.What is not true: the gate reaches no consumer
A new step in a reusable workflow reaches only callers at a mutable ref. A SHA pin freezes the new step out.
Measured live across the estate:metric value repositories probed 355 live caller repositories 351 at a mutable ref ( @main, a tag, a branch)0 SHA-pinned 351 distinct pins 23 resolvable pins 22 — every one predating the gate merge, every one without the gate unresolvable pins 1 ( 8f31a5a4…, 8 callers — see #987)callers that can reach the AC4 gate 0 The gate merged as
e3b9929cdc57149874e2211e6c8934145d245855at 2026-09-22T20:10:28Z. The newest pin
anywhere in the estate ise977cc6745at 09:59:42Z the same day — about ten hours earlier. Every one of the
22 resolvable pins was probed for the gate's presence directly; all 22 returned absent, with
e3b9929citself carried as a positive control returning present in the same run.The largest cohorts, for scale:
81dbf2dd85(2026-07-21) holds 89 callers,8f2ee50841(09-08) holds 50,
fad242d352(09-07) holds 45,84355587cb(08-27) holds 43. The single biggest block of consumers is pinned to
a July commit.Why, mechanically
Reusable-workflow refs are exempt from
actions.lock, so a lock regeneration does not move them. A pinned
caller therefore picks up a new step in a callee only via a Dependabotuses:bump or a deliberate re-pinning
campaign. Nothing in the current arrangement moves these 351 repositories on its own.Method, so the number can be reproduced or contested
- Population = every
uses:line matching
^[[:space:]]*uses:[[:space:]]*hyperpolymath/standards/\.github/workflows/governance-reusable\.yml@
with trailing#comments stripped. - Anchoring on
uses:is load-bearing. An unanchored by-name grep counted a comment as a caller ref
(affinescript/.github/workflows/governance.yml:6), which alone would have turned "zero mutable callers"
into "one" and inverted the conclusion. - Deduped by origin slug, not clone basename — basenames over-counted by 35 via
owner__repomirror clones
and clones of repositories that no longer exist. - Each caller then re-read live from
repos/<slug>/contents/.github/workflows/governance.yml. Four repos
carry no such ref live (k9iser,lua-filters,vex-tools, andrsr-julia-library-template-repo, which is
now 404 — deleted).
⚠ Steps 1–3 alone produced numbers that were stale by up to nine days.
hyperpolymath/hermeneiaread
@8f31a5a4…on disk (clone dated 09-12) and reads@da2c748a…live (main dated 09-21) — a real commit. Step 4
is what makes the figures above trustworthy.What this means for closing AC4
AC4's wording asks for a check that fails under the stated condition. That check exists, is tested, is wired,
and demonstrably runs. On a strict reading AC4 is met.If the intent is that the check protects the estate, it does not yet, and no amount of work inside this
repository will change that — the remaining step is a re-pinning campaign across 351 consumer repositories,
which is a separate workstream with its own blast radius, not a loose end on this issue. Flagging it here so the
distinction is on the record rather than assumed either way; which reading governs is the owner's call.
🤖 Generated with Claude Code
- addedmigrationPorting between languages or toolchains (e.g. -> AffineScript)Porting between languages or toolchains (e.g. -> AffineScript)priority:p2Normal - queue itNormal - queue itscope:estateAffects many or all repos across the estateAffects many or all repos across the estatestatus:readyFully specified and ready to be picked upFully specified and ready to be picked up
on Sep 30, 2026
21 downstream launcher descriptors now name a file that no longer exists
D73-C (owner ruling, #787) translated
launcher/launcher-standard.a2mltolauncher/launcher-standard_praxis.deedand deleted the source. #952 merged 2026-09-22T10:10:04Z asbe6c9580, verified againstorigin/main:launcher/launcher-standard.a2mlis absent,launcher/launcher-standard_praxis.deedis present.That closes the standards side. It does not touch the downstream surface, which this issue records so it is not lost. These references are now dangling, not merely stale.
Measured 2026-09-22
A.
*.launcher.a2mldescriptors — 21 distinct, 31 on-disk pathsFound with
rg --files -g '*.launcher.a2ml', excluding.claude/worktrees/. The path count exceeds the distinct count because several repos are cloned twice (once undermeta-repos/, once underhyper-repos/metadatastician/).Every one sampled carries the same two lines:
So each names both the deleted file and the TOML
[section]notation that the DEED form replaces with(runtime ...)clauses.⚠ A prior note in this campaign recorded this population as 10. That was a 2× undercount — the real figure is 21 distinct. Recorded because the estate has hit "a census is wrong in both directions at once" repeatedly, and the corrected number is the one to work from.
B. The
triggerrepo is a live consumerhyper-repos/triggerhas 3 files naminglauncher-standard.a2ml, and one of them is an actual launcher implementation, not documentation:scripts/trigger-launcher.sh— citeslauncher-standard.a2ml v0.3.0and resolves desktop tools "using ladder from launcher-standard.a2ml"; also names§a2ml-metadata-block,§default-mode,§required-modes.dev-notes/HANDOVER.adocdocs/IMPLEMENTATION-STATUS.adocThis one matters more than the descriptors: it is code that claims compliance with a standard whose canonical form has changed.
Acceptance criteria
hyperpolymath/standardsnameslauncher-standard.a2mlexcept in a dated historical record that says so on its face. An archived repository is out of scope by definition — it is read-only, so the criterion would demand an impossible write (AGENTS.md §6: refusing an impossible operation is required, not optional). (Wording amended 2026-09-22 by owner ruling; see the AC1 closure comment.).deedform or are explicitly declared out of scope for D73-C with a reason recorded here — decided, not left to decay.trigger/scripts/trigger-launcher.shciteslauncher-standard_praxis.deedand DEED clause notation, and its claimed version is the current one.Deliberately not asserted
These 21 files are part of the wider superseded-A2ML surface (owner ruling 2026-09-08, executed by a2ml#2), not solely a D73-C consequence. This issue records the launcher-shaped subset and its true size; it does not claim the whole A2ML migration.
Refs #837 · #952 · owner ruling D73-C in #787
🤖 Generated with Claude Code
https://claude.ai/code/session_01WPSJ7fBhVAMcpSffCBWUDo