Skip to content

research(companion-reuse): Sub-wave B — omo multi-plan + categories + owner disambig - #250

Merged
artyhoo merged 2 commits into
stagingfrom
research/companion-reuse-omo-deep-dive
May 26, 2026
Merged

research(companion-reuse): Sub-wave B — omo multi-plan + categories + owner disambig#250
artyhoo merged 2 commits into
stagingfrom
research/companion-reuse-omo-deep-dive

Conversation

@artyhoo

@artyhoo artyhoo commented May 26, 2026

Copy link
Copy Markdown
Owner

Summary

§1.7 Forward-check applied

§1.7 Backward-check applied

How to verify

  • Patch file present at docs/meta-factory/research-patches/2026-05-26-companion-reuse-omo-deep-dive.md — 362 lines, sections §0-§8 complete, <!-- scope:companion-reuse-omo-deep-dive --> on line 1
  • Owner disambig completed in §1.5 BEFORE evidence sweep in §2 — gh api raw output verbatim quoted
  • DeepWiki sweep ≥5 phrasings (§2.1-§2.5), all with within-one-project disambiguation — verified by reading query text in patch
  • Match-score revision traceable to DeepWiki excerpts — §3.1 table per-sub-capability, §3.2 per alias routing finding
  • <!-- scope:... --> annotation on first line (principle 10) — confirmed in commit
  • Cold-QA pass performed pre-PR per T19 — 1 finding caught and fixed
  • All 19 principle tests pass on pre-push — confirmed in push output
  • Maintainer reviews verdict + SSOT amendments — owner: maintainer

Scope-out

  • I-phase implementation of any verdict (research-only).
  • Substrate edits (SKILL.md, hooks, templates untouched).
  • SSOT row amendments are PROPOSALS only — apply to prior-art-evaluations.md in a separate maintainer-applied commit.

artyhoo added 2 commits May 26, 2026 22:46
…tegories + owner disambig

Re-evaluates oh-my-openagent multi-plan selection (5-level recency fallback),
Categories System, and 11-agent architecture against corrected within-one-project
scope. First step: disambiguates canonical owner between SSOT #68
(code-yeongyu/oh-my-openagent) and #81 (Doriandarko/oh-my-openagent).

Finding: Doriandarko/oh-my-openagent does not exist (GitHub 404 + DeepWiki 404
confirmed 2026-05-26). Canonical repo is code-yeongyu/oh-my-openagent (59.6k*).
SSOT #81 cites a non-existent owner — flagged for correction.

SSOT #68 match-score revised 30% -> ~50% under corrected within-one-project
framing (T16 muddied-scope fix). New vocabulary: session-plan-affinity recency
algorithm (findRecentSessionPlanPath). SSOT #81 match-score corrected ~60% ->
~30% (omo alias routing is runtime display-name normalization, not static
planning-time vocabulary table). New SSOT row proposed at [next-available-slot]
for session-plan-affinity pattern (ADOPT VOCABULARY, ~85% match).

Corrects T16 muddied-scope trap from 2026-05-23 / 2026-05-26 initial sweeps.

Prior-art: prior-art-evaluations.md#68 (amended: match-score + vocabulary
expansion), prior-art-evaluations.md#81 (amended: repo citation + match-score
correction).
…-dive

Adds <!-- scope:companion-reuse-omo-deep-dive --> on first line per
principle 10 (research-patch-annotation) requirement.

Prior-art: skipped — annotation fix only, no new capability.
@artyhoo
artyhoo merged commit cba88e7 into staging May 26, 2026
22 checks passed
artyhoo added a commit that referenced this pull request Aug 16, 2026
… confounding measured) (#1392)

Authors the S4 dispatch input fresh (kickoff-s1/s2/s3 §8/§5 chain) and flips the
router's S4 row to READY.

Substantive content beyond restating design §4/§5:

- C0 re-measured on the adjudicated corpus: 0.733 accuracy, MATERIAL-miss 0.319,
  scored subset 131/151 (86.8%, above D-K8's ~70% floor). This falsifies the spec's
  own r2 NEW-M4 pre-read («roughly 0.8-0.9») on that pre-read's own stated
  falsifier; §3.3 carries the number, the command, and a re-derive-or-PARK rule.
- §3.6 names a confounding design §5b.1 covers only generically: C1 shares rubric
  and model family with the S2 cold rater whose labels survive on 122/151 rows.
  Mandates a secondary breakdown on the 29-row (25 C0-scored) advisor-override
  slice, with its n≈25 power caveat as part of the requirement, not a footnote.
- §7 deliberately does NOT copy the S2 contract shape — S2 closed with
  `#contract-that-cannot-fail` open against its own lines 2 and 4. Line 1 is arms
  A-F over S4's own deliverables; the S0 frozen-record probe is absorbed into arm F
  (blob-hash immutability of every population/S0/S2/S3 master), which S4 can break.
- Arm E closes W-7 for S4's own report: report numbers are recomputed from the
  artifacts and must match the prose.
- Destination probes re-run 2026-08-16: `gh` IS authenticated in the container now,
  so S2's `cannot-reach-gh` park is NOT a standing fact; promptfoo 0.122.0 reachable;
  aif base clone STALE at 3a10c71. Table carries probe + date per
  destination-environment-verification §1b.
- Domain traps T-TK4-A..D (truth edited to fit the bench, confounded agreement as
  accuracy, bar rebuilt after seeing the candidate, promptfoo adopted by name — the
  last aimed at SSOT #53's existing BUILD verdict for a neighbouring problem class).

Prior-art: skipped — dispatch-input authoring only; no dependency, module, or
capability is added by this commit. The stage's own capability commit (promptfoo
devDependency + Prior-art: trailer + SSOT #250) is specified in kickoff-s4.md §3.1
and lands with S4's implementation, not here.

Co-authored-by: Test <test@example.com>
@artyhoo artyhoo mentioned this pull request Aug 16, 2026
artyhoo added a commit that referenced this pull request Aug 16, 2026
* feat(triage-kernel-v2): S4 capability — promptfoo devDep + SSOT row #250

Stage S4 bench runner (kickoff-s4 §3.1, design D-K3 ratified ADOPT).
promptfoo@0.122.0 pinned as devDependency — matrix/caching runner over an
exec:-shaped provider shelling `claude -p --model sonnet` for C1 (151
per-row) and C2 (41 grouped) vs s3-final.csv. devDependency only; never
enters CI (no-paid-llm-in-ci.md, design §6). SSOT #250 carries the T16
problem-class check vs #53: same tool name, different problem class
(generation-then-grade here vs grade-only-pre-existing-transcripts there),
so the verdicts differ legitimately.

Prior-art: prior-art-evaluations.md#250 (ADOPT — S4 bench runner; T16 class check vs #53 in rationale.)
Prior-art: prior-art-evaluations.md#53 (BUILD — different problem class: transcript scoring without generation; verdict stands.)

* triage-kernel-v2 S4: bench mechanics — promptfoo exec runner, sha-gated bench input, scorer + 8 fail-closed arms

Runner: promptfoo@0.122.0 over an exec provider shelling `claude -p --model sonnet`
(model pinned by name inside provider.mjs — a swap is a PARK, kickoff-s4 §3.4).
Bench input built from the frozen substrate via the frozen buildPayload (judges see
rubric + context + finding only), stamped with its SHA-256 and re-derived by arm H.
Scorer: per-axis stats (copied frozen choose/mcnemar/kappa), two-leg class gate,
confounding slice, C2 delta/cost split, --join for s4-bench.csv, and arms A-H
(blindness differential + token rescan, enums, subset honesty, report-number
reconciliation, substrate blob-hash immutability at 7425346, SSOT #250 wiring,
judge provenance). One recorded parse-refinement incident in run.mjs parseC2Group
doc comment (frozen search-parse semantics; positional keys still reject).

* triage-kernel-v2 S4: results — C1/C2 judge artifacts, s4-bench.csv join, bench report + corpus README §S4

Verdict lines (scorer output, arms A-H green): class n=131 — no layer beats C0
(C1 0.687 p=0.4514 miss 0.351; C2 0.710 p=0.7608 miss 0.266; both DOES-NOT-SHIP,
C0 0.733 stays the bar). Layer n=151 — both candidates beat the 0.530 majority bar
(C1 0.662 p=0.0012; C2 0.642 p=0.0076). Whose n=151 — judgment-only, not
corpus-validated (C1 0.848, C2 0.854 below the degenerate 0.901 bar). Confounding
slice measured (n=25, insufficient power, reported never gated). C2 = delta over C1
(+0.023, inside ±9pp MDD) at 41 vs 151 calls. Spec's C0 pre-read falsification and
the C2 parse-refinement incident recorded in the report.

* fix(triage-kernel-v2): S4 round-1 fidelity rework — arm E reconciles report PROSE, directional leg 1

Cold fidelity audit round 1 (FIDELITY: REVISE vs 1bbff50) — five items, no judge
re-run, no answer-key touch, no artifact regeneration:

1. MAJOR arm E: NUM gains the report-stated keys computed from the existing artifacts
   (class PABAK per candidate, layer multiclass kappa per candidate, discordant b/c
   pairs for every McNemar comparison), and arm E now reconciles the report PROSE in
   addition to the s4-numbers block (block stays the canonical carrier). Boundary-
   anchored match (?<![\d.])v(?!\d|\.\d) so '25' cannot match inside '0.325'/'25.5'
   while a sentence-ending period still matches. Falsified live: a one-digit prose
   edit REDs arm E; restored, green.
2. MINOR arm A(a): per-axis denominators captured inside the per-axis loops from the
   iterated arrays and asserted against the §3.6 populations (class=131 on the scored
   subset, layer=whose=151 on labelable) — a loop switched to the other population is RED.
3. MINOR leg 1 made DIRECTIONAL (PASS requires p<0.05 AND c>b), same rule applied to
   the layer beat phrase; method note added to the report. No verdict changed: both
   class candidates failed leg 1 on p alone.
4. DOC the C2 incident passage now states the actual finding — kickoff §3.5 specified
   no C2 output contract; the frozen S2/C1 search semantics (triage-s0-run.mjs:59)
   were adopted and are ratified; PARK-shaped note recorded for S5. No behaviour change.
5. NOTE regex-divergence recorded (s0-run [a-z]+ vs bench TRIPLE_RE [a-z-]+ layer
   pattern); neither regex changed.

§7 gates green: s4 --check 8/8 arms, s3-agreement --check, 9-arg s2-labels-check,
markdownlint clean (226 lines).

Prior-art: skipped — gate-strength fix + documentation on existing S4 surfaces, no new capability.

* fix(triage-kernel-v2): add <!-- scope: --> annotation to the S4 bench research patch

Principle 10 (packages/core/principles/10-research-patch-annotation.test.ts)
requires every file in docs/meta-factory/research-patches/ to carry a
machine-parseable <!-- scope:<slug> --> comment on its FIRST line; the S4 bench
patch shipped with the H1 heading there, so vitest-principles went RED in the
full local CI sweep (branch-introduced — the file is new in this branch).

Slug triage-kernel-v2-s4-bench, matching the sibling
2026-08-11-triage-kernel-v2-s0-probe.md shape. Content-neutral: two lines
prepended, no prose touched, so arm E of triage-s4-score.mjs is unaffected.

Prior-art: skipped — one-line annotation fix for an existing principle gate, no new capability.

---------

Co-authored-by: Test <test@example.com>
artyhoo added a commit that referenced this pull request Aug 16, 2026
…e axis (7 arms) (#1400)

## Summary

triage-kernel-v2 **S4b — the outcome audit**. For all 151 labelable corpus rows it establishes, from
the live tree and its history, what the repository actually did about each finding, and publishes two
things: a prioritised drift register (the input a repair umbrella consumes) and the outcome axis
inserted into S4's bench patch. Seven fail-closed arms gate it.

Stage kickoff: `.claude/orchestrator-prompts/triage-kernel-v2/kickoff-s4b.md`. Rigor label (L0):
`research-grade`.

## Changes

- `scripts/triage-s4b-outcomes.mjs` — the audit driver plus arms A-G (A completeness + artifact
  registration, B enum/stratum validity, C witness discipline, D raw-join + per-seat provenance,
  E report reconciliation, F substrate immutability by blob hash against `FROZEN_S4 = 'fa8da9406c'`,
  G repair ceiling in both directions).
- `docs/meta-factory/triage-corpus/s4b-outcomes.csv` — the register, 151 rows,
  `id,stratum,outcome,cost,witness,rationale`.
- `docs/meta-factory/triage-corpus/s4b-audit-raw.json` — the seat log: 30 per-group objects carrying
  `group`/`model`/`startedAt`/`rows`, so every register row traces to an auditor line.
- `docs/meta-factory/research-patches/2026-08-16-triage-kernel-v2-s4b-outcome-audit.md` — the drift
  register: probes verbatim, method, per-stratum distribution, the ranked rotted table, the empty
  disagreement table with its mechanical definition, §3.6 limits, traps, self-application.
- `docs/meta-factory/research-patches/2026-08-16-triage-kernel-v2-s4-bench.md` — **only** its reserved
  `## Outcome axis (filled by S4b)` section filled (arm F asserts prefix+tail byte-equality).
- `docs/meta-factory/triage-corpus/README.md` — §S4b section + Files-table rows with `rows=151`.

**Headline:** HOLDS 139/151 (92.1%) · MOVED 8 · NEVER-DONE 3 · DECLINED 1 · **DRIFTED 0** ·
UNVERIFIABLE 0 · `cost=VISIBLE` 0. Survivorship is named, not hidden: the corpus is drawn from
findings on PRs that were reviewed and merged, so a high HOLDS share is a property of the
population, not a grade. `cost=NONE-FOUND` on a MATERIAL row is never read as falsification of the
S3 label (T-TK4b-B) — the disagreement table ships empty and `s3-final.csv` is untouched.

## Prior-art consult

- [x] No capability commit in this PR: no new explicit dependency, no new file ≥80 LOC under
      `packages/`, no new `packages/core/<new-dir>/` file ≥50 LOC. The driver lands in `scripts/`
      and the rest is documentation, so the `Prior-art:` trailer gate does not fire.
- [x] No new capability area surfaced — the stage consumes S4's already-registered SSOT #250
      (promptfoo) and adds none of its own.
- [x] n/a — no existing SSOT entry needed a `Last reviewed` touch.
- [x] n/a — no new capability area, so no context7 pass was owed.

## Test plan

- [x] `node scripts/triage-s4b-outcomes.mjs --check` → PASS, 7/7 arms.
- [x] `node scripts/triage-s4-score.mjs --check` → PASS, 8/8 arms (S4's numbers and frozen artifacts
      unmoved by this stage).
- [x] `node scripts/triage-s3-agreement.mjs --check` → PASS, arms A-F over 151 rows.
- [x] `node scripts/triage-s2-labels-check.mjs …` (union of the six population CSVs + README +
      rubric) → PASS, 6/6 arms — the README `rows=` tokens reconcile.
- [x] `npm run --prefix packages/core test:principles` → 41 files / 390 tests green (this is what
      caught the branch-introduced principle-10 red; see `## Review findings`).
- [x] `bash scripts/run-local-ci-sweep.sh --full` → `SWEEP: 33 gate(s) passed (mode=full)`, exit 0.
      `md-ci-only` is WARN-SKIP by construction (markdown line/dead-link gates are CI-only); the
      `.md → .md` links of every file this PR touches were resolved by hand and all exist.
- [ ] §1.7-свод lands in squash-body.

## Provenance

Stage PR. Kickoff `.claude/orchestrator-prompts/triage-kernel-v2/kickoff-s4b.md`; base
`fa8da9406c` (S4's squash, PR #1397). Substrate: aif-handoff task
`7cd11b76-6c1a-41da-a79d-5161700f6bd2`, branch `feature/triage-kernel-v2-7cd11b`, dispatched from
that kickoff via `packages/runtime-bridge/src/cli/dispatch.ts`. The container worker committed and
stopped per kickoff §9 (`#autonomous-self-egress` containment) — it opened no PR and pushed
nothing; the host session holds the identical three commits, added the principle-10 fix on top, and
pushed all four, so `.husky/pre-push` ran. Audit seats: 30 grouped read-only sub-agents on the
pinned model `sonnet`, 8 dispatch waves, 7 full-group re-dispatches on malformed verdict lines
(never hand-fixed) — logged in `docs/meta-factory/triage-corpus/s4b-audit-raw.json`. Fidelity:
Round 2 (round 1 GO on the container head, round 2 GO on the fix).

## Review findings

Two cold rounds, both dispatched with `agents/fidelity-auditor.md`, each on its own head SHA. No
round-triggering finding in either — no BLOCKER-grade or round-triggering entry was raised, so no
`Failure-scenario:` line is owed; everything below is the notes lane.

**Round 1 (`71872230b0`) — GO.** The seat verified non-vacuity rather than presence: arm D's exact
per-group partition and register-row ⇔ raw-line field equality (`scripts/triage-s4b-outcomes.mjs:294-318`),
arm F's 37-file blob freeze plus the insertion invariant on S4's report (`:405-417`), arm G's converse
direction (`:449-456`), `FROZEN_S4` pinned as a literal (`:28`). It re-verified 11 register witnesses
against the live tree (5 required) — including all three NEVER-DONE rows, whose verdicts stand — and
sampled 8 rationales for non-restatement. Stratum B came back 42 HOLDS + 2 MOVED with **zero**
UNVERIFIABLE, i.e. not batch-verdicted (T-TK4b-D).

Notes-lane items from round 1, none round-triggering:

- `scripts/triage-s4b-outcomes.mjs:454` — arm G's converse exempts `.ai-factory/plans/**`, a
  permitted-set category kickoff §2 does not grant. Inert on this branch: `.gitignore:77` matches
  `/.ai-factory/*`, so no such path can reach `git diff --name-only`. Latent widening, not a live one.
- `scripts/triage-s4b-outcomes.mjs:339` + `:358` — arm E binds only the 10 headline keys, and binds
  them by presence of the value string in prose; the per-stratum §distribution table and the S4
  cross-tab are reconciled block↔recomputation but never prose↔CSV. The seat re-derived both by hand
  from the canonical block and every cell matched — gate strength, not a wrong number.
- `scripts/triage-s4b-outcomes.mjs:251-267` — arm C accepts `path:N-M` and `path:N,M` where §3.8 C
  writes `file.ext:line`. Every token is bounds-checked and the single-file constraint holds, and the
  register discloses the widening in its §method.
- `docs/meta-factory/triage-corpus/s4b-outcomes.csv`, row `1341-r7-6` — the witness span resolves to
  the superseding addendum's heading rather than the `/chat`-routing acceptance a few lines below.
  Right section, imprecise span; the verdict stands. This is the register's own `T-TK4b-E`
  plausible-witness class, named at
  `docs/meta-factory/research-patches/2026-08-16-triage-kernel-v2-s4b-outcome-audit.md:133`.

**Between rounds — one branch-introduced red the stage's own gates cannot see.** The dispatching
session's full local run found `packages/core/principles/10-research-patch-annotation.test.ts` RED:
the new drift register opened with its H1 instead of the required `<!-- scope:<slug> -->` first line.
The stage's §7 host-verify contract runs four triage scripts and none of them reaches the principles
suite, and the diff-mode sweep does not map `docs/meta-factory/research-patches/` onto it — which is
why a GO round could sit on top of it. Fixed in `c86a12d72f` (scope annotation + an MD040 fence tag
the pre-commit markdownlint gate flagged on re-staging); three lines added, none removed.

**Round 2 (`c86a12d72f`) — GO**, narrow delta seat (incremental diff + scope sections + the round-1
watch-list), fresh, not a resume. It verified the delta was scope-neutral instead of taking the
commit message's word for it: a repo-wide grep for a `s4b-outcome-audit.md:<digit>` citation returns
zero hits, so the +2 line shift moves nothing; arm E's `<!-- s4b-numbers` regex is position-independent;
S4's frozen report already carried its own scope annotation, so arm F's prefix equality is untouched.
All eight round-1 rows re-verdicted CLEAN against the current tree, and W-9 was added preventively.

Plan spot-check: 5.

### Watch-list

| id | criterion | why | defect site | reintroduction tell |
| --- | --- | --- | --- | --- |
| W-1 | §3.8 F — `FROZEN_S4` is a literal SHA constant | a dynamic base makes the whole substrate-freeze arm pass by construction on every branch | none — preventive (`scripts/triage-s4b-outcomes.mjs:28`) | `HEAD`, `merge-base`, `process.env`, or a `git rev-parse` on the `FROZEN_S4` assignment |
| W-2 | §3.8 D — register rows are driver-built from raw seat lines, never hand-edited | a hand-patched CSV row is an outcome no seat ever produced, entering a repair umbrella's input | none — preventive (`scripts/triage-s4b-outcomes.mjs:314`) | the field equality loosened to id-only, or the CSV added to a hand-edit path |
| W-3 | §3.8 F — S4's report edit is an INSERTION (prefix AND tail byte-equal) | an append would silently push past `## Self-application (T15)` and the s4-numbers block | none — preventive (`scripts/triage-s4b-outcomes.mjs:405-417`) | the tail comparison dropped, or the next-heading anchor re-pointed to EOF |
| W-4 | §3.8 G — the converse direction (branch diff ⊆ §2 permitted set) | the ceiling is evaded by unregistered repairs, not by declaring six | none — preventive (`scripts/triage-s4b-outcomes.mjs:449-456`) | the `git diff` leg removed, or the permitted list grown without a §2 amendment |
| W-5 | §2 — no permitted-set category the kickoff did not grant | an inert carve-out is the cheapest thing to make live later | `scripts/triage-s4b-outcomes.mjs:454` (inert: `.gitignore:77`) | a second prefix exemption, or this one surviving after `/.ai-factory/*` leaves .gitignore |
| W-6 | §3.8 E — prose numbers bound to the CSV, not merely present in it | the per-stratum table and the S4 cross-tab are what a reader quotes, and they are unbound | `scripts/triage-s4b-outcomes.mjs:339`, `:358` | the headline-key list shrinking, or a new prose table with no canonical key |
| W-7 | §3.8 C — a witness names ONE file and every cited line exists in it | comma-joined multi-file witnesses are how the seats' malformed lines got in (7 re-dispatches) | none — preventive (`scripts/triage-s4b-outcomes.mjs:254`) | the regex gaining a path alternation, or bounds-checking reduced to file existence |
| W-8 | §0 — the answer key is never moved; contradictions are published | resolving a disagreement by editing `s3-final.csv` is the failure the stage exists to avoid | none — preventive (0 disagreement rows) | `s3-final.csv` leaving arm F's freeze list, or appearing in the branch diff |
| W-9 | principle 10 — the register keeps `<!-- scope:… -->` as its literal first line | a later prepend re-reds `packages/core/principles/10-research-patch-annotation.test.ts:34` and is invisible to all seven S4b arms | `docs/meta-factory/research-patches/2026-08-16-triage-kernel-v2-s4b-outcome-audit.md:1` (fixed round 2) | any content — an H1, front-matter, a banner — occupying line 1 |

Round 1: W-1…W-8 CLEAN (established this round).
Round 2: W-1 CLEAN · W-2 CLEAN · W-3 CLEAN · W-4 CLEAN · W-5 CLEAN (inert, notes lane) · W-6 CLEAN · W-7 CLEAN · W-8 CLEAN · W-9 CLEAN (new, preventive)

## Fidelity verdict

FIDELITY: GO
Basis: .claude/orchestrator-prompts/triage-kernel-v2/kickoff-s4b.md
Round: 2
Audited-SHA: c86a12d
Evidence: scripts/triage-s4b-outcomes.mjs:28 — `const FROZEN_S4 = 'fa8da9406c';` pinned as a literal per §3.8 arm F (never HEAD, never merge-base); `node scripts/triage-s4b-outcomes.mjs --check` → PASS, all 7 arms ok; principle 10 green after the delta (packages/core/principles/10-research-patch-annotation.test.ts:34).

## Parked questions

none — no §9 fork fired. The two §3.1/§3.2 re-derivations matched the kickoff's expected
`{A:92, B:44, C:8, D:7}` and `{rows:151, groups:30}` (INFO lines re-emitted on every `--check`
pass), the grouping key was not contested, no row's outcome contradicted `class_final` in the
§3.6 sense (disagreement table empty), the §3.7 repair ceiling was never approached (0/5
eligible — DRIFTED count is 0), and the container clone was verified non-shallow before dispatch.

## §1.7 Self-discipline check (REQUIRED if PR touches discipline-bearing files)

### §1.7 Forward-check applied

Disciplines checked before shipping, each with the artifact that binds it:

- `.claude/rules/attention-is-not-a-mechanism.md` §1 — every load-bearing claim here is a
  deterministic gate, never «a reviewer will notice»: arm D binds each register row to a seat line
  (`scripts/triage-s4b-outcomes.mjs:1` driver, `--check` arm D), arm C re-verifies every witness
  against the live file, arm E recomputes all 49 report numbers from the CSV. The written-but-never-read
  artifact class that S2's arm E and S4's arm H (`scripts/triage-s4-score.mjs:474`) exist for is closed
  one layer down.
- `.claude/rules/effort-worthiness.md` §1/§2 — L0 label `research-grade` is declared in the kickoff
  and honoured: the audit is the irreversible-in-consequence half (a register a repair umbrella will
  trust), while repair itself stays out of scope. §3.7's ceiling of 5 is the L4 budget tripwire; 0 rows
  qualified, so it never fired.
- `.claude/rules/ai-laziness-traps.md` §2 — T1 (no sampling: all 151 rows disposed of by seats),
  T2, T3, T5, T14, T15, T20 governed execution and are enumerated with their evidence in the report's
  §traps section (`docs/meta-factory/research-patches/2026-08-16-triage-kernel-v2-s4b-outcome-audit.md:125`).
- `.claude/rules/language-discipline.md` §1 — driver, register, report and this body are English.
- `CLAUDE.md` `PR strategy` — three NEVER-DONE rows are register-only observations; none was fixed
  drive-by, and the two that sit outside §2's permitted files say so explicitly in the ranked table.

### §1.7 Backward-check applied

Class of this change: **a stage that publishes counts in prose and gates them with its own arms** —
the same W-7 «a stated number drifts from its own file invisibly» class S4 swept. Surfaces
enumerated and verdicted:

- `scripts/triage-s4b-outcomes.mjs` arm E — **SWEPT-CLEAN this PR**: all 49 canonical numbers are
  recomputed from the CSV and matched against the report **text**, which is the exact defect S4's
  round-1 cold seat found in its own arm E (`scripts/triage-s4-score.mjs:424`, fixed there).
- `scripts/triage-s4-score.mjs:474` — CLEAN, re-run green this PR (8/8 arms); its frozen substrate
  is additionally re-frozen by this stage's arm F, which pins `triage-s4-score.mjs` itself — S4's own
  arm F does not (`scripts/triage-s4-score.mjs:437`).
- `scripts/triage-s0-score.mjs:83` and `scripts/triage-s3-agreement.mjs:136` — **GAP-FOUND, still
  open**, inherited from S4's backward-check: neither reconciles any report number. Not fixed here —
  both are frozen substrate for this stage (arm F), so touching them is forbidden by §2, and widening
  reconciliation to sibling stages is outside the umbrella scope. Routed to S5 as an observation.
- `docs/meta-factory/triage-corpus/README.md` — **narrowed this PR**: arm A(c) now asserts that every
  `s4b-*` artifact carries a Files-table row whose `rows=` token matches its real count, closing the
  never-listed half that `scripts/triage-s2-labels-check.mjs:140` structurally cannot see (its loop
  iterates README rows, so an absent row is invisible to it). The listed half stays gated by S2's arm D.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant