Skip to content

docs(umbrella-donemd-backfill): close the umbrella — premise disproved by measurement - #1118

Merged
artyhoo merged 8 commits into
stagingfrom
claude/pipeline-umbrella-donemd-backfill-9394f1
Jul 23, 2026
Merged

docs(umbrella-donemd-backfill): close the umbrella — premise disproved by measurement#1118
artyhoo merged 8 commits into
stagingfrom
claude/pipeline-umbrella-donemd-backfill-9394f1

Conversation

@artyhoo

@artyhoo artyhoo commented Jul 23, 2026

Copy link
Copy Markdown
Owner

Summary

Closes umbrella-donemd-backfill: done.md for both umbrella dirs per CLAUDE.md «Umbrella closure convention», plus 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 umbrella's premise is disproved by measurement, not by argument. Re-ran priority-score.sh against the live panel at HEAD ee4c3ee03 (post-#1117):

bucket count
synthetic candidates (open-questions, code-TODOs — not umbrellas) 78
kickoff=missing — never reach classification 40
real umbrellas (kickoff=exists) 248
├─ classified DONE 193 (183 basis=done-md, 9 jaccard, 1 branch)
└─ open — what the panel shows 55

The kickoff's «~99 open umbrellas» was 287 dirs − 187 done.md computed over all directories; the panel counts umbrellas carrying a kickoff.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=missing and the line terminates — no status field, and the C3 done.md layer is never consulted (priority-score.sh:177-192, pre-filter at :139). Mechanically incapable of helping, which is exactly the KICKOFF-AMBIGUOUS the cold fidelity auditor raised at Round 1.

The done.md convention 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:

umbrella-donemd-backfill … status=DONE done_pr=1107 basis=jaccard score=100%
umbrella-donemd-backfill-meta-launch … status=DONE done_pr=1109 basis=jaccard score=100%

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.md files replace the false match with real evidence, and the :139 pre-filter now short-circuits both dirs before the expensive C2 pass runs.

Handed to follow-up (not fixed here)

  1. Kickoff Goal-vs-population contradiction (auditor's KICKOFF-AMBIGUOUS) — future backfill kickoffs must scope the population to kickoff-bearing dirs or declare documentation-only intent.
  2. The live-signal rule has no squash-merge carve-out — «unmerged branch with commits ahead» literally matches the stale post-squash branch of a landed PR.
  3. Panel readability, if ever wanted, is a grouping problem, not a backfill one: ~22 of the 55 open rows are the fan-out of seven programs (shipped-artifact-liveness-gap* 5, install-* 4, getff-* 4, beta-* 3, plus plan-currency-reconcile-*, r2-*, preset-react-* pairs).

Test plan

  • done.md schema conformance for both files (# <name> — DONE, Final PR:, Closed:, Summary:)
  • priority-score.sh re-run at ee4c3ee03rc=0, 366 lines; all 12 Stage-1 dirs verified emitting kickoff=missing individually
  • state.md cleared of PENDING|TODO|AWAITING markers → the synthetic umbrella-donemd-backfill-meta-launch-state-pending candidate no longer fires
  • markdownlint-cli2 clean; report.md 249 lines (≤600 gate)

§1.7 Skipped: this PR writes two done.md files 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

artyhoo added 8 commits July 23, 2026 23:55
…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
…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
…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
artyhoo merged commit d99e909 into staging Jul 23, 2026
39 checks passed
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant