@adia-ai/adia-ui-forge 0.1.3 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +4 -7
- package/CHANGELOG.md +35 -34
- package/README.md +35 -40
- package/agents/a2ui-engineer.md +22 -53
- package/agents/component-author.md +29 -0
- package/agents/framework-verifier.md +26 -0
- package/agents/release-engineer.md +21 -81
- package/agents/routing-corpus.json +293 -64
- package/bin/demo-postwrite-pattern-gate +94 -0
- package/bin/forge-lint +17 -2
- package/bin/sidecar-prewrite-guard +104 -0
- package/commands/deploy.md +9 -0
- package/commands/dogfood.md +10 -0
- package/commands/gen-review.md +9 -0
- package/commands/release.md +10 -0
- package/hooks/hooks.json +15 -0
- package/package.json +3 -6
- package/references/contracts/a2ui-mcp-surface.md +35 -0
- package/references/contracts/migration-guide-format.md +34 -0
- package/references/shared/content-trust.md +19 -74
- package/skills/adia-a2ui/SKILL.md +99 -0
- package/skills/{adia-ui-a2ui → adia-a2ui}/evals/routing-corpus.json +10 -10
- package/skills/adia-a2ui/references/anti-patterns.md +27 -0
- package/skills/adia-a2ui/references/chunk-authoring.md +71 -0
- package/skills/adia-a2ui/references/corpus-discipline.md +68 -0
- package/skills/adia-a2ui/references/eval-diagnostics.md +86 -0
- package/skills/adia-a2ui/references/format-extension-decisions.md +66 -0
- package/skills/adia-a2ui/references/leverage-rules.md +52 -0
- package/skills/adia-a2ui/references/mcp-pipeline-ops.md +83 -0
- package/skills/adia-a2ui/references/mcp-tool-reference.md +59 -0
- package/skills/adia-a2ui/references/pipeline-overview.md +115 -0
- package/skills/adia-a2ui/references/semantic-fail-lifting.md +74 -0
- package/skills/adia-a2ui/references/strategy-engines.md +109 -0
- package/skills/adia-a2ui/references/zettel-calibration.md +104 -0
- package/skills/adia-author/SKILL.md +112 -0
- package/skills/adia-author/evals/routing-corpus.json +222 -0
- package/skills/{adia-ui-authoring → adia-author}/references/anti-patterns.md +33 -4
- package/skills/{adia-ui-authoring → adia-author}/references/authoring-cycle.md +9 -11
- package/skills/adia-author/references/canonical-pattern-index.md +243 -0
- package/skills/{adia-ui-authoring → adia-author}/references/code-style.md +19 -21
- package/skills/adia-author/references/common-gotchas.md +129 -0
- package/skills/adia-author/references/composite-demo-protocol.md +271 -0
- package/skills/{adia-ui-authoring → adia-author}/references/css-patterns.md +19 -6
- package/skills/{adia-ui-authoring → adia-author}/references/lifecycle-patterns.md +1 -0
- package/skills/{adia-ui-authoring → adia-author}/references/llm-bridge.md +3 -5
- package/skills/{adia-ui-authoring → adia-author}/references/module-promotion.md +20 -38
- package/skills/{adia-ui-authoring → adia-author}/references/primitive-audit.md +2 -4
- package/skills/{adia-ui-authoring → adia-author}/references/shell-patterns.md +12 -18
- package/skills/{adia-ui-authoring → adia-author}/references/token-contract.md +5 -7
- package/skills/{adia-ui-authoring → adia-author}/references/worked-example.md +3 -3
- package/skills/{adia-ui-authoring → adia-author}/references/yaml-contract.md +3 -3
- package/skills/{adia-ui-authoring → adia-author}/scripts/build-canonical-pattern-index.mjs +3 -3
- package/skills/adia-deploy/SKILL.md +128 -0
- package/skills/{adia-ui-ops → adia-deploy}/references/deploy-playbooks.md +47 -30
- package/skills/adia-dogfood/SKILL.md +124 -0
- package/skills/adia-dogfood/references/admin-shell-anatomy.md +77 -0
- package/skills/adia-dogfood/references/app-shell-pitfalls.md +66 -0
- package/skills/adia-dogfood/references/card-anatomy-sweep.md +66 -0
- package/skills/adia-dogfood/references/html-attr-sweep.md +63 -0
- package/skills/adia-dogfood/references/native-leak-annotations.md +73 -0
- package/skills/adia-dogfood/references/visual-probe-triage.md +80 -0
- package/skills/{adia-ui-dogfood → adia-dogfood}/scripts/analyze.mjs +30 -14
- package/skills/adia-gen-review/SKILL.md +127 -0
- package/skills/adia-gen-review/references/corpus-html-patterns.md +279 -0
- package/skills/adia-gen-review/references/loop-protocol.md +216 -0
- package/skills/adia-gen-review/references/rubric-cosmetic.md +100 -0
- package/skills/adia-gen-review/references/rubric-decompose.md +101 -0
- package/skills/adia-gen-review/references/rubric-score.md +214 -0
- package/skills/{adia-ui-gen-review → adia-gen-review}/references/scores.schema.json +2 -2
- package/skills/{adia-ui-gen-review → adia-gen-review}/scripts/gen-review-coverage-audit.mjs +4 -4
- package/skills/{adia-ui-gen-review → adia-gen-review}/scripts/gen-review-decompose.mjs +10 -6
- package/skills/{adia-ui-gen-review → adia-gen-review}/scripts/gen-review-status.mjs +5 -5
- package/skills/{adia-ui-gen-review → adia-gen-review}/scripts/validate-cycle-scores.mjs +5 -5
- package/skills/adia-llm-internals/SKILL.md +77 -0
- package/skills/{adia-ui-llm → adia-llm-internals}/references/adapter-contract.md +4 -2
- package/skills/{adia-ui-llm → adia-llm-internals}/references/add-a-provider.md +4 -5
- package/skills/{adia-ui-llm → adia-llm-internals}/references/bridge-facade.md +10 -3
- package/skills/{adia-ui-llm → adia-llm-internals}/references/browser-proxy-boundary.md +1 -1
- package/skills/{adia-ui-llm → adia-llm-internals}/references/model-registry.md +5 -3
- package/skills/{adia-ui-llm → adia-llm-internals}/references/streaming-sse.md +2 -2
- package/skills/adia-release/SKILL.md +72 -0
- package/skills/adia-release/references/changelog-discipline.md +119 -0
- package/skills/adia-release/references/cut-procedure.md +247 -0
- package/skills/adia-release/references/gates-catalog.md +222 -0
- package/skills/adia-release/references/independent-package-release.md +52 -0
- package/skills/adia-release/references/migration-guide-authoring.md +86 -0
- package/skills/adia-release/references/notes-authoring.md +90 -0
- package/skills/adia-release/references/recovery-paths.md +106 -0
- package/skills/{adia-ui-release → adia-release}/scripts/bump.mjs +28 -3
- package/skills/{adia-ui-release → adia-release}/scripts/dispatch-publish.mjs +10 -7
- package/skills/{adia-ui-release → adia-release}/scripts/insert-stub.mjs +1 -1
- package/skills/{adia-ui-release → adia-release}/scripts/package-paths.mjs +6 -0
- package/skills/{adia-ui-release → adia-release}/scripts/promote-unreleased.mjs +1 -1
- package/skills/{adia-ui-release → adia-release}/scripts/release-pack.mjs +38 -31
- package/skills/{adia-ui-release → adia-release}/scripts/tag-lockstep.mjs +7 -3
- package/skills/adia-site-docs/SKILL.md +68 -0
- package/skills/adia-site-docs/evals/audit-report.md +30 -0
- package/skills/adia-site-docs/evals/routing-corpus.json +176 -0
- package/skills/adia-site-docs/intent.md +72 -0
- package/agents/README.md +0 -209
- package/agents/author.md +0 -56
- package/agents/repo-steward.md +0 -56
- package/agents/spec-architect.md +0 -53
- package/agents/tech-lead.md +0 -57
- package/agents/verifier.md +0 -55
- package/bin/lib/audit-axes.mjs +0 -555
- package/bin/lib/dry-run-irreversible.mjs +0 -236
- package/bin/lib/run-skill-evals.mjs +0 -487
- package/bin/lib/teach-router.mjs +0 -250
- package/commands/adia-forge-a2ui.md +0 -10
- package/commands/adia-forge-author.md +0 -10
- package/commands/adia-forge-dogfood.md +0 -8
- package/commands/adia-forge-llm.md +0 -8
- package/commands/adia-forge-orient.md +0 -10
- package/commands/adia-forge-release.md +0 -8
- package/commands/adia-forge-review.md +0 -10
- package/references/shared/pev-rationale.md +0 -64
- package/references/shared/skill-conventions.md +0 -133
- package/skills/adia-ui-a2ui/CHANGELOG.md +0 -32
- package/skills/adia-ui-a2ui/SKILL.md +0 -243
- package/skills/adia-ui-a2ui/evals/adversarial-corpus.json +0 -75
- package/skills/adia-ui-a2ui/evals/teach-routing-cases.json +0 -100
- package/skills/adia-ui-a2ui/references/anti-patterns.md +0 -24
- package/skills/adia-ui-a2ui/references/chunk-authoring.md +0 -88
- package/skills/adia-ui-a2ui/references/corpus-discipline.md +0 -56
- package/skills/adia-ui-a2ui/references/eval-diagnostics.md +0 -127
- package/skills/adia-ui-a2ui/references/fragment-graph.md +0 -91
- package/skills/adia-ui-a2ui/references/mcp-pipeline-ops.md +0 -106
- package/skills/adia-ui-a2ui/references/mcp-tool-reference.md +0 -398
- package/skills/adia-ui-a2ui/references/pipeline-overview.md +0 -175
- package/skills/adia-ui-a2ui/references/semantic-fail-lifting.md +0 -120
- package/skills/adia-ui-a2ui/references/strategy-engines.md +0 -111
- package/skills/adia-ui-a2ui/references/teach-protocol.md +0 -220
- package/skills/adia-ui-a2ui/references/zettel-calibration.md +0 -93
- package/skills/adia-ui-a2ui/scripts/audit-a2ui-roster.mjs +0 -96
- package/skills/adia-ui-a2ui/scripts/teach-route.mjs +0 -157
- package/skills/adia-ui-a2ui/skill.json +0 -38
- package/skills/adia-ui-authoring/CHANGELOG.md +0 -32
- package/skills/adia-ui-authoring/SKILL.md +0 -256
- package/skills/adia-ui-authoring/assets/case-studies/admin-shell-decomposition.md +0 -101
- package/skills/adia-ui-authoring/assets/case-studies/maxtokens-32768-discovery.md +0 -109
- package/skills/adia-ui-authoring/assets/case-studies/theme-panel-promotion.md +0 -113
- package/skills/adia-ui-authoring/evals/adversarial-design-plan-gates.json +0 -138
- package/skills/adia-ui-authoring/evals/routing-corpus.json +0 -245
- package/skills/adia-ui-authoring/references/canonical-pattern-index.md +0 -179
- package/skills/adia-ui-authoring/references/common-gotchas.md +0 -93
- package/skills/adia-ui-authoring/references/composite-demo-protocol.md +0 -1084
- package/skills/adia-ui-authoring/references/teach-protocol.md +0 -428
- package/skills/adia-ui-authoring/scripts/audit-authoring-roster.mjs +0 -148
- package/skills/adia-ui-authoring/skill.json +0 -45
- package/skills/adia-ui-dogfood/CHANGELOG.md +0 -17
- package/skills/adia-ui-dogfood/README.md +0 -62
- package/skills/adia-ui-dogfood/SKILL.md +0 -866
- package/skills/adia-ui-dogfood/skill.json +0 -40
- package/skills/adia-ui-forge/SKILL.md +0 -88
- package/skills/adia-ui-forge/evals/routing-corpus.json +0 -30
- package/skills/adia-ui-gen-review/CHANGELOG.md +0 -108
- package/skills/adia-ui-gen-review/SKILL.md +0 -266
- package/skills/adia-ui-gen-review/references/loop-protocol.md +0 -712
- package/skills/adia-ui-gen-review/references/rubric-cosmetic.md +0 -144
- package/skills/adia-ui-gen-review/references/rubric-decompose.md +0 -117
- package/skills/adia-ui-gen-review/references/rubric-score.md +0 -249
- package/skills/adia-ui-gen-review/references/teach-protocol.md +0 -214
- package/skills/adia-ui-gen-review/skill.json +0 -23
- package/skills/adia-ui-llm/CHANGELOG.md +0 -25
- package/skills/adia-ui-llm/SKILL.md +0 -165
- package/skills/adia-ui-llm/evals/adversarial-corpus.json +0 -75
- package/skills/adia-ui-llm/evals/routing-corpus.json +0 -30
- package/skills/adia-ui-llm/evals/teach-routing-cases.json +0 -73
- package/skills/adia-ui-llm/references/teach-protocol.md +0 -78
- package/skills/adia-ui-llm/scripts/audit-llm-roster.mjs +0 -93
- package/skills/adia-ui-llm/scripts/teach-route.mjs +0 -119
- package/skills/adia-ui-llm/skill.json +0 -33
- package/skills/adia-ui-ops/CHANGELOG.md +0 -291
- package/skills/adia-ui-ops/SKILL.md +0 -401
- package/skills/adia-ui-ops/references/INDEX.md +0 -158
- package/skills/adia-ui-ops/references/audit-cadence.md +0 -263
- package/skills/adia-ui-ops/references/audit-patterns/archive-link-sweep.md +0 -96
- package/skills/adia-ui-ops/references/audit-patterns/audit-history-ledger.md +0 -162
- package/skills/adia-ui-ops/references/audit-patterns/browser-bundle-node-imports.md +0 -154
- package/skills/adia-ui-ops/references/audit-patterns/changelog-unreleased-bloat.md +0 -75
- package/skills/adia-ui-ops/references/audit-patterns/coverage-gaps.md +0 -187
- package/skills/adia-ui-ops/references/audit-patterns/entry-file-coverage.md +0 -122
- package/skills/adia-ui-ops/references/audit-patterns/format-hygiene.md +0 -217
- package/skills/adia-ui-ops/references/audit-patterns/lockstep-versioning.md +0 -113
- package/skills/adia-ui-ops/references/audit-patterns/memory-fragmentation.md +0 -180
- package/skills/adia-ui-ops/references/audit-patterns/orphan-detection.md +0 -202
- package/skills/adia-ui-ops/references/audit-patterns/pointer-validation.md +0 -180
- package/skills/adia-ui-ops/references/audit-patterns/redundancy-detection.md +0 -210
- package/skills/adia-ui-ops/references/audit-patterns/spec-dating-sweep.md +0 -91
- package/skills/adia-ui-ops/references/audit-patterns/stale-content.md +0 -182
- package/skills/adia-ui-ops/references/audit-patterns/staleness-tooling.md +0 -156
- package/skills/adia-ui-ops/references/audit-patterns/token-waste-detection.md +0 -196
- package/skills/adia-ui-ops/references/doc-types/adr-pattern.md +0 -210
- package/skills/adia-ui-ops/references/doc-types/architecture-md.md +0 -190
- package/skills/adia-ui-ops/references/doc-types/changelog.md +0 -183
- package/skills/adia-ui-ops/references/doc-types/decisions-log.md +0 -146
- package/skills/adia-ui-ops/references/doc-types/plan-roadmap.md +0 -182
- package/skills/adia-ui-ops/references/doc-types/postmortem-pattern.md +0 -206
- package/skills/adia-ui-ops/references/genres/prose-and-writing.md +0 -149
- package/skills/adia-ui-ops/references/guidance/context-budget.md +0 -137
- package/skills/adia-ui-ops/references/guidance/llm-doc-writing.md +0 -116
- package/skills/adia-ui-ops/references/guidance/reliability-dial.md +0 -186
- package/skills/adia-ui-ops/references/recipes/adr-introduction.md +0 -211
- package/skills/adia-ui-ops/references/recipes/audit-existing-repo.md +0 -234
- package/skills/adia-ui-ops/references/recipes/cold-start-harvest.md +0 -263
- package/skills/adia-ui-ops/references/recipes/concurrent-learnings-merge.md +0 -158
- package/skills/adia-ui-ops/references/recipes/continuous-learning-loop.md +0 -169
- package/skills/adia-ui-ops/references/recipes/external-reference-verification.md +0 -158
- package/skills/adia-ui-ops/references/recipes/findings-index-readout.md +0 -126
- package/skills/adia-ui-ops/references/recipes/greenfield-setup.md +0 -252
- package/skills/adia-ui-ops/references/recipes/harvest-repo-brain.md +0 -169
- package/skills/adia-ui-ops/references/recipes/import-repo-brain-harvest.md +0 -153
- package/skills/adia-ui-ops/references/recipes/memory-organization.md +0 -182
- package/skills/adia-ui-ops/references/recipes/recommend-then-validate.md +0 -199
- package/skills/adia-ui-ops/references/recipes/self-healing-hooks.md +0 -366
- package/skills/adia-ui-ops/references/recipes/skill-stewardship-loop.md +0 -113
- package/skills/adia-ui-ops/references/standards/agents-md-spec.md +0 -138
- package/skills/adia-ui-ops/references/standards/claude-md-convention.md +0 -123
- package/skills/adia-ui-ops/references/standards/cross-tool-matrix.md +0 -85
- package/skills/adia-ui-ops/references/standards/readme-conventions.md +0 -232
- package/skills/adia-ui-ops/references/teach-protocol.md +0 -215
- package/skills/adia-ui-ops/scripts/audit-ops-roster.mjs +0 -104
- package/skills/adia-ui-ops/skill.json +0 -65
- package/skills/adia-ui-release/CHANGELOG.md +0 -66
- package/skills/adia-ui-release/SKILL.md +0 -323
- package/skills/adia-ui-release/assets/case-studies/2026-05-20-batch-push-v0.6.14-v0.6.15.md +0 -144
- package/skills/adia-ui-release/assets/case-studies/2026-05-20-corpus-drift-remediation-v0.6.15.md +0 -155
- package/skills/adia-ui-release/assets/case-studies/2026-05-20-version-skip-correction-v0.6.12.md +0 -114
- package/skills/adia-ui-release/assets/case-studies/2026-05-21-author-from-scratch-v0.6.18.md +0 -139
- package/skills/adia-ui-release/assets/case-studies/2026-05-21-feedback37-retraction-v0.6.21.md +0 -124
- package/skills/adia-ui-release/assets/case-studies/2026-05-21-fn1-enrichment-pass-v0.6.19.md +0 -125
- package/skills/adia-ui-release/assets/case-studies/2026-05-21-stale-test-detection-v0.6.20.md +0 -142
- package/skills/adia-ui-release/assets/case-studies/2026-05-23-freshness-gate-recovery-v0.6.32.md +0 -97
- package/skills/adia-ui-release/assets/case-studies/2026-05-26-catalog-drift-recurring-v0.6.40.md +0 -147
- package/skills/adia-ui-release/assets/templates/stub-changelog.template.md +0 -22
- package/skills/adia-ui-release/evals/evals.json +0 -164
- package/skills/adia-ui-release/references/changelog-discipline.md +0 -250
- package/skills/adia-ui-release/references/cycle-happy-path.md +0 -520
- package/skills/adia-ui-release/references/exe-deploy.md +0 -149
- package/skills/adia-ui-release/references/gates-catalog.md +0 -778
- package/skills/adia-ui-release/references/independent-package-release.md +0 -129
- package/skills/adia-ui-release/references/ledger-discipline.md +0 -232
- package/skills/adia-ui-release/references/migration-guide-authoring.md +0 -174
- package/skills/adia-ui-release/references/multi-agent-baseline.md +0 -207
- package/skills/adia-ui-release/references/notes-authoring.md +0 -212
- package/skills/adia-ui-release/references/recovery-paths.md +0 -262
- package/skills/adia-ui-release/references/rollup-notes.md +0 -208
- package/skills/adia-ui-release/references/teach-protocol.md +0 -468
- package/skills/adia-ui-release/scripts/audit-gate-roster.mjs +0 -196
- package/skills/adia-ui-release/scripts/make-ledger.mjs +0 -200
- package/skills/adia-ui-release/skill.json +0 -77
- package/skills/dogfood-sweep/CHANGELOG.md +0 -37
- package/skills/dogfood-sweep/README.md +0 -105
- package/skills/dogfood-sweep/SKILL.md +0 -1000
- package/skills/dogfood-sweep/analyze.mjs +0 -600
- package/skills/dogfood-sweep/skill.json +0 -31
- /package/skills/{adia-ui-authoring → adia-author}/references/api-contract.md +0 -0
- /package/skills/{adia-ui-release → adia-release}/scripts/assert-monorepo-root.mjs +0 -0
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
date: 2026-04-27
|
|
3
|
-
coverage: canonical
|
|
4
|
-
peers:
|
|
5
|
-
- adr-pattern.md
|
|
6
|
-
- architecture-md.md
|
|
7
|
-
- plan-roadmap.md
|
|
8
|
-
primary_sources:
|
|
9
|
-
- https://learn.microsoft.com/en-us/azure/well-architected/architect-role/architecture-decision-record — Microsoft Azure Well-Architected Framework on ADR / decision log
|
|
10
|
-
- https://docs.aws.amazon.com/prescriptive-guidance/latest/architectural-decision-records/welcome.html — AWS Prescriptive Guidance, "ADRs"
|
|
11
|
-
- https://adr.github.io — ADR organization (canonical hub)
|
|
12
|
-
- https://github.com/joelparkerhenderson/architecture-decision-record — Joel Parker Henderson catalog (most-cited examples library)
|
|
13
|
-
- https://github.com/npryce/adr-tools — adr-tools, including `adr generate toc`
|
|
14
|
-
- https://github.com/adr/adr-log — adr-log Markdown index generator
|
|
15
|
-
status: research-verified
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
# Decision log — what it actually is
|
|
19
|
-
|
|
20
|
-
> **The canonical "decision log" is the index of all ADRs in `.brain/adrs/`. It is *not* a separate folder.** This is the load-bearing nuance most teams get wrong.
|
|
21
|
-
|
|
22
|
-
## The canonical meaning (cite-able)
|
|
23
|
-
|
|
24
|
-
Microsoft Azure Well-Architected Framework, AWS Prescriptive Guidance, and adr.github.io all converge on the same definition:
|
|
25
|
-
|
|
26
|
-
> "An Architectural Decision Record (ADR) captures a single AD and its rationale; **the collection of ADRs constitutes the decision log.**"
|
|
27
|
-
> — Microsoft Azure WAF, *Architecture decision record*
|
|
28
|
-
|
|
29
|
-
> "A collection of ADRs creates a decision log that captures the architectural decisions for a project."
|
|
30
|
-
> — AWS Prescriptive Guidance, *Architectural decision records*
|
|
31
|
-
|
|
32
|
-
So when a repo has `.brain/adrs/0001-…md` … `0042-…md` and a `.brain/adrs/README.md` listing them, **that is the decision log**. There is no second folder needed.
|
|
33
|
-
|
|
34
|
-
This skill delivers **Promise 5 (continuously-learning)** by ensuring the decision log is *navigable* — an ADR folder without an index is a scrapyard.
|
|
35
|
-
|
|
36
|
-
## The two shapes the audit detects
|
|
37
|
-
|
|
38
|
-
The repo-fixer audit must accept both shapes and not flag either as wrong. Just note which one is in play.
|
|
39
|
-
|
|
40
|
-
| Shape | What's on disk | When appropriate |
|
|
41
|
-
|---|---|---|
|
|
42
|
-
| **Canonical (single-folder)** | `.brain/adrs/` containing all decisions; `.brain/adrs/README.md` is the log index | Default. Fits 90% of teams. |
|
|
43
|
-
| **Split (two-folder)** | `.brain/adrs/` for big architecture decisions; `.brain/decisions/` for lighter day-to-day picks (tooling swaps, library choices, formatting conventions) | Larger orgs where ADR review is heavyweight and would gate routine choices |
|
|
44
|
-
|
|
45
|
-
The split is **a team convention, not industry standard**. Some teams find it useful: ADRs gate architecture, `.brain/decisions/` lets engineers move on a tooling swap without scheduling an architecture review. Other teams find it confusing — two homes invites drift over which decision goes where.
|
|
46
|
-
|
|
47
|
-
The audit's recommendation order:
|
|
48
|
-
|
|
49
|
-
1. If only `.brain/adrs/` exists → recommend keeping it canonical; ensure `README.md` index is present and current.
|
|
50
|
-
2. If only `.brain/decisions/` exists → recommend renaming to `.brain/adrs/` for tool/community alignment (ADR tooling expects `.brain/adrs/`).
|
|
51
|
-
3. If both exist → recommend documenting the split rule in `AGENTS.md`'s "Where to find things" section so the agent knows which folder to write to.
|
|
52
|
-
|
|
53
|
-
## Generating the index
|
|
54
|
-
|
|
55
|
-
Three options, ordered by maintenance burden (lowest first):
|
|
56
|
-
|
|
57
|
-
### Option 1 — `adr-log` (auto-generate)
|
|
58
|
-
|
|
59
|
-
[`adr-log`](https://github.com/adr/adr-log) reads a folder of ADRs and writes a Markdown table of contents into a delimited region of `README.md`:
|
|
60
|
-
|
|
61
|
-
```bash
|
|
62
|
-
npm i -g adr-log
|
|
63
|
-
adr-log -d .brain/adrs -i .brain/adrs/README.md
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
Wrap the index in begin/end markers so subsequent runs only update that region:
|
|
67
|
-
|
|
68
|
-
```markdown
|
|
69
|
-
# Architecture Decision Records
|
|
70
|
-
|
|
71
|
-
<!-- adrlog -->
|
|
72
|
-
- [ADR-0001](0001-record-architecture-decisions.md) — Record architecture decisions
|
|
73
|
-
- [ADR-0002](0002-use-postgres-not-mysql.md) — Use Postgres, not MySQL
|
|
74
|
-
<!-- adrlogstop -->
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
Add to a pre-commit hook or CI workflow so the index never drifts from filenames. See `../recipes/self-healing-hooks.md`.
|
|
78
|
-
|
|
79
|
-
### Option 2 — `adr-tools generate toc`
|
|
80
|
-
|
|
81
|
-
[`adr-tools`](https://github.com/npryce/adr-tools) ships a similar generator. Lightly maintained as of April 2026 — works, but no recent releases.
|
|
82
|
-
|
|
83
|
-
```bash
|
|
84
|
-
adr generate toc > .brain/adrs/README.md
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
### Option 3 — Hand-written index
|
|
88
|
-
|
|
89
|
-
For small repos (<20 ADRs) the index is one line per ADR. Maintain by hand:
|
|
90
|
-
|
|
91
|
-
```markdown
|
|
92
|
-
# Architecture Decision Records
|
|
93
|
-
|
|
94
|
-
| # | Title | Status | Date |
|
|
95
|
-
|---|---|---|---|
|
|
96
|
-
| [0001](0001-record-architecture-decisions.md) | Record architecture decisions | Accepted | 2024-01-12 |
|
|
97
|
-
| [0002](0002-use-postgres-not-mysql.md) | Use Postgres, not MySQL | Accepted | 2024-03-04 |
|
|
98
|
-
| [0003](0003-rest-not-graphql.md) | REST, not GraphQL | Superseded by 0017 | 2024-03-19 |
|
|
99
|
-
| [0017](0017-graphql-for-public-api.md) | GraphQL for public API | Accepted | 2025-11-08 |
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
The hand-written form **adds the Status column**, which the auto-generated forms typically omit. Worth it for a navigable log.
|
|
103
|
-
|
|
104
|
-
## How AGENTS.md links the decision log
|
|
105
|
-
|
|
106
|
-
In the `Where to find things` section:
|
|
107
|
-
|
|
108
|
-
```markdown
|
|
109
|
-
- **Architecture Decision Records:** `.brain/adrs/` — see `.brain/adrs/README.md` for the indexed log; newest-first
|
|
110
|
-
- **Lightweight decisions** (if your team uses the split): `.brain/decisions/`
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
In the `Memory primitives` section:
|
|
114
|
-
|
|
115
|
-
```markdown
|
|
116
|
-
- **Before making architectural decisions**, consult the decision log at `.brain/adrs/README.md`. If your proposed change conflicts with an `Accepted` ADR, write a new ADR superseding it; don't silently override.
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
## Audit checks for the decision log
|
|
120
|
-
|
|
121
|
-
1. **`.brain/adrs/` exists** (or `.brain/architecture/decisions/` — accepted alias).
|
|
122
|
-
2. **An index file exists** at `.brain/adrs/README.md` listing all ADRs.
|
|
123
|
-
3. **The index is current** — every `NNNN-*.md` filename in the folder appears in the index. No orphans, no broken links.
|
|
124
|
-
4. **The index sort order is meaningful** (chronological or by status group, not random).
|
|
125
|
-
5. **AGENTS.md points at the index file**, not just the folder. Folder-only pointers force the agent to `ls` and guess.
|
|
126
|
-
6. **If `.brain/decisions/` also exists**, AGENTS.md documents the split rule.
|
|
127
|
-
|
|
128
|
-
The "index is current" check is the high-value one — it catches drift after a teammate adds an ADR but forgets to update the index.
|
|
129
|
-
|
|
130
|
-
## Common anti-patterns
|
|
131
|
-
|
|
132
|
-
- **No index** — folder of 40 ADRs, no `README.md`. The decision log exists but isn't navigable.
|
|
133
|
-
- **Stale index** — index lists 18 ADRs; folder has 26. Catch with the audit + auto-generation.
|
|
134
|
-
- **Two parallel logs that drift** — `.brain/adrs/` and `.brain/decisions/` both have ADRs about Postgres. Pick a rule and document it.
|
|
135
|
-
- **Decision log as a single Markdown file** — `.brain/decisions.md` with all decisions in one document. Editing one decision rewrites file history; no per-decision audit trail. Strongly recommended against.
|
|
136
|
-
- **Folder named `.brain/architecture-decisions/`** — works, but `.brain/adrs/` is what tooling expects. Prefer `.brain/adrs/`.
|
|
137
|
-
- **Numbering reset on folder split** — if you split into `.brain/adrs/` and `.brain/decisions/`, do NOT restart numbering at 0001 in the second folder. Keep the global sequence so cross-references work.
|
|
138
|
-
|
|
139
|
-
## Cross-references
|
|
140
|
-
|
|
141
|
-
- ADR pattern (canonical): `adr-pattern.md`
|
|
142
|
-
- Architecture overview (current state, not decisions): `architecture-md.md`
|
|
143
|
-
- Plan / roadmap (forward-looking, not decisions): `plan-roadmap.md`
|
|
144
|
-
- Self-healing index generation: `../recipes/self-healing-hooks.md`
|
|
145
|
-
- Memory organization: `../recipes/memory-organization.md`
|
|
146
|
-
- AGENTS.md memory primitives section: `../standards/agents-md-spec.md`
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
date: 2026-04-27
|
|
3
|
-
coverage: canonical
|
|
4
|
-
peers:
|
|
5
|
-
- decisions-log.md
|
|
6
|
-
- changelog.md
|
|
7
|
-
- architecture-md.md
|
|
8
|
-
primary_sources:
|
|
9
|
-
- https://keepachangelog.com/en/1.1.0/ — Keep a Changelog 1.1.0 (date-stamp convention)
|
|
10
|
-
- https://linear.app/docs/markdown-export — Linear Markdown export (issues / projects)
|
|
11
|
-
- https://help.shortcut.com/hc/en-us/articles/360057451511 — Shortcut Markdown / API export
|
|
12
|
-
- https://docs.basecamp.com/article/29-export-your-account — Basecamp project export
|
|
13
|
-
- https://docs.github.com/en/issues/planning-and-tracking-with-projects — GitHub Projects (issue-tracker plan source)
|
|
14
|
-
- https://www.atlassian.com/agile/project-management/program-roadmaps — Atlassian on roadmaps vs plans
|
|
15
|
-
status: research-verified
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
# PLAN.md and ROADMAP.md — active work vs forward-looking
|
|
19
|
-
|
|
20
|
-
> **PLAN.md is *now* — what's in flight this week or sprint. ROADMAP.md is *next* — what's coming this quarter or year.** They are two different documents with different update cadences and different audiences. Conflating them is the most common failure mode.
|
|
21
|
-
|
|
22
|
-
This pattern delivers **Promise 1 (less-wasteful)** and **Promise 3 (less-prone-to-staleness)**: when the boundary between active and forward-looking is clear, neither doc rots into a TODO graveyard.
|
|
23
|
-
|
|
24
|
-
## The split
|
|
25
|
-
|
|
26
|
-
| | `.brain/PLAN.md` | `.brain/ROADMAP.md` |
|
|
27
|
-
|---|---|---|
|
|
28
|
-
| **Horizon** | This week / sprint / current iteration | This quarter / half / year |
|
|
29
|
-
| **Granularity** | Specific tasks, owners, due dates | Themes, milestones, target months |
|
|
30
|
-
| **Cadence** | Updated weekly or per-sprint | Updated quarterly |
|
|
31
|
-
| **Audience** | The team doing the work; LLM agents picking up tasks | Stakeholders, leadership, contributors deciding whether to invest |
|
|
32
|
-
| **Status verbs** | "in progress", "blocked", "in review", "done" | "planned", "in progress", "shipped", "deferred" |
|
|
33
|
-
| **Source of truth** | Often a mirror/export of the issue tracker | Hand-maintained by leads/PMs |
|
|
34
|
-
|
|
35
|
-
If a team has only one of the two, **`PLAN.md` is the higher-value one for LLM agents** — the agent needs to know what to pick up, not what's coming in Q3. Skip `ROADMAP.md` until there is one to publish.
|
|
36
|
-
|
|
37
|
-
## PLAN.md — shape and conventions
|
|
38
|
-
|
|
39
|
-
### Minimal template
|
|
40
|
-
|
|
41
|
-
```markdown
|
|
42
|
-
---
|
|
43
|
-
updated: 2026-04-27
|
|
44
|
-
horizon: 2026-W17 (Apr 21 – Apr 27)
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
# Plan — Week of 2026-04-21
|
|
48
|
-
|
|
49
|
-
## In progress
|
|
50
|
-
|
|
51
|
-
- **[#412] Migrate auth to Auth.js v5** — @alice — due 2026-04-28
|
|
52
|
-
- **[#418] Replace Redis with Postgres LISTEN/NOTIFY** — @bob — due 2026-05-02
|
|
53
|
-
- Blocked on ADR-0042 review
|
|
54
|
-
|
|
55
|
-
## Up next (this week)
|
|
56
|
-
|
|
57
|
-
- [#421] Cron worker → BullMQ — unassigned
|
|
58
|
-
- [#423] Strip dead `lib/legacy/` — @carol
|
|
59
|
-
|
|
60
|
-
## Done this week
|
|
61
|
-
|
|
62
|
-
- [x] [#405] Bump TypeScript 5.7 → 5.8 (@alice, merged 2026-04-23)
|
|
63
|
-
- [x] [#408] Drop Node 20 from CI matrix (@bob, merged 2026-04-25)
|
|
64
|
-
|
|
65
|
-
## Archive
|
|
66
|
-
|
|
67
|
-
See `.brain/archive/plan-2026-W16.md`.
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### Conventions
|
|
71
|
-
|
|
72
|
-
- **Date the doc**: Keep-a-Changelog-style `updated: YYYY-MM-DD` in YAML frontmatter, plus an English `Week of …` line in the H1. Without a date stamp the agent can't tell whether the plan is current. ([keepachangelog.com](https://keepachangelog.com/en/1.1.0/) date-stamp convention.)
|
|
73
|
-
- **Issue numbers**: link to the tracker so the plan is a *view*, not a parallel source of truth.
|
|
74
|
-
- **Owners**: an unowned item drifts. If no one will own it this week, push it to the roadmap.
|
|
75
|
-
- **Due dates**: explicit ISO dates beat "next week" — relative dates rot.
|
|
76
|
-
- **Archive completed work weekly**: copy the "Done" section to `.brain/archive/plan-YYYY-Www.md` and clear it from `PLAN.md`. The archive is a free changelog.
|
|
77
|
-
|
|
78
|
-
### The TODO-graveyard anti-pattern
|
|
79
|
-
|
|
80
|
-
The most common failure: items accumulate, nothing leaves. After a year `PLAN.md` is 800 lines, half of it is "Up next" from 8 months ago, the agent doesn't know which items are real.
|
|
81
|
-
|
|
82
|
-
Mitigations:
|
|
83
|
-
|
|
84
|
-
1. **Time-box "Up next"** to the current iteration. Items that don't make it move to `ROADMAP.md` or get closed.
|
|
85
|
-
2. **Archive on a fixed cadence** (every Friday, end-of-sprint).
|
|
86
|
-
3. **Run a staleness audit**: any line item with a due date >30 days in the past, or unedited for >60 days, is flagged. See `../audit-patterns/staleness-tooling.md`.
|
|
87
|
-
|
|
88
|
-
## ROADMAP.md — shape and conventions
|
|
89
|
-
|
|
90
|
-
### Minimal template
|
|
91
|
-
|
|
92
|
-
```markdown
|
|
93
|
-
---
|
|
94
|
-
updated: 2026-04-15
|
|
95
|
-
horizon: 2026-Q2 / Q3
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
# Roadmap
|
|
99
|
-
|
|
100
|
-
## Now (Q2 2026)
|
|
101
|
-
|
|
102
|
-
- **Multi-tenant scoping** — required for enterprise GA. Owner: @alice. Target: 2026-05.
|
|
103
|
-
- **Webhook delivery v2** — exponential backoff, replay tooling. Owner: @bob. Target: 2026-06.
|
|
104
|
-
|
|
105
|
-
## Next (Q3 2026)
|
|
106
|
-
|
|
107
|
-
- **Self-serve billing portal** — Stripe Customer Portal integration.
|
|
108
|
-
- **OpenTelemetry instrumentation** — replace ad-hoc logging.
|
|
109
|
-
|
|
110
|
-
## Later (2026-H2 and beyond)
|
|
111
|
-
|
|
112
|
-
- Federated SSO
|
|
113
|
-
- Audit-log export to customer S3
|
|
114
|
-
|
|
115
|
-
## Recently shipped
|
|
116
|
-
|
|
117
|
-
- 2026-Q1 — SAML SSO (Enterprise tier)
|
|
118
|
-
- 2025-Q4 — Async webhook delivery v1
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
### Conventions
|
|
122
|
-
|
|
123
|
-
- **Now / Next / Later** is the standard public-roadmap shape ([ProductPlan](https://www.productplan.com/learn/now-next-later-roadmap/) popularized this; widely adopted). Keeps things vague enough to ship.
|
|
124
|
-
- **No daily-task granularity.** If an item belongs in a sprint, it belongs in `PLAN.md`.
|
|
125
|
-
- **Recently shipped** doubles as a release-notes pointer — link to `CHANGELOG.md`.
|
|
126
|
-
- **Quarterly review** ritual: at end of quarter, move "Now" → "Recently shipped", promote "Next" → "Now", review "Later".
|
|
127
|
-
|
|
128
|
-
## Issue-tracker exports — when the plan IS the export
|
|
129
|
-
|
|
130
|
-
Many teams treat the issue tracker as truth and `PLAN.md` as a generated view. This works well — and the agent gets a Markdown view it can read without API access.
|
|
131
|
-
|
|
132
|
-
| Tool | Export mechanism | Notes |
|
|
133
|
-
|---|---|---|
|
|
134
|
-
| **Linear** | [Markdown export](https://linear.app/docs/markdown-export) per issue or project; API for bulk | Project view exports clean Markdown with status grouping |
|
|
135
|
-
| **Shortcut (formerly Clubhouse)** | [API + Markdown rendering in CLI](https://help.shortcut.com/hc/en-us/articles/360057451511) | Iteration views map to weekly plans |
|
|
136
|
-
| **GitHub Projects** | [GraphQL API](https://docs.github.com/en/graphql/reference/objects#projectv2); community scripts dump views to Markdown | Native to GitHub — no separate auth |
|
|
137
|
-
| **Jira** | REST API; `jira-cli`, `gojira` | Heavier setup; usually only worth it for Jira-mandated orgs |
|
|
138
|
-
| **Basecamp** | [Account export](https://docs.basecamp.com/article/29-export-your-account) | Coarser; better for archive than weekly plan |
|
|
139
|
-
|
|
140
|
-
The pattern: a CI job (or pre-commit hook) regenerates `.brain/PLAN.md` from the tracker on a cron schedule, commits the diff. Now the agent reads a current plan without an API token.
|
|
141
|
-
|
|
142
|
-
## How AGENTS.md links them
|
|
143
|
-
|
|
144
|
-
In the `Where to find things` section:
|
|
145
|
-
|
|
146
|
-
```markdown
|
|
147
|
-
- **Active plan:** `.brain/PLAN.md` — what's in flight this week
|
|
148
|
-
- **Roadmap:** `.brain/ROADMAP.md` — quarterly horizon
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
In the `Memory primitives` section:
|
|
152
|
-
|
|
153
|
-
```markdown
|
|
154
|
-
- **When picking up work**, start at `.brain/PLAN.md`. Items there are scoped for the current iteration.
|
|
155
|
-
- **For longer-horizon questions** ("are we going to support X?"), check `.brain/ROADMAP.md` before proposing new work.
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
## Audit checks
|
|
159
|
-
|
|
160
|
-
1. **Date stamps present** — `updated:` frontmatter or visible date in H1. A `PLAN.md` without a date is unverifiable.
|
|
161
|
-
2. **PLAN.md updated within the last 14 days** (sprint cadence). Older = staleness flag.
|
|
162
|
-
3. **ROADMAP.md updated within the last 90 days** (quarterly cadence). Older = staleness flag.
|
|
163
|
-
4. **No items in PLAN.md with due dates >30 days past** (TODO graveyard).
|
|
164
|
-
5. **`.brain/PLAN.md` and `.brain/ROADMAP.md` are referenced from AGENTS.md.**
|
|
165
|
-
6. **Archive folder exists** if the team is using weekly archival (`.brain/archive/plan-YYYY-Www.md`).
|
|
166
|
-
|
|
167
|
-
## Common anti-patterns
|
|
168
|
-
|
|
169
|
-
- **One file called `TODO.md`** at repo root, mixing this-week and someday. Split it into PLAN.md + ROADMAP.md or kill it.
|
|
170
|
-
- **No date on either doc** — agent can't tell if the plan is from last sprint or last year.
|
|
171
|
-
- **PLAN.md as immortal backlog** — items added, never removed. Time-box and archive.
|
|
172
|
-
- **ROADMAP.md with weekly-task granularity** — wrong horizon. Push detail to PLAN.md.
|
|
173
|
-
- **PLAN.md and the issue tracker disagree** — pick one as truth (usually the tracker) and generate the other.
|
|
174
|
-
- **Roadmap contains commitments without owners or target months** — it's a wishlist, not a roadmap.
|
|
175
|
-
|
|
176
|
-
## Cross-references
|
|
177
|
-
|
|
178
|
-
- Decision log (decisions, not plans): `decisions-log.md`
|
|
179
|
-
- Changelog (shipped, not planned): `changelog.md`
|
|
180
|
-
- Self-healing PLAN.md regeneration: `../recipes/self-healing-hooks.md`
|
|
181
|
-
- Staleness detection: `../audit-patterns/staleness-tooling.md`
|
|
182
|
-
- AGENTS.md "Where to find things" section: `../standards/agents-md-spec.md`
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
date: 2026-04-27
|
|
3
|
-
coverage: extended
|
|
4
|
-
peers:
|
|
5
|
-
- adr-pattern.md
|
|
6
|
-
- decisions-log.md
|
|
7
|
-
primary_sources:
|
|
8
|
-
- https://sre.google/workbook/postmortem-culture/ — Google SRE postmortem culture
|
|
9
|
-
- https://sre.google/sre-book/example-postmortem/ — Google SRE example postmortem
|
|
10
|
-
- https://www.atlassian.com/incident-management/postmortem/templates — Atlassian postmortem templates
|
|
11
|
-
- https://github.com/dastergon/postmortem-templates — most-cited template catalog
|
|
12
|
-
status: research-verified
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
# Post-mortem pattern
|
|
16
|
-
|
|
17
|
-
> **Storage convention.** This skill recommends `.brain/postmortems/` (most common) or `.brain/incidents/` (also common). Avoid `.brain/traces/` — "traces" risks being read as observability traces (OpenTelemetry / Jaeger), which is a different concept.
|
|
18
|
-
|
|
19
|
-
## What a post-mortem is
|
|
20
|
-
|
|
21
|
-
A **dated write-up of an incident**: what happened, what the impact was, what caused it, what we did, what we learned. Filed after the incident is resolved; serves as **memory** so the same failure doesn't repeat.
|
|
22
|
-
|
|
23
|
-
The load-bearing principle is **blameless**: post-mortems describe systems failures, not personal failures. People did what felt reasonable given the information they had. The post-mortem looks for systemic improvements — process, tooling, alerting, documentation — not someone to blame.
|
|
24
|
-
|
|
25
|
-
Source: [Google SRE — Postmortem Culture: Learning from Failure](https://sre.google/workbook/postmortem-culture/).
|
|
26
|
-
|
|
27
|
-
## Two canonical templates
|
|
28
|
-
|
|
29
|
-
### Google SRE postmortem (the gold standard)
|
|
30
|
-
|
|
31
|
-
Sections (per Google's [example postmortem](https://sre.google/sre-book/example-postmortem/)):
|
|
32
|
-
|
|
33
|
-
- **Summary** — one paragraph
|
|
34
|
-
- **Impact** — users affected, duration, severity
|
|
35
|
-
- **Root causes** — the underlying *why* (often plural)
|
|
36
|
-
- **Trigger** — the proximate event that fired the latent bug
|
|
37
|
-
- **Resolution** — what stopped the bleeding
|
|
38
|
-
- **Detection** — how we noticed (monitoring? user report? both?)
|
|
39
|
-
- **Action items** — concrete follow-ups, with owners + due dates
|
|
40
|
-
- **Lessons learned** — what went well / what went poorly / where we got lucky
|
|
41
|
-
- **Timeline** — chronological log with timestamps
|
|
42
|
-
|
|
43
|
-
Stored internally at Google as Google Docs, not Markdown — but the structure ports directly to Markdown.
|
|
44
|
-
|
|
45
|
-
### Atlassian postmortem template
|
|
46
|
-
|
|
47
|
-
Sections (per [Atlassian](https://www.atlassian.com/incident-management/postmortem/templates)):
|
|
48
|
-
|
|
49
|
-
- **Summary**
|
|
50
|
-
- **Leadup** — what was happening before
|
|
51
|
-
- **Fault** — the specific failure
|
|
52
|
-
- **Impact**
|
|
53
|
-
- **Detection**
|
|
54
|
-
- **Response**
|
|
55
|
-
- **Recovery**
|
|
56
|
-
- **Five Whys** — recursive root-cause drill
|
|
57
|
-
- **Action items**
|
|
58
|
-
|
|
59
|
-
Atlassian's split between *Detection / Response / Recovery* maps cleanly to incident-management process steps; the skill recommends this structure for teams with formal IM tooling.
|
|
60
|
-
|
|
61
|
-
## Filename + storage
|
|
62
|
-
|
|
63
|
-
Recommended:
|
|
64
|
-
|
|
65
|
-
```
|
|
66
|
-
.brain/postmortems/
|
|
67
|
-
├── 2026-04-12-checkout-outage.md
|
|
68
|
-
├── 2026-03-08-payment-double-charge.md
|
|
69
|
-
├── 2026-01-22-search-degradation.md
|
|
70
|
-
└── README.md # index, sorted newest-first
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
Filename pattern: `YYYY-MM-DD-short-incident-name.md`. The date prefix sorts chronologically.
|
|
74
|
-
|
|
75
|
-
`.brain/incidents/` is an accepted alias. `.brain/post-mortems/` (with hyphen) also works. Pick one and stick with it.
|
|
76
|
-
|
|
77
|
-
## File template (Google SRE flavor)
|
|
78
|
-
|
|
79
|
-
```markdown
|
|
80
|
-
---
|
|
81
|
-
date: 2026-04-12
|
|
82
|
-
status: resolved
|
|
83
|
-
severity: SEV-2
|
|
84
|
-
duration: 47 minutes
|
|
85
|
-
---
|
|
86
|
-
|
|
87
|
-
# Checkout outage — 2026-04-12
|
|
88
|
-
|
|
89
|
-
## Summary
|
|
90
|
-
|
|
91
|
-
For 47 minutes on April 12 starting at 14:23 UTC, the checkout endpoint
|
|
92
|
-
returned 500s for ~30% of requests due to a database connection-pool
|
|
93
|
-
exhaustion triggered by a bot scrape.
|
|
94
|
-
|
|
95
|
-
## Impact
|
|
96
|
-
|
|
97
|
-
- ~12,000 affected users
|
|
98
|
-
- ~$40K in dropped revenue
|
|
99
|
-
- SEV-2 declared at 14:31 UTC
|
|
100
|
-
|
|
101
|
-
## Root causes
|
|
102
|
-
|
|
103
|
-
1. Connection pool sized for normal load only; no headroom.
|
|
104
|
-
2. Bot scrape was not detected by rate-limiter (User-Agent allow-listed
|
|
105
|
-
in legacy config from 2024).
|
|
106
|
-
3. No alert on connection-pool saturation; alert fired only on response-
|
|
107
|
-
latency p95.
|
|
108
|
-
|
|
109
|
-
## Trigger
|
|
110
|
-
|
|
111
|
-
GoogleBot-impersonating scrape from AS12345, 14:21 UTC, 800 req/s.
|
|
112
|
-
|
|
113
|
-
## Resolution
|
|
114
|
-
|
|
115
|
-
- Killed scrape via WAF rule (14:55 UTC).
|
|
116
|
-
- Connection pool drained naturally over 90s.
|
|
117
|
-
|
|
118
|
-
## Detection
|
|
119
|
-
|
|
120
|
-
User report at 14:27 UTC. Internal alert fired 14:29 UTC.
|
|
121
|
-
|
|
122
|
-
## Action items
|
|
123
|
-
|
|
124
|
-
- [ ] (Alice, due 2026-04-19) Add connection-pool-saturation alert.
|
|
125
|
-
- [ ] (Bob, due 2026-04-26) Review WAF allow-list; remove stale entries.
|
|
126
|
-
- [ ] (Charlie, due 2026-05-03) Right-size connection pool with headroom.
|
|
127
|
-
|
|
128
|
-
## Lessons learned
|
|
129
|
-
|
|
130
|
-
### What went well
|
|
131
|
-
- Time-to-resolution was 32 minutes once root cause identified.
|
|
132
|
-
- WAF tooling was usable without a vendor escalation.
|
|
133
|
-
|
|
134
|
-
### What went poorly
|
|
135
|
-
- 4 minutes between user report and our alert firing.
|
|
136
|
-
- WAF allow-list hadn't been reviewed in 18 months.
|
|
137
|
-
|
|
138
|
-
### Where we got lucky
|
|
139
|
-
- Scrape happened at 14:23 UTC (low-traffic window). At peak we'd have
|
|
140
|
-
exhausted the pool faster.
|
|
141
|
-
|
|
142
|
-
## Timeline (UTC)
|
|
143
|
-
|
|
144
|
-
- 14:21 — bot scrape begins
|
|
145
|
-
- 14:23 — first checkout 500
|
|
146
|
-
- 14:27 — user report in #incidents
|
|
147
|
-
- 14:29 — internal latency alert fires
|
|
148
|
-
- 14:31 — SEV-2 declared
|
|
149
|
-
- 14:48 — root cause identified (DB connection pool)
|
|
150
|
-
- 14:55 — scrape blocked at WAF
|
|
151
|
-
- 15:10 — incident resolved
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
## How AGENTS.md should reference post-mortems
|
|
155
|
-
|
|
156
|
-
In the `Where to find things` section:
|
|
157
|
-
|
|
158
|
-
```markdown
|
|
159
|
-
- **Post-mortems:** `.brain/postmortems/` — newest-first; read when investigating recurring issues
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
In the `Memory primitives` section:
|
|
163
|
-
|
|
164
|
-
```markdown
|
|
165
|
-
- **When debugging a production issue**, search `.brain/postmortems/` for prior occurrences. Many "new" bugs are repeats of fixed-and-forgotten issues.
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
## Audit checks for post-mortems
|
|
169
|
-
|
|
170
|
-
1. **Folder exists** at `.brain/postmortems/` (or `.brain/incidents/` — accepted alias).
|
|
171
|
-
2. **Filename pattern is consistent** (`YYYY-MM-DD-name.md`).
|
|
172
|
-
3. **Each post-mortem has a `status:` field** (resolved / ongoing / blocked) and `date:`.
|
|
173
|
-
4. **An index file (`README.md`) exists** in the folder, sorted newest-first.
|
|
174
|
-
5. **`.brain/postmortems/` is referenced from AGENTS.md**.
|
|
175
|
-
|
|
176
|
-
The audit should NOT flag a missing `.brain/postmortems/` folder for projects that haven't had production incidents — heuristic: search commit log for `revert`, `incident`, `outage`, `hotfix` to estimate whether the project should have post-mortems.
|
|
177
|
-
|
|
178
|
-
## Trigger rules — when to write a post-mortem
|
|
179
|
-
|
|
180
|
-
A post-mortem is *not* required for every bug. The skill recommends writing one when **any one** of:
|
|
181
|
-
|
|
182
|
-
1. **A `release(.*hotfix` commit lands within 24h of a non-hotfix `release(` commit.** This is the canonical trigger — the hotfix exists *because* something escaped the prior release. The mechanism that allowed the escape needs writing down.
|
|
183
|
-
2. **A consumer-facing bug spent more than 1h in `latest` on npm** (or equivalent — the user-visible default channel for the package). The lag-to-detection is the unit of regret; capture how it happened and shorten the next loop.
|
|
184
|
-
3. **An audit emits a `severity: high` finding affecting anything outside `[Unreleased]`.** OPEN findings on shipped artifacts are incidents-in-waiting; if they trace to a published version, write the post-mortem.
|
|
185
|
-
4. **A trip-wire (CI gate, pre-commit hook) failed silently and the failure mode was discovered post-hoc.** "The check that should have caught this didn't" is exactly the class of process lesson post-mortems exist to capture.
|
|
186
|
-
5. **A user-reported runtime error against a tagged release.** External-detected runtime failures are the cleanest signal that internal verification missed.
|
|
187
|
-
|
|
188
|
-
The point isn't ceremony — it's that the *mechanism* of failure is captured *once*, in plain text, so the next session inherits the diagnosis instead of re-walking it. A post-mortem that says "we'll be more careful" is failing the test; one that says "we'll add `<specific trip-wire>`" passes.
|
|
189
|
-
|
|
190
|
-
**Mapping to `ops-repo` artifacts.** When a post-mortem identifies a structural fix (new trip-wire, new convention, new generator), record the finding-to-fix pairing in `.brain/findings/INDEX.md` under `## Graduations`. The post-mortem is the narrative; the graduations table is the structured index. See [`../recipes/findings-index-readout.md`](../recipes/findings-index-readout.md).
|
|
191
|
-
|
|
192
|
-
## Common anti-patterns
|
|
193
|
-
|
|
194
|
-
- **Folder named `.brain/traces/`** — confused with observability traces.
|
|
195
|
-
- **No date prefix on filename** — files don't sort chronologically.
|
|
196
|
-
- **Post-mortem is a finger-pointing exercise** — violates blameless principle. Convert to systems-language.
|
|
197
|
-
- **Action items without owners or due dates** — they don't get done.
|
|
198
|
-
- **No timeline section** — losing the "what happened when" loses the chance to improve detection.
|
|
199
|
-
- **Not linked from AGENTS.md** — agent doesn't know to check.
|
|
200
|
-
|
|
201
|
-
## Cross-references
|
|
202
|
-
|
|
203
|
-
- ADR pattern (architecture decisions, separate concept): `adr-pattern.md`
|
|
204
|
-
- Decision log (collection of ADRs): `decisions-log.md`
|
|
205
|
-
- AGENTS.md "Memory primitives" section: `../standards/agents-md-spec.md`
|
|
206
|
-
- Memory-organization recipe: `../recipes/memory-organization.md`
|