Uh oh!
There was an error while loading. Please reload this page.
docs(skills): state the ablation-on-dist hazard as a resolution property, not a dogfood one - #9509
Merged
Conversation
The dev-agent definition and the dogfood skill both scoped the "rebuild before you believe an ablation" rule to `packages/qa/dogfood`. The condition is not the suite, it is the resolution path: any test whose subject resolves through the dependency's `exports` (which point at that package's built `dist/`, not `src/`) with no vitest alias redirecting the specifier back to source. That set is already enumerated as `KNOWN_UNALIASED_TEST_IMPORTS` in `scripts/check-test-source-alias.mjs`, and dogfood is one instance of it rather than the definition. Read narrowly, an ablation run in a plain unit suite gets trusted when it proves nothing. Two measured pairs are carried as the shortest possible provenance: `plugin-email` to `platform-objects` (375 passes on an ablated field, 4 red once the dep was rebuilt) and `plugin-auth` to `core`, whose legs existed to prove a new gate can fail. The second shape is why both copies now name it: an un-rebuilt ablation there returns "the gate did not fire", which reads as evidence the gate is broken rather than the harness, and the expensive outcome is weakening a working gate until it fires. Both halves of the mechanical rule are now explicit in both files -- the mutate leg and the restore leg each rebuild and each prove the artifact. The restore half is the one that gets skipped, and a marker left in `dist/` keeps mutated code live for every later run in that worktree. The authority for this framing is the preflight script's own header, which already carries it; these two files were the lagging copies. The script is deliberately untouched here. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Rn7aaamsR99FXRqLcpL99q
This was referenced Aug 18, 2026
hotlong
approved these changes
Aug 18, 2026
os-support-ai
marked this pull request as ready for review
August 18, 2026 06:18
Uh oh!
There was an error while loading. Please reload this page.
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 freeto 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.
Fixes#8949
What changed
Two
.claude/**instruction files stated the "rebuild before you believe an ablation"rule as a property of
packages/qa/dogfood. Both now state it as a property ofresolution, which is what it actually is.
.claude/agents/os-dev.md— the ablation clause in the standing-clauses section,generalized in place (no new section).
.claude/skills/dogfood-verification/SKILL.md— the ablation bullet in section 2,generalized in place (no new section).
The condition, as both copies now state it
Any test whose subject resolves through the dependency's
exports— which point atthat package's built
dist/, notsrc/— with no vitest alias redirecting thespecifier back to source. That set is enumerable and already enumerated:
KNOWN_UNALIASED_TEST_IMPORTSinscripts/check-test-source-alias.mjs.packages/qa/dogfoodis the most familiar instance, not the definition.Two measured pairs are carried as the shortest possible provenance, as mechanism
illustration rather than as the rule body:
plugin-emailtoplatform-objectsplugin-authtocoreThe second pair is the one both files are written around. An un-rebuilt ablation there
does not return a null result — it returns "the gate did not fire", which in that
context reads as evidence the gate is broken rather than the harness. The expensive
outcome is a dev weakening a working gate until it fires, destroying the thing the
ablation was written to certify.
Both halves of the mechanical rule, now explicit in both copies
The restore half is the one that gets skipped: rebuilding after mutating is intuitive,
while remembering that restoring also needs a rebuild before the next measurement
is trustworthy is not. A marker left behind in
dist/keeps mutated code live for everylater suite run in that worktree, so the runs that follow measure the wrong tree.
Scope
scripts/ablation-dist-preflight.mjsis deliberately not touched — that header isthe authority and already carries this framing (landed via PR docs(scripts): state the ablation-on-dist hazard by its true condition, not as a dogfood property #8951); it is [finding] the ablation-on-dist false green is NOT dogfood-only — any package in
KNOWN_UNALIASED_TEST_IMPORTShas it (measured in plugin-email ⇢ platform-objects) #8706'sscope and out of bounds here. These two files were the lagging copies.
packages/qa/dogfood/README.mdstep 4 is the third coupled location and is out ofscope on purpose — it belongs to
packages/qa/dogfood/README.mdstep 4 still prescribes the ablation without the rebuild — the third copy of the procedure, in the lane #8246 could not reach #8366 in thedomain:clilane. That card remainsopen and is not addressed here.
KNOWN_UNALIASED_TEST_IMPORTShas it (measured in plugin-email ⇢ platform-objects) #8706 andis untouched.
Merge path
⛔ Human merge only. Standing maintainer ruling, 2026-08-11:
「所有 skills 的更新和 adr 类似,需要人工审核」. This PR is a draft; no AI seat should
mark it ready, add it to the merge queue, or arm auto-merge. It is awaiting a human
merge, which on GitHub looks identical to "forgotten".
Verification
.claude/**prose only — no package source, no published surface, so no changeset(
skip-changeset).Local gate union, all green at
2cfdd3bfb(the final commit of this branch):pnpm check:doc-authoringpnpm --filter @objectstack/lint run check:doc-formula-expressionspnpm check:skill-frame-syncpnpm check:pm-skill-ratchetos-dev.md341 lines, ceiling 399, headroom 58pnpm check:pm-skill-id-lintos-dev.mdstays at zero issue-ID citationspnpm check:agent-model-declaredos-dev.mddeclaresopuspnpm check:nul-bytesnode scripts/check-adr-merge-approval.mjspnpm check:pm-skill-id-lintwas not in the dispatched gate list; it was picked upby re-deriving the family from the actual diff
(
node scripts/pm/dispatch-gates.mjsover the two changed paths) and is green. Thatre-derivation placed 8 families for this surface and matched no others.
The id-lint gate is why neither file cites an issue number: maintainer ruling
2026-08-12 keeps operative agent-protocol text free of issue-ID dereferences, so the
two measured pairs are named by package pair only.
Generated by Claude Code
Generated by Claude Code