…ords its mutation (#2829)
Three of five ejections on the 2026-09-15 merge train — the third train
running — were tests that prove the code was written rather than that it
runs: source-text regexes over the module under test (#2811), a bound
check at the one value where both bounds coincide (#2817), a docstring
claim about CI never negative-controlled (#2805). All green.
- docs/testing/STRATEGY.md: a new "Evidence bar for a test" section beside
the harness bar — the three spellings, the two greps (the live-consumer
grep is the one that decides), guard-vs-source-only with the train's own
pair (#2819 kept, #2811 ejected, same shape), mutation as the fix
standard, bound tests away from the coincidence — each with what
enforces it.
- .github/pull_request_template.md: a Testing checkbox for "every new test
executes the changed path" and a `Mutation:` line naming the test(s)
that go red with the fix reverted ("n/a — not a fix" otherwise). The
trailing space after the colon matches the existing `Journey Impact:`
line — a fill-in prompt.
- docs/memory/learnings.md: the class, with the prior occurrences.
The skill half — /review Step 2.5 and /validate-pr §5.4 answered first
and in writing, /implement's two done-criteria — is trinity-dev#29.
Fixes #2829
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VpvcfgWkmQPD7DrDLmATTf
Summary
The public half of #2829. Three of five ejections on the 2026-09-15 merge train — the third train running — were tests that prove the code was written rather than that it runs: source-text regexes over the module under test (#2811), a bound check at the one value where both bounds coincide (#2817), a docstring claim about CI never negative-controlled (#2805). All green CI. The question that caught all three lived only in
/merge-trainPhase 2.The issue's four directions, split by where they live:
/validate-prand/review/validate-pr§5.4 and/reviewStep 2.5, answered before the checklist with a report block;/implementgains two done-criteriaMutation:line +STRATEGY.md; enforced by/review(a fix with no red mutation is CRITICAL)refis conclusiveSTRATEGY.md+ both skillsSTRATEGY.md+ both skillsChanges
docs/testing/STRATEGY.md— new section Evidence bar for a test — it executes the path, beside the harness bar: the three spellings with the train's own examples; the two greps, stating that the live-consumer grep is the one that decides ("definition + test only" is the finding); guard-vs-source-only with the train's own pair — feat(ci): status-needs-fix label clears on the author's push — unaddressed findings become queue-visible (#2815) #2819 was six substring matches and was correctly kept because Actions itself is its consumer, fix(session): one platform credential, one 401 verdict, one handler (#2791) #2811 was the same shape over a module nothing imports and was correctly ejected; mutation as the fix standard; bound tests. Each rule names what enforces it..github/pull_request_template.md— a Testing checkbox ("every new test executes the changed path…") and aMutation:line forfix:PRs naming the test(s) that go red with the fix reverted ("n/a — not a fix" otherwise). Same fill-in shape asJourney Impact:;test_2350_journey_impact.pystill passes.docs/memory/learnings.md— the class as apatternentry, with the prior occurrences (feat(workspace): an unread reply shows on the agent's row and in the tab title (ent#557) #2648, fix(subscriptions): a rate-limited turn completes on another subscription (#2638) #2645, feat(canvas): delete, pin, search and a stated bound for the canvas pile (ent#553) #2619) and the near-miss that shows the discriminator.Test Plan
test_2350_journey_impact.py(reads the template) — greentest_2338_journey_catalog.py— greenfix:PR carries aMutation:line;/validate-prreports it under Execution coverageMutation: n/a — docs and process
Journey Impact: none: documentation and PR-template only, touches no journey promise
Fixes #2829
🤖 Generated with Claude Code
https://claude.ai/code/session_01VpvcfgWkmQPD7DrDLmATTf