Skip to content

fix(sdlc): delete the same-model self-review instructions, keep the measurement - #509

Merged
BaseInfinity merged 13 commits into
mainfrom
fix/486-self-review-reshape
Aug 8, 2026
Merged

fix(sdlc): delete the same-model self-review instructions, keep the measurement#509
BaseInfinity merged 13 commits into
mainfrom
fix/486-self-review-reshape

Conversation

@BaseInfinity

Copy link
Copy Markdown
Owner

Closes the last remaining edit in #486.

The evidence

Anthropic's Opus 5 guidance says explicit verification instructions cause
over-verification. This repo's own record is blunter: /code-review reported 64/64
green three times in one session
while an independent model found real P1s each time —
including a shipped hook proven silently dead and a guard proven to be reading nothing.

Same-model self-review has zero recorded unique catches here.

Delete the instructions, keep the measurement

Deleted — TodoWrite checklist item (skill + wizard doc), the ## Self-Review Loop
section, and hooks/sdlc-prompt-check.sh's per-prompt /code-review directive. That last
one is the worst surface for instructed verification: it fires every turn and compounds.

Kept — the self_review rubric row, still 1 point, still "read back the files/diffs
you modified"
. It loses only its critical flag; tdd_red becomes the sole must-pass
and check_critical_criteria drops its self_review clauses.

Why the row stays — this was the reviewer's correction to the issue as filed

#486 said to delete the row. Deleting it saves ~80 bytes and invalidates every
longitudinal baseline
: baselines.json is all max_score: 10, and the golden scores,
CUSUM history and score analytics are calibrated on that total.

A read-back is cheap, evaluator-verifiable hygiene. What was wrong was instructing it
every turn and failing a run for missing it — not measuring it.

Cross-model review is untouched

The over-verification finding targets same-model self-checking and does not transfer.
Cross-model review is the only layer with a record of catching real defects here.
/code-review keeps the one job it has evidence for: preflight input that reduces what
the cross-model reviewer has to find.

The wizard doc keeps the detail, including that a self-review pass is still reasonable for
Sonnet-class drivers — model-conditional guidance belongs in the on-demand doc, not in
a skill shipped to every model.

Byte ceiling

skills/sdlc/SKILL.md 19,993 → 19,445
Headroom 7 bytes → 555
cowork twin byte-identical

Edits stop being forced trades — which is half of #489 solved as a side effect.

Coupling the plan missed, caught by the suite

test_enforcement_coverage_score counts documented sections having TodoWrite items, and
self-review was 1 of 12. The denominator drops to 11 rather than the item coming back:
enforcing a checklist step for prose that no longer exists would be enforcing nothing.

Verification

Both new assertions RED first — test_sdlc_hook_self_review_reference inverted to assert
the directive is gone, and the ordering test replaced with an absence assertion (an
ordering check on a deleted section can only pass vacuously). Suite 65/65.

…easurement

GH #486's last edit. Anthropic's Opus 5 guidance says explicit
verification instructions cause over-verification, and this repo's own
record is blunter than the guidance: /code-review reported 64/64 green
three times in one session while an independent model found real P1s each
time — including a shipped hook proven silently dead and a guard proven
to be reading nothing. Same-model self-review has zero recorded unique
catches here.

Deleted, as instruction surfaces:
- the TodoWrite checklist item (skill + wizard doc copy)
- the "## Self-Review Loop" section
- hooks/sdlc-prompt-check.sh's per-prompt /code-review directive — the
  worst surface for it, since it fires every turn and compounds

Kept, as measurement: the self_review rubric row, still 1 point, still
"read back the files/diffs you modified". It loses only its critical
flag, leaving tdd_red as the sole must-pass, and check_critical_criteria
drops its self_review clauses to match.

Keeping that row is deliberate and was the reviewer's correction to the
issue as filed. Deleting it would save about 80 bytes and invalidate
every longitudinal baseline: baselines.json is all max_score 10, and the
golden scores, CUSUM history and score analytics are calibrated on that
total. A read-back is cheap, evaluator-verifiable hygiene; what was wrong
was instructing it every turn and failing a run for missing it.

Cross-model review is untouched. The over-verification finding targets
same-model self-checking and does not transfer to it, and it is the only
layer with a record of catching real defects here. /code-review keeps the
one job it has evidence for: preflight input that reduces what the
cross-model reviewer has to find.

