Conversation
…fix table-cell pipe escape 2 Copilot post-merge findings on PR #1253 (already merged): 1. **P1 expand-from-closure.ts doesn't exist** — referenced as "the mechanizing tool" without marking proposed/not-yet-built. Same class as the courier-ferry-protocol issue caught earlier. Fixed: added "(proposed, not yet built; named in feedback_ skill_flywheel_* as Phase-1b candidate)" qualifier and shifted tense to subjunctive ("would stay stable once shipped"). 2. **P1 table-cell pipe escape** — `ls docs/DECISIONS/ \| grep <pattern>` inside a markdown table cell used `\|` which doesn't copy-paste correctly even though it satisfied table- parser concerns. Rewrote to `find docs/DECISIONS/ -iname "*<pattern>*"` — single-command alternative that avoids the pipe-in-table-cell awkwardness entirely. The pattern this teaches: when a markdown table cell needs to show a pipe-using shell command, use a single-command alternative (find instead of ls|grep) rather than escaping. Escaping satisfies the parser but breaks copy-paste. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR updates a memory entry that documents the repository’s skill-design rules, mainly to clarify that one referenced tool is still only proposed and to rework a markdown-table shell example. It fits into the codebase as maintenance of the shared memory/ corpus that agents rely on for current project conventions.
Changes:
- Marks
tools/backlog/expand-from-closure.tsas proposed/not yet built instead of implying it already exists. - Replaces a markdown-table example that used a piped shell command with a
find-based single-command variant. - Leaves the rest of the skill-design memory intact while tightening wording around repository state.
…ailure-mode corrective (Otto 2026-05-03) After 9 distinct claim-vs-reality drift instances caught across 7 PRs in this session (#1245 #1247 #1248 #1250 #1252 #1253 #1254), the pattern is consistent enough to warrant a named discipline. CARVED RULE — Before stating any fact in substrate (memo / doc / commit message / PR description / shard), verify it empirically. Specifically: before writing "<file> exists" / "<command> returns <X>" / "<table> has <N> rows" / "<tool> ships" / "<ADR> exists" / "<dir> is present" — run the actual ls / grep / count / find command FIRST, then commit the claim. Generalizes existing rules at the broader any-substrate-claim layer: Otto-247 (version-currency) + Otto-364 (search-first authority) + verify-before-deferring + Otto-363 (substrate- or-it-didn't-happen) + assumed-state-vs-actual-state. Scope: - IN: fact-claims about current repo state, command output, file existence, count totals, tool shipped/proposed - OUT: verbatim quotes (preserve typos), hedged speculation, future predictions, normative recommendations Mechanization path: tools/substrate-claim-checker/ TS tool (proposed, not yet built; per Aaron 2026-05-03 no-dynamic- commands rule + Phase-1b backlog candidate). Discipline is manual until tool ships. Worked example: PR #1250 Layer-7 ADR claim ("ls docs/DECISIONS/ | grep returns nothing") — verify-then-claim would have caught this pre-commit by running the command, observing the actual ADR match, and correcting the claim before publishing. Composes with the bugs-per-PR-as-immune-system-health metric: this discipline moves bugs-per-PR closer to single-digit productive zone (currently caught post-merge; should be caught pre-publish). Aarav's B-0169 review predicted this pattern with the worked- examples-need-empirical-grounding framing. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ding memo + #1252/#1253 merged Self-grading from 9 drift instances across 7 PRs in session: the verify-then-claim discipline captures the dominant failure mode for substrate authoring. Mechanization path identified (tools/substrate-claim-checker/ TS tool). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ation semantics Copilot caught: `find docs/DECISIONS/ -iname "*<pattern>*"` is not equivalent to `ls | grep -iE "<pattern>"` because find's -iname only does shell glob, not regex alternation. The worked-example elsewhere uses regex alternation (double.hop|acehack|mirror) which would silently fail under find -iname. Correct fix: use `grep -ilrE "<pattern>" docs/DECISIONS/` which is single-command (no pipe; avoids markdown-table escape awkwardness) AND regex-capable (preserves alternation semantics). Worked example of the verify-then-claim discipline I just landed: I should have run BOTH commands and compared outputs on a sample input before substituting them. The previous fix (replacing pipe with find) substituted syntactic form-equivalence for semantic-equivalence — exactly the class of drift the discipline guards against. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
Both #1255 threads addressed:
|
…m application caught my own drift on #1255 + #1256 opened for #1254 follow-up Even ONE PR after naming the verify-then-claim discipline, drift-from-canonical-convention happened (find vs grep semantic-equivalence; ADR convention drift). Recursive application is the strongest evidence the discipline needs mechanization (TS tool) not just naming. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…s + correct hook semantics Two real Copilot findings on PR #1255: 1. **`\|` in drift catalogue table** — the very memo cataloguing drift contained its own escape-vs-copy-paste drift. Rewrote rows 5 and 7 to describe the search prose-style rather than showing the literal pipe inside markdown table cells. 2. **Pre-commit hook can't validate commit-message claims** — git pre-commit hooks fire BEFORE commit-message exists; they can only check files staged for commit. Updated mechanization path: split into `pre-commit` hook (validates staged-file content), `commit-msg` hook (validates the commit message itself, fires AFTER it's written), and CI check (validates PR descriptions which are authored on the host, not pre-commit). The third Copilot finding (find→grep equivalence on feedback_skills_as_carved_sentences_*) is stale — already fixed in commit 862d190 which is on this branch. Will resolve as "already addressed" when commenting. Both fixes are themselves recursive applications of verify-then- claim: rewriting the drift catalogue uncovers the catalogue's own drift; clarifying hook semantics required actually verifying git's hook ordering (pre-commit fires before commit-msg). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…rift catalogue contained its own drift Catalogue-substrate-drift caught: the memo cataloguing 9 drift instances had its own `\|` table-cell escape drift in 2 catalogue rows + a pre-commit-vs-commit-msg hook semantic error. Recursive failure on the very memo naming the failure mode is the strongest empirical urgency for mechanization (tools/substrate-claim-checker/ TS tool). Manual discipline insufficient. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 70cbf91fab
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| @@ -0,0 +1,105 @@ | |||
| --- | |||
| name: Verify-then-claim discipline — verify every substrate claim empirically BEFORE publishing (Otto 2026-05-03 self-grading; dominant failure mode caught across 7+ PRs this session) | |||
| description: 2026-05-03; Otto self-grading after Copilot caught 9 distinct claim-vs-reality drift instances across 7 PRs (#1245 #1247 #1248 #1250 #1252 #1253 #1254). The dominant failure mode for substrate authoring this session is claim-vs-reality drift — Otto wrote "X exists" / "command returns Y" / "table has N rows" without verifying empirically. The corrective is the verify-then-claim discipline: before stating ANY fact in substrate (file exists, command returns X, row count is N, tool ships, ADR matches, persona dir present), verify by running the actual command / `ls` / `grep` BEFORE writing the claim. Same class as Otto-247 version-currency-always-search-first + Otto-363 substrate-or-it-didn't-happen + verify-before-deferring — but at the more general layer of any-substrate-claim. Mechanization: `tools/substrate-claim-checker/` (proposed, not yet built) that reads a memo / doc / commit message and runs the cited commands to verify; pre-commit hook integration is a future Phase. Until that ships: discipline is manual but the pattern is now named. | |||
| <!-- paired-edit log (NOT the single-slot latest-marker — that lives on line 3 above): PR #986 lands carved-sentence fixed-point stability + Zeta soul-file executor architecture (Infer.NET-style Bayesian inference, NOT LLMs) + carved sentences ≈ formal specs provable in DST + Deepseek CSAP review absorption (Aaron 2026-04-30 → 2026-05-01, eight-message chain across two autonomous-loop ticks per the file body's section header). Architectural disclosure: substrate IS the priors; alignment IS substrate. The single-slot latest-marker on line 3 (forever-home Aaron 2026-05-01) takes precedence as the chronologically-latest paired edit; this PR's work is earlier. --> | ||
| **📌 Fast path: read `CURRENT-aaron.md` and `CURRENT-amara.md` first.** <!-- paired-edit: PR #690 scheduled-workflow-null-result-hygiene-scan tier-1 promotion 2026-04-28 --> These per-maintainer distillations show what's currently in force. Raw memories below are the history; CURRENT files are the projection. (`CURRENT-aaron.md` refreshed 2026-04-28 with sections 26-30 — speculation rule + EVIDENCE-BASED labeling + JVM preference + dependency honesty + threading lineage Albahari/Toub/Fowler + TypeScript/Bun-default discipline.) | ||
|
|
||
| - [**Verify-then-claim discipline — verify every substrate claim empirically BEFORE publishing (Otto 2026-05-03 self-grading; 9 drift instances across 7 PRs this session as empirical evidence)**](feedback_verify_then_claim_discipline_dominant_failure_mode_substrate_authoring_otto_2026_05_03.md) — The dominant failure mode for substrate authoring this session: Otto wrote "X exists" / "command returns Y" / "table has N rows" without verifying. Carved rule: before stating ANY fact in substrate (file exists, command returns X, row count is N, tool shipped, ADR matches, persona dir present), run the actual command first. Generalizes Otto-247 + Otto-364 + verify-before-deferring at the broader any-substrate-claim layer. Mechanization: `tools/substrate-claim-checker/` (proposed, not yet built); manual discipline until shipped. Composes with bugs-per-PR-as-immune-system-health metric. |
| @@ -0,0 +1 @@ | |||
| | 2026-05-03T00:31:00Z | opus-4-7 / autonomous-loop continuation | a2e2cc3a | **#1252 + #1253 merged on main; PR #1255 expanded with verify-then-claim self-grading memo capturing the dominant failure mode of this 2-day session.** Cycle worked: (1) Copilot's 2 post-merge findings on #1253 (expand-from-closure.ts referenced without "proposed" marker; `\|` table-cell escape) addressed in #1255; (2) self-grading memo captures 9 distinct claim-vs-reality drift instances across 7 PRs in this session as empirical evidence for naming the verify-then-claim discipline; (3) carved rule lands at the more-general layer than Otto-247 (version-currency) + Otto-364 (search-first authority) + verify-before-deferring + Otto-363 (substrate-or-it-didn't-happen) — applies to ANY fact-claim about current repo state. Mechanization path identified: `tools/substrate-claim-checker/` TS tool (proposed, not yet built). Manual discipline until tool ships. Composes with bugs-per-PR-as-immune-system-health metric — would move bugs closer to single-digit productive zone by catching drift pre-publish rather than post-merge. The 9-drift evidence catalogue (per-PR, per-instance, with wrong-claim + actual-reality columns) is preserved in the memo body for future skill-creator authoring. Aarav's B-0169 review predicted this pattern with worked-examples-need-empirical-grounding framing. Cron a2e2cc3a still armed. | #1252 (multi-harness future-skill-domain memo) merged b5baf4b5; #1253 (three skill-design rules) merged 6627ff39; #1254 (Layer-7 ADR follow-up) wait-ci, auto-merge armed; #1255 (#1253 post-merge fixes + verify-then-claim self-grading memo) auto-merge armed | This tick teaches the operational pattern of self-grading from accumulated empirical evidence: the 9 drift instances across the session weren't all the same shape but shared one root cause (publishing fact-claims without empirical verification); naming the pattern + cataloguing instances IS the substrate that future-Otto can use to prevent the same drift. The memo body's 9-row table is the dry-run-eval-set for the eventual `tools/substrate-claim-checker/` TS tool: each row is a test case where the tool should fire. | | |||
| @@ -0,0 +1 @@ | |||
| | 2026-05-03T00:37:00Z | opus-4-7 / autonomous-loop continuation | a2e2cc3a | **#1255 BLOCKED-with-green-CI investigation: 3 threads triaged + fixed (drift-catalogue's own `\|` table-cell drift + pre-commit-vs-commit-msg hook semantics + already-fixed-stale-thread).** Cycle worked the BLOCKED-with-green-CI investigate-threads-first discipline + the recursive verify-then-claim discipline applied to itself: (1) the verify-then-claim memo's drift CATALOGUE TABLE contained its own `\|` table-cell escape drift in rows 5 and 7 — exactly the class of drift the catalogue documents; rewrote rows to describe the search prose-style rather than showing literal pipes; (2) the mechanization-path section claimed pre-commit hook would validate commit-message claims, which is empirically wrong per git hook ordering — pre-commit fires BEFORE commit-msg exists; corrected to two-hook architecture (pre-commit for staged-files; commit-msg for the message itself; CI for PR descriptions); (3) third finding (find→grep equivalence) was stale — already fixed in commit 862d190 on this branch. The recursive application IS the worked example: even when documenting drift, the documenting substrate itself drifts. Manual discipline insufficient against trained-prior pull. tools/substrate-claim-checker/ TS tool ships before this cycle stops repeating. Cron a2e2cc3a still armed. | #1255 — 3 threads triaged + fixed (catalogue rewrite + hook semantics correction); auto-merge armed; CI pending; #1256 (#1254 follow-up) wait-ci, auto-merge armed | This tick teaches the operational pattern of catalogue-substrate-drift: when documenting failure modes, the documentation itself can fall into the documented mode. The strongest evidence yet that mechanization (TS tool) is required, not just naming. Composes with verify-then-claim memo (which now records this recursive-failure as part of its own evidence) + the bugs-per-PR-as-immune-system-health metric (recursive failure on the very memo that names the failure mode is the strongest possible signal the metric is detecting real cost). The substrate-claim-checker proposal in the memo's mechanization path now has empirical urgency — manual discipline ALREADY hit its wall. | | |||
| | 5 | `git log -L :func:file` | `bun tools/decision-archaeology/function-archaeology.ts <func> <file>` | | ||
| | 6 | `grep -rlnE "<pattern>" docs/hygiene-history/ticks/` | `bun tools/decision-archaeology/shard-search.ts <pattern>` | | ||
| | 7 | `ls docs/DECISIONS/ \| grep <pattern>` | `bun tools/decision-archaeology/adr-search.ts <pattern>` | | ||
| | 7 | `grep -ilrE "<pattern>" docs/DECISIONS/` (single-command, regex-capable equivalent of `ls .. | grep -iE`; preserves alternation semantics; avoids markdown-table pipe-escape awkwardness) | `bun tools/decision-archaeology/adr-search.ts <pattern>` | |
…onsistency (#1256) * review(pr-1254-postmerge): align ADR supersession convention + path consistency 3 Copilot post-merge findings on PR #1254 (already merged): 1. **P1 ADR supersession convention drift** — recommended `superseded:` / `current_status:` frontmatter marker for the 2026-04-26 sync-drain-plan ADR, but the canonical ADR convention is `> **Superseded by** [link]` blockquote at top (verified in docs/DECISIONS/2026-04-21-router-coherence- claims-vs-complexity.md line 3 + 2026-04-21-router-coherence- v2.md lines 4 + 142). Updated worked example's two instances to recommend the canonical convention. 2. **P1 markdown nested-list trap** — line wrapping with `+ ` at start of continuation line was interpreted as nested unordered list. Reworded the synthesized-answer item #4 to replace the `+ 2026-05-02 abandonment` continuation with "plus the 2026-05-02 abandonment" (no leading `+`). 3. **P2 path inconsistency** — line 178 referenced the memo without `memory/` prefix where line 197 + 372 use the full path. Made consistent. Worked example of the verify-then-claim discipline: substrate authoring should grep canonical conventions in the target directory before recommending alternatives. The ADR convention in docs/DECISIONS/ was empirically verifiable pre-write; I made up an alternative without checking. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * hygiene(tick-history): 2026-05-03T00:34Z — recursive verify-then-claim application caught my own drift on #1255 + #1256 opened for #1254 follow-up Even ONE PR after naming the verify-then-claim discipline, drift-from-canonical-convention happened (find vs grep semantic-equivalence; ADR convention drift). Recursive application is the strongest evidence the discipline needs mechanization (TS tool) not just naming. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * review(pr-1256): path consistency for ADR refs + MD038 lint fix 3 fixes: 1. **P1 ADR citation path consistency** — line 187 mixed fully-qualified `docs/DECISIONS/...router-coherence-claims-vs-complexity.md` with bare `2026-04-21-router-coherence-v2.md` in the same sentence. Standardized to fully-qualified path on both. 2. **P1 ADR citation prefix** — line 320 cited `2026-04-21-router-coherence-claims-vs-complexity.md` without `docs/DECISIONS/` prefix while nearby citations use full path. Added prefix. 3. **MD038 lint fix** — tick shard 0034Z had `\`+ \`` (backticks surrounding plus-then-space), which markdownlint flags as "spaces inside code span elements." Reworded to `leading-\`+\`-then-space continuation-line trap` — preserves the substantive claim (the `+` character at start of line is interpreted as nested unordered list) without trailing space inside the code span. The tick-shard edit is a hygiene fix, not a content revision — the substantive claim is unchanged; only the trailing space inside backticks is removed. Within the append-only-history discipline this is acceptable per the same precedent as typo-fixes on shards. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * hygiene(tick-history): 2026-05-03T00:39Z — #1256 path-consistency + MD038 lint fix; drift count ~14 Path-consistency drift identified as recurring sub-class within claim-vs-reality drift: pick ONE path-form (fully-qualified or bare) per document and apply uniformly. Adds another concrete check to the future tools/substrate-claim-checker/ TS tool spec. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
|
Row-7 finding addressed in follow-up PR #1257:
Resolving thread with cross-reference. |
…ended to 15 instances (#1257) * review(pr-1255-postmerge): row-7 prose-form fix + drift catalogue extended to 15 instances P2 finding on PR #1255 (already merged): my "fix" of row 7 in the skill-design memo (replacing `ls docs/DECISIONS/ | grep -iE` with `grep -ilrE PATTERN docs/DECISIONS/`) was ALSO a semantic-equivalence drift — `grep -r` searches file CONTENTS, not filenames. The original ls|grep searches filenames. Two recursive failures on the same substitution attempt: - First: substituted ls|grep → find -iname (shell glob only) - Second: substituted ls|grep → grep -ilrE (file-content search) Both attempts failed because I claimed semantic-equivalence without empirical verification. Exactly the failure mode the verify-then-claim discipline names; happening on the very memo defining the discipline. Fixes: - Row 7 of the skill-design memo's procedure-table now describes the search in prose ("ADR-filename search by regex pattern") with a NOTE warning against the wrong substitution (`grep -ilrE` searches contents not filenames) - Canonical command pulled OUT of the table cell into a fenced code block below the table — preserves the working command without needing pipe-in-cell escapes Verify-then-claim memo's drift catalogue extended: - Was 9 instances; now 15+ (added #10-#15 covering all in-session drift caught after the memo was authored) - New section: recurring sub-classes (existence-drift, count-drift, semantic-equivalence-drift, empirical-output-drift, convention- drift, path-form-drift, self-recursive-drift) - Updated headline to reflect that 6 of 15 instances landed AFTER the discipline was named — strongest empirical urgency for mechanization Manual discipline insufficient against trained-prior pull. The substrate-claim-checker TS tool is the only path forward. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * hygiene(tick-history): 2026-05-03T00:43Z — double-recursive substitution drift caught; catalogue at 15+ Same substitution attempt (ls|grep → alternative single-command) failed twice in succession. Drift catalogue extended with 7 recurring sub-classes. 6 of 15 instances landed AFTER the verify-then-claim discipline was named — manual discipline insufficient; mechanization required. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
…ist + tool-status across memo 4 substantive findings on PR #1259 (in-flight): 1. **Section heading drift** — "## Empirical evidence (this session, 9+ PRs, 15+ distinct drift instances)" still said "15+" while body table has 20 rows + summary says 20. Updated heading to "20 distinct drift instances". 2. **Carved sentence stale at "9"** — line 115 still said "9 instances caught across 7 PRs". Updated to "20 instances across 9+ PRs" + named that instances #10-#20 landed after discipline-naming + named v0-shipped status. 3. **PR list incorrect** — frontmatter listed `#1247` (not in table) and excluded `#1249, #1257, #1259` (which ARE in table). Corrected to `#1245, #1248/#1249, #1250, #1252, #1253, #1254, #1255, #1256, #1257, #1259`. 4. **"Until tool ships" + "v0 shipped" contradiction** — reorganized §96 to put tool-status FIRST ("v0 shipped covering count-drift; v1+ extends to remaining 6 sub-classes; until v1+ ships covering all 7, the discipline outside count-drift is still manual"). 2 tick-shard findings (0049Z + 0058Z) NOT addressed — tick shards are append-only history preserving agent-belief-at-time. The shards accurately recorded my belief at write-time; the underlying memo is the canonical truth and is fixed in this PR. A note in the next tick shard acknowledges the over-claims. Drift instances #21 + #22 + #23 + #24 (this PR's own findings) are not yet catalogued in the table — they will land in the next sync pass to avoid recursing forever in this PR. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…tmatter + body + MEMORY.md (#1259) * review(pr-1257-postmerge): update verify-then-claim count drift (9→18+) in frontmatter + body + MEMORY.md Copilot post-merge findings on PR #1257 (already merged): the body of verify-then-claim memo says "15+ drift instances" but the FRONTMATTER description and MEMORY.md index entry still say "9 drift instances" — count drift between body and metadata. This is itself drift instance #19 (count drift, sub-class already catalogued). Fixed in three places: 1. **Frontmatter description** updated 9 → 18+, names the PRs covered (#1245-#1256 and counting), names the 7 sub- classes catalogued, sharpens the manual-insufficient framing to reflect post-naming drift. 2. **Body line 91** ("9 drift instances above" → "18+ drift instances above across 7 recurring sub-classes"). 3. **MEMORY.md index entry** updated to reflect 18+ count + 7 sub-classes + manual-insufficient framing + the instances-#10-#18-landed-AFTER-naming evidence. The frontmatter ↔ body drift is itself a recurring sub-class within count-drift: when body content updates but metadata doesn't, the index summary lies. The substrate-claim-checker TS tool spec gets another check: scan frontmatter description + MEMORY.md entry against body content for count consistency. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * hygiene(tick-history): 2026-05-03T00:49Z — frontmatter↔body↔MEMORY.md count drift caught (drift #19) Body said 15+, frontmatter description + MEMORY.md said 9 — count drift across surfaces. Each new tick produces new drift instances even when the discipline cataloguing the drift was authored last tick. Mechanization (substrate-claim-checker TS tool) is the only path. Spec gets another concrete check: cross-surface count consistency. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * review(pr-1259): add table rows #16-#20 to match the "20" count claim Copilot caught: frontmatter description + MEMORY.md said "18+ drift instances" but body table only had 15 rows — opposite- direction count drift introduced by the very PR fixing the prior count drift. **This is itself drift instance #20** — self-recursive count drift; the count-fix introduces new count drift in the opposite direction. Fix: added 6 catalogue rows to the body table (#16-#20) matching the claimed 20-instance count. Body now has 20 rows; all three surfaces (frontmatter description + body table + MEMORY.md index entry) consistent at 20. The 6 new rows document drift instances #16-#20 — including THIS PR's own drift as instance #20, demonstrating the self-recursive sub-class explicitly. Also updated: - Sub-class section: self-recursive instances now [#10, #11, #19, #20] - Body line 96: "20 drift instances above" + note that v0 of substrate-claim-checker shipped in PR #1260 - Frontmatter description: count → 20; instances range → #10-#20; v0 shipped reference - MEMORY.md: count → 20; v0 shipped reference This is the perfect worked example for the substrate-claim- checker tool's value: the very count-drift-fix produced new count drift, which the tool catches automatically. v0 (PR #1260) would have caught this pre-publish. Verified manually: `awk '/Drift instance/,/^$/'` + `grep -c "^| [0-9]"` returns 20 rows; matches all 3 surfaces. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * hygiene(tick-history): 2026-05-03T00:58Z — count-fix introduced opposite-direction drift; body extended to 20 rows Even authoring a PR to fix count drift produces opposite-direction count drift. Drift instance #20 self-recursively documents this PR's own drift. Substrate-claim-checker v0 (PR #1260) would have caught it pre-publish — empirical evidence v0 was the right architectural answer. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * review(pr-1259): synchronize section heading + carved sentence + PR list + tool-status across memo 4 substantive findings on PR #1259 (in-flight): 1. **Section heading drift** — "## Empirical evidence (this session, 9+ PRs, 15+ distinct drift instances)" still said "15+" while body table has 20 rows + summary says 20. Updated heading to "20 distinct drift instances". 2. **Carved sentence stale at "9"** — line 115 still said "9 instances caught across 7 PRs". Updated to "20 instances across 9+ PRs" + named that instances #10-#20 landed after discipline-naming + named v0-shipped status. 3. **PR list incorrect** — frontmatter listed `#1247` (not in table) and excluded `#1249, #1257, #1259` (which ARE in table). Corrected to `#1245, #1248/#1249, #1250, #1252, #1253, #1254, #1255, #1256, #1257, #1259`. 4. **"Until tool ships" + "v0 shipped" contradiction** — reorganized §96 to put tool-status FIRST ("v0 shipped covering count-drift; v1+ extends to remaining 6 sub-classes; until v1+ ships covering all 7, the discipline outside count-drift is still manual"). 2 tick-shard findings (0049Z + 0058Z) NOT addressed — tick shards are append-only history preserving agent-belief-at-time. The shards accurately recorded my belief at write-time; the underlying memo is the canonical truth and is fixed in this PR. A note in the next tick shard acknowledges the over-claims. Drift instances #21 + #22 + #23 + #24 (this PR's own findings) are not yet catalogued in the table — they will land in the next sync pass to avoid recursing forever in this PR. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * hygiene(tick-history): 2026-05-03T01:06Z — 5-surface count-drift sub-pattern; prior shards over-claimed "all surfaces consistent" Memos have 5 count-bearing surfaces (frontmatter + body table + section heading + carved sentence + MEMORY.md), not just 3. Prior shards (0049Z + 0058Z) claimed "all 3 surfaces consistent" when the section heading + carved sentence still had stale counts. Acknowledgment lands here in append-only history; substrate-claim- checker v1+ spec gets enumeration of all count-bearing surfaces. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Summary
Two pieces (composed by tick context):
1. Post-merge fixes for #1253 (skill-design memo)
2 Copilot post-merge findings on PR #1253 (already merged):
tools/backlog/expand-from-closure.tsreferenced as "the mechanizing tool" without marking proposed/not-yet-built — fixed\|escape in markdown-table cell shell example — rewrote withfindto avoid pipe-in-cell entirely2. Self-grading memo — verify-then-claim discipline as dominant failure-mode corrective
After 9 distinct claim-vs-reality drift instances caught across 7 PRs in this session (#1245 #1247 #1248 #1250 #1252 #1253 #1254), the pattern is consistent enough to warrant a named discipline.
CARVED RULE — Before stating any fact in substrate (file exists, command returns X, row count is N, tool shipped, ADR matches, persona dir present), run the actual
ls/grep/ count /findcommand FIRST, then commit the claim.Generalizes existing rules: Otto-247 (version-currency) + Otto-364 (search-first authority) + verify-before-deferring + Otto-363 (substrate-or-it-didn't-happen) + assumed-state-vs-actual-state — at the broader any-substrate-claim layer.
Scope:
Mechanization path:
tools/substrate-claim-checker/TS tool (proposed, not yet built). Discipline is manual until tool ships.Composes with the bugs-per-PR-as-immune-system-health metric: this discipline would move bugs-per-PR closer to single-digit productive zone (currently caught post-merge; should be caught pre-publish).
Why two pieces in one PR
Both relate to substrate-quality discipline at different scopes:
Splitting them would lose the composition narrative.
MEMORY.md pairing
Newest-first index entry landed for the verify-then-claim memo.
Test plan
find🤖 Generated with Claude Code