refactor!: carry out the simplification audit across gates, tests, plugins and docs #135
Reference in New Issue
Block a user
Delete Branch "docs/simplification-audit"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
This PR started as a read-only audit of what could be removed, merged or shrunk. It now carries out that audit too. The record is at
docs/notes/simplification-audit-2026-09.md, and every finding is closed at its own note: done, refuted, declined or not proceeding. The one exception is 22, which is deferred along with the rest ofbin.72 commits · 563 files · +9,960 / −37,916
⚠️ Breaking changes
skill-audit+agent-audit→factory-audit(ADR-0025, kyberforge2.0.0). Callers that name either old skill need updating..pre-commit-hooks.yamlcontract is retired. Three published hook ids are gone:kyberforge-vale-audit-skill,kyberforge-vale-audit-agentandkyberforge-skill-size-check. Consumers pinned to a tag up tov2.0.1keep working; anyone onrev: mainbreaks on their next pull..mcp.jsonfiles are removed. #66 needs re-scoping, and open PR #132 conflicts with this change.mattpocock-skillsremote entry are removed.0.5.0.bin,git,gitea,coreandlinteach get a patch bump.What changed
Gates and tests
check-manifests,check-release-needed,check-vale-style-sync,validate-plugins,check-plugin-content-sync,check-marketplace-mirror-syncandapm-marketplace-check— along with their sync scripts.skill-frontmatteris folded intoskill-size-check, which now sources the shared boundary resolver.check-skill-version-bumpis a pre-push gate. It requires ametadata.versionbump on every changed skill, checked against both the merge-base and theorigin/maintip (ADR-0022).echo | grep -qpipefail races, and made the runners' worktree exclusion work when the repo is itself a Claude worktree.apm and session start
version:anddescription:lines from rootapm.yml(ADR-0021)..claude/apm-hooks.jsonsidecar. Without it, a freshapm installduplicated theSessionStartentry and failedapm audit --ci. The same bug exists onmain.apm.lock.yaml. ADR-0019 now records the hazard of refreshing on a feature branch.Docs and prose
LESSONS.md,CONTEXT.md,gates.mdand the ADR narration. Duplicated structure and stack descriptions are merged into one place.HUMANS.mdpath in always-on governance.ai-constitution.mdnow deploys withcore, so the governance pointer resolves.Verification
main(audit §12). The full suite and every hook passed at55221d0. Their fixes landed afterwards.run-tests.sh --strict: 19 passed, 0 skipped, 0 failed atbaa2f5d.Declined in review
These are in audit §12:
(ADR-0023)tags stay, becausecheck-rtk-prefixrequires them.Review follow-up
The review comment on this PR was validated finding by finding, and four further commits landed on the branch:
ea119d8(six gate and test findings),3920dfa(skill content, plus version bumps for git-branches, git-commits and gitea-prs),82b7bbc(docs, the audit-note corrections and most nits) and1614bce(the version-blind correction extended togates.mdand, as a dated correction note, to ADR-0019).Two findings and three nits were refuted rather than fixed — the folded-scalar routing-target rule was never lost, the HOTL/Sycophancy removal was recorded as audit finding 31, and the apm override really does win silently. The finding-by-finding outcome, with the evidence for each refutation, is in the validation comment on this PR.
Follow-ups not in this PR
.mcp.jsontarget is gone. Close or re-scope PR #132 as well.LESSONS.mdentry ("read at session start" is only a hope) is not tracked anywhere.Merge note
A
.apm/edit reaches consumers only once it is onmain(ADR-0019). Until this merges, sessions keep running the old skill names.The
!in this PR's title will not reachmainon its own. Only620f20bcarries a!or aBREAKING CHANGE:marker in its own commit message, and this repo merges PRs with a merge commit whose subject isMerge pull request '<title>' (#N). Unless the merge commit message is set by hand torefactor!: ...with aBREAKING CHANGE:footer listing all five breaks above,main's history will not record this as a breaking change.Resolves #101 (closed early; see the issue comment)
Refs #66
Refs #94: no hook-authoring support was added. The
forgeline saying hooks have no route is byte-identical at the merge base, so it is not a change this branch made.🤖 Generated with Claude Code
Finding 30 of the simplification audit. 41 entries had grown to 255 lines; 10 described a write-skill / write-eval bootstrap workflow whose skills no longer exist in this repo, and the longest entries ran 200-550 words of incident narrative for a one-line lesson. Deleted the 10 stale entries. Kept 3 same-dated ones (RLHF defaults, secrets-rule gap, HITL gap) whose content is unrelated to the defunct workflow and still applies. Removed one open-work entry ("neither part landed", about CONTEXT.md not being @import-ed at session start) rather than filing it as a tracker issue -- not turned into an issue, just dropped; the audit's own commit history and this repo's session transcript carry the detail if it's wanted later. Compressed the remaining 30 entries to roughly 60-90 words each. 255 -> 131 lines, 41 -> 30 entries. Refs: SIMPLIFICATION-AUDIT.md finding 30 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YR2CjVumUbEGWcMikcoXBDe647f14f11b6455ceecho | grep -qwith here-strings ffcbed6c41docs: add simplification audit of hooks, tests, plugins, and proseto refactor!: carry out the simplification audit across gates, tests, plugins and docsIndependent review of this branch (against
docs/notes/simplification-audit-2026-09.mdand this PR body)Seven read-only reviewers went over the diff against
main(a712f2c...e62188c), each in a scratch clone, plus a reconciliation pass checking the audit note and PR body against the diff and against Gitea. Full suite, hooks and apm packaging were re-executed. Summary below; nothing here was fixed, only found.Verdict
The branch does what the audit says it does, and the verification claims hold. Nothing found blocks the merge. There are three content regressions from the trimming, three test-coverage gaps left by the deletions, and a cluster of stale doc/PR-body claims. All are small fixes.
What was independently verified
Every "done" finding is present at HEAD; every declined/refuted/deferred finding was left untouched (bin,
docs/research, the provenance chain,forge,grill-me,lint-runner, all 25 ADR lengths). All 56 commit hashes cited in the audit note exist and are reachable except the ones it already annotates as unreachable.run-tests.sh --strictrun-bats.shapm installmainapm audit --cifails. Fixed on branch: one entry, audit passesfactory-auditpresent, old audit skills absent, no.mcp.jsongeneratedfactory-auditvalidators vs both old validatorscheck-skill-version-bump.shmutation testFindings
Content regressions from the trimming
retrofit.md. The deleted file carried "never let a hyphenated routing target wrap across lines in a folded scalar", which the boundary resolver enforces and which brokegitea-labels-milestonesin issue #100.baa2f5drestored only the cut order, not this rule. Neitherskill-authornoragent-authormentions it now.config.example.jsonand the config-read steps, butbranch-operations.md:11,branch-patterns.md:12,orchestrator-contract.md:16,create-commit.md:12andgit-orchestrate.agent.md:45still tell the agent to take the base branch, scope or workflow from the config.test-governance-layer.shasserted CONTEXT.md defines HOTL and Sycophancy. Both are gone from CONTEXT.md but still used in the constitution and VISION.md. Human call, not a defect either way.Test coverage the deletions left behind
test-skill-frontmatter.sh. Mutating the missing-version check to a no-op leaves all five ADR-0020 suites green.test-vale-hooks-consumer.shran one fixture per rule and demanded an alert. RewritingCompositionNote.ymlto match nothing leavestest-vale-wrap.shat 63/63 passed. That rule shipped dead once before, which is why the guard existed.run-tests.sh --strictexits 0 on zero discovered suites. Pre-existing, but it's the exact silent-green failure mode the branch's worktree fix repaired, and the fix proves discovery works rather than that its failure would be noticed.run-bats.shhas the guard;run-tests.shdoes not.Documentation defects
61b0b9cat lines 49/391 — reachable equivalent620f20b;484357aat line 220, exists only on a rescue branch). Line 49 tells the reader to run agit showthat fails on a fresh clone.architecture.md:78points at a LESSONS.md entry this branch deleted; the PR notes the entry is untracked but not that this pointer now dangles.architecture.md:90still calls ADR-0015/0017 "the two compilers" and treats 0017 as live, contradicting line 47 of the same file and 0017's own superseded banner.apm-workflow/references/configure.md:38-41.gates.mdis stale in four places: wrong file named for the ADR-0020 constants (406-411), wrong exclude-alternation count forpretty-format-json(1093-1097), self-contradictory contract-suite counts (425-426), and "two copies" of the resolver where there's now one (1133).apm-audit-ci's hook description says apm verifies "exactly two things"; it runs five, and one fails in any fresh clone untilapm installhas run — so "every hook passed" and "pushing without a network" both presuppose a completed install.PR body
e4ed343) that's already in this PR..pre-commit-hooks.yamlretirement (three published hook ids) should be listed under Breaking changes, not just "What changed." Existing tag pins keep working;rev: mainconsumers break.check-marketplace-mirror-syncandapm-marketplace-checkare missing from the list.forgenow says hooks have no route" is not a branch change — that sentence is byte-identical at the merge base.!/BREAKING CHANGE:marker, andmainmerges via merge commit, so the PR title'srefactor!:won't reach history unless the merge commit carries it too.Audit note self-contradictions still live at HEAD: line 26 ("back to 27/9" vs. 26/8 everywhere else), lines 228/416/419 (stale line numbers and a stale line count for
skill-size-check.sh), line 546 (bats/README counts stale since the ADR-0025 merge — 5 skills/16 paths now, not 6/17), line 607 (bolded "do not runapm update" not reconciled with the later branch-aware guidance).Gate edge cases (non-blocking): a criss-cross-merge false positive in
check-skill-version-bump.sh(reproduced with a fixture, not in the documented gaps);check-apm-current.shdefaults to literalmainwhenorigin/HEADis unset, mis-advising amaster-default repo; the rootapm.ymlcomment onexecutables.allowversioning is factually wrong for apm 0.28.0 (grants are version-blind) but predates this branch.On the lock file: a fresh clone +
apm installon this branch deploysskill-audit/agent-auditand the obsidian server, because the committed lock (byte-identical tomain's) pins a commit 9 behindmain's tip — expected per ADR-0019, not a branch defect, but worth noting that the two apm pre-push hooks therefore validate pre-branch content. The consumer install pinned directly to HEAD deployed correctly (factory-auditpresent, no.mcp.json).Nits (grouped, no action required for merge):
README.md:15still says "sync scripts";AGENTS.md:24/CONTEXT.md:174still hedge on native installs at user scope;architecture.md:28and CONTEXT.md list MCP servers andcommands/instructions/extensionsdirs that don't exist;plugins/kyberforge/bin/README.md:7points at.mcp.json/${CLAUDE_PLUGIN_ROOT}; ADR-0021:87 cites the deletedcheck-manifests.sh;gitea-prsis the one gitea skill whose 404 guidance contradicts the 404-masks-403 rule normalised elsewhere; apm-workflow's "silently wins" is actually a verbose-level diagnostic;run-tests.sh:224-227's comment describes a deleted suite; theskill-size-checkhook description doesn't mention the frontmatter check; open issues #121, #124, #102, #9, #116 cite paths/gates this branch renamed or deleted; 22 of 38 skills exceed the 250-char description target (ADR-0020 backlog, not a gate failure).Not covered
Docs prose wasn't Vale-linted (the repo's only
.vale.inimatches skill/agent files, so a run overdocs/scans zero files). The multi-ref-push gap in the version-bump gate wasn't reproduced end-to-end (documented, not disputed). "Every hook passed at55221d0" was verified at HEAD, not at that exact commit.Review validation outcome
Follow-up to the review comment of 2026-09-16 (comment 2578). Every numbered finding, audit-note contradiction, gate edge case and nit from that comment was checked by six validation agents, and four commits then landed on the branch. This records the outcome finding by finding.
Attribution, up front: this is model-produced validation of a model-produced review. The refutations below are the load-bearing part — they are the places where the original review was wrong and the code was already right. Treat the "confirmed" rows as ordinary fixes and read the "refuted" rows closely.
The four commits
ea119d8fix(gates): B1, B2, #4, #5, #6, N93920dfafix(skills): #2, N6, N4; version bumps git-branches1.0.5, git-commits0.1.7, gitea-prs0.1.582b7bbcdocs: #7, #8, #9, #10, #11a–d, #12, A1–A4, the finding-31 "true orphans" wording, N1, N3, N5, N8, B3; skill-author1.0.31614bcedocs: the version-blind correction extended togates.md'scheck-executables-allow-syncsection and, as a dated correction note, to ADR-0019Confirmed and fixed
3920dfa)tests/test-adr0020-frontmatter.sh(ea119d8)test-vale-wrap.shcase 35 now discovers every Kyberforge Vale rule and requires a fixture that raises it (ea119d8)run-tests.shpassed on zero discovered suitesea119d8)620f20band598a7c3(82b7bbc)LESSONS.mdpointer82b7bbc)architecture.mdmissing ADR-0015 / ADR-0024 entry points82b7bbc)apm-workflow/references/configure.mdas the standing rule; correction note added atADR-0015:93(82b7bbc)gates.mdinaccuracies82b7bbc)apm installhas run" (82b7bbc)check-skill-version-bump.shfalse failure on a criss-cross mergegit merge-base --all(ea119d8)check-apm-current.shwithorigin/HEADunsetea119d8)apm.ymlcomment82b7bbc)82b7bbc)3920dfaand82b7bbc— N6 adds the gitea-prs "a 404 may mean 403" caveat, N4 repoints kyberforgebin/README.mdathooks.json, N9 fixes the skill-size-check hook descriptionWorse than first reported
Three items turned out to be bigger than the review said:
apm audit --ciruns 10 checks on the root manifest, not 2. On a fresh clone it failsdeployed-files-presentwith "303 deployed file(s) missing", and the drift and config-consistency replays clone from the remote, so they are not offline-safe. The AGENTS.md "no network" claim needed qualifying, not just the count.scripts/skill-size-check.shis 509 lines, not the 1,522 the audit note claimed. The note overstated it by 3x.Refuted — not fixed, because the finding was wrong
retrofit.md"skill-author/references/contract.md:78,agent-author/references/contract.md:80, and the SKILL.md template.retrofit.mdwas repeating the rule, not owning it, andtests/test-adr0020-targets.shstill catches the issue #100 case. Nothing was lost; no change made.core/ai-constitution.mddefines both terms itself, so neither is undefined. Only the note's "true orphans" wording was wrong — that phrasing was corrected in82b7bbc. The removal stands.0.28.0the overrideBuildDiagnosticis constructed but never rendered:BuildReport.diagnosticshas no consumer, and_render_marketplace_resultiterates warnings only. On a fixture where the override demonstrably fired,apm pack,apm pack -vandAPM_LOG_LEVEL=DEBUG apm pack -vall printed nothing. "Silently wins" is accurate; the skill text is deliberately unchanged.Deferred and untouched
bin, as the PR description already says.Process notes
e62188c, so the diff shown above the fold does not yet include them.Co-Authored-By: Claude Opus 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01NwD8Egs5r4ndqeFLmhusX2
Independent review round, with fixes applied
Six read-only reviewers went over this branch against
mainat1614bce, one per area: the gate scripts, test-suite integrity, dangling references, plugin content, docs and ADRs, and governance/security/hygiene. Each was told to only report what is still broken at HEAD, since §11 and §12 already record three prior rounds.Note up front, as the last round did: this is model-produced review of a model-produced branch. The reproductions and mutation proofs are the load-bearing part; the prose judgements are weaker.
What reproduced clean
Every verification claim in the PR body held independently:
run-tests.sh --strict19 passed / 0 skipped / 0 failed, 378 bats tests,apm audit --ciexit 0 on all 10 checks,pre-commit run --all-filesexit 0, strict fast-forward with no conflicts, no secrets, and no dangling reference across all 369 deleted paths. Thefactory-auditmerge was diffed against both originals and is a complete 1:1 union — every reference file, both Vale configs, both Rule→Dimension tables, both Gotcha sets routed to the correct flow. The audit's §1 figures reproduce byte-for-byte at the commits they are pinned to.Fixed on this branch (4 commits,
8cfd54f..1ec3e8a)Two gate bugs, both reproduced in scratch repos (
8cfd54f):check-skill-version-bumpfailed a push whose skill was byte-identical to main's tip — a cherry-pick or backport had to take a spurious bump or an unneeded rebase. Themerge-base --allintersectionea119d8added covers this only when some base carries the content: true of a criss-cross history, false of a linear one. Now compares tree object ids.baseline: nonewhen the skill was absent at every merge-base but present at the tip, so theFix:line named no version and the author's natural1.0.0bought a second blocked push.ADR-0022 deliberately not amended — the documented behaviour does not change, and
ea119d8set the precedent by fixing the same failure class script-only.Hook wiring was unpinned (
384756b). Deleting thecheck-skill-version-bumpblock from.pre-commit-config.yamlleft the whole suite green; deleting eight blocks at once,run-testsamong them, also left it green. Only 4 of 20 hook ids were pinned anywhere.test-adr0020-contractnow derives the repo-authored hooks from therepo: localentries and pins id,entryandstagesboth directions (29 → 44 assertions). Mutation-checked: removed block, repointedentry, and a hook moved offpre-pusheach go red; arev:bump, a comment edit and reordering stay green.run-bats.shcomputed each file's TAP plan and discarded it (384756b) — a process printing1..10, threeoklines and exit 0 counted as "3 tests, 0 failures" with seven tests silently gone. That is exactly the wrapper-swallows-the-status case the runner's own comment puts in its threat model, where the plan is the only surviving signal. Now enforced.The
1614bceversion-blind correction was incomplete in three places (8cfd54f): the gate script's own header and its operator-facing FAIL message still told the reader deployment was silently broken, andgates.md's hook summary still called it a silent-failure guard, contradicting the corrected text 1,000 lines below. Also found: the old header cited ADR-0019 by heading, and that heading still carries the superseded text with the correction quoted beneath it.Self-contradictions left by the branch's own cuts (
c84f1f4):CONTEXT.mdused the Preload tax and Skill context contract terms — bolded, its own convention for a defined term — after deleting both entries as finding 31. ADR-0024 said 6 skills where ADR-0025 left 5 the next day, and was the only ADR 0025 invalidated without an amendment banner, as was ADR-0016. ADR-0019's1614bcecorrection block was inserted mid-paragraph and swallowed the original's trailing sentence.skill-authorrouted content at the README this branch abolished (1ec3e8a): four reference files still said "move it to the body or toREADME.md" whileskill-file-structure.mdbans non-spec files at the skill root and the line exempting README was deleted here — soskill-authorcreated the file,factory-auditfailed it, and nothing read it.8ce5392fixed the two scripts and missed the prose. Deletingretrofit.mdalso dropped three instructionsbaa2f5ddid not restore, two of whichretrofit.mditself recorded as having no validator behind them.Audit-note bookkeeping (
c84f1f4): two of §12's five open follow-ups were already closed (e4ed343repointed thea8cd5e8citations; #101 closed 2026-09-16, soCloses #101is a no-op), the vale-wrap counts had drifted 63/19 → 65/14 and are now pinned to a commit, and the deleted-suite tally said eight where the diff shows nine.Final state: 19 suites / 378 bats green, full pre-push stage passing,
test-skill-version-bump81 → 89,test-adr0020-contract29 → 44,test-run-bats13 → 14.Left open, deliberately
Governance content has no enforcement.
test-governance-layer.shwas the only thing asserting thatcore/instructions/governance.mdstill contains its five hard prohibitions and that the provider@importwiring exists. Nothing replaced it —test-install.shchecks byte-equality between source and destination, so an emptiedgovernance.mddeploys cleanly and passes every gate. The deletion rationale (prose-grep pinning one-shot migration states as permanent assertions) is sound; the gap is that the trade from weak enforcement to none is recorded nowhere. Two reviewers reached this independently. Not fixed in this round by decision; it needs either a minimal existence/non-empty check or an explicit note accepting the gap.One deviation from convention, flagged
ADR-0024 and ADR-0016 got both an amendment banner and an in-place correction, where the other nine banners leave body text stale. Those two carry wrong statements of present fact in Consequences sections, so a reader skipping the banner is misinformed. Each banner says the body was corrected in place, so nothing is silently rewritten. Easy to flip if strict consistency is preferred.
Merge guidance, unchanged from the PR body's own note
Squash rather than merge-commit. ~20 of the branch's commits are fixups of earlier commits on the same branch — four correcting audit figures, three fixing the version-bump gate, three correcting the apm-only claims, and two restoring content the branch's own trimming deleted. ADRs and spec docs pass through several factually wrong intermediate states, so the history is not review-usable commit-by-commit.
The breaking marker still will not reach
mainon its own. Only620f20bcarries!.4de5b6b(deletes.pre-commit-hooks.yaml, removing three published hook ids) and718c79a(removes nativeclaude plugin install) are both typedchore:. The squash subject needs to be set by hand torefactor!:with aBREAKING CHANGE:footer listing all five breaks.Also worth stating: there are still no formal reviews on this PR — zero approvals, zero requested-changes, no inline comments. This comment is not one either.
🤖 Generated with Claude Code
https://claude.ai/code/session_01NwD8Egs5r4ndqeFLmhusX2
Fourth review round: 49 findings, 5 fix commits
This branch had already been through a seven-agent sweep and two review rounds. This round was structured to catch what those missed: six areas, two independent reviewers each, and a third agent adjudicating wherever the pair disagreed — 18 agents, every finding re-checked by someone who did not raise it.
Result: 49 findings survived adjudication — 16 major, 20 minor, 13 nit. Zero blockers. 4 findings were refuted and dropped. Nothing found breaks the code; the suite was green throughout. Almost every major was the same species: a document stating, as verified, something that does not reproduce.
Fixed
aa6586cdocs(spec): gates.md, architecture.md,.pre-commit-config.yamle849a82fix(gates): the folded-scalar routing gap + three README misroutes44bde9edocs(adr): seven ADRs describing deleted code or absent behaviour9b6f2b1docs(audit): freeze the audit document, strike what was never true4e22c49docs: LESSONS.md and VISION.mdThe one live defect.
boundary_clause_status()tested the arrow regex over the whole description, so one routing clause that parsed suppressed the diagnostic for every other clause. A backticked hyphenated target wrapped across lines in a folded scalar was silently unchecked — no error, exit 0 — whenever a sibling clause parsed. Written bare, the same wrap errors correctly. That is the shape #100 regressed on, andtest-adr0020-targets.shdocumented it with the wrong shape, pinning the case the gate still missed. Now per-clause, with a bats case. Blast radius nil: all 68 routing targets across the 38 skills resolved before and still do — but 26 of 38 descriptions carry more than one arrow clause, so the suppression was live across two thirds of the corpus.Corrections on this branch that made things worse. ADR-0021's 2026-09-14 correction asserted
apm audit --ci"was never a drift gate at all" — it is one, and the claim contradicted this branch's own AGENTS.md and gates.md..pre-commit-config.yamlsaid the hook verifies "exactly two things per manifest" and "does NOT scan for hidden Unicode"; apm 0.28.0 runs ten checks includingcontent-integrity, which does. ADR-0014's correction said restoring.pre-commit-hooks.yamlwould ship a hook that fails for every consumer; pre-commit clones the whole hook repo andBASH_SOURCEresolves into that clone, so it would work.Records describing deleted things. ADR-0022 and ADR-0013 named
skill-frontmatter's hook as the enforcer of mandatorymetadata.version— deleted on this branch. ADR-0022 also enumerated the tip rule's carve-outs as a closed list while the shipped gate has two more (same_subtree, andmerge-base --allwith intersection);8cfd54fsaid "the documented behaviour does not change" — it did. The gate is correct and unchanged; the record was not. ADR-0020's Decision still routed overflow to README.md, the upstream source of what1ec3e8afixed downstream.The audit document is now frozen at
1ec3e8aas a dated record. Three of the last five commits on this branch were figure corrections to it, and correcting it moves the line counts it reports about itself. Freezing covers staleness; it does not cover figures that never reproduced, so four were struck — including §6 finding 33's "all five citations still resolve at HEAD, verified 2026-09-19", which was false when written (improve.md:82stopped carrying the content three days earlier).Refuted, not fixed
Four findings died on adjudication, including one where the on-disk facts were right but the inference wasn't. One more was caught at the last possible stage: a finding claimed apm ships
<skill>/tests/to consumers, making the exclusion's justification false. It does not — five skills carrytests/in source and zerotests/directories exist anywhere in the install output. A fix agent had already acted on it; the verifier refused to take it as measured. The original wording was correct and was restored.Not addressed here
skill-auditpaths this branch deletes. New homes exist underfactory-audit/(skill-file-structure.md:26and:53), so these are citation re-points, not re-scopes.apm.yml.:9-93header citation in ADR-0022's amendment stops mid-block;:9-101is the clean boundary. Cosmetic.Verification
tests/run-tests.sh --strict→ 19 passed, 0 skipped, 0 failed. Bats: 379 tests, 0 failures.pre-commit run --all-files→ all hooks pass (pre-existing ADR-0020 SUGGESTIONs only). Pre-push stage → all 10 hooks pass, includingcheck-skill-version-bump,apm audit --ciandapm pack --check-clean.factory-auditbumped 1.0.2 → 1.0.3.One note on method
The fix pass ran five agents partitioned by write ownership on disjoint files. That was not sufficient: one agent wrote ADR text citing
file:lineinto files another was editing concurrently, so freshly-written correction blocks acquired stale pointers — one landing on a different function. Disjoint writes do not make agents independent when one cites the other. Caught by the verifier, fixed, and 20 citations were then swept (2 wrong, 2 fixed). Worth knowing before the next parallel documentation pass.🤖 Generated with Claude Code
https://claude.ai/code/session_01NwD8Egs5r4ndqeFLmhusX2