@nurix/etna 0.19.66 → 0.19.67
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/bin/etna.js +10 -1
- package/data/harness-index.json +1 -5
- package/data/harnesses/code/CLAUDE.md +2 -0
- package/data/harnesses/code/agents/maintenance.md +3 -1
- package/data/harnesses/code/harness.json +7 -2
- package/data/harnesses/code/hooks/compliance.mjs +1 -0
- package/data/harnesses/code/hooks/lib/frozen.mjs +3 -0
- package/data/harnesses/code/hooks/lib/ownership.mjs +3 -1
- package/data/harnesses/code/skills/documentation/scripts/doc-lint.mjs +1 -1
- package/data/harnesses/delivery/agents/maintenance.md +3 -1
- package/data/harnesses/delivery/harness.json +2 -2
- package/data/harnesses/delivery/skills/documentation/scripts/doc-lint.mjs +1 -1
- package/data/harnesses/etna/agents/maintenance.md +3 -1
- package/data/harnesses/etna/harness.json +2 -2
- package/data/harnesses/etna/skills/documentation/scripts/doc-lint.mjs +1 -1
- package/lib/install/materialize.mjs +51 -57
- package/package.json +2 -2
- package/data/harnesses/apollo/.mcp.json +0 -8
- package/data/harnesses/apollo/.prettierignore +0 -29
- package/data/harnesses/apollo/.prettierrc.json +0 -3
- package/data/harnesses/apollo/.vscode/settings.json +0 -19
- package/data/harnesses/apollo/CLAUDE.md +0 -162
- package/data/harnesses/apollo/agents/bookkeeper.md +0 -28
- package/data/harnesses/apollo/agents/brainstorm.md +0 -144
- package/data/harnesses/apollo/agents/change-review.md +0 -251
- package/data/harnesses/apollo/agents/lld-mode.md +0 -58
- package/data/harnesses/apollo/agents/maintenance.md +0 -234
- package/data/harnesses/apollo/agents/performance-review.md +0 -223
- package/data/harnesses/apollo/agents/retro.md +0 -46
- package/data/harnesses/apollo/codex/agents/bookkeeper.toml +0 -26
- package/data/harnesses/apollo/codex/agents/brainstorm.toml +0 -142
- package/data/harnesses/apollo/codex/agents/change-review.toml +0 -249
- package/data/harnesses/apollo/codex/agents/lld-mode.toml +0 -52
- package/data/harnesses/apollo/codex/agents/maintenance.toml +0 -228
- package/data/harnesses/apollo/codex/agents/performance-review.toml +0 -222
- package/data/harnesses/apollo/codex/agents/retro.toml +0 -45
- package/data/harnesses/apollo/harness.json +0 -19
- package/data/harnesses/apollo/hooks/approved-packages.md +0 -44
- package/data/harnesses/apollo/hooks/awareness.mjs +0 -405
- package/data/harnesses/apollo/hooks/check-bookkeeping-clean.mjs +0 -19
- package/data/harnesses/apollo/hooks/check-changelog-presence.mjs +0 -57
- package/data/harnesses/apollo/hooks/check-completion-integrity.mjs +0 -71
- package/data/harnesses/apollo/hooks/check-ownership.mjs +0 -22
- package/data/harnesses/apollo/hooks/compliance.mjs +0 -457
- package/data/harnesses/apollo/hooks/hooks.json +0 -23
- package/data/harnesses/apollo/hooks/lib/frozen.mjs +0 -58
- package/data/harnesses/apollo/hooks/lib/ownership.mjs +0 -242
- package/data/harnesses/apollo/hooks/lib/state.mjs +0 -170
- package/data/harnesses/apollo/rules/changelog.md +0 -27
- package/data/harnesses/apollo/rules/database.md +0 -34
- package/data/harnesses/apollo/rules/frontend.md +0 -30
- package/data/harnesses/apollo/rules/general.md +0 -40
- package/data/harnesses/apollo/rules/nomenclature.md +0 -30
- package/data/harnesses/apollo/rules/pnpm.md +0 -57
- package/data/harnesses/apollo/rules/testing.md +0 -64
- package/data/harnesses/apollo/skills/boundary/SKILL.md +0 -75
- package/data/harnesses/apollo/skills/boundary/references/index.md +0 -16
- package/data/harnesses/apollo/skills/boundary/references/mechanisms.md +0 -99
- package/data/harnesses/apollo/skills/boundary/references/packs/async-messaging.md +0 -81
- package/data/harnesses/apollo/skills/boundary/references/packs/auth.md +0 -93
- package/data/harnesses/apollo/skills/boundary/references/packs/build-config-runtime.md +0 -93
- package/data/harnesses/apollo/skills/boundary/references/packs/cloudflare.md +0 -93
- package/data/harnesses/apollo/skills/boundary/references/packs/frontend.md +0 -93
- package/data/harnesses/apollo/skills/boundary/references/packs/generic-tail.md +0 -55
- package/data/harnesses/apollo/skills/boundary/references/packs/persistence.md +0 -93
- package/data/harnesses/apollo/skills/boundary/references/packs/wire-api.md +0 -87
- package/data/harnesses/apollo/skills/brainstorm/README.md +0 -56
- package/data/harnesses/apollo/skills/brainstorm/SKILL.md +0 -173
- package/data/harnesses/apollo/skills/brainstorm/references/doctrine.md +0 -98
- package/data/harnesses/apollo/skills/brainstorm/references/harvest.md +0 -86
- package/data/harnesses/apollo/skills/brainstorm/references/session-schema.md +0 -186
- package/data/harnesses/apollo/skills/brainstorm/scripts/detector.mjs +0 -460
- package/data/harnesses/apollo/skills/design/SKILL.md +0 -121
- package/data/harnesses/apollo/skills/design/components/charts.md +0 -76
- package/data/harnesses/apollo/skills/design/components/collections.md +0 -132
- package/data/harnesses/apollo/skills/design/components/feedback.md +0 -47
- package/data/harnesses/apollo/skills/design/components/hooks.md +0 -35
- package/data/harnesses/apollo/skills/design/components/index.md +0 -143
- package/data/harnesses/apollo/skills/design/components/inputs.md +0 -327
- package/data/harnesses/apollo/skills/design/components/layout.md +0 -52
- package/data/harnesses/apollo/skills/design/components/media.md +0 -66
- package/data/harnesses/apollo/skills/design/components/motion.md +0 -82
- package/data/harnesses/apollo/skills/design/components/navigation.md +0 -29
- package/data/harnesses/apollo/skills/design/components/overlays.md +0 -72
- package/data/harnesses/apollo/skills/design/components/setup.md +0 -40
- package/data/harnesses/apollo/skills/design/components/typography.md +0 -46
- package/data/harnesses/apollo/skills/design/components/utils.md +0 -37
- package/data/harnesses/apollo/skills/design/data/blueprints/browse.md +0 -38
- package/data/harnesses/apollo/skills/design/data/blueprints/creation-flow.md +0 -38
- package/data/harnesses/apollo/skills/design/data/blueprints/dashboard.md +0 -38
- package/data/harnesses/apollo/skills/design/data/blueprints/grid.md +0 -38
- package/data/harnesses/apollo/skills/design/data/blueprints/queue.md +0 -38
- package/data/harnesses/apollo/skills/design/data/blueprints/record-detail.md +0 -38
- package/data/harnesses/apollo/skills/design/data/blueprints/settings.md +0 -38
- package/data/harnesses/apollo/skills/design/data/charts/census.csv +0 -58
- package/data/harnesses/apollo/skills/design/data/checklists/browse.md +0 -21
- package/data/harnesses/apollo/skills/design/data/checklists/creation-flow.md +0 -20
- package/data/harnesses/apollo/skills/design/data/checklists/dashboard.md +0 -21
- package/data/harnesses/apollo/skills/design/data/checklists/grid.md +0 -21
- package/data/harnesses/apollo/skills/design/data/checklists/queue.md +0 -21
- package/data/harnesses/apollo/skills/design/data/checklists/record-detail.md +0 -21
- package/data/harnesses/apollo/skills/design/data/checklists/settings.md +0 -21
- package/data/harnesses/apollo/skills/design/data/chrome/board-column.md +0 -68
- package/data/harnesses/apollo/skills/design/data/chrome/data-table.md +0 -63
- package/data/harnesses/apollo/skills/design/data/chrome/side-panel.md +0 -60
- package/data/harnesses/apollo/skills/design/data/chrome/sidebar.md +0 -78
- package/data/harnesses/apollo/skills/design/data/chrome/stat-cards.md +0 -62
- package/data/harnesses/apollo/skills/design/data/chrome/topbar.md +0 -65
- package/data/harnesses/apollo/skills/design/data/elevation/ant-design-directional-shadow.md +0 -19
- package/data/harnesses/apollo/skills/design/data/elevation/apple-liquid-glass-material.md +0 -18
- package/data/harnesses/apollo/skills/design/data/elevation/atlassian-surface-shadow-pairing.md +0 -20
- package/data/harnesses/apollo/skills/design/data/elevation/fluent-2-key-ambient-ramp.md +0 -20
- package/data/harnesses/apollo/skills/design/data/elevation/github-primer-sparing-shadow.md +0 -19
- package/data/harnesses/apollo/skills/design/data/elevation/ibm-carbon-layer-and-border.md +0 -19
- package/data/harnesses/apollo/skills/design/data/elevation/linear-dark-surface-ladder.md +0 -17
- package/data/harnesses/apollo/skills/design/data/elevation/material-2-key-ambient-dp-ramp.md +0 -19
- package/data/harnesses/apollo/skills/design/data/elevation/material-3-tonal-elevation.md +0 -21
- package/data/harnesses/apollo/skills/design/data/elevation/neobrutalist-hard-offset.md +0 -19
- package/data/harnesses/apollo/skills/design/data/elevation/neumorphic-soft-dual-shadow.md +0 -18
- package/data/harnesses/apollo/skills/design/data/elevation/notion-warm-minimal-hairline.md +0 -17
- package/data/harnesses/apollo/skills/design/data/elevation/polaris-elevation-inset-bevel.md +0 -21
- package/data/harnesses/apollo/skills/design/data/elevation/radix-themes-alpha-ring-scale.md +0 -19
- package/data/harnesses/apollo/skills/design/data/elevation/shadcn-neutral-derived-radius.md +0 -19
- package/data/harnesses/apollo/skills/design/data/elevation/stripe-brand-tinted-dual-shadow.md +0 -18
- package/data/harnesses/apollo/skills/design/data/elevation/tailwind-default-utility-scale.md +0 -19
- package/data/harnesses/apollo/skills/design/data/elevation/vercel-geist-shadow-as-border.md +0 -20
- package/data/harnesses/apollo/skills/design/data/iconography.md +0 -199
- package/data/harnesses/apollo/skills/design/data/motion/accordion-expand.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/destructive-hold-confirm.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/drag-dismiss-momentum.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/empty-state-arrive.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/hover-lift.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/modal-center-arrive.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/number-ticker-roll.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/onboarding-bounce.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/panel-slide.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/press-feedback.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/progress-linear-loop.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/route-crossfade.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/rubber-band-overscroll.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/skeleton-shimmer.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/stagger-arrive.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/toast-enter-stack.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/tooltip-chain-instant.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/trigger-anchored-reveal.md +0 -18
- package/data/harnesses/apollo/skills/design/data/tells.csv +0 -34
- package/data/harnesses/apollo/skills/design/data/voices/bright-collaborator.md +0 -29
- package/data/harnesses/apollo/skills/design/data/voices/direct-operator.md +0 -29
- package/data/harnesses/apollo/skills/design/data/voices/earnest-helper.md +0 -29
- package/data/harnesses/apollo/skills/design/data/voices/editorial-composed.md +0 -29
- package/data/harnesses/apollo/skills/design/data/voices/quiet-concierge.md +0 -29
- package/data/harnesses/apollo/skills/design/data/voices/warm-guide.md +0 -29
- package/data/harnesses/apollo/skills/design/references/compose.md +0 -23
- package/data/harnesses/apollo/skills/design/references/content.md +0 -28
- package/data/harnesses/apollo/skills/design/references/emission.md +0 -21
- package/data/harnesses/apollo/skills/design/references/existing-apps.md +0 -27
- package/data/harnesses/apollo/skills/design/references/foundations.md +0 -57
- package/data/harnesses/apollo/skills/design/references/intake.md +0 -40
- package/data/harnesses/apollo/skills/design/references/object-pass.md +0 -24
- package/data/harnesses/apollo/skills/design/references/ship-gate.md +0 -29
- package/data/harnesses/apollo/skills/design/references/ux-patterns/Readme.md +0 -195
- package/data/harnesses/apollo/skills/design/references/ux-patterns/ai-layer.md +0 -49
- package/data/harnesses/apollo/skills/design/references/ux-patterns/attributes-lifecycle.md +0 -43
- package/data/harnesses/apollo/skills/design/references/ux-patterns/container-choice.md +0 -44
- package/data/harnesses/apollo/skills/design/references/ux-patterns/creation-paths.md +0 -46
- package/data/harnesses/apollo/skills/design/references/ux-patterns/dashboards.md +0 -42
- package/data/harnesses/apollo/skills/design/references/ux-patterns/modes.md +0 -42
- package/data/harnesses/apollo/skills/design/references/ux-patterns/object-model.md +0 -46
- package/data/harnesses/apollo/skills/design/references/ux-patterns/page-archetype.md +0 -48
- package/data/harnesses/apollo/skills/design/references/ux-patterns/promotion-demotion.md +0 -37
- package/data/harnesses/apollo/skills/design/references/ux-patterns/settings.md +0 -42
- package/data/harnesses/apollo/skills/design/references/ux-patterns/standard-pages.md +0 -46
- package/data/harnesses/apollo/skills/design/references/ux-patterns/state-matrix.md +0 -41
- package/data/harnesses/apollo/skills/design/references/ux-patterns/table-mechanics.md +0 -48
- package/data/harnesses/apollo/skills/design/references/ux-patterns/verbs.md +0 -45
- package/data/harnesses/apollo/skills/design/references/ux-patterns/viewer-context.md +0 -40
- package/data/harnesses/apollo/skills/design/scripts/README-validator.md +0 -27
- package/data/harnesses/apollo/skills/design/scripts/select-chart.mjs +0 -622
- package/data/harnesses/apollo/skills/design/scripts/validate-design-md.mjs +0 -1198
- package/data/harnesses/apollo/skills/documentation/SKILL.md +0 -135
- package/data/harnesses/apollo/skills/documentation/references/examples.md +0 -279
- package/data/harnesses/apollo/skills/documentation/references/frontmatter.md +0 -44
- package/data/harnesses/apollo/skills/documentation/references/instruction-style.md +0 -50
- package/data/harnesses/apollo/skills/documentation/references/style-guide.md +0 -384
- package/data/harnesses/apollo/skills/documentation/references/untemplated.md +0 -38
- package/data/harnesses/apollo/skills/documentation/scripts/doc-lint.mjs +0 -140
- package/data/harnesses/apollo/skills/documentation/templates/Readme.md +0 -35
- package/data/harnesses/apollo/skills/documentation/templates/api-reference.md +0 -20
- package/data/harnesses/apollo/skills/documentation/templates/architecture-decision.md +0 -121
- package/data/harnesses/apollo/skills/documentation/templates/backlog.md +0 -33
- package/data/harnesses/apollo/skills/documentation/templates/behavioral-checklist.md +0 -81
- package/data/harnesses/apollo/skills/documentation/templates/bookkeeping.md +0 -18
- package/data/harnesses/apollo/skills/documentation/templates/changelog-entry.md +0 -57
- package/data/harnesses/apollo/skills/documentation/templates/changelog-index.md +0 -41
- package/data/harnesses/apollo/skills/documentation/templates/docs-readme.md +0 -72
- package/data/harnesses/apollo/skills/documentation/templates/domain-model.md +0 -30
- package/data/harnesses/apollo/skills/documentation/templates/environment-registry.md +0 -15
- package/data/harnesses/apollo/skills/documentation/templates/feature.md +0 -150
- package/data/harnesses/apollo/skills/documentation/templates/glossary.md +0 -11
- package/data/harnesses/apollo/skills/documentation/templates/implementation-map.md +0 -42
- package/data/harnesses/apollo/skills/documentation/templates/journal.md +0 -13
- package/data/harnesses/apollo/skills/documentation/templates/memory-main.md +0 -25
- package/data/harnesses/apollo/skills/documentation/templates/migration-runbook.md +0 -34
- package/data/harnesses/apollo/skills/documentation/templates/non-goals.md +0 -11
- package/data/harnesses/apollo/skills/documentation/templates/operations-procedure.md +0 -36
- package/data/harnesses/apollo/skills/documentation/templates/plan.md +0 -88
- package/data/harnesses/apollo/skills/documentation/templates/protected-files.md +0 -37
- package/data/harnesses/apollo/skills/documentation/templates/root-readme.md +0 -104
- package/data/harnesses/apollo/skills/documentation/templates/security-overview.md +0 -27
- package/data/harnesses/apollo/skills/documentation/templates/structure.md +0 -65
- package/data/harnesses/apollo/skills/documentation/templates/system-overview.md +0 -32
- package/data/harnesses/apollo/skills/documentation/templates/testing-strategy.md +0 -29
- package/data/harnesses/apollo/skills/schema-design/SKILL.md +0 -141
- package/data/harnesses/apollo/skills/test/SKILL.md +0 -104
- package/data/harnesses/apollo/skills/testing/SKILL.md +0 -166
- package/data/harnesses/apollo/skills/workflow-mapper/SKILL.md +0 -451
- package/data/harnesses/apollo/skills/workflow-mapper/references/patterns.md +0 -214
- /package/data/harnesses/{apollo → code}/docs/README.md +0 -0
- /package/data/harnesses/{apollo → code}/docs/history/CHANGELOG.md +0 -0
- /package/data/harnesses/{apollo → code}/docs/history/backlog.md +0 -0
- /package/data/harnesses/{apollo → code}/docs/memory/main.md +0 -0
- /package/data/harnesses/{apollo → code}/docs/structure.md +0 -0
- /package/data/harnesses/{apollo → code}/rules/cloudflare.md +0 -0
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
# Architecture Decision (AD)
|
|
2
|
-
|
|
3
|
-
Truth document — with the one sanctioned dated tail. Use for: the standing decision on one architectural **subject** — a system shape, a contract, a substrate choice. Lives in `docs/architecture/decisions/`. The body always states the current decision and its current reasoning. When the decision moves, rewrite the affected sections to what is now true, bump `last-updated`, and append the revision to the **Decision Changelog** — the journey lives in that tail, never in the body. Head is truth; tail is provenance.
|
|
4
|
-
|
|
5
|
-
### One subject per AD
|
|
6
|
-
|
|
7
|
-
The unit is the subject, not the individual call. "The persistence layer", "auth", "the design-skill architecture" are subjects; every decision, reversal, and re-decision on a subject lands in that subject's one AD, however many times it moves. Write a second AD only when a genuinely separate subject emerges — never to record a revision of an existing one.
|
|
8
|
-
|
|
9
|
-
### When to write an AD
|
|
10
|
-
|
|
11
|
-
Write an AD when **all three** apply:
|
|
12
|
-
|
|
13
|
-
1. The decision is architectural — affects system shape, contracts, or substrate choice, not internal implementation
|
|
14
|
-
2. Alternatives were genuinely considered and rejected
|
|
15
|
-
3. Future maintainers will ask "why is it this way?"
|
|
16
|
-
|
|
17
|
-
Don't write an AD for:
|
|
18
|
-
|
|
19
|
-
- Standing principles or style preferences (those are stances, not decisions — put them in `docs/architecture/`)
|
|
20
|
-
- Routine implementation choices with no rejected alternatives
|
|
21
|
-
- Anything you'd be happy reversing without ceremony
|
|
22
|
-
|
|
23
|
-
### Lifecycle
|
|
24
|
-
|
|
25
|
-
`Proposed` → `Accepted` → `Deprecated`
|
|
26
|
-
|
|
27
|
-
Frontmatter `status:` is the single lifecycle source of truth. An AD stays `Accepted` for as long as its subject is live — revisions rewrite the body and never change the status, and there is **no `Superseded` state**: supersession is an edit plus a changelog entry, not a new document. Set `Deprecated` only when the subject itself is retired (the component is gone, the contract no longer exists); state where the replacement lives, if any.
|
|
28
|
-
|
|
29
|
-
### Naming
|
|
30
|
-
|
|
31
|
-
`AD-NNN-short-title.md` — three-digit zero-padded number, kebab-case subject. Numbers are assigned sequentially across the project and never reused.
|
|
32
|
-
|
|
33
|
-
### Structure
|
|
34
|
-
|
|
35
|
-
Three sections are required: **Decision**, **Context**, **Consequences** — plus the **Decision Changelog** once the AD has been revised at least once. Everything else is optional — include only when warranted. Decision-first: readers should see the answer in the first paragraph.
|
|
36
|
-
|
|
37
|
-
### Template
|
|
38
|
-
|
|
39
|
-
```markdown
|
|
40
|
-
---
|
|
41
|
-
title: "AD-NNN: Short title in sentence case"
|
|
42
|
-
status: Accepted # Proposed | Accepted | Deprecated
|
|
43
|
-
created: YYYY-MM-DD
|
|
44
|
-
last-updated: YYYY-MM-DD # bump on every revision
|
|
45
|
-
decision-owner: Name
|
|
46
|
-
reviewers: [] # optional
|
|
47
|
-
tags: [ad]
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
# AD-NNN: Short Title
|
|
51
|
-
|
|
52
|
-
## Decision
|
|
53
|
-
|
|
54
|
-
[One paragraph, active voice. "We will…" Lead with the answer — the current answer, whatever the journey was.]
|
|
55
|
-
|
|
56
|
-
## Context
|
|
57
|
-
|
|
58
|
-
[The forces in play. What is the problem? Why does it need a decision? Technical, political, social, and project-local pressures — stated as present-tense forces, not as a history of the subject.]
|
|
59
|
-
|
|
60
|
-
## Consequences
|
|
61
|
-
|
|
62
|
-
**Positive:**
|
|
63
|
-
|
|
64
|
-
- [What becomes easier]
|
|
65
|
-
|
|
66
|
-
**Negative:**
|
|
67
|
-
|
|
68
|
-
- [What becomes harder, what we accept reluctantly]
|
|
69
|
-
|
|
70
|
-
**Risks:**
|
|
71
|
-
|
|
72
|
-
- [Second-order effects you can already see, with mitigations if known]
|
|
73
|
-
|
|
74
|
-
<!-- Optional sections below. Include only when warranted by the decision's weight. -->
|
|
75
|
-
|
|
76
|
-
## Decision Drivers
|
|
77
|
-
|
|
78
|
-
[Hard non-negotiables vs. strong levers. Include when alternatives exist and the criteria aren't self-evident from Context.]
|
|
79
|
-
|
|
80
|
-
## Options Considered
|
|
81
|
-
|
|
82
|
-
| Option | Pros | Cons | Outcome |
|
|
83
|
-
| ------------ | ---- | ---- | --------------------- |
|
|
84
|
-
| **Option A** | … | … | **CHOSEN** |
|
|
85
|
-
| Option B | … | … | Eliminated — [reason] |
|
|
86
|
-
|
|
87
|
-
## Deep Comparison
|
|
88
|
-
|
|
89
|
-
[Honest framing of the strongest alternative(s). Include when the table doesn't make the reasoning obvious. State the *real* reason each was rejected — not a strawman.]
|
|
90
|
-
|
|
91
|
-
## Architecture in Detail
|
|
92
|
-
|
|
93
|
-
[Diagrams, code shape, layer responsibilities. Include when the decision implies non-trivial structure that readers need to understand alongside the *why*. Execution belongs in a plan doc (`docs/history/plans/`) — link to it, don't embed an implementation plan here.]
|
|
94
|
-
|
|
95
|
-
## Open Questions
|
|
96
|
-
|
|
97
|
-
1. **[Question]** — _Default_: [stated default until resolved].
|
|
98
|
-
|
|
99
|
-
## References
|
|
100
|
-
|
|
101
|
-
- [External link or cross-reference]
|
|
102
|
-
|
|
103
|
-
## Decision Changelog
|
|
104
|
-
|
|
105
|
-
<!-- The provenance tail — append-only, newest first. One entry per revision: what changed, the trigger, the previous choice, and the plan that implemented it. Added on the first revision; the initial acceptance is the last entry. -->
|
|
106
|
-
|
|
107
|
-
- YYYY-MM-DD — [What changed] because [trigger]. Implemented by [plan link]. (Previously: [old choice].)
|
|
108
|
-
- YYYY-MM-DD — Initial decision accepted. Implemented by [plan link].
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
### Rules
|
|
112
|
-
|
|
113
|
-
- **One subject per AD; all its revisions stay inside it.** Two genuinely different subjects means two ADs — a revision of an existing subject never does.
|
|
114
|
-
- **The body is always the current truth.** Rewrite affected sections on every revision; never leave a superseded choice narrated in the body — the Decision Changelog carries the journey, with each entry naming the old choice and the trigger.
|
|
115
|
-
- Decision-first. The first paragraph after the heading is the answer; readers should not need to scroll.
|
|
116
|
-
- **Consequences lists positives, negatives, AND risks.** Pros-only Consequences is the genre's classic failure — one AD's honest resulting context is the input context for the next.
|
|
117
|
-
- **Options Considered keeps every genuinely rejected alternative with the real reason.** Informed rejections are the most expensive knowledge to lose; a rejection made with strong prior art in view says so explicitly.
|
|
118
|
-
- **Keep it short — one to two pages.** Long decision docs don't get updated. How-it-works detail belongs in the owning feature doc; execution in a plan. Link, don't embed.
|
|
119
|
-
- No section numbering (`§5.1.1`). Use markdown headings only — inserting a section shouldn't renumber everything.
|
|
120
|
-
- Frontmatter `status` is the single source of truth for lifecycle. Don't also write "Status: Accepted" in the body.
|
|
121
|
-
- The Decision Changelog is append-only, newest first. Typo and formatting fixes don't get entries.
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# Scaffold: docs/history/backlog.md
|
|
2
|
-
|
|
3
|
-
Baseline scaffold — created if missing (the `maintenance` agent's baseline calls this). Target file: `docs/history/backlog.md`.
|
|
4
|
-
|
|
5
|
-
```
|
|
6
|
-
# Backlog
|
|
7
|
-
|
|
8
|
-
Tracked work items, technical debt, and planned improvements. Append new items under the appropriate priority.
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Format
|
|
13
|
-
|
|
14
|
-
- **[P0]** Description — discovered by [plan-name or agent-name]
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## P0 — Critical
|
|
19
|
-
|
|
20
|
-
{items here}
|
|
21
|
-
|
|
22
|
-
## P1 — High
|
|
23
|
-
|
|
24
|
-
{items here}
|
|
25
|
-
|
|
26
|
-
## P2 — Medium
|
|
27
|
-
|
|
28
|
-
{items here}
|
|
29
|
-
|
|
30
|
-
## P3 — Low
|
|
31
|
-
|
|
32
|
-
{items here}
|
|
33
|
-
```
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
# Behavioral Checklist (docs/tests/{feature}.md)
|
|
2
|
-
|
|
3
|
-
Truth document. Use for: **how to verify one feature's promised behavior by driving the real product** — the browser, the CLI binary, HTTP against the running service. One file per feature, named for the feature doc that owns the code (`docs/features/auth.md` → `docs/tests/auth.md`). No frontmatter; a checklist owns no code.
|
|
4
|
-
|
|
5
|
-
**This is the driving script, and it is the source the suite is drawn from.** At the verification gate it does double duty: rung 1 drives the real surface *against these steps*, and rung 2 pins the durable subset *of these assertions* as suite tests. Writing it is therefore not a report written afterwards — it is authored or updated **before** the driving, so the gate has something to execute and the tests have something to be derived from. Which assertions earn a permanent test is decided by `verification.md` § What earns a durable test, and each section records the answer on its `Pinned:` line.
|
|
6
|
-
|
|
7
|
-
A checklist outlives the tests it seeds. Where a Playwright script breaks on every selector change, a checklist states the behavior and lets the implementation move under it — so it is written in the product's own vocabulary (labels, URLs, rows) and never in the code's (function names, props, internal state).
|
|
8
|
-
|
|
9
|
-
Required: **Conventions**, at least one numbered behavior section, **Failure Report**. Optional: Test Inputs, Wait Strategy, Driving notes — include only when they carry real content.
|
|
10
|
-
|
|
11
|
-
## Writing the assertions
|
|
12
|
-
|
|
13
|
-
- **A section is one behavior, its heading stated as a fact** — `3. A stale pointer falls back to the sole membership`, not `3. Test the resolver`. The heading is the promise; the steps are how you see it.
|
|
14
|
-
- **A step is an action; an `**Assert**` is the observable it must produce.** Interleave them in the order a person meets them, so the file reads as a session rather than a spec.
|
|
15
|
-
- **Assert what is observable, at the altitude a user meets it** — a visible label, a URL, a toast, a row in the database, a response envelope. Never a private function's return value: that is a unit test's job, and stating it here couples the checklist to code that will move.
|
|
16
|
-
- **Prefer exact literals** — the real prompt text, the real button label, the real count. A vague assertion passes a broken product.
|
|
17
|
-
- **Assert persistence separately from display.** "It appeared on screen" and "it was written" are two claims; a surface that streams unsaved content satisfies the first while failing the second.
|
|
18
|
-
- **State each section's trace.** `Pinned:` names the suite test that now guards it, or says `driven only` **with the reason** — an unmarked section is indistinguishable from an unexamined one.
|
|
19
|
-
- **State each section's `AC:` keys.** Where the repo carries a keyed acceptance-criteria source, each section names the keys it proves, so the chain from criterion to checklist to suite test survives the last hop; the gate reports coverage and backlogs uncovered keys. `none — not AC-mapped` is the honest line where no keyed source exists.
|
|
20
|
-
- **A known-failing assertion stays written as the contract.** A checklist states what the feature promises; the *run* records the failure and the backlog carries the defect. Never soften an assertion to make a run go green.
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
# {Feature} Test Plan
|
|
24
|
-
|
|
25
|
-
{What this covers, and what neighbouring checklists cover instead, with links. Close with:}
|
|
26
|
-
Each step is an action; each **Assert** is the observable it must produce.
|
|
27
|
-
|
|
28
|
-
## Test Inputs
|
|
29
|
-
|
|
30
|
-
- **URL / entry point** — where the run starts
|
|
31
|
-
- **Identity** — the account or role required, and how it is obtained
|
|
32
|
-
- **State** — the fixture or seeded state the run assumes, stated as counts a reader can check
|
|
33
|
-
|
|
34
|
-
## Conventions
|
|
35
|
-
|
|
36
|
-
- {The invariants a reader needs to interpret the assertions — the vocabulary, the scoping rule,
|
|
37
|
-
the guarantee that makes a surprising assertion correct. Not a restatement of the LLD.}
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
### 1. {The behavior, stated as a fact}
|
|
42
|
-
|
|
43
|
-
- [ ] {action}
|
|
44
|
-
- [ ] **Assert**: {the observable, with exact literals}
|
|
45
|
-
- [ ] **Assert**: {the persistence claim, where the behavior writes something}
|
|
46
|
-
|
|
47
|
-
> Pinned: `{tests/path/to/file.test.ts}` — or `driven only — {why no durable test is bought}`
|
|
48
|
-
> AC: {the acceptance-criteria keys this section proves} — or `none — not AC-mapped`
|
|
49
|
-
|
|
50
|
-
### 2. {The next behavior}
|
|
51
|
-
|
|
52
|
-
- [ ] {action}
|
|
53
|
-
- [ ] **Assert**: {observable}
|
|
54
|
-
|
|
55
|
-
> Pinned: {…}
|
|
56
|
-
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
## Wait Strategy
|
|
60
|
-
|
|
61
|
-
State-based signals, never fixed sleeps:
|
|
62
|
-
|
|
63
|
-
- **{Milestone}** — {the signal that proves it, as a selector or an observable}
|
|
64
|
-
|
|
65
|
-
Timeouts: {operation} **{n}s**.
|
|
66
|
-
|
|
67
|
-
## Driving notes
|
|
68
|
-
|
|
69
|
-
- {Hard-won facts about driving this surface that cost someone an hour — an environment trap, a
|
|
70
|
-
harness quirk, a signal that lies. Not general advice.}
|
|
71
|
-
|
|
72
|
-
## Failure Report
|
|
73
|
-
|
|
74
|
-
For each failed step, capture:
|
|
75
|
-
|
|
76
|
-
- Section and step name, and the expected signal
|
|
77
|
-
- The URL or command at the time of failure
|
|
78
|
-
- The state assertion's actual value, where the step checks one
|
|
79
|
-
- Any visible error, toast, or console exception
|
|
80
|
-
- A screenshot or transcript
|
|
81
|
-
```
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# Bookkeeping ledger (docs/operations/bookkeeping.md)
|
|
2
|
-
|
|
3
|
-
Truth document with an unusual lifecycle: a **work queue**, not an archive. Rows are appended mechanically by the awareness hook (`auto:`) and deliberately by working sessions (`note:`), drained by the `bookkeeper` agent, and walled at Stop and commit — a commit is possible only when every row is resolved (deleted) or converted to `waived:`. What survives in git — `waived:` and `needs-session:` rows — is exactly what a PR reviewer should see.
|
|
4
|
-
|
|
5
|
-
The row grammar is machine-read by the hooks and CI; keep it exact. A `waived:` row's `expires=` date is enforced: CI honors the waiver until the date, then fails. `waived:` rows whose finding kind is `dead-glob` double as the dead-glob allowlist.
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
# Bookkeeping
|
|
9
|
-
|
|
10
|
-
The shared work queue keeping documentation and code in sync — a queue, never an archive. Rows are appended mechanically (auto:) and by working sessions (note:), drained by the bookkeeper agent, and walled at commit: a commit is possible only when every row is either **resolved, which deletes it**, or converted to `waived:`. A drained row leaves no trace here; what it closed is recorded in the doc it corrected, and git history holds the row itself. Row grammar and lifecycle: the `documentation` skill's `templates/bookkeeping.md`. A `waived:` row carries `expires=` and is PR-reviewable history.
|
|
11
|
-
|
|
12
|
-
- auto: YYYY-MM-DD · {finding-kind} · {description} → {action} | sid={session_id} tp={transcript_path} ts={ISO}
|
|
13
|
-
- note: YYYY-MM-DD · {area} · {one-line context only the session holds} → lands-in: {owning doc | backlog | memory} | sid=… tp=… ts=…
|
|
14
|
-
- needs-session: YYYY-MM-DD · {what the bookkeeper could not ground} → main session resolves | refs={original row ts}
|
|
15
|
-
- waived: YYYY-MM-DD · {what is deferred} · reason: {why} → expires=YYYY-MM-DD
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
Finding kinds for `auto:`: `dead-glob` · `doc-implicated` · `doc-lint` · `header-missing` · `index-row-missing` · `boundary-scan-suggested` · `doc-placement`.
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
# Changelog Entry
|
|
2
|
-
|
|
3
|
-
Record. Use for: the per-unit-of-work journal of what changed and how it was refined — one file per entry under `docs/history/changelog/YYYY-MM-DD-{three-words}.md`, written by whoever does the work and frozen inside the commit it describes. The three words name the work, not the commit. Trigger and lifecycle policy: the `changelog` rule; distillation is the `retro` agent.
|
|
4
|
-
|
|
5
|
-
An entry is not a summary line. Its value concentrates in the fields a diff cannot reconstruct — the ask in the user's own words, what was rejected, which skills survived or were overridden, what running the thing taught.
|
|
6
|
-
|
|
7
|
-
## Entry format
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
# {YYYY-MM-DD} · {surface} — {one-line outcome}
|
|
11
|
-
|
|
12
|
-
**Plan:** [history/plans/YYYY-MM-DD-slug.md](../plans/YYYY-MM-DD-slug.md)
|
|
13
|
-
**Commits:** {sha}, {sha}
|
|
14
|
-
|
|
15
|
-
- **Ask:** {what the user asked, compressed — taste and preference statements quoted verbatim}
|
|
16
|
-
- **Iterations:** {N} · rejected: {what was rejected and why} | none
|
|
17
|
-
- **Skills:** {skill}@{version} — survived | partially survived | overridden ({why, briefly}) | none used
|
|
18
|
-
- **Change:** {added/changed X, which does Y, because Z — behavior first, mechanism second. Plan-linked entries also carry the verification gate's results here: rows discharged, suite outcome, anything blocked}
|
|
19
|
-
- **Discovered:** {non-obvious fact learned by running the product — environment quirk, platform ceiling, seam behavior, dependency constraint} [source: {tag}] | none
|
|
20
|
-
- **Class:** {one or more keywords — suggestive vocabulary, not a closed enum; see Field rules}
|
|
21
|
-
- **Pin:** {enforced artifact written in this entry's commit: test / token / guardrail / schema} | none — candidate: {what should hold it}
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
`**Plan:**` appears only on plan-linked entries. `**Commits:**` appears only when one entry covers several commits, and lists the predecessors — an entry can never carry its own commit's SHA.
|
|
25
|
-
|
|
26
|
-
## Lifecycle
|
|
27
|
-
|
|
28
|
-
| State | Meaning |
|
|
29
|
-
| --- | --- |
|
|
30
|
-
| **Draft** | Created before its commit exists — typically the moment a plan reaches `Status: Complete`. Mutable; fields filled as far as the session can |
|
|
31
|
-
| **Complete** | Missing fields filled in from the diff and the session |
|
|
32
|
-
| **Frozen** | The moment it rides in a commit. Never edited, renumbered, or reconciled |
|
|
33
|
-
|
|
34
|
-
**Immutability begins at commit, not at creation.** A draft in the working tree is meant to be edited; that is what lets a completed plan capture its context before anything is committed. A committed entry is history — a correction is a new entry that links back. Entries are exempt from doc-health passes by genre: they are history and can never be "wrong".
|
|
35
|
-
|
|
36
|
-
## Field rules
|
|
37
|
-
|
|
38
|
-
- **Every field present; "none" stated explicitly.** An absent field is a template violation. Sessions assert success by default — the required `rejected:` and `overridden` entries are the counterweight; an honestly empty failure field is information too.
|
|
39
|
-
- **`surface`** uses the repo's ownership vocabulary — the owning feature doc's topic or an `owns:` path stem — so entries are queryable per surface.
|
|
40
|
-
- **`Ask` quotes taste verbatim.** The user's preference wording is the one thing no skill can infer and no rebuild recovers; the entry is its durable home.
|
|
41
|
-
- **`Skills` records efficacy honestly** — survived / partially survived / overridden with a reason. These verdicts are the raw data the `retro` agent aggregates into skill-evolution findings; sanitizing them into success stories destroys the mechanism's value.
|
|
42
|
-
- **`Discovered` holds what only running the product teaches.** If it was learned in use, it is recorded the same day — this field feeds the pin candidates. **Each finding carries a `source:` tag from a closed list** — `generator` (a generated doc was wrong) · `generator-conflict` (two generated docs disagreed) · `rules-conflict` (a generated doc contradicted standing rules) · `runtime-discovery` (only running revealed it) · `environment` (tooling or harness). Closed deliberately, unlike `Class:` — the consumer is the doc generator's readback grep, not a human. A finding in a repo with no generated docs is almost always `runtime-discovery` or `environment`.
|
|
43
|
-
- **`Class` is a suggestive vocabulary, not a closed enum.** Tag with one or more keywords, preferring an existing term over a synonym so the `retro` agent can cluster; coin a new one when nothing fits — a recurring coinage is itself retro signal that the vocabulary (or the doc set) is missing a category. Suggested keywords: `ux` · `ui` · `visual` · `taste` · `layout` · `motion` · `interaction` · `copy` · `a11y` · `responsiveness` · `navigation` · `state` · `structure` · `architecture` · `seam` · `contract` · `schema` · `data` · `content` · `seed` · `performance` · `caching` · `resilience` · `error-handling` · `security` · `auth` · `observability` · `logging` · `testing` · `tooling` · `dependency` · `ops` · `deploy` · `env` · `ci` · `i18n` · `docs`.
|
|
44
|
-
- **`Pin` closes the loop:** the enforced artifact written in this commit, or the named candidate for the `retro` agent to flag. A taste-verified behavior with `Pin: none` and no candidate is a template smell.
|
|
45
|
-
- **Out-of-session entries** (the writing session did not do the work): fill what the diff and conversation evidence support; mark the rest `unknown — committed out-of-session`.
|
|
46
|
-
|
|
47
|
-
## Granularity
|
|
48
|
-
|
|
49
|
-
A commit is the smallest unit an entry may describe. Above that the mapping is judgment — four commits may be four entries or one. When the work exceeds what a draft describes, write a **second** entry rather than stretching the first: the plan-linked entry stays an honest account of the plan.
|
|
50
|
-
|
|
51
|
-
## The index
|
|
52
|
-
|
|
53
|
-
Every entry appends one row to `docs/history/CHANGELOG.md` — date, link, one-line summary — in the same pass that writes the entry.
|
|
54
|
-
|
|
55
|
-
## Exemptions (closed list)
|
|
56
|
-
|
|
57
|
-
No entry for: release and bot commits, harness installs and bumps, lockfile-only changes, pure renames and moves, and changelog housekeeping itself. Everything else gets an entry, however short.
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# Scaffold: docs/history/CHANGELOG.md
|
|
2
|
-
|
|
3
|
-
Baseline scaffold — created if missing (the `maintenance` agent's baseline calls this). Target file: `docs/history/CHANGELOG.md`.
|
|
4
|
-
|
|
5
|
-
```
|
|
6
|
-
# Changelog
|
|
7
|
-
|
|
8
|
-
All notable changes to {Project Name} will be documented in this file.
|
|
9
|
-
|
|
10
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## [Unreleased]
|
|
15
|
-
|
|
16
|
-
{entries added here as work proceeds; promoting them under a release heading is the one sanctioned edit to this index — the dated entry files themselves stay frozen}
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## Links
|
|
21
|
-
|
|
22
|
-
- [Setup Guide](../operations/setup.md)
|
|
23
|
-
- [Architecture](../architecture/)
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
## How to Update This Changelog
|
|
28
|
-
|
|
29
|
-
1. Create a dated change file in `docs/history/changelog/`:
|
|
30
|
-
`docs/history/changelog/YYYY-MM-DD-feature-name.md`
|
|
31
|
-
|
|
32
|
-
2. Update this CHANGELOG.md with a high-level summary linking to the detail file
|
|
33
|
-
|
|
34
|
-
3. Follow Keep a Changelog categories:
|
|
35
|
-
- **Added** for new features
|
|
36
|
-
- **Changed** for changes in existing functionality
|
|
37
|
-
- **Deprecated** for soon-to-be removed features
|
|
38
|
-
- **Removed** for now removed features
|
|
39
|
-
- **Fixed** for bug fixes
|
|
40
|
-
- **Security** for security improvements
|
|
41
|
-
```
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
# docs/README.md (Documentation Root)
|
|
2
|
-
|
|
3
|
-
Truth document. Use for: the entry point for all documentation in a repo. Created during baseline audit.
|
|
4
|
-
|
|
5
|
-
**Link only what exists.** Every row below is a placeholder — drop any whose target the repo does not have. Most `history/` and `architecture/` folders are created on first use, so linking them unconditionally ships a docs index with dead links on day one. An index is a browse page: a link that resolves to nothing is worse than an absent row.
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
# {Project Name} Documentation
|
|
9
|
-
|
|
10
|
-
Technical documentation for {project description}.
|
|
11
|
-
|
|
12
|
-
> For documentation organization, authority map, and folder rules, see **[structure.md](structure.md)**.
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## Quick Links
|
|
17
|
-
|
|
18
|
-
| Document | Description |
|
|
19
|
-
| --------------------------------- | ------------------------------------ |
|
|
20
|
-
| [Structure](structure.md) | Documentation entry point and rules |
|
|
21
|
-
| [Setup](operations/setup.md) | Installation and configuration guide |
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
## Architecture
|
|
26
|
-
|
|
27
|
-
System design, steering docs, and standing decisions — the truth layer.
|
|
28
|
-
|
|
29
|
-
- [system-design.md](architecture/system-design.md) - System overview: subsystems and key flows
|
|
30
|
-
- [domain-model.md](architecture/domain-model.md) - Entities, relationships, state ownership
|
|
31
|
-
- [glossary.md](architecture/glossary.md) - Project vocabulary
|
|
32
|
-
- [non-goals.md](architecture/non-goals.md) - What this system deliberately does not do
|
|
33
|
-
- [decisions/](architecture/decisions/Readme.md) - Architecture Decisions (ADs)
|
|
34
|
-
{list other architecture docs — api.md, security.md — when present}
|
|
35
|
-
|
|
36
|
-
---
|
|
37
|
-
|
|
38
|
-
## Features
|
|
39
|
-
|
|
40
|
-
Living reference docs for implemented features (how things currently work).
|
|
41
|
-
|
|
42
|
-
- [feature-name.md](features/feature-name.md) - Feature description
|
|
43
|
-
{list all feature docs}
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
## Operations
|
|
48
|
-
|
|
49
|
-
How to run, develop, and deploy.
|
|
50
|
-
|
|
51
|
-
- [setup.md](operations/setup.md) - Installation and configuration guide
|
|
52
|
-
{list all operations docs — environment.md when present}
|
|
53
|
-
|
|
54
|
-
---
|
|
55
|
-
|
|
56
|
-
## History
|
|
57
|
-
|
|
58
|
-
The records — everything dated, frozen, or append-only.
|
|
59
|
-
|
|
60
|
-
- [CHANGELOG.md](history/CHANGELOG.md) - Master changelog index
|
|
61
|
-
- [changelog/](history/changelog/) - Individual changelog entries
|
|
62
|
-
- [plans/](history/plans/) - Implementation plans (frozen at completion)
|
|
63
|
-
- [migrations/](history/migrations/) - One-shot migration runbooks (frozen once executed)
|
|
64
|
-
- [research/](history/research/) - Deep-research artifacts (one folder per topic)
|
|
65
|
-
- [backlog.md](history/backlog.md) - Tracked work items and technical debt
|
|
66
|
-
|
|
67
|
-
---
|
|
68
|
-
|
|
69
|
-
## Contributing
|
|
70
|
-
|
|
71
|
-
See [CLAUDE.md](../CLAUDE.md) for documentation guidelines.
|
|
72
|
-
```
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# Domain Model (docs/architecture/domain-model.md)
|
|
2
|
-
|
|
3
|
-
Truth document. Use for: the entities the system is about — what they are, how they relate, and who owns their state. The vocabulary here must match the glossary and the code; when they disagree, fix the disagreement, don't document around it.
|
|
4
|
-
|
|
5
|
-
Required: **Entities**, **Relationships**. Optional: Lifecycle states, Invariants.
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
# Domain Model
|
|
9
|
-
|
|
10
|
-
## Entities
|
|
11
|
-
|
|
12
|
-
| Entity | What it is | State lives in |
|
|
13
|
-
| ------ | ---------- | -------------- |
|
|
14
|
-
| {Entity} | {one line} | {table / slice / service} |
|
|
15
|
-
|
|
16
|
-
## Relationships
|
|
17
|
-
|
|
18
|
-
- {EntityA} 1—N {EntityB} — {the meaning of the link}
|
|
19
|
-
- {EntityB} N—N {EntityC} via {join} — {meaning}
|
|
20
|
-
|
|
21
|
-
## Lifecycle states
|
|
22
|
-
|
|
23
|
-
{Only for entities with real state machines.}
|
|
24
|
-
|
|
25
|
-
- **{Entity}**: draft → active → archived — {what moves it between states}
|
|
26
|
-
|
|
27
|
-
## Invariants
|
|
28
|
-
|
|
29
|
-
- {A relationship or state rule that must always hold, stated as a constraint}
|
|
30
|
-
```
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# Environment Registry (docs/operations/environment.md)
|
|
2
|
-
|
|
3
|
-
Truth document. Use for: the config surface — every variable the code reads, in one table. `.env.example` mirrors this doc's variable list.
|
|
4
|
-
|
|
5
|
-
**Placeholders only, never real values.** A real-looking password, account ID, or personal profile name in a doc is a leak, and one developer's local setup written as the canonical value is a trap for everyone else. Values in this doc are `{placeholder}` descriptions.
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
# Environment Registry
|
|
9
|
-
|
|
10
|
-
Every variable the code reads. `.env.example` mirrors this list.
|
|
11
|
-
|
|
12
|
-
| Variable | Purpose | Required | Where set | Secret |
|
|
13
|
-
| -------- | ------- | -------- | --------- | ------ |
|
|
14
|
-
| `DATABASE_URL` | {one line} | yes / default: `{value}` | local `.env` / CI / prod | yes |
|
|
15
|
-
```
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
# Feature Documentation — the LLD (docs/features/{feature}.md)
|
|
2
|
-
|
|
3
|
-
Truth document. Use for: every feature in `docs/features/`. The feature doc is the feature's **LLD (low-level design)**: the same file persists from design (Status: Draft, written in LLD Mode) through implementation to live reference (Status: Active). Sections fill in as the feature matures — no template swap. The body always describes the feature as it currently is; the journey lives in the linked plan and changelog entries.
|
|
4
|
-
|
|
5
|
-
**Required vs optional.** Required in every feature doc: the frontmatter, **Goal**, and **Background** — plus **Files** once implementation exists (a Draft for unbuilt code has no real paths to list) and **Current Behavior** once research or implementation exists (at Draft it's the pre-feature baseline; at Active it's how the feature works today). Every other section is optional: include it only when the feature has something real to put in it (no Redux → no Redux section; no risks worth naming → no Risks section). A **minimal form** is sanctioned for small features: frontmatter + Goal + a short how-it-works section + Files. A two-screen doc that is accurate beats a full-template doc with empty sections.
|
|
6
|
-
|
|
7
|
-
The four research-derived sections (**Affected Modules**, **Conventions to Follow**, **Current Behavior**, **Ownership Conflicts**) map 1:1 to the `lld-mode` agent's return shape. The orchestrator drops its findings into those slots without restructuring.
|
|
8
|
-
|
|
9
|
-
```yaml
|
|
10
|
-
---
|
|
11
|
-
owns: ["src/feature/**", "src/other/file.ts"] # required — code-path globs this doc owns (the only ownership key)
|
|
12
|
-
module: billing # optional — single bounded-context label; omit if cross-cutting
|
|
13
|
-
keywords: [invoice, pdf] # required — discovery terms
|
|
14
|
-
status: active # required — active | draft | deprecated
|
|
15
|
-
last-reviewed: YYYY-MM-DD # optional tooling key — stamped on substantive review/update; the maintenance agent ranks audit priority by it (metadata, never narrated in the body)
|
|
16
|
-
type: feature # required tooling key — genre stamp (generator-written or authored; enum = the template names), read by tooling (UI grouping, protected-file mapping); preserve on edits, never narrate
|
|
17
|
-
---
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
> Declare the code paths it owns in its `owns:` frontmatter — projected at Draft, confirmed against real code at Active.
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
# {Feature Name}
|
|
24
|
-
|
|
25
|
-
<!-- Lifecycle lives in the frontmatter `status:` key (active | draft | deprecated) — the single source of truth. Don't restate it in the body. -->
|
|
26
|
-
**Plan:** [history/plans/YYYY-MM-DD-feature-name.md](../history/plans/YYYY-MM-DD-feature-name.md) <!-- added once a plan exists -->
|
|
27
|
-
|
|
28
|
-
## Goal
|
|
29
|
-
|
|
30
|
-
One sentence. What this feature accomplishes, in user-facing terms.
|
|
31
|
-
|
|
32
|
-
## Goals & Non-Goals
|
|
33
|
-
|
|
34
|
-
**In scope**
|
|
35
|
-
- Bullet 1
|
|
36
|
-
- Bullet 2
|
|
37
|
-
|
|
38
|
-
**Out of scope**
|
|
39
|
-
- Bullet 1
|
|
40
|
-
|
|
41
|
-
## Background
|
|
42
|
-
|
|
43
|
-
Why this feature exists. The user need, the business trigger, the constraint that pushed it above the line. One paragraph.
|
|
44
|
-
|
|
45
|
-
(For Product-level work, also include: problem statement, key hypotheses, open questions.)
|
|
46
|
-
|
|
47
|
-
## Approach
|
|
48
|
-
|
|
49
|
-
High-level shape of the solution. ASCII diagram if it helps. Implementation specifics belong in the plan.
|
|
50
|
-
|
|
51
|
-
## Affected Modules
|
|
52
|
-
|
|
53
|
-
(From lld-mode research) Files, routes, components, slices this feature involves. Group by module.
|
|
54
|
-
|
|
55
|
-
| Module | Path | Role in this feature |
|
|
56
|
-
|--------|------|----------------------|
|
|
57
|
-
|
|
58
|
-
## Conventions to Follow
|
|
59
|
-
|
|
60
|
-
(From lld-mode research) Naming patterns, structural patterns, doc-fit heuristics confirmed for the area being touched. Cite the source file(s) where the convention is established.
|
|
61
|
-
|
|
62
|
-
## Current Behavior
|
|
63
|
-
|
|
64
|
-
(From lld-mode research) How the relevant part of the system works *today*, before this feature lands. Without this baseline the design intent is hard to evaluate.
|
|
65
|
-
|
|
66
|
-
## Ownership Conflicts
|
|
67
|
-
|
|
68
|
-
(From lld-mode research) Existing feature docs whose `owns:` globs overlap with the projected scope. Resolve before the plan starts — leave nothing unresolved.
|
|
69
|
-
|
|
70
|
-
| Conflicting doc | Overlapping path(s) | Resolution |
|
|
71
|
-
|-----------------|---------------------|------------|
|
|
72
|
-
|
|
73
|
-
## Architecture
|
|
74
|
-
|
|
75
|
-
[ASCII diagram. Fill once implementation lands. See style-guide.md for box-drawing patterns.]
|
|
76
|
-
|
|
77
|
-
## Key Functions
|
|
78
|
-
|
|
79
|
-
### `functionName(param1, param2)`
|
|
80
|
-
**Goal:** What it accomplishes
|
|
81
|
-
**Input:**
|
|
82
|
-
- `param1` (type) - Description
|
|
83
|
-
- `param2` (type) - Description
|
|
84
|
-
**Output:** Return type and shape
|
|
85
|
-
**Side Effects:** DB writes, API calls, state updates
|
|
86
|
-
|
|
87
|
-
### `hookName(config)`
|
|
88
|
-
**Goal:** What it provides
|
|
89
|
-
**Returns:** `{ data, loading, error }`
|
|
90
|
-
**Triggers:** On mount, on change, manual
|
|
91
|
-
|
|
92
|
-
## State
|
|
93
|
-
|
|
94
|
-
**Frontend (at persistence):**
|
|
95
|
-
{
|
|
96
|
-
"data": [],
|
|
97
|
-
"changes": { "added": [], "updated": [], "removed": [] }
|
|
98
|
-
// "cache": {} // UNUSED: dead key; kept so old persisted state rehydrates
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
**Storage:** localStorage `app_state`
|
|
102
|
-
|
|
103
|
-
**Backend:**
|
|
104
|
-
export const resources = pgTable('resources', {
|
|
105
|
-
id: text('id').primaryKey(),
|
|
106
|
-
data: jsonb('data'),
|
|
107
|
-
// oldField: text('old_field'), // UNUSED: dead column; nothing reads it
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
**API Shape:**
|
|
111
|
-
{ "status": 1, "data": {...} }
|
|
112
|
-
|
|
113
|
-
## Redux (if applicable)
|
|
114
|
-
|
|
115
|
-
**Slice:** `sliceName`
|
|
116
|
-
|
|
117
|
-
**Actions:**
|
|
118
|
-
- `setData(payload)` - Replace all data
|
|
119
|
-
- `upsertItem(item)` - Add or update single item
|
|
120
|
-
|
|
121
|
-
**Selectors:**
|
|
122
|
-
- `selectAll(state)` → `Array<Item>`
|
|
123
|
-
- `selectById(state, id)` → `Item | undefined`
|
|
124
|
-
|
|
125
|
-
## Files
|
|
126
|
-
|
|
127
|
-
- `src/path/to/main.js` - Core logic
|
|
128
|
-
- `src/path/to/hooks.js` - React hooks
|
|
129
|
-
|
|
130
|
-
## Open Questions
|
|
131
|
-
|
|
132
|
-
- Question — who decides, by when
|
|
133
|
-
- (Resolved questions: fold the resolution into Background.)
|
|
134
|
-
|
|
135
|
-
## Risks
|
|
136
|
-
|
|
137
|
-
- Risk — likelihood / impact / mitigation
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
### Section evolution
|
|
141
|
-
|
|
142
|
-
Sections fill in across the feature's lifecycle. No template swap — they accumulate in place.
|
|
143
|
-
|
|
144
|
-
| When | Sections written | Source |
|
|
145
|
-
| --- | --- | --- |
|
|
146
|
-
| Status: Draft (design) | Goal, Goals & Non-Goals, Background, Approach, Open Questions, Risks | User interview |
|
|
147
|
-
| Status: Draft (research) | Affected Modules, Conventions to Follow, Current Behavior, Ownership Conflicts | lld-mode agent |
|
|
148
|
-
| Status: Draft → Active (implementation lands) | Architecture, Key Functions, State, Redux, Files; `owns:` globs confirmed against real code | Main agent (from actual code) |
|
|
149
|
-
|
|
150
|
-
Resolved Open Questions can be summarized into Background; unresolved ones stay visible.
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# Glossary (docs/architecture/glossary.md)
|
|
2
|
-
|
|
3
|
-
Truth document. Use for: the project's vocabulary — one name per concept, one line per name. Alphabetical. When the code uses a different name than the docs, record it in **In code** so readers can bridge; one concept never gets two doc names.
|
|
4
|
-
|
|
5
|
-
```
|
|
6
|
-
# Glossary
|
|
7
|
-
|
|
8
|
-
| Term | Meaning | In code |
|
|
9
|
-
| ---- | ------- | ------- |
|
|
10
|
-
| {Term} | {one-line definition} | `{identifier}` |
|
|
11
|
-
```
|