Conversation
There was a problem hiding this comment.
Pull request overview
Adds a new memory/ feedback memo capturing three “flywheel-class” questions (skill-invocation cadence, backlog expansion dynamics, and parallelization substrate), and updates the memory/MEMORY.md index with a newest-first entry so the memo is discoverable.
Changes:
- Added a new feedback memo documenting the flywheel questions plus the same-tick corrective about skills vs memory.
- Added a new top-of-file index entry in
memory/MEMORY.mdpointing to the new memo.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.
| File | Description |
|---|---|
| memory/feedback_skill_flywheel_expansion_flywheel_parallel_tracks_substrate_aaron_2026_05_02.md | New memo capturing Q1/Q2/Q3 + operational guidance and cross-references. |
| memory/MEMORY.md | Adds a newest-first index entry linking to the new memo. |
a680576 to
4b124ca
Compare
|
Review-thread triage on this PR's 4 Copilot findings:
Resolving all 4 threads. |
…bstrate (Aaron 2026-05-02 + same-tick corrective) Aaron 2026-05-02 asked three flywheel-class questions covering different layers (skill-invocation cadence; backlog dual-loop dynamics; team-parallelization substrate). Memo captures all three with mechanization paths. Aaron's same-tick corrective lands as the pivotal section: "skills are for everyone and even other agent harnesses / memory can only scale so far as a flywheel and it's just for you, not your whole team." The corrective composes with B-0169 decision-archaeology — same load-bearing point at substrate-class layer. Operational implication captured as 12-row surface→specialist mapping table. When editing in a specialist's domain, INVOKE the specialist; don't generalist-Otto your way through. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
4b124ca to
43de7af
Compare
…ollow-up + #1245 rebase #1246 (depends_on 100%) + #1247 (at-creation/at-pickup discipline) merged on main. #1245 (skill-flywheel memo) DIRTY conflict cleared via rebase, auto-merge armed. #1248 auto-merge armed. #1249 opened addressing #1247 post-merge Copilot findings (filename rename + grep-placeholder fix). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ollow-up + #1245 rebase #1246 (depends_on 100%) + #1247 (at-creation/at-pickup discipline) merged on main. #1245 (skill-flywheel memo) DIRTY conflict cleared via rebase, auto-merge armed. #1248 auto-merge armed. #1249 opened addressing #1247 post-merge Copilot findings (filename rename + grep-placeholder fix). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ries Multiple post-merge findings across PRs #1245, #1247, #1248 addressed: PR #1247 followup (this PR's primary purpose): - Renamed feedback_at_pickup_time_prereq_check_discipline_* → feedback_depends_on_backlog_search_discipline_at_creation_and_at_pickup_* to reflect both triggers - Fixed bare-grep-placeholder in the at-creation procedure PR #1245 + #1248 post-merge consequences (rebase-discovered): - Stale references to old filename in MEMORY.md (line 8 duplicate from #1247's original index entry that survived the rename) + future-domain memo (lines 35 and 90 referenced the old filename) — all updated to new filename - MEMORY.md index entries trimmed for brevity per #1248's P2 finding (memory/README.md "keep entries terse" rule) - Quotes in skill-flywheel index entry that didn't match verbatim source removed; verbatim preservation lives in the memo body, not the one-line index Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
All 3 post-merge findings addressed in PR #1249:
Resolving threads. |
… rebased + 4 post-merge findings triaged Two-merge tick: #1245 (skill-flywheel) + #1248 (future-skill-domain). PR #1249 went DIRTY from concurrent merges; rebase cleared it + caught stale filename refs the rename was supposed to update. 4 post-merge findings triaged: 2 false positives (table double-pipes — Copilot rendering bug), 1 real (verbatim-quote mismatch in index entry; quotes removed since terseness > quote- preservation in MEMORY.md), 1 real (entry too long; trimmed to one-liner per memory/README.md). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…bare-grep placeholder (#1249) * review(pr-1247-followup): rename file to reflect both triggers + fix bare-grep placeholder Two Copilot post-merge findings on PR #1247: P2 — filename mismatch. The MEMORY.md entry described a two-trigger discipline (creation + pickup), but the filename was feedback_at_pickup_time_prereq_check_discipline_*, which reads like pickup-only. Renamed to feedback_depends_on_backlog_search_discipline_at_creation_and_at_pickup_* so the filename matches the substantive content. P1 — bare grep placeholder. The at-creation procedure had `grep -l "tags:.*<tag>" ...` where `...` was a placeholder. Copilot caught the risk: a contributor copy-pasting literally gets a repo-wide grep that pulls in references/ clones and other noise. Replaced with explicit `grep -l "tags:.*<tag>" docs/backlog/P*/B-*.md`; added a sentence warning against bare placeholders. MEMORY.md pointer updated to the new filename. Worked example of "if it matters is almost always yes": post-merge findings on substrate-rule memos warrant their own follow-up PR rather than backlog deferral. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * hygiene(tick-history): 2026-05-02T23:54Z — three-merge tick + #1249 follow-up + #1245 rebase #1246 (depends_on 100%) + #1247 (at-creation/at-pickup discipline) merged on main. #1245 (skill-flywheel memo) DIRTY conflict cleared via rebase, auto-merge armed. #1248 auto-merge armed. #1249 opened addressing #1247 post-merge Copilot findings (filename rename + grep-placeholder fix). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * review(post-merge): fix stale filename refs + trim long MEMORY.md entries Multiple post-merge findings across PRs #1245, #1247, #1248 addressed: PR #1247 followup (this PR's primary purpose): - Renamed feedback_at_pickup_time_prereq_check_discipline_* → feedback_depends_on_backlog_search_discipline_at_creation_and_at_pickup_* to reflect both triggers - Fixed bare-grep-placeholder in the at-creation procedure PR #1245 + #1248 post-merge consequences (rebase-discovered): - Stale references to old filename in MEMORY.md (line 8 duplicate from #1247's original index entry that survived the rename) + future-domain memo (lines 35 and 90 referenced the old filename) — all updated to new filename - MEMORY.md index entries trimmed for brevity per #1248's P2 finding (memory/README.md "keep entries terse" rule) - Quotes in skill-flywheel index entry that didn't match verbatim source removed; verbatim preservation lives in the memo body, not the one-line index Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * hygiene(tick-history): 2026-05-02T23:57Z — #1245 + #1248 merged + #1249 rebased + 4 post-merge findings triaged Two-merge tick: #1245 (skill-flywheel) + #1248 (future-skill-domain). PR #1249 went DIRTY from concurrent merges; rebase cleared it + caught stale filename refs the rename was supposed to update. 4 post-merge findings triaged: 2 false positives (table double-pipes — Copilot rendering bug), 1 real (verbatim-quote mismatch in index entry; quotes removed since terseness > quote- preservation in MEMORY.md), 1 real (entry too long; trimmed to one-liner per memory/README.md). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
…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>
…-cell pipe escape fix (#1255) * review(pr-1253-postmerge): mark expand-from-closure.ts as proposed + 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> * free-memory(self-grading): verify-then-claim discipline as dominant failure-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> * hygiene(tick-history): 2026-05-03T00:31Z — verify-then-claim self-grading 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> * review(pr-1255): correct find→grep equivalence; preserve regex alternation 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> * review(pr-1255): rewrite drift table to remove `\|` table-cell escapes + 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> * hygiene(tick-history): 2026-05-03T00:37Z — verify-then-claim memo's drift 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> --------- 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
Aaron 2026-05-02 asked three flywheel-class questions covering different layers (skill-invocation cadence; backlog dual-loop dynamics; team-parallelization substrate), then corrected mid-tick on the framing.
The corrective is the substantive part
Aaron 2026-05-02 verbatim:
Three load-bearing points:
This corrective composes structurally with the just-filed B-0169 (decision-archaeology should be a skill) — same load-bearing point at the substrate-class layer: when something is universally useful, the right shape is a skill, not a memory.
Operational change
Memo captures a 12-row surface→specialist mapping table. Going forward: when editing in a specialist's domain, INVOKE the specialist (
harsh-criticfor F#/.NET correctness;public-api-designerfor shipped-library API;threat-model-criticfor security;performance-engineerfor hot path;formal-verification-expertfor spec routing;user-experience-engineerfor library-consumer surfaces;developer-experience-engineerfor contributor onboarding;agent-experience-engineerfor cold-start substrate; etc.). Don't generalist-Otto through specialist surfaces.MEMORY.md pairing
Top-of-file newest-first entry added.
Test plan
🤖 Generated with Claude Code