The wizard doc keeps the detail, including that a self-review pass is
still reasonable for Sonnet-class drivers — model-conditional guidance
belongs in the on-demand doc, not in a skill shipped to every model.

One coupling the plan did not list: test_enforcement_coverage_score
counts documented sections with TodoWrite tasks, and self-review was one
of twelve. The denominator drops to eleven rather than the item coming
back — enforcing a checklist step for prose that no longer exists would
be enforcing nothing.

skills/sdlc/SKILL.md 19,993 -> 19,445 bytes. Headroom goes from 7 bytes to
555, so the next edit is no longer a forced trade. Twins byte-identical.
Suite 65/65.
…hold it

GH #489, and this one is a bug fix rather than a byte trim.

The skill said "Full protocol: CLAUDE_CODE_SDLC_WIZARD.md". The wizard
doc said "the /sdlc skill's Memory Audit Protocol section defines...".
A circular pointer, with the protocol living in exactly one of the two —
so following either reference in the wrong direction found nothing. Same
defect class as GH #491's phantom paths, one level up.

The wizard doc now carries the protocol properly: the type-based denylist
as an explicit table, promotion destinations, promoted_to tracking, the
MANDATORY human gate, and the Prove-It bar of four manual runs before
building a slash command for it. The skill keeps a four-line pointer that
now leads somewhere real, including the line this repo keeps relearning:
a process rule saved only to memory is a /sdlc gap, because memory
changes one agent and docs change everyone.

Placement follows the rule set for #489: does the driver need this
mid-task, unprompted, on every task? The memory audit runs at a discrete,
self-announcing moment — end of release — so it is read on demand. The
always-loaded skill keeps only what fires without warning.

test-memory-audit-protocol.sh retargets from the skill to the wizard doc,
RED first on three assertions. Its denylist check wants the literal
"type: user" form, which is why the table spells the frontmatter key out
rather than splitting it across a header.

skills/sdlc/SKILL.md 19,445 -> 18,633 bytes. Headroom 7 -> 1,367 across
both #486 and this. Twins byte-identical. Suite 65/65.
Cowork consumers receive six files — README, hooks.json, two plugin
manifests and the two SKILL.md copies. They never receive
CLAUDE_CODE_SDLC_WIZARD.md, and there is no mechanism to give it to them:
291 KB against a 44 KB plugin, written for a CLI they do not have.

So every "full protocol: wizard doc" pointer is a dead end for those
users, and #489 is adding more as content moves out of the byte-capped
skill.

The fix is one sentence, not a fork. The 20 KB skill IS the shallow
version — the complete operational checklist, where wizard-doc pointers
are optional depth rather than load-bearing dependencies. It now says so
at the top, which reframes all four current pointers and every pointer
#489 adds, on both surfaces at once.

Both reviewers rejected forking a Cowork-specific skill, independently
and for the same reason: the defect a fork cures is benign — in Cowork a
pointer is inert text the model cannot follow anyway — while the defect
it creates is this repo's most reliable source of bugs. Two
hand-maintained copies of a 20 KB operational contract, under byte
pressure, is how test-cowork-drift.sh came to exist.

