docs(kickoffs): correct three falsified container-reachability claims, back a fourth with its probe - #1345
Merged
Merged
Conversation
…, back a fourth with its probe A cold backward sweep over negative-existence claims in `.claude/orchestrator-prompts/**`, `docs/meta-factory/research-patches/**`, `docs/superpowers/**` and `.claude/rules/*.md` (845 claim-lines / 431 files, 31 examined) surfaced five GAP-FOUND items. Each is re-measured here against the live `aif-handoff-agent-1`, not against the sweep's numbers. Every falsified claim shares one shape: a negative-existence claim about the DESTINATION environment, inferred from how the container is assembled rather than probed on the running container, then frozen behind a «Verified <date>» stamp carrying no re-verification trigger. Original wording is struck in place, not deleted — these are dispatch inputs and their history is the evidence that the shape recurs. - `meta-orchestrator-refactor/kickoff.md` §4c — «Superpowers plugins NOT available» is false. `docker inspect` returns 8 mounts, two of them for plugins: `/host_mnt/Users/art/.claude/plugins → /home/node/.claude/plugins` AND `→ /Users/art/.claude/plugins`, the second mirroring the host-absolute path so `installed_plugins.json`'s `installPath` resolves verbatim. Measured inside: superpowers 6.2.0, 14 `SKILL.md`. The same row's `~/.claude/skills/` half was wrong in the other column too — `orchestrator/` and `reviewer/` exist on neither side. - Same file §4c — «`audit-plan.md` NOT reachable» is false, and it was load-bearing. The premise half holds (`git check-ignore -v` → `.gitignore:16`, so it is genuinely not in the clone); the conclusion does not — CANON is a bind mount and `docker exec … ls` lists the file (33372 B). The steering it fed (§4c «CC session is the RECOMMENDED runner», plus a workaround prescribing inlining or temporarily committing a gitignored file) is WITHDRAWN, not re-decided: the umbrella closed 2026-06-03 (PR #399), so no live runner choice exists, and picking one from a corrected fact-base would repeat the error in the other direction. What changes is its value as precedent. - `token-economy-research-s-b/kickoff.md` §2 — «that path does not exist in the aif container» is false: 102 project dirs, 934 `.jsonl`. Correcting it without a caveat would have been the same laziness, so the caveat is stated — `/home/node/.claude` is the `aif-handoff_claude-auth` volume, the dir names are container paths, and those transcripts are the container's own worker sessions, a different population from the 247 host operator sessions §2 profiles. §2's binding INCONCLUSIVE grammar is unchanged. - Same file §0 — «`claude-code-guide` NOT available (operator-verified precedent)» is false. It is a built-in agent inside the container's own CLI: `grep -ao` over `/usr/local/lib/node_modules/@anthropic-ai/claude-code/bin/claude.exe` (v2.1.218) returns its definition with `source:"built-in"`, `baseDir:"built-in"`, `model:"haiku"`. Egress works too (`docs.claude.com` → 301, `api.anthropic.com` → 404). The paired INCONCLUSIVE fallback stands. - `getff-freshness-widening-meta-launch/kickoff.md` §1 — `.ai-factory/rules-decisions.md` «does not exist» is TRUE and re-verified; it was the only line in its T3 anchor block with no citation while every neighbour had one. Command + output added. The first file additionally gains a `host-verify: none` opt-out — it predates `destination-environment-verification.md` and the edit-time gate blocks any edit without one; the umbrella is closed, so the honest declaration is «no executable deliverable left to gate», not a fabricated contract. Verified on the host: `markdownlint-cli2` 0 errors over all three; `vitest run packages/core/principles/12-ai-laziness-traps.test.ts` 7/7; `scripts/host-verify.sh --list` exit 0 for both umbrellas that own a contract. Not done here, deliberately (one concern per PR): `destination-environment-verification.md` gates the POSITIVE direction only — whether a kickoff declares a host-verify contract — and nothing gates the NEGATIVE «the container cannot reach X». That is a rule change, surfaced not autopiloted. Sweep coverage was 31/845 claim-lines (3.7%), which is «coverage insufficient to conclude», not «class clean» — ~107 lines of the high-risk destination-environment sub-stratum are unexamined. Prior-art: skipped — documentation only; corrects falsified facts in three existing kickoffs and adds no capability, no dependency, and no new module.
artyhoo
added a commit
that referenced
this pull request
Aug 9, 2026
… — a doc citation is not a probe (#1347) §1 gates one direction: does a kickoff declare what must pass on the host. Nothing gated the opposite claim — «X is NOT available in the container», «that path does not exist there» — and measured over the same surface, that is where the falsified statements actually live. Six of them, across four umbrellas, now recorded as §2b with the probe that falsified each: - «container lacks ast-grep (no network)» → `npm view @ast-grep/cli` → 0.44.0, `curl` → 200 - «container lacks ~/.claude/projects, /context, live CC» → 746 .jsonl (arch-v2 FORK C) - «Superpowers plugins NOT available» → `docker inspect` → 8 mounts, two of them for plugins - «audit-plan.md NOT reachable» → `docker exec … ls` lists it, 33372 B - «that path does not exist in the aif container» → 102 dirs, 934 .jsonl - «claude-code-guide NOT available (operator-verified precedent)» → compiled into the container's own CLI as `source:"built-in"` Rows 1-2 were caught independently by the umbrellas that owned them, months apart; rows 3-6 by the cold sweep in #1345. What they share is not carelessness about whether to cite — rows 3 and 6 both cite something. It is carelessness about what a citation can establish. Row 3 cited `runtime-bridge-setup.md:40`, a doc that described how the runtime was assembled, while the mount set had moved underneath it. §1b's load-bearing sentence is therefore: a primary-doc citation is not a probe of the environment. Cite the doc for why it should be so; cite the probe for that it is so. Rows 3-4 also inferred not-reachable from not-in-the-clone, which `git check-ignore` cannot answer — it is a question about the repository, not the environment. An own-stack analog exists and is promoted rather than reinvented: `arch-v2-context-pipeline-s-e/kickoff.md:257` T-SE-B already told its executor that «container-unreachable claims carry a primary-doc citation or park». §1b corrects it — the primary-doc citation is the insufficient case, not the sufficient one — and row 3 is the evidence. Deliberately NOT a gate, and the verdict is measured rather than argued. A candidate detector was built and replayed against the six claims in pre-correction wording, 15 curated conditional/defensive negatives, and the live 115-line stratum: recall 4/6 (both misses structural — one claim names the destination only in a table column header two rows up), 0/15 on the curated negatives, and 54/115 fired in the wild against ~6 real defects, precision ~11%. The noise is a category mix, not a tuning artefact: error-code enums (`'unavailable'|'quota_exceeded'`), counter-measures against this very trap, already-corrected records, deliberate graceful-degradation design, and claims about a repo rather than the container. Flagging half a surface to catch two-thirds of six defects is `#gate-where-judgment-needed`. §5 records the numbers and a re-gate trigger keyed to claim FORM (three incidents stated in a structured slot a parser can address), never to a flag count. Three ad-hoc domain T-traps of this shape (T-SE-B, T-AIP-B, T-SH-A) meet ai-laziness-traps.md §5's promotion criterion. Not promoted here: that catalogue is a different rule with a coupled anti-drift gate (principle 35 quotes the digest verbatim), so it is a separate change with a separate owner. Recorded as GAP-FOUND in the backward-check. Verified on the host: principles 353 passed / 1 skipped (37 files); markdownlint 0 errors; rule index + AGENTS.md region regenerated via `render-rule-index.mjs --write`; every cited file:line opened and quoted. Prior-art: skipped — documentation only; widens the scope of an existing rule whose own SSOT entry is #229, reuses this file's existing edit-time injection marker, and adds no module, no dependency, and no gate. §1.7: forward-check applied — channel picked on the detectability axis from a measurement, not an assertion (rule-enforcement-channel-selection.md §1; recall 4/6, 54/115 wild firings recorded in §5); deterministic bash only, zero API calls (no-paid-llm-in-ci.md); paths: and <!-- globs: --> unchanged and still identical (principle 31, 21/21); no new .md file so no new doc-authority surface (doc-authority-hierarchy.md §2, principle 09 green); BFR — no new capability, reuses this file's own injection marker, SSOT #229 is this contract's entry and its scope widens rather than forks; own-stack-first RAN and found T-SE-B at arch-v2-context-pipeline-s-e/kickoff.md:257, which §1b promotes and corrects rather than reinvents. backward-check sweep — class = negative-existence claims about live destination state in a dispatch input; (a) .claude/orchestrator-prompts/** GAP-FOUND x6, all enumerated in §2b; (b) the three ad-hoc domain T-traps T-SE-B / T-AIP-B (multi-model-pipeline-pilot/kickoff.md:123) / T-SH-A (arch-v2-context-pipeline-s-h/kickoff.md:178) GAP-FOUND, deliberately not closed — ai-laziness-traps.md §5 promotion belongs to a different rule with a coupled anti-drift gate (principle 35); (c) phase-research-coverage.md §1 SWEPT-CLEAN — owns negative-existence claims generally, §1b instantiates and points upward; (d) attention-is-not-a-mechanism.md §1 SWEPT-CLEAN — the frozen «Verified» stamp is #hope-as-gate, answered with a stated re-verification probe; (e) kickoff-staging-placement.md SWEPT-CLEAN — same path scope, orthogonal concern. Co-authored-by: Test <test@example.com>
artyhoo
added a commit
that referenced
this pull request
Aug 9, 2026
…s EVALUATED-and-routed, not un-noticed (#1348) Three wave-specific T-additions of adjacent shape sit in closed kickoffs — T-SE-B (observation-by-assumption), T-AIP-B (registered-in-repo != wired-in-container), T-SH-A (pricing-by-assumption). Anyone recounting them against §5's «2+ wave-specific T-additions of one failure mode -> abstract into §2» reaches for a T22. It was considered and declined; without this record the same question re-opens on the next recount, which is how a decided fork becomes recurring work. Declined on three measured grounds, all in the new §5 bullet: 1. Not one failure mode. T-SE-B is a NEGATIVE claim about the environment, T-AIP-B its POSITIVE inverse («registered, therefore wired»), T-SH-A not environment-scoped at all. The only abstraction covering all three degrades to «probe, don't assume» — which is T3. 2. Channel mismatch, in the expensive direction. The class is path-scoped to `.claude/orchestrator-prompts/**`, while `ai-laziness-digest.md` is always-on core (`00-rule-index.md:10`) and principle 35 obliges every new §2 entry to carry a >=60-char verbatim digest line (`35-…test.ts:94-98`, MIN_QUOTE). That is a permanently resident cost for a surface-scoped concern — `#always-on-bloat`. Catalogue is also at 21/25 against §5's own split threshold. 3. The coverage already ships at the right channel: `destination-environment-verification.md §1b` (PR #1347), `paths:`-scoped to exactly that surface, six-incident base, plus the measurement that rejected a gate. All three source umbrellas are closed (2026-07-23, 2026-08-07 ×2), so no live re-invention exists for a promotion to stop. The bullet carries the falsifier rather than leaving the verdict permanent: re-open if a kickoff authored after 2026-08-09 invents its own container-reachability trap despite §1b's edit-time injection — that falsifies the channel argument and the digest cost becomes worth paying. Second change, same concern: T-SE-B's own counter was left stating «container-unreachable claims carry a primary-doc citation or park». §1b establishes that a primary-doc citation is the INSUFFICIENT case, and the falsification is concrete — `meta-orchestrator-refactor` §4c cited `runtime-bridge-setup.md:40` for «Superpowers plugins NOT available» and `docker inspect` returned two plugin mounts. Corrected in place with the original struck (the #1345 treatment), since the umbrella is closed and the file is now a historical record. Verified on the host: principles 12 + 35 + 09 -> 51/51; markdownlint 0 errors over both files; both files well under the 600-line gate (218 / 266). Prior-art: skipped — documentation only; records an already-taken routing decision in an existing rule's §5 and corrects one stale counter, adding no capability, no dependency, no new module. §1.7: forward-check applied — complies with rule-enforcement-channel-selection.md §5 (the decision recorded IS the `#always-on-bloat` avoidance, argued from 00-rule-index.md:10 + principle 35's MIN_QUOTE coupling rather than from taste); no-paid-llm-in-ci.md (prose only, zero API calls); doc-authority-hierarchy.md §2 (no new .md, headers untouched, principle 09 green); ai-laziness-traps.md §5 is this file's own promotion/retirement section, so the edit lands in the section that owns promotion verdicts; no §2 T-block added, so the principle-35 digest coupling is untouched by construction (35/35 green). backward-check sweep — class = a promotion criterion that will be re-evaluated by future readers and needs its prior verdict visible. (a) ai-laziness-traps.md §5 GAP-CLOSED here; (b) the three source kickoffs — T-SE-B corrected in place, T-AIP-B (multi-model-pipeline-pilot/kickoff.md:123) and T-SH-A (arch-v2-context-pipeline-s-h/kickoff.md:178) SWEPT-CLEAN, their counters are not falsified by §1b (one is the positive direction, one is not environment-scoped); (c) destination-environment-verification.md §5 SWEPT-CLEAN — it already records the T-trap family as GAP-FOUND-not-closed, and this commit is the closure that entry anticipated, so the two do not contradict; (d) ai-laziness-digest.md SWEPT-CLEAN — deliberately unchanged, which is the whole point of the verdict. 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.
What
A cold backward sweep over negative-existence claims in
.claude/orchestrator-prompts/**,docs/meta-factory/research-patches/**,docs/superpowers/**and.claude/rules/*.md(845 claim-lines / 431 files, 31 examined) returned five GAP-FOUND items. Each is re-measured here against the liveaif-handoff-agent-1, not carried over from the sweep's numbers. Original wording is struck in place, not deleted — these are dispatch inputs and their history is the evidence that the shape recurs.meta-orchestrator-refactor/kickoff.md§4caudit-plan.md«NOT reachable»token-economy-research-s-b/kickoff.md§2~/.claude/projects/*rules-as-tests-aif*/«does not exist in the aif container»claude-code-guide«NOT available (operator-verified precedent)»getff-freshness-widening-meta-launch/kickoff.md§1.ai-factory/rules-decisions.md«does not exist»Measurements
docker inspect aif-handoff-agent-1 --format '{{range .Mounts}}…'→ 8 mounts, two for plugins:/host_mnt/Users/art/.claude/plugins → /home/node/.claude/pluginsand→ /Users/art/.claude/plugins, the second mirroring the host-absolute path soinstalled_plugins.json'sinstallPathresolves verbatim. Inside: superpowers 6.2.0 (gitCommitSha 3dcbd5c4b4), 14SKILL.md. Same row's~/.claude/skills/half was wrong in the other column too —orchestrator/andreviewer/exist on neither side (host tree isai-docs,design-compare,native-css-responsive,uniq-rewrite).git check-ignore -vresolvesaudit-plan.mdto.gitignore:16, so it is genuinely not in the clone. The conclusion does not: CANON is a bind mount (/host_mnt/Users/art/.claude-coordination → /home/node/.claude-coordination) anddocker exec aif-handoff-agent-1 ls /home/node/.claude-coordination/rules-as-tests-aif/meta-orchestrator-refactorlistsaudit-plan.md(33372 B) first. Not-in-the-clone ≠ not-reachable.ls -d /home/node/.claude/projects/*rules-as-tests-aif*→ 102 dirs;find … -name '*.jsonl'→ 934, newest same-day. Caveat stated rather than swapped in silently:/home/node/.claudeis theaif-handoff_claude-authvolume (not a host bind), dir names are container paths (-home-www-…), so those are the container's own worker sessions — a different population from the 247 host operator sessions §2 profiles. §2's bindingINCONCLUSIVEgrammar is unchanged.grep -aoover/usr/local/lib/node_modules/@anthropic-ai/claude-code/bin/claude.exe(v2.1.218) returns the agent definition carryingsource:"built-in",baseDir:"built-in",model:"haiku". Egress works:docs.claude.com→301,api.anthropic.com→404. The pairedINCONCLUSIVEfallback stands.ls .ai-factory/rules-decisions.md→No such file or directory;ls .ai-factory/→ four JSON files, no markdown ledger.The #2 steering decision — WITHDRAWN, not re-decided
§4c's «CC session is the RECOMMENDED runner» rested on three stated advantages, now measured false (Superpowers: available in both), false on both sides (
orchestrator//reviewer/: absent from the host), and false (audit-plan.md: reachable in both). Its prescribed workaround — inline the plan, or temporarily commit a gitignored dispatch input — was unnecessary the whole time.It is not re-decided: the umbrella closed 2026-06-03 (PR #399,
done.md), so no live runner choice exists, and picking one from a corrected fact-base would repeat the error in the other direction. What the correction changes is the section's value as precedent — the table now carries an explicit re-verification trigger, because it had none.Also in the diff
meta-orchestrator-refactor/kickoff.mdgains ahost-verify: noneopt-out. It predatesdestination-environment-verification.md, and the edit-time gate blocks any edit without one. The umbrella is closed, so the honest declaration is «no executable deliverable left to gate» — not a fabricated contract (#optout-as-reflexavoided by the fact that there is genuinely nothing left to run).Verification (host)
Pre-push suite green (46/46 across 4 files, link-check 21 OK / 0 errors, always-on 31293B within 54000B ceiling).
Not done here, deliberately
PR strategy):destination-environment-verification.mdgates the positive direction only — whether a kickoff declares a host-verify contract. Nothing gates the negative «the container cannot reach X», and none of the four false claims carried a re-verification trigger;meta-orchestrator-refactorwas stamped «Verified 2026-06-03» and froze while the mounts moved underneath it.§1.7 Forward-check applied
Complies with
.claude/rules/destination-environment-verification.md:1§1 — the one file lacking a contract now carries an explicit ≥20-char opt-out at.claude/orchestrator-prompts/meta-orchestrator-refactor/kickoff.md:1rather than silence (#silent-contract-skip), andscripts/host-verify.sh --listexits 0 on both umbrellas. Complies with.claude/rules/ai-laziness-traps.md:1§2 — T3 (every corrected line carries command + output, not prose; e.g. the.gitignore:16resolution behind item #2), T20 (no verdict issued without an evidence-bearing call in the same turn), T14 (3.7%coverage reported as insufficient, never as «class clean»). Complies with.claude/rules/kickoff-staging-placement.md:1§1 — these are tracked kickoffs and this PR is the merge-to-stagingstep that makes the corrections visible to dispatch sessions.CLAUDE.mdArtifact Ownership Contractrespected: no README/EXECUTION-PLAN/PROPOSAL/rules edit, anddocs/meta-factory/prior-art-evaluations.mduntouched (Prior-art: skipped— documentation only).§1.7 Backward-check applied
Class of this change = negative-existence claims about the destination environment, asserted in a dispatch input without a probe of it. Surfaces where that class occurs, enumerated beyond this diff: (a)
.claude/orchestrator-prompts/**— the sweep's population, GAP-FOUND ×4, all in this diff, and the remaining ~107 high-risk lines are declared UNEXAMINED rather than swept-clean; (b).claude/rules/destination-environment-verification.md:20— GAP-FOUND: §1's contract grammar covers only the positive direction, no clause reaches a «cannot reach X» claim; surfaced above, deliberately not fixed here (rule ownership + one concern per PR); (c).claude/rules/attention-is-not-a-mechanism.md:17— SWEPT-CLEAN: the four false claims are precisely its#hope-as-gateshape (detection left to «someone will notice the stamp is old»), and this diff adds a re-verification trigger rather than relying on attention, so the rule is reinforced, not contradicted; (d)packages/core/principles/12-ai-laziness-traps.test.ts:1— SWEPT-CLEAN: 7/7 after the edits, the §3 T-enumeration blocks in all three kickoffs are untouched; (e).claude/rules/kickoff-staging-placement.md:30— SWEPT-CLEAN: same path scope, orthogonal concern (merge timing, not claim truth), nothing superseded.🤖 Generated with Claude Code
Fidelity verdict
FIDELITY: skipped — no dispatch kickoff was implemented here, so there is no kickoff-to-implementation fidelity to audit. This PR corrects falsified facts inside three kickoffs against fresh container measurements; every claim it makes is itself the evidence, quoted in full above.