docs(umbrella-donemd-backfill): close the umbrella — premise disproved by measurement - #1118
Merged
artyhoo merged 8 commits intoJul 23, 2026
Merged
Conversation
…rofile marker Adds the `/pipeline umbrella-donemd-backfill` dispatch artefact: a 2-stage Mode-SDD meta-launch kickoff (Stage 1 evidence-backed done.md sweep -> operator answer on the OBSOLETE-CANDIDATE table -> Stage 2 obsolete-close + this umbrella's own done.md), carrying the §4c park-don't-guess contract required for autonomous aif dispatch. Also fixes a live dispatch blocker in the umbrella kickoff: the marker value `glm-5.2` matches TWO live runtime profiles (`Z.AI GLM-5.2`, `Z.AI GLM-5.2 SDK`) under the substring resolver at packages/runtime-bridge/src/AifHandoffBackend.ts:131 (case-insensitive `includes`, no exact-match priority) -> guaranteed `dispatch_failed` ambiguity throw. Both kickoffs now name the unique `Z.AI GLM-5.2 SDK` (the project-default task profile). Same defect + same fix as PR #1109; verified against live `GET /runtime-profiles` (3 profiles, one match). Prior-art: skipped — dispatch-input kickoff authoring plus a one-line profile-marker correction; no new capability, no dependency, no code module introduced
… marked kickoffs Fixes the authoring surface that produced the ambiguous-marker dispatch blocker, then sweeps the whole marked-kickoff population rather than the one instance. CLAUDE.md «Task-tier routing» is the doc every kickoff author reads, and it templated the marker as `<executor-tier profile name>` with no uniqueness requirement — while the peer statement in `.claude/skills/arch/SKILL.md:61` («Marker value = the UNIQUE profile display name») already carried it. PR #1109 fixed one instance and taught /arch; CLAUDE.md was missed, so the defect recurred twice more. Adds a binding «Marker value rule» paragraph naming the resolver's substring-without-exact-match-priority behaviour (packages/runtime-bridge/src/AifHandoffBackend.ts:131), the authoring-time verify command, and a pointer to the banked resolver fix (research-patches/2026-07-23-aif-parity-s4-synthesis.md §3 item 6). Both placeholder spellings become `<unique-executor-tier-profile-name>`. Population sweep of every kickoff carrying the marker (5 files): fixes the two remaining defects. `getff-honest-signals` carried the ambiguous `glm-5.2` (matches 2 live profiles -> dispatch_failed). `multi-model-profile-marker` — the kickoff that DESIGNED the marker — spelled the literal syntax in its header blockquote, which is exactly the region `extractProfileHint` scans, so its own mechanism parsed the documentation as a directive (hint `<name>`, 0 matches). Its §2 predicted the body-prose false-positive and scoped the parse to the header; it did not foresee the header itself carrying the mention. Prose reworded; the literal stays in §2, outside the scanned region. Verified: all 5 marked kickoffs resolve to exactly one live runtime profile. Prior-art: skipped — documentation-only correction of an authoring rule plus data fixes in dispatch-input kickoffs; no dependency, no code module, no new capability
…brella-donemd-backfill-9394f1
…y dispatchable The meta-launch kickoff is an orchestration artefact, not a dispatch target: dispatch.ts `isOrchestrationKickoff` flags any `*-meta-launch` name because aif treats a kickoff as an implementation spec and a meta-plan yields ZERO code (live-confirmed 2026-05-31, task a4bdff98: $5.66, no code). The buildable spec is this umbrella kickoff — but it lacked the §4c park-don't-guess contract that autonomous dispatch requires (`#autonomous-dispatch-without-park`). Adds: the park-don't-guess block with umbrella-specific park triggers (weak closure signal is an UNCLEAR row, NOT a park — that fork is already decided); an explicit «this dispatch = Stage 1 only» scope line so the gated obsolete-close follow-up and this umbrella's own done.md stay out of the run; and trap T-UDB-C — a PR-title slug match is not closure evidence, since `gh pr list --search "<slug>"` self-matches this umbrella's own kickoff PR #1107. Verified: 0 orchestration markers, profileHint resolves to exactly one live runtime profile, park contract greppable, 136 lines. Prior-art: skipped — dispatch-input kickoff hardening for autonomous dispatch; no dependency, no code module, no new capability introduced
…brella-donemd-backfill-9394f1
…brella-donemd-backfill-9394f1
…brella-donemd-backfill-9394f1
…d by measurement Writes done.md for both umbrella dirs per CLAUDE.md «Umbrella closure convention» and records the closure measurement as report.md §9. Stage 2 is dropped, not deferred: report §5 proposes zero OBSOLETE-CANDIDATE rows, so the operator-confirmation queue the stage exists to drain is empty. The closure measurement re-tested Stage 1's structural finding against the live panel at HEAD ee4c3ee and disproved the umbrella's premise with line-level evidence: priority-score.sh emits 366 candidate lines = 78 synthetic + 40 kickoff=missing + 248 real umbrellas, of which 193 are DONE and **55 open**. The kickoff's «~99 open» was 287 dirs − 187 done.md computed over all directories, but the panel counts umbrellas carrying a kickoff.md. The real figure was 55 before and after. Net effect of Stage 1's 12 done.md: zero, verified 12/12 — every target dir emits `kickoff=missing` and terminates before the C3 layer is consulted (priority-score.sh:177-192, pre-filter at :139). That is the KICKOFF-AMBIGUOUS the cold fidelity auditor raised at Round 1. Incidental finding recorded in §9: trap T-UDB-C fires inside the C2 layer, not only in human reasoning — before this closure the panel reported `umbrella-donemd-backfill status=DONE done_pr=1107 basis=jaccard score=100%`, where #1107 is this umbrella's own kickoff-authoring PR; the -meta-launch slot was matched to the unrelated #1109. These two done.md files replace the false match with real evidence, and the :139 pre-filter now short-circuits both dirs before the expensive jaccard pass runs. Prior-art: skipped — umbrella closure per an existing binding convention plus a measurement appendix; no dependency, no code module, no new capability
artyhoo
added a commit
that referenced
this pull request
Aug 21, 2026
…us + principle 43 (#1506) * feat(host-verify-retrofit): kickoff inventory classifier — lanes + bulk-wave filter Warn-phase tool for the host-verify retrofit (PR #1491 park #2): classifies every .claude/orchestrator-prompts/*/kickoff.md into contracted | legacy-closed | attention/closed | attention/open. Fail-safe by direction of error: the blanket lane (legacy-closed) requires BOTH done.md AND last non-wave activity older than --min-days (default 30). Bulk waves (commits touching >10 umbrella dirs — back-catalog migration #523, done.md backfills, the FRS S2 spelling sweep itself) do not refresh activity dates. Contract recognition is delegated to scripts/host-verify.sh --list (the SSOT runner, dual-implementation-discipline §8) — never re-implemented here. Dirs without kickoff.md are out of scope by construction. Measured on staging c8d2e34 (322 kickoff files, lanes reconcile exactly): contracted 64, legacy-closed 86, attention/closed 133 (119 last=none-non-wave — every commit in their history is a bulk wave; 31 with dated non-wave activity — the human-review borderline), attention/open 39. Blanket-safe total: 86 + 119 = 205; manual lanes: 31 + 39 = 70. Recheck note: two dated files (pre-merge-carrier-meta-launch, generator-forbid-mvp-meta-launch) MENTION host-verify in prose/headings but carry no runner-recognized contract — classified as uncontracted, correctly. * docs(kickoff): host-verify retrofit B1 — blanket legacy-closed opt-outs (195 files) Retrofits the destination-environment-verification contract (.claude/rules/destination-environment-verification.md §1) onto the closed back-catalog: each file gets the canonical opt-out marker <!-- host-verify: none — legacy closed umbrella (done.md): work already accepted; no live host acceptance to declare — retro-marked 2026-08-21 --> recognized by the runner (bash scripts/host-verify.sh --list <path> → 0), replacing silent contract-absence with an explicit, greppable declaration. +2 lines per file, byte-identical otherwise. Population (lanes from scripts/kickoff-hv-inventory.sh, run at this commit): - legacy-closed 90 + attention/closed none-non-wave 102 → kickoff.md each - stage kickoffs of closed tracked umbrellas: beta-delivery-ux s1/s2/s3/s5 = 195 tracked files. Guards applied per file (escalate, never blanket): done.md required; runner-recognition skip; any prose 'host-verify' mention → individual lane. Escalated to B2: generator-forbid-mvp-meta-launch (prose mention the runner does not recognize — one of the two 'lying contracts'), beta-delivery-ux/ kickoff-r1.md (already carries a real contract; guard prevented a second declaration). consumer-install-{completeness,hardening} stage kickoffs are gitignored (per-umbrella un-ignore globs, .gitignore:31-55) — excluded: their kickoff.md is marked, the untracked stage files stay untouched. .husky/pre-commit, two accompaniments (both first-triggered by staging the corpus; no CI mirror, no shipped-template twin carries either gate — verified: grep 'exceeds 600' → only this hook): - 600-line gate: case entries for the two oversized closed meta-kickoffs it would otherwise block (queue-mode-bootstrap 730, strategic-clarity-dialogue 664). Both already self-declared the 'transient artifact' exemption in their headers at creation — only the case entry was missing. Same list∩marker shape as the two pre-existing entries. - markdownlint-cli2 arm now excludes .claude/orchestrator-prompts/**: the dispatch corpus is append-only history whose older files predate linting (95 pre-existing violations, 68 of them MD040 bare fences; zero introduced by this commit's EOF-only appends); full-file lint made any touch of an old kickoff a style-repair demand. The corpus keeps its dedicated spec-discipline soft-warn arm; all other md surfaces stay fully linted. * docs(kickoff): host-verify retrofit B2 — 28 individually adjudicated closed kickoffs The attention/closed-with-date lane: every umbrella HAS done.md but its dir saw non-wave activity inside the 30-day window, so the blanket pass refused them (guard: recent targeted touch = look before marking). Adjudication per dir — the git log of each — sorted every recent touch into four closure classes, zero live-work reopeners: - done.md closure commits (#1243 #1361 #1476 #1118 #1158 #1262 #1175 …) - closure-sweep backfills (#1268: 50 verified closures, round 3) - archival of superseded designs (#1221) - cosmetic example fixes on closed files (#1280 Jest→vitest in fenced examples; #1288 600-line unfreeze) Each of the 27 dated dirs + the G3-escalated generator-forbid-mvp-meta-launch gets the same canonical marker as B1 (+2 lines, EOF append). The two 'lying contracts' resolved as NOT lying declarations but prose vocabulary: generator-forbid-mvp-meta-launch §4d ('Cross-stage host-verify acceptance' section title, commands named as stage obligations — never a fenced contract) and pre-merge-carrier-meta-launch (prose pointers to the binding umbrella's §4 host-verify + 'both host-verify legs green' gate description). The runner is right to not see a contract; the marker states the machine truth, the historical prose stays byte-identical. * docs(kickoff): host-verify retrofit B3 — real contracts + honest opt-outs for the 39 open umbrellas (+ modular stages) The attention/open lane (no done.md — the lane the fail-safe classifier refuses to blanket): every file handled individually, error direction toward REAL contracts (an executable kickoff never gets a lazy opt-out). 17 contracts, each quoting the file's own acceptance material or the existing suites its acceptance names (mechanical quoting, no authorship): - heal-honest-capacity → the fixture suite §3 demands + criterion 8 - install-prepush-copylist → §5 bullet 2 verbatim (SHAs zeroed: the no-op deletion probe, live-verified exit 0 before quoting) - multi-model-profile-marker → live aif /tasks probe (§3 verifies live; the contract fails closed when the runtime is down — stated in the fence) - r2-enforced-zod-scope → gh-535-rule-enforced.test.sh (§6's harness) - r2-zod-aware-selector → make self-audit (§5 names it) - rule-bootstrapping-iphase-spike → snapshot compare (§7 byte-identical) - salg-m1-gate → principle 21 (its Part B, shipped) - salg-postinstall-smoke-p1 → the four harness homes §Deliverable names - shipped-skill-sync → check-skill-drift.sh (sibling gate, same surface) - zero-dep-synth-bundle → build-synth-bundle.sh --check (its step-6 gate) - zcode-full-parity + step1-emit-wrapper → the twin test suites §3/§4 name - modular-install-fullpack s1-s5 → snapshot compare (+shellcheck on s1), the §4 byte-identical guard; empirical consumer probes stay documented in §4 as live-session work 28 opt-outs, three precented classes, each naming its own evidence: - 15 planning STUBs (U4-U17 of the getff-to-prod МЕГАКИКОФФ + the self-declared stack-tooling-generation stub): stages are sketches; the full kickoff that replaces a stub declares the contract - 6 research/docs-only (h10, phase-10, salg R-phase, container-audit, worktree-flakiness tracker, trust-tiers adjudication): deliverable is a markdown artifact per each file's own header/scope - 7 meta-launch/orchestration/deferred (getff-to-prod МЕГАКИКОФФ, salg-meta-launch, beta-ai-docs-agnosticism [stages s1-s3 already carry contracts], modular umbrella + S0 table, executable-aidocs deferred WIs, m2-probe [DORMANT prose deliverable by design]) Every edited file verified: bash scripts/host-verify.sh --list <path> exits 0 (recognized contract or valid opt-out). * feat(principles): host-verify retrofit B4 — principle 43 (whole-population contract presence) + rule §1 note packages/core/principles/43-kickoff-host-verify-presence.test.ts: promotes the edit-time contract gate (fires only on touch) to a CI channel over the WHOLE tracked kickoff family — kickoff.md + stage kickoffs via kickoff-population.ts, mirrors excluded, gitignored stage files out of population (principle 40's tracked-file posture; they cannot ship a contract to CI). Detection shells to the SSOT runner (host-verify.sh --list) exactly like the edit-time gate — no second grammar (#sync-by-copy-paste avoided). Paired-negative fixtures prove the detector discriminates: absence fail-closed, fence pass, opt-out pass, too-short rationale fail; anti-tautology strips a real compliant kickoff and asserts the verdict flips; tripwire holds the population non-vacuous. First live run CAUGHT two real gaps the lane measurement missed: cross-worktree-symlink-iphase and f2-aif-fire-backend-iphase end in a dangling bare ``` (single fence line, CommonMark opens an unterminated code block), so their B1 opt-out markers landed inside the block and the runner rightly ignored them. Fixed by closing the dangling fence (+1 line, renders empty exactly as before); both now recognized. No exemption list: after the retrofit nothing is exempt. Rule §1 (destination-environment-verification.md): names the stage-kickoff family as bound (population SSOT), documents principle 43 as mechanism (c) in the Class header — honestly: PRESENCE, not execution; the Class-A promotion path is unchanged. Prior-art: prior-art-evaluations.md#229 (ADAPT — the destination-environment contract row; this commit promotes its edit-time gate to a population principle test on the same SSOT runner, grammar unchanged) * fix(review): host-verify retrofit B5 — cold-review round 1 fixes Code review (review-sidecar, cold): REVISE on one MAJOR, folded the cheap MINORs. Fidelity audit (cold): GO, no round-triggering findings. MAJOR — markdownlint exclusion was permanent and corpus-wide (no re-entry): new kickoffs would have escaped lint forever. Fixed by narrowing the carve-out to the legacy corpus ON TOUCH: the STAGED_MD filter now ADMITS orchestrator- prompts files with git status A (newly added — no pre-existing debt, fully linted), excludes only M-status touches of historical files. Re-entry trigger recorded in the comment, measurable: when 'npx markdownlint-cli2 .claude/orchestrator-prompts' reports zero, drop the filter. Awk filter unit-tested against synthetic A/M/R/non-md input. MINOR — principle 43 anti-tautology wrote its stripped copy INSIDE the real population dir (litter risk on mid-test failure): now mutates in tmpdir with a finally-cleanup; timeout 120_000 added (its find can spawn the runner hundreds of times on a non-compliant corpus). MINOR — comment precision: 342 tracked family files at retrofit (auditor's independent count), not 349. Verified: principle 43 4/4, sweep 26/26 (diff mode). * fix(hooks): host-verify retrofit B6 — pre-push §8 lychee legacy-corpus carve-out (A/M split) The push of the retrofit surfaced the same structural class the pre-commit markdownlint arm hit: §8 checks EVERY link in EVERY changed *.md, and the orchestrator-prompts back-catalog carries 101 pre-existing offline errors (links to since-moved targets — e.g. .github/workflows/discipline-self-check.yml resolved from the wrong base; gitignored drafts/ scratch; machine-local ~/… paths; one doubled .claude/.claude relative path). All 101 pre-date the retrofit; the touching commit introduces zero links. Fix mirrors the pre-commit markdownlint arm's A/M split exactly (one carve-out pattern, two gates): orchestrator-prompts *.md enter the lychee set only when git status A (newly authored — fully checked); M/R-status touches of legacy files are excluded. utils/git.ts gains getAddedFiles() (diff-filter=A via the existing parseNameStatus) reused by the section. Re-entry trigger recorded in the comment, measurable: when 'lychee --offline .claude/orchestrator-prompts' reports zero, drop the filter. No consumer-twin sync needed: the shipped husky-pre-push.sh template does not carry §8 (verified: zero lychee references). tsc clean; pre-push consumer-layout suite 32/32 (the §3 negative arm still guards the gate lives on consumer-owned md). * chore(install-sh): host-verify retrofit B7 — regenerate snapshot baselines for B6's shipped-file edits B6 edited two shipped files (packages/core/hooks/pre-push.ts §8 carve-out, packages/core/hooks/utils/git.ts getAddedFiles) without regenerating the fingerprints — the byte-identical battery (all 4 stacks × greenfield/brownfield) went RED on CI exactly as designed. SNAPSHOT_MODE=capture diff reviewed: only the two expected hash lines per baseline (fe4242205c0… pre-push.ts, 3a1b55973f… git.ts), matching the hashes CI computed — no other shipped byte moved. Sweep after B6 was skipped by me; this is the FRS S2 lesson repeated. * chore(install-sh): host-verify retrofit B8 — merge-forward staging + recapture refresh-baseline hashes staging moved under the PR (#1503 consumer-refresh-integrity R1 added the .ai-factory/refresh-baseline.json manifest + its baseline lines; #1504 R4; #1505 barrel fix). The PR merge-ref mixed my B6 hooks with staging's R1 manifest: the installed manifest hashes the shipped files, so B6's pre-push.ts/git.ts edits change its bytes — CI computed the new manifest hashes (7a39d960…/0b204c85…/34eb550e…/59008f53…), staging's baselines still carried the pre-B6 ones. merge origin/staging (clean, no conflicts) + SNAPSHOT_MODE=capture on the merged tree: diff is exactly the 4 refresh-baseline hash lines × 8 npm baselines, matching what CI's install computes — no other shipped byte moved. --------- Co-authored-by: Test <test@example.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Closes
umbrella-donemd-backfill:done.mdfor both umbrella dirs per CLAUDE.md «Umbrella closure convention», plus the closure measurement asreport.md§9.Stage 2 is dropped, not deferred. Report §5 proposes zero OBSOLETE-CANDIDATE rows, so the operator-confirmation queue the stage exists to drain is empty.
The umbrella's premise is disproved by measurement, not by argument. Re-ran
priority-score.shagainst the live panel at HEADee4c3ee03(post-#1117):kickoff=missing— never reach classificationkickoff=exists)basis=done-md, 9jaccard, 1branch)The kickoff's «~99 open umbrellas» was
287 dirs − 187 done.mdcomputed over all directories; the panel counts umbrellas carrying akickoff.md. The real figure was 55 both before and after this umbrella ran.Net effect of Stage 1's 12
done.md: zero, verified 12/12. Every target dir emits<name> kickoff=missingand the line terminates — no status field, and the C3done.mdlayer is never consulted (priority-score.sh:177-192, pre-filter at:139). Mechanically incapable of helping, which is exactly theKICKOFF-AMBIGUOUSthe cold fidelity auditor raised at Round 1.The
done.mdconvention itself is vindicated, not indicted: 183 of the 193 closures rest on it. The error was where it was applied.Incidental finding — T-UDB-C fires inside the C2 layer
Before this closure the panel already reported both dirs DONE on false evidence:
PR #1107 is this umbrella's own kickoff-authoring PR; #1109 is an unrelated marker fix. The jaccard title-overlap layer reproduces exactly the defect trap T-UDB-C names — «a PR-title slug match is not closure evidence» — so the trap is not only a human-reasoning hazard. These two
done.mdfiles replace the false match with real evidence, and the:139pre-filter now short-circuits both dirs before the expensive C2 pass runs.Handed to follow-up (not fixed here)
KICKOFF-AMBIGUOUS) — future backfill kickoffs must scope the population to kickoff-bearing dirs or declare documentation-only intent.shipped-artifact-liveness-gap*5,install-*4,getff-*4,beta-*3, plusplan-currency-reconcile-*,r2-*,preset-react-*pairs).Test plan
done.mdschema conformance for both files (# <name> — DONE,Final PR:,Closed:,Summary:)priority-score.shre-run atee4c3ee03→rc=0, 366 lines; all 12 Stage-1 dirs verified emittingkickoff=missingindividuallystate.mdcleared ofPENDING|TODO|AWAITINGmarkers → the syntheticumbrella-donemd-backfill-meta-launch-state-pendingcandidate no longer firesmarkdownlint-cli2clean;report.md249 lines (≤600 gate)§1.7 Skipped: this PR writes two
done.mdfiles and appends a measurement appendix to a report, all under.claude/orchestrator-prompts/**— outside the §1.7 discipline-file set, with no rule, principle, skill, agent, template, or CLAUDE.md surface introduced or extended, so no forward/backward discipline sweep applies.Fidelity verdict
FIDELITY: skipped — non-stage PR; an umbrella-closure record plus a measurement appendix, produced in-session with no aif substrate and no factory stage output whose WHAT could be audited against a spec