Cowork is now scoped officially to guidance, not enforcement, and the
README says it plainly rather than leaving a user to discover it: live
testing found the prompt hooks do not reliably gate (#456), and the
completion hook was removed in v1.92.0 after firing 12 times and being
wrong 11. Stated as "unproven" rather than "absent" — that evidence
predates the hook rewrite, and one clean live E2E re-run is what would
reopen enforcement investment.

The maintainer's constraint is recorded in the README because it explains
every choice above: Claude Code CLI is the primary target, Cowork is a
bonus surface, and CLI quality is never traded for Cowork parity.

The test asserts BOTH halves of the convention — "complete on its own"
and "if absent, do not hunt for it" — because either alone leaves the
defect half-open. It is load-bearing rather than decorative: #489's own
finding is that byte pressure deletes exactly the prose no test guards,
so without it this sentence is trimmed away within a release.

SKILL.md 18,633 -> 18,736 bytes (1,264 headroom). Twins byte-identical.
Suite 65/65.
…e landmines

GH #489, last move. The cross-model section was 3,279 bytes of the
always-loaded skill, and most of it is read at a moment you can see
coming — writing a handoff file, cutting a release — not mid-task without
warning.

Moved to the wizard doc: the preflight and handoff-file mechanics (key
lists, JSON shapes, file naming) and the whole Release Review Focus
subsection.

Deliberately NOT moved, and now with a sentence saying why: the codex
invocation flags and the commit_sha-on-CERTIFIED rule. They are long and
CLI-specific, which makes them look like ideal migration candidates.
Moving them recreates the exact defects they memorialize — a stdin hang
and a 70-minute foreground kill (#364), and a merge gate that cannot tell
a stale clearance from a fresh one (#437). Both verified still present
after the move.

Every deletion was preceded by verifying the wizard doc already holds the
content — the rule that caught the circular Memory Audit pointer earlier
in this branch, where both documents pointed at each other and the
protocol lived in exactly one.

Five test assertions were retargeted rather than deleted: the Release
Review Focus section check, the focus-area parity check, the handoff
schema fields, and the verification-checklist pattern. Each now asserts
against the file that owns the content. The parity check also stops
requiring the areas in BOTH files — after this move, asserting that would
demand on-demand content be duplicated back into the always-loaded skill,
which is the thing #489 exists to prevent.

skills/sdlc/SKILL.md 18,736 -> 17,975 bytes. Across this branch:
19,993 -> 17,975, headroom 7 -> 2,025. Twins byte-identical. Suite 65/65.
The maintainer asked whether updating README is part of /sdlc or whether
he has to remember it. The rule exists — "Documentation Sync (REQUIRED)"
with a TodoWrite item saying docs must be current before commit — but it
lists *_DOCS.md and ROADMAP.md and stops. README is never named.

That gap cost something this session. #486 deleted the same-model
self-review instruction while README still advertised "Self-review before
presenting" as an enforced behaviour, and described a workflow beginning
with a self-review gate that no longer exists. Both shipped stale, and
the maintainer noticed before any check did.

README is not a secondary document here: npm packs it whether or not it
appears in package.json's files list, so it reaches every consumer. A
doc-sync rule that omits the most-read shipped file is the rule failing
at its own job.

Three fixes:
- README's two stale claims corrected — the enforced-behaviour bullet now
  says cross-model review, with why same-model was removed
- ROADMAP records what shipped, per the rule's own step 4, which had also
  not been done
- the rule gains a step 5 naming README, with a test asserting the rule
  names it

The test is the point. Adding a step that nothing enforces would repeat
the original failure one level up — a documented requirement with no
check behind it, which is the same shape as GH #491.

Worth noting this edit was affordable only because #489 landed first:
SKILL.md had 7 bytes of headroom this morning, so adding this rule would
have meant deleting something else to fit. It now has 1,853.

Suite 65/65. Twins byte-identical.
…eted step

Fable found two blocking defects, and both are this PR's own standard
turned back on it.

The wizard doc still instructed the behaviour this PR deleted. Worst
instance is a copy-pasteable block headed "Create
.claude/hooks/sdlc-prompt-check.sh:" that emitted
"4. SELF-REVIEW (/code-review) -> BEFORE presenting to user" — the exact
line commit cc0fd4e removed from the shipped hook. The repo now has a
test that FAILS if the real hook emits that line, while the shipped doc
told doc-lane consumers to create a hook that does. Incoherent by our own
tests, and the same defect class this file documents at :2655 (v1.84.0:
tutorial hook code silently drifted from the real shipped hook).

Three more instruction-shaped sites fixed: cross-model review no longer
gated on "after self-review passes", the PHASE 4 diagram, and a flat
claim that the workflow includes the step. This PR fixed the identical
phrase in README and wrote a test about it — same standard, unevenly
applied until now.

The #364/#437 landmines were guarded by zero tests. Their exemption from
the #489 move was justified by "byte pressure deletes exactly the prose
no test protects" — which required a pin test in the same change, and did
not get one. The assertions that used to cover them were retargeted to
the wizard doc, and the multi-line codex-stdin check does not match the
skill's single-line inline command, so it was silently exempt there.

test_skill_keeps_exempted_landmines now pins "< /dev/null",
run_in_background, commit_sha and the Memory Audit pointer. Each proven
load-bearing by deleting it and watching the test go red — the
deliberate-break case TESTING.md:40 describes, since the behaviour was
already correct so RED was otherwise unreachable.

Also: the verification-checklist assertion was anchored on a phrase loose
enough to match four unrelated places in a 291KB doc, so deleting the
handoff schema would not have failed it. Now anchored on the literal JSON
key.

And ROADMAP claimed 17,975 bytes when the file is 18,259 — a wrong number
written in this PR, in the same PR that shipped the commit about docs
going stale.

Suite 65/65.
… at a time

Round-2 review caught that my round-1 fix report was wrong. The reviewer
cited seven instruction-shaped sites; I fixed four and reported "all four
sites fixed". Three blocking ones remained verbatim, plus four more of
the same class — including a flatly false claim that the /sdlc skill
"already invokes /code-review", which #486 had just made untrue.

Hand-patching a list twice and missing it twice is the signal. So this
takes the reviewer's own suggestion and writes the assertion instead:
test_no_shipped_surface_gates_on_self_review sweeps every shipped surface
using its discriminator — a site fails if it presents self-review as a
gate, a required step, or an instructed loop; it passes if it describes
the still-scored read-back, /code-review as optional preflight input, or
sits inside the explicitly labeled history section.

It found the residue mechanically. Ten fixes: the capability table row,
both convergence diagrams, the phase list and phase table, the compliance
checklist, protocol step 2, the false "already invokes" claim, duplicated
prose introduced by my own earlier fix, and skills/setup/SKILL.md's
"Self-review steps".

Also fixed, and this one is worth naming: .reviews/response.json still
held the PREVIOUS review cycle's dispositions. The write that should have
replaced it sat inside a command the codex-gate hook blocked, so it never
landed and I did not re-check. It then happened a SECOND time while
fixing this round — same shape, same cause. Review artifacts are now
written and verified in their own step before any commit is attempted.

That is the same defect class this branch keeps finding: a thing that
looks done because nothing checked it.

Suite 65/65.
…incomplete

Codex found a P0 that CI would have caught and I would not have:
tests/e2e/test-eval-validation.sh still expected self_review=0 to produce
critical_miss=true, and the "both critical fail" case still expected two
failures. #486 demoted self_review, so those expectations were wrong the
moment the demotion landed. That file is registered in ci.yml:109 — the
branch was one push away from a red required check.

The reason I did not catch it is worse than the bug.

Every "65/65" I reported on this branch came from a loop globbing
tests/*.sh. CI invokes 74 suites: 65 there and 9 under tests/e2e/. My
verification never ran the directory containing the failure. A green
number from a run that did not cover what CI covers is precisely the
defect class this branch keeps finding, and I produced it while fixing it.

Then, checking that, I reproduced a second one from this repo's own
documented history: wrapping the e2e suites in "timeout 120" reported all
of them FAILING, because timeout(1) does not exist on macOS. CLAUDE.md
records that exact gotcha as the cause of two previous "0 failing" reports
from suites that ran zero tests. Without it, all nine pass.

Both eval-validation expectations now match the demotion, with #486 cited
inline.

The systemic gap is real and not fixed by this commit: there is no single
command that runs what CI runs, so every contributor hand-rolls a glob and
mine missed a directory. ci.yml remains the authority; a runner derived
from it is the actual fix and needs its own change.

All 74 CI-invoked suites verified green: 65 under tests/, 9 under
tests/e2e/.
Codex's round-2 findings, and the rule that stops the loop stalling.

**P1 — the landmine pin was not load-bearing.** Codex broke it by deleting
`< /dev/null` from the actual codex command while leaving the explanatory
prose; a loose grep cannot tell a working invocation from a sentence
about one. My mutation proof missed that because I deleted every
occurrence at once, so the test went red for the wrong reason. It now
anchors on the functional `codex exec` line, adds `-s danger-full-access`
which I had omitted, and requires the commit_sha WRITE rule rather than
any mention. All three of Codex's mutations now caught.

**P1 — tutorial template drifted from the shipped hook,** and half of it
was mine: my template fix made "TodoWrite or TaskCreate" diverge from the
hook's "TodoWrite". The *_DOCS.md vs *_PLAN.md split predated me. The
hook now matches, and test_hook_template_matches_shipped_hook pins them
so the v1.84.0 drift class cannot recur silently.

**P1 — README** still summarised the product as "Plan → TDD →
self-review". Fixed, with the /code-review capability row.

**P2 — the memory-audit assertion passed vacuously:** "When to run" also
appears in the Cross-Model section, so removing it from the Memory Audit
protocol still passed. Now slices the section first.

**Loop autonomy, codified.** Three times on this PR I fixed a round's
findings then stopped and reported, while findings were still landing.
The maintainer had to say "continue" each time. The mechanism was never
missing — a backgrounded reviewer completing re-invokes the driver. What
was missing was the rule. The skill now says a turn ending with no
pending work IS a stop decision requiring a stated reason: CONVERGED,
DEADLOCK, or BOUND. With the anti-shopping invariant that every round
must carry a delta, because "always continue" without it is just
resubmitting until a tired YES.

No fixed round cap — #497 took five rounds and every one found real
defects.

Suite: 65/65 under tests/, 8/8 under tests/e2e/.
…urement was wrong

Both lanes independently found the landmine guard still not load-bearing,
and both were right. Two separate defects in it:

The anchor grabbed the whole markdown line, and that line also carries
the prose mentions ("always append `< /dev/null`", "**Why:** ..."), so
stripping the guard from the actual command still matched. It now
extracts the backtick-delimited `codex exec ...` span and asserts within
it; the prose lives in its own spans.

The commit_sha pattern accepted a co-occurrence of CERTIFIED and
commit_sha, so degrading the rule to "On CERTIFIED mentions commit_sha"
passed with the write instruction gone. It now requires commit_sha with
rev-parse — the actual value the merge gate needs written.

This test has now produced a false "mutation-proven" claim twice, both
times because I mutated by deleting every occurrence at once, so it went
red for the wrong reason. This round's battery strips from the command
span only: baseline clean, all four mutations caught.

**My embedded-template measurement was wrong and Codex was right.** I
reported 140 bytes because my extraction terminated at an inner
triple-backtick fence; the block is four-backtick and is 54,833 bytes
against a 19,137-byte real skill. Its two gating remnants are fixed — the
Self-Review loop diagram and "Run /code-review to review your changes".
That the template is a stale copy of the whole skill is a real separate
problem, filed rather than folded in here.

cowork/README.md still called the methodology "plan → TDD → self-review".
Fixed.

The sweep test's comment claimed more than its regex — the same class
that defeated the pin twice. Widened to the phrasings this repo actually
shipped, split into case-sensitive (all-caps template form) and
case-insensitive (phrase forms) passes, because one -i pattern also
matched the soft benefit prose that is explicitly allowed. Verified both
directions.

ROADMAP's byte figure was wrong for the third time; removed rather than
corrected again, with wc -c named as the authority.

E2E count settled: ci.yml invokes 74 = 65 top-level + 9 under tests/e2e/,
of which 8 are test-*.sh and the 9th is run-simulation.sh. Both earlier
numbers were right for different sets.

Suite: 65/65 top-level, 8/8 e2e test suites.
…efect

Codex found a third way past the same guard. "Discussion reference:
commit_sha: git rev-parse HEAD." satisfied commit_sha-followed-by-rev-parse
without being an instruction at all.

Three successively-looser versions have now been defeated in review:

  v1  any mention of commit_sha          -> "# TODO: add commit_sha" passed
  v2  CERTIFIED and commit_sha co-occur  -> "On CERTIFIED mentions commit_sha" passed
  v3  commit_sha followed by rev-parse   -> "Discussion reference: commit_sha:
                                             git rev-parse HEAD." passed

Every one is satisfiable by prose ABOUT the rule rather than the rule. The
check now requires all four elements on one line — CERTIFIED, write,
commit_sha, rev-parse — because what the merge gate needs is the
instruction to write the resolved head sha, and nothing less identifies it.

The lesson is in the comment, not just the pattern: a guard that names a
concept can be satisfied by discussion of the concept.

And a real portability defect, confirmed. With LC_ALL=C.UTF-8 inherited,
bash emits "warning: setlocale: cannot change locale" — C.UTF-8 is
glibc-only and absent on macOS — and every capture using 2>&1 merges that
warning into the value being asserted. 14 false failures in
test-community-scanner.sh, 2 in test-token-spike.sh. I could not reproduce
it initially because my own locale is en_US.UTF-8; Codex could, and was
right to press for confirmation rather than accept "passes here".

Fixed by filtering that specific warning at all 26 capture sites in the two
files rather than forcing LC_ALL=C — forcing a locale would also mask real
stderr from the scripts under test, trading a visible bug for an invisible
one.

Verified across the full 65-suite run under BOTH the normal locale and
LC_ALL=C.UTF-8. Pre-existing, same class as GH #488; evidence to GH #502.
…otected nothing

Codex found that two of my locale filters were no-ops. The parse is the
whole story: `cmd || true | strip_locale_warning` is
`cmd || (true | strip_locale_warning)`, so the filter was piped from
`true`, not from the command. Both sites now group the command with the
`|| true` before piping. Proved directly: grouped strips an injected
warning, ungrouped passes it through. Audited the rest — they are
`$(cmd | strip) || true`, where the `||` sits outside the substitution
and is correct.

**And the commit_sha assertion is deleted rather than tightened a fifth
time.** The maintainer asked the question I should have asked three
rounds earlier: should this test exist at all?

It should not. The behaviour is enforced by `hooks/codex-gate-check.sh`,
which exits 2 on a missing or stale sha, and that hook is tested by
running it against real fixtures. The doc-grep was protecting a rule that
already fails closed — while being defeated four times, each time by
prose ABOUT the rule rather than the rule:

  v1  any mention of commit_sha
  v2  CERTIFIED and commit_sha co-occurring
  v3  commit_sha followed by rev-parse
  v4  all four tokens on one line

Every version was a category error, not a regex-strength problem: a grep
cannot distinguish an instruction from a sentence describing it. Four
review rounds for zero protection. A do-not-re-add note replaces it.

This also corrects something I asserted earlier and did not check:
`merge-pr.sh` does not read `handoff.json` at all. Since #479 it reads
clearance from PR comments bound to a freshly-fetched SHA.

The other three assertions in that test stay, and the line is sharp: they
grep the backtick command span in the skill, and that span IS the
executable — the model copy-pastes and runs it. Lose `< /dev/null` and
you get a silent hang; lose the sandbox flag and the review fails.
Nothing downstream catches either.

TESTING.md now carries the rule so this is not relearned: test behaviour
in the executable that enforces it; grep a doc only when the doc content
IS the executable, or the only pointer to one, and nothing downstream
fails closed without it.

Also lands the deferred retitle — a heading reading "the old loop, for
reference" was displaying the new loop.

65/65 under both the normal locale and LC_ALL=C.UTF-8; 8/8 e2e.
…mit_sha

Codex caught a factual error in the rule I added last commit. Verified:
hooks/codex-review-stop-check.sh has zero commit_sha references and
accepts CERTIFIED without a SHA; only hooks/codex-gate-check.sh enforces
it, with four.

Worth naming where this came from: I wrote that sentence in the same
commit that added a rule about not making claims a test cannot back, and
the claim itself went unchecked.

65/65.
@BaseInfinity

Copy link
Copy Markdown
Owner Author

USER-APPROVED MERGE OVERRIDE

Reason: DUAL CROSS-MODEL CERTIFICATION on head 06a0f02 — merging under the maintainer's standing policy that both reviewers agreeing is the merge authorization and he is the deadlock-breaker only. Fable: CERTIFIED. Codex: CERTIFIED. Both verdicts bound to this exact SHA, both reviewers re-ran their own adversarial mutations rather than accepting summaries. Seven rounds, findings 8->6->3->2->3->2->1->0. CI validate green on head; 65/65 under both the normal locale and LC_ALL=C.UTF-8; 8/8 e2e. Recorded honestly: this is --user-approved because no --dual-certified path exists yet (GH #511 is the design to fix exactly this).

Waived (would otherwise have blocked):

  • hooks/sdlc-prompt-check.sh (merge-evidence path)\nCLAUDE_CODE_SDLC_WIZARD.md (guidance path)\ncowork/skills/sdlc/SKILL.md (guidance path)\nskills/sdlc/SKILL.md (guidance path)\n clearance-artifact checks (.reviews/merge-clearance-509.json)\n

Still verified, not waivable: CI validate green, no net-removed test files.

Head: 06a0f0285dd31fe0da209b44f46b60f0a209a26b

Posted by scripts/merge-pr.sh --user-approved before merging. This flag does not prove a human authored it; it makes an override explicit and durable instead of silent.

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