Diff v1 → v2
v1: bot backfill · 2026-07-01 10:34:12
v2: bot legacy · 2026-07-28T06:30:55Z
# The Compounding Layer The pipeline produces _one feature_, well, once. It also produces _lessons_: what went wrong, what worked, which failures recurred, which patterns are now reusable. If those lessons evaporate at the end of each run, every future run pays the same costs. The compounding layer captures lessons and feeds them back. Failures compound into rules. Successes compound into reusable skills. ## Flow ```mermaid flowchart LR - V["/verify/ PASS"] --> RE["/retrospective/"] + V["/speckit.agentic.verify/ PASS"] --> RE["/speckit.agentic.retrospective/"] RE --> CA[CONSTITUTION_AMENDMENTS] RE --> SE[SKILLS_TO_EXTRACT] CA --> KF["known-failures.md<br/>count"] KF --> R{3+ times?} - R -- yes --> CON["/constitution/<br/>promote to rule"] + R -- yes --> CON["/speckit.constitution/<br/>promote to rule"] R -- no --> Wait[Stay pending] - SE --> EX["/extract-skills/"] + SE --> EX["/speckit.agentic.skills/"] EX --> SK["skills/extracted/*.yml"] - SK -.->|next run uses| Specify["/specify/"] - CON -.->|next run respects| Plan["/plan/"] + SK -.->|next run uses| Specify["/speckit.specify/"] + CON -.->|next run respects| Plan["/speckit.plan/"] ``` ## Retrospective After verify passes, retrospective reads the whole run (spec, plan, tasks, diff, verify report) and outputs two structured blocks: **`CONSTITUTION_AMENDMENTS`** — proposed rules that, if adopted, would prevent the failures seen this run. ```yaml CONSTITUTION_AMENDMENTS: - id: cache-stateless-builders rationale: | Chroma formatter was constructed per HTTP request, costing ~3ms per call. rule: "Stateless objects with non-trivial construction cost should be cached at handler init, not constructed per request." severity: warn ``` **`SKILLS_TO_EXTRACT`** — reusable patterns from this run. ```yaml SKILLS_TO_EXTRACT: - name: sqlite-fts5-pattern rationale: This run set up an FTS5 virtual table with content/content_rowid and triggers — the canonical pattern. template_path: skills/extracted/sqlite-fts5-pattern.md ``` ## Known-failures funnel A single proposed amendment is not enough. One observation might be a one-off. Three is a pattern. ``` known-failures.md ================== - id: cache-stateless-builders count=3 first=2026-03 last=2026-06 - id: never-amend-shipped count=1 first=2026-06 - id: ctx-too-tight count=2 first=2026-04 last=2026-05 ``` - `count >= 3` → next retrospective promotes via `/constitution`. It becomes an enforced rule, checked by future plans and verifies. + `count >= 3` → next retrospective promotes via `/speckit.constitution`. It becomes an enforced rule, checked by future plans and verifies. False positives stay pending forever — cheap. False negatives surface on the next recurrence. + ## Debt ledger + + The other input to the funnel. When an agent knowingly cuts a corner with a real ceiling — a global lock, an O(n²) scan, a naive heuristic — it leaves an `agentic:debt` comment naming both the ceiling and the trigger to revisit it. `/speckit.agentic.debt` harvests every marker in the tree into one ledger. + + ``` + internal/cache/store.go:88 + simplified: global lock instead of striped + ceiling: fine under ~50 rps + upgrade: when write contention shows in p99 + + internal/parse/tokens.go:212 [no-trigger] + simplified: O(n²) scan over token list + ceiling: inputs under ~2k tokens + upgrade: — + ``` + + Markers tagged `no-trigger` are the dangerous ones: a ceiling with no revisit condition will not be revisited. And if the same ceiling shows up in three or more places, it stopped being a shortcut — the codebase adopted an architectural constraint by accident, which is a constitution amendment, not a debt row. + + A deliberate shortcut is fine. An unrecorded one is how a codebase acquires limits nobody remembers agreeing to. + ## Skills library Skills live under `skills/extracted/*.yml`. The agent receives a digest of relevant skills at the start of each run. Shape: ```yaml name: sqlite-fts5-pattern trigger: "adding full-text search to a new SQLite table" applies_when: - "table has a text/title column to index" - "soft-delete is not required" template: | CREATE VIRTUAL TABLE <name>_fts USING fts5( title, content, content=<name>, content_rowid=id ); -- + ai/ad/au triggers references: - internal/storage/sqlite.go:24-63 ``` Trigger + preconditions + template + references. Snippets without scaffolding are not skills, just text. ## Why it matters Without compounding, every run is independent: ``` Run 1: 100% effort Run 2: 100% effort Run 3: 100% effort ``` With compounding: ``` Run 1: 100% — produces 3 rules + 2 skills Run 2: 95% — rules + skills now help Run 3: 90% ``` Marginal cost trends down. Marginal quality trends up. Previous failure modes can no longer recur — the constitution forbids them. This is also where Agentic Engineering differs from "let the AI code for me." The system gets better at _your_ codebase over time, even though the underlying model didn't change. ## Anti-patterns - **Skip retrospective when in a hurry.** Highest-leverage phase, skipped. Cost is invisible per run, enormous over a quarter. - **Promote every observation to a rule.** Floods the constitution; future plans drown in noise. The 3-count threshold filters one-offs. - **Treat the constitution as a wishlist.** It's enforced. Plans that violate it must justify in Complexity Tracking. Verifies that detect violations are BLOCKERs. ## Bootstrap - Day one: empty constitution, empty skills library. Fine. Each run adds a few. By run ~10 you have ~5-10 rules and ~10-20 skills. The slope is the value, not the starting point. + Day one: a baseline constitution and an empty skills library. The extension ships a starting rulebook — process, decomposition, restraint, and quality rules covering the failures this methodology sees most often — so the promotion machinery has somewhere to promote into. Copy the rules you actually want to enforce; a rulebook nobody enforces trains everyone to ignore it. + Each run adds a few. By run ~10 you have ~5-10 rules and ~10-20 skills, and the ones you earned from your own retrospectives outrank anything shipped in the box. The slope is the value, not the starting point. + > Successes compound into the skills library. Failures compound into the constitution. Everything else is noise.