Skip to content

D73-C downstream: 21 launcher descriptors + trigger/ still name the deleted launcher-standard.a2ml #960

Description

@hyperpolymath

21 downstream launcher descriptors now name a file that no longer exists

D73-C (owner ruling, #787) translated launcher/launcher-standard.a2ml to launcher/launcher-standard_praxis.deed and deleted the source. #952 merged 2026-09-22T10:10:04Z as be6c9580, verified against origin/main: launcher/launcher-standard.a2ml is absent, launcher/launcher-standard_praxis.deed is 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.a2ml descriptors — 21 distinct, 31 on-disk paths

Found with rg --files -g '*.launcher.a2ml', excluding .claude/worktrees/. The path count exceeds the distinct count because several repos are cloned twice (once under meta-repos/, once under hyper-repos/metadatastician/).

688-attack-hub   aerie   berrywiki   boj-server-mk2   burble   cadastra
canonical-ums    cerro-torre   chronicles-of-slavia   enaction-engine
f117a-stealth-glider   f19-stealth-glider   game-server-admin   gossamer
idaptik-ums   nqc   paint-type   panll   progblocks   stapeln
the-nash-equilibrium

Every one sampled carries the same two lines:

# Compliant with launcher-standard.a2ml v0.3.0
...
# Per launcher-standard.a2ml [runtime] section:

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 trigger repo is a live consumer

hyper-repos/trigger has 3 files naming launcher-standard.a2ml, and one of them is an actual launcher implementation, not documentation:

  • scripts/trigger-launcher.sh — cites launcher-standard.a2ml v0.3.0 and resolves desktop tools "using ladder from launcher-standard.a2ml"; also names §a2ml-metadata-block, §default-mode, §required-modes.
  • dev-notes/HANDOVER.adoc
  • docs/IMPLEMENTATION-STATUS.adoc

This one matters more than the descriptors: it is code that claims compliance with a standard whose canonical form has changed.

Acceptance criteria

  1. No file in a writable repository outside hyperpolymath/standards names launcher-standard.a2ml except 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.)
  2. The 21 descriptors either migrate to the .deed form or are explicitly declared out of scope for D73-C with a reason recorded here — decided, not left to decay.
  3. trigger/scripts/trigger-launcher.sh cites launcher-standard_praxis.deed and DEED clause notation, and its claimed version is the current one.
  4. A check that fails if a repo claims launcher-standard compliance while naming a version or filename that no longer exists upstream.

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

Activity

  1. hyperpolymath commented on Sep 22, 2026

    @hyperpolymath
    OwnerAuthor

    Status: AC3 and AC4 are done and merged. AC1 is done for trigger only. AC2 is an owner decision and is the one thing outstanding.

    AC3 — ✅ MERGED

    trigger/scripts/trigger-launcher.sh now cites launcher-standard_praxis.deed, DEED clause notation, and the current version. Landed as hyperpolymath/trigger#14, merged 2026-09-22T13:13:56Z.

    AC4 — ✅ MERGED

    scripts/check-launcher-standard-currency.sh fails a repo that claims compliance while naming a version or filename that no longer exists upstream. Landed as #983, squash edac0d6a on main.

    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 — implemented and tested, but NOT wired.

    • Its 19 controls do run in CI: scripts/tests/…-test.sh is discovered by scripts/run-shell-test-suite.sh, which self-test.yml invokes. Green on edac0d6a itself.
    • 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 descriptors

    trigger's remaining occurrence is in dev-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 to hyper-repos + meta-repos, with nested worktrees verified absent:

    metric value
    *.launcher.a2ml paths on disk 31
    distinct descriptor basenames 21 ← matches this issue
    paths citing the deleted launcher-standard.a2ml 26
    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 under metadatastician/ — 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 # comment

    All 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-scaffolder writes 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-output and (runtime are real clause heads in launcher-standard_praxis.deed at lines 115 and 122.
    • developer-ecosystem/standards/launcher/launcher-standard.a2ml is a path that does not exist.

    This separates AC2 into two things one framing conflates

    blocked?
    (a) the file extension .launcher.a2ml → something else Yes — by R-G's dual-accept rule, until the @a2ml-metadata compat reader lands (launch-scaffolder#40)
    (b) the citation text inside them No — comment-only, independent of the extension, structurally identical to the trigger fix already merged in AC3

    AC2 as written asks whether the 21 descriptors migrate to the .deed form or are declared out of scope for D73-C with a reason recorded here — decided, not left to decay. Note that a .deed filename is a closed dispatch set of four (estate_chora / ATLAS / *_praxis / *_chora), so "convert <app>.launcher.a2ml to .deed" cannot yield <app>.launcher.deed; and a deed admits no key = value and 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.adoc declares no version, yet two files cite it at v0.2.0 — docs/audits/launcher-standard-review-2026-05-26.adoc:33 and docs/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

    https://claude.ai/code/session_01WPSJ7fBhVAMcpSffCBWUDo

  2. hyperpolymath commented on Sep 22, 2026

    @hyperpolymath
    OwnerAuthor

    ⚠ 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 single hyperpolymath/-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

    https://claude.ai/code/session_01WPSJ7fBhVAMcpSffCBWUDo

  3. hyperpolymath commented on Sep 22, 2026

    @hyperpolymath
    OwnerAuthor

    ⚖ 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 standards names launcher-standard.a2ml except in a dated historical record RULED: fix now. ✅ done for trigger; execution pending for the descriptors
    AC2 — the 21 descriptors either migrate to .deed or are declared out of scope for D73-C ✅ CLOSED by this ruling: migrate to .deed
    AC3 — trigger-launcher.sh cites launcher-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 implemented and tested — its 19 controls run green in self-test.yml via scripts/run-shell-test-suite.sh — but it is not wired. 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 .deed

    AC2 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-metadata launcher 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:

    1. The name. A .deed filename is a closed dispatch set of four — estate_chora.deed, ATLAS.deed, *_praxis.deed, *_chora.deed. So <app>.launcher.a2ml → <app>.launcher.deed is not an available name. The migration needs either a fifth dispatch case or a mapping onto <app>_chora.deed.
    2. The grammar. A deed admits no key = value and no [section]; tabs are invalid; uuid5 only. The descriptors are TOML-shaped ([runtime], [version-output]). This is a rewrite, not a rename — and launch-scaffolder has no per-app config deed grammar today.

    These will be filed as one design issue on launch-scaffolder with 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.a2ml paths on disk 31
    distinct descriptor basenames 21 — matches this issue's own figure exactly
    paths citing the deleted launcher-standard.a2ml 26
    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-output at line 115, (runtime at 122, (integration at 184. developer-ecosystem/standards/launcher/launcher-standard.a2ml is 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-scaffolder writes 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.rs writes no such string. ⚠ The control was necessary — src/ is absent at that repo's root (the crate lives under crates/), 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-equilibrium gets 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 only hyperpolymath/-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-repos
    

    returns exactly the the-nash-equilibrium paths 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 -g exclude 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

    https://claude.ai/code/session_01WPSJ7fBhVAMcpSffCBWUDo

  4. hyperpolymath commented on Sep 22, 2026

    @hyperpolymath
    OwnerAuthor

    ⚠ 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 is 1-formats/deed/spec/abnf/deed.abnf (v1.0.0) on origin/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:71 is stem = 1*( ALPHA / DIGIT / "-" / "." / "_" ) — dots are legal in a stem — and :62-64 says so explicitly: "Do NOT split on . — the stem may contain dots." So myapp.launcher_praxis.deed is a legal deed filename with stem myapp.launcher. That makes the rename a suffix swap (.launcher.a2ml → .launcher_praxis.deed) with the existing .launcher infix 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-414 makes :beholding-chora a 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-414 marks 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.deed already beholds #u5"estate/chora" and already carries :standard-version, :standard-date and :compliance beyond 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:24 carries 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-exclusion side condition exists precisely because estate_chora.deed also matches *_chora.deed, and it notes that "the grammar alone is not sufficient to dispatch a filename." So <app>.launcher.deed is 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 _chora the wrong choice: repo-deed means "Noun. What a repo IS. A record." A launcher descriptor is not that.

    *_praxis.deed → praxis-deed means "Verb. What a tool DOES. Rules." — which is exactly what a per-app launcher descriptor is. So <app>_praxis.deed needs no grammar change and is semantically correct, and it composes with what already exists: launcher-standard_praxis.deed states the general rules, <app>_praxis.deed states 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, and launch-scaffolder's pub 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-deed was ruled on #752 as "a genuine fourth head, not a facet of repo-deed."

    None of this affects AC1, which is comment-only and proceeding independently.

    🤖 Generated with Claude Code

    https://claude.ai/code/session_01WPSJ7fBhVAMcpSffCBWUDo

  5. hyperpolymath commented on Sep 22, 2026

    @hyperpolymath
    OwnerAuthor

    ⚠ 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 names launcher-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.a2ml in 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 on main.
    Every other sat on a peer session's WIP branch. The tell:
    trigger/scripts/trigger-launcher.sh showed 8+ stale citations on disk while
    AC3 was recorded MERGED — both were true. The clone was on
    chore/bump-standards-pins at c5afab9; origin/main was 7ff9c0a with
    0 a2ml mentions and 18 _praxis.deed ones. 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-mark2 archived — read-only, no PR possible
    metadatastician/canonical-ums archived — read-only, no PR possible
    metadatastician/idaptik-ums redirects to universal-modding-studio — one repo double-counted as two

    The 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 in dev-notes/HANDOVER.adoc,
      :revdate: 2026-08-13.
    • hyperpolymath/launch-scaffolder — all three hits are provenance:
      standards/launcher-standard_praxis.deed:7 names 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
    a grep -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/main
    repos 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/trigger 1/2 dated historical record — already AC1-compliant
    hyperpolymath/launch-scaffolder 2/3 dated ADRs + translation provenance — already AC1-compliant
    hyperpolymath/tma-mark2 2/5 archived, read-only
    metadatastician/canonical-ums 1/3 archived, read-only
    hyperpolymath/the-nash-equilibrium 1/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,
    a DEBT.adoc governance 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 @a2ml header in tma-mark2/scripts/etma-handler-launcher is
    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 on origin/main.
    AC4 ✅ merged. Only AC1 execution remains.

    🤖 Generated with Claude Code

    https://claude.ai/code/session_01WPSJ7fBhVAMcpSffCBWUDo

  6. 8 remaining items

  7. hyperpolymath commented on Sep 22, 2026

    @hyperpolymath
    OwnerAuthor

    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/main per repo, the true pre-sweep scope was 24 repos / 29 files / 60 lines. ⚠ A first re-measure said 25 / 30 / 63; that double-counted metadatastician/idaptik-ums, which redirects to metadatastician/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 to 0 remaining with 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-repos or meta-repos.

    The 5 exemptions (+ standards itself)

    repo files/lines why it is exempt
    hyperpolymath/standards 6 / 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/trigger 1 / 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-scaffolder 2 / 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's supersedes = "ADR-003" context, dated 2026-09-22. Editing any of these would destroy the migration record.
    hyperpolymath/tma-mark2 2 / 5 Archived, read-only. Cannot be fixed without unarchiving — owner call, see below.
    metadatastician/canonical-ums 1 / 3 Archived, read-only. Same.
    hyperpolymath/the-nash-equilibrium 1 / 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-scaffolder and trigger ranked worst on a naive grep -c precisely 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

    1. The body says hyper-repos/trigger has 3 files naming the retired filename, listing scripts/trigger-launcher.sh, dev-notes/HANDOVER.adoc and docs/IMPLEMENTATION-STATUS.adoc. On origin/main today it has 1 — AC3's fix (trigger#14) cleared the other two. The three-file figure was a working-tree reading.
    2. 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-studio redirect; see above.)

    ⛔ One owner decision remains on AC1

    hyperpolymath/tma-mark2 and metadatastician/canonical-ums are 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 in scripts/ and docs/, and 19 of launcher-standard_praxis.deed. (The repo total is 1 file / 2 lines — the dated dev-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 not wired: 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

    https://claude.ai/code/session_01WPSJ7fBhVAMcpSffCBWUDo

  8. hyperpolymath commented on Sep 22, 2026

    @hyperpolymath
    OwnerAuthor

    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:

    1. No file in a writable repository outside hyperpolymath/standards names launcher-standard.a2ml except 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-mark2 2 / 5 out of scope — archived=true
    metadatastician/canonical-ums 1 / 3 out of scope — archived=true

    These 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) and hyperpolymath/standards itself 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/main reads 0 files / 0 lines on all 19; 3 exemptions + standards itself, all legitimate; 2 archived repos now out of scope. No unaccounted-for citation anywhere in hyper-repos or meta-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). ⚠ implemented and tested — its 19 controls run green in self-test.yml — but not wired: 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 tested as deployed. 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

    https://claude.ai/code/session_01WPSJ7fBhVAMcpSffCBWUDo

  9. hyperpolymath commented on Sep 22, 2026

    @hyperpolymath
    OwnerAuthor

    AC4 detour: the gate had three false positives. Fixed in #990.

    AC4's gate merged as implemented + tested, not wired. Before wiring it I ran it
    against 27 estate trees on origin/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:138 reads
    | 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
    path launcher/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.a2ml under 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 —
    canonical descriptiles/ and the deprecated 6a2/ — 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-scaffolder 4 0 no
    hyperpolymath/the-nash-equilibrium 4 4 no
    hyperpolymath/tma-mark2 7 7 yes
    metadatastician/canonical-ums 4 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 hardcoded 2 controls clean while 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 of governance-reusable.yml sees, so it gets its own
    blast-radius measurement and its own warn-tier/fail-tier decision, following the split-gate
    precedent already set by check-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

    https://claude.ai/code/session_01WPSJ7fBhVAMcpSffCBWUDo

  10. hyperpolymath commented on Sep 22, 2026

    @hyperpolymath
    OwnerAuthor

    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.

    1. 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 governance run on main — run 35786279918, head faed4dd195, job 106943755094
    (governance / Code quality + docs, conclusion success):

    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 on main
    • scripts/tests/check-launcher-standard-currency-test.sh — 6,384 B on main

    Its 19 controls do run in self-test.yml. They are not named there: the suite globs tests/*.sh and
    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 e3b9929cdc57149874e2211e6c8934145d245855 at 2026-09-22T20:10:28Z. The newest pin
    anywhere in the estate is e977cc6745 at 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
    e3b9929c itself 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 Dependabot uses: 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

    1. Population = every uses: line matching
      ^[[:space:]]*uses:[[:space:]]*hyperpolymath/standards/\.github/workflows/governance-reusable\.yml@
      with trailing # comments stripped.
    2. 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.
    3. Deduped by origin slug, not clone basename — basenames over-counted by 35 via owner__repo mirror clones
      and clones of repositories that no longer exist.
    4. 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, and rsr-julia-library-template-repo, which is
      now 404 — deleted).

    ⚠ Steps 1–3 alone produced numbers that were stale by up to nine days. hyperpolymath/hermeneia read
    @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

    https://claude.ai/code/session_01WPSJ7fBhVAMcpSffCBWUDo

  11. added
    migrationPorting between languages or toolchains (e.g. -> AffineScript)
    scope:estateAffects many or all repos across the estate
    status:readyFully specified and ready to be picked up
    on Sep 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    migrationPorting between languages or toolchains (e.g. -> AffineScript)priority:p2Normal - queue itscope:estateAffects many or all repos across the estatestatus:readyFully specified and ready to be picked up

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions