wdi-method 0.5.13 → 0.6.0

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.
Files changed (87) hide show
  1. package/README.md +436 -271
  2. package/bin/wdi-method.js +198 -5
  3. package/kit/.constitution/method/README.md +76 -75
  4. package/kit/.constitution/method/constitution.md +2 -1
  5. package/kit/.constitution/method/document/architecture-guide.md +10 -10
  6. package/kit/.constitution/method/document/bmad-guide.md +50 -16
  7. package/kit/.constitution/method/document/bmad-skill-register.md +74 -71
  8. package/kit/.constitution/method/document/brief-guide.md +42 -11
  9. package/kit/.constitution/method/document/corpus-guide.md +146 -11
  10. package/kit/.constitution/method/document/decision-guide.md +199 -134
  11. package/kit/.constitution/method/document/delivery-flow-guide.md +154 -83
  12. package/kit/.constitution/method/document/prd-guide.md +63 -20
  13. package/kit/.constitution/method/document/sdd-guide.md +5 -4
  14. package/kit/.constitution/method/document/srs-guide.md +150 -147
  15. package/kit/.constitution/method/document/templates/addendum.md +70 -71
  16. package/kit/.constitution/method/document/templates/architecture-spine.md +6 -4
  17. package/kit/.constitution/method/document/templates/brief.md +132 -110
  18. package/kit/.constitution/method/document/templates/c4.md +11 -11
  19. package/kit/.constitution/method/document/templates/contract.md +51 -52
  20. package/kit/.constitution/method/document/templates/cross-cutting.md +1 -2
  21. package/kit/.constitution/method/document/templates/design-system.md +0 -1
  22. package/kit/.constitution/method/document/templates/integration.md +68 -69
  23. package/kit/.constitution/method/document/templates/inventory.md +0 -1
  24. package/kit/.constitution/method/document/templates/lc.md +49 -47
  25. package/kit/.constitution/method/document/templates/lifecycle.md +51 -52
  26. package/kit/.constitution/method/document/templates/model.md +68 -55
  27. package/kit/.constitution/method/document/templates/oq.md +45 -45
  28. package/kit/.constitution/method/document/templates/prd.md +244 -226
  29. package/kit/.constitution/method/document/templates/questions.md +100 -76
  30. package/kit/.constitution/method/document/templates/rules.md +46 -47
  31. package/kit/.constitution/method/document/templates/sdd.md +26 -11
  32. package/kit/.constitution/method/document/templates/srs.md +46 -25
  33. package/kit/.constitution/method/document/templates/uc.md +1 -1
  34. package/kit/.constitution/method/document/templates/ux.md +76 -77
  35. package/kit/.constitution/method/document/ux-guide.md +115 -99
  36. package/kit/.constitution/method/language-guide.md +1 -1
  37. package/kit/.constitution/method/method-glossary.md +29 -16
  38. package/kit/.constitution/method/scripts/timeline.py +663 -665
  39. package/kit/.constitution/method/scripts/validate.py +1143 -362
  40. package/kit/.constitution/method/structure-guide.md +3 -3
  41. package/kit/.constitution/method/why/README.md +184 -169
  42. package/kit/.constitution/method/why/artifact-map.md +15 -13
  43. package/kit/.constitution/method/why/mode-risk-map.md +140 -0
  44. package/kit/.constitution/method/why/portability.md +1 -1
  45. package/kit/.constitution/method/why/rationale.md +12 -5
  46. package/kit/.constitution/project/README.md +2 -2
  47. package/kit/.constitution/project/codebase-brownfield-guide.md +18 -18
  48. package/kit/.constitution/project/codebase-conventions-guide.md +18 -18
  49. package/kit/.constitution/project/codebase-stack-guide.md +18 -18
  50. package/kit/assets/bmad-custom/bmad-architecture.toml +1 -1
  51. package/kit/assets/bmad-custom/bmad-correct-course.toml +5 -5
  52. package/kit/assets/bmad-custom/bmad-prd.toml +9 -3
  53. package/kit/assets/bmad-custom/bmad-product-brief.toml +6 -2
  54. package/kit/skills/wdi-blueprint/SKILL.md +71 -10
  55. package/kit/skills/wdi-build/SKILL.md +233 -122
  56. package/kit/skills/wdi-component/SKILL.md +8 -6
  57. package/kit/skills/wdi-decision/SKILL.md +187 -183
  58. package/kit/skills/wdi-help/SKILL.md +8 -7
  59. package/kit/skills/wdi-init/SKILL.md +20 -6
  60. package/kit/skills/wdi-problem/SKILL.md +31 -13
  61. package/kit/skills/wdi-product/SKILL.md +30 -17
  62. package/kit/skills/wdi-question/SKILL.md +170 -88
  63. package/kit/skills/wdi-reconcile/SKILL.md +33 -10
  64. package/kit/skills/wdi-report/SKILL.md +77 -25
  65. package/kit/skills/wdi-review/SKILL.md +201 -118
  66. package/kit/skills/wdi-systematic-debugging/SKILL.md +7 -7
  67. package/kit/skills/wdi-upgrade/SKILL.md +179 -0
  68. package/kit/skills/wdi-ux/SKILL.md +35 -11
  69. package/kit-overlay/AGENTS.md +2 -2
  70. package/kit-overlay/README.md +76 -75
  71. package/kit-overlay/constitution.md +2 -1
  72. package/kit-overlay/portability.md +1 -1
  73. package/package.json +43 -43
  74. package/scaffold/.control/product-glossary.md +1 -1
  75. package/scaffold/.control/registry/goals.yaml +25 -0
  76. package/scaffold/.control/registry/index.yaml +5 -5
  77. package/scaffold/.control/registry/specs.yaml +5 -0
  78. package/scaffold/.control/structure-codebase.md +19 -19
  79. package/scaffold/.control/structure-document.md +25 -25
  80. package/kit/.constitution/method/document/templates/rtr.md +0 -61
  81. package/kit/assets/bmad-custom/bmad-build-auto.toml +0 -10
  82. package/kit/assets/bmad-custom/bmad-build.toml +0 -52
  83. package/kit/assets/bmad-custom/bmad-code-review.toml +0 -13
  84. package/kit/assets/bmad-custom/bmad-retrospective.toml +0 -9
  85. package/kit/assets/bmad-custom/bmad-spec.toml +0 -16
  86. package/scaffold/.control/registry/requirements.yaml +0 -15
  87. package/scaffold/.control/registry/waves.yaml +0 -5
@@ -1,110 +1,132 @@
1
- # Product Brief Template
2
-
3
- A flexible starting structure for the executive product brief. Adapt aggressively to the product, the purpose, and the domain. Drop sections that do not earn their place, add sections the product needs, reorder freely. The brief serves the product's story, not the template's shape.
4
-
5
- ## Default Structure
6
-
7
- ```markdown
8
- # Product Brief: {Product Name}
9
-
10
- ## Executive Summary
11
-
12
- [2-3 paragraph narrative: what this is, what problem it solves, why it matters, why now. Compelling enough to stand alone — if someone reads only this section, they should understand the vision.]
13
-
14
- ## The Problem
15
-
16
- [What pain exists, who feels it, how they cope today, the cost of the status quo. Be specific: real scenarios, real frustrations, real consequences.]
17
-
18
- ## The Solution
19
-
20
- [What is being built, how it solves the problem. Focus on the experience and the outcome, not the implementation.]
21
-
22
- ## What Makes This Different
23
-
24
- [Key differentiators. Why this approach over alternatives, what is the unfair advantage. Be honest. If the moat is execution speed, say so. Do not fabricate technical moats.]
25
-
26
- ## Who This Serves
27
-
28
- [Primary users — vivid but brief. Who they are, what they need, what success looks like for them. Secondary users if relevant.]
29
-
30
- | Role | Need | Tier |
31
- |---|---|---|
32
- | {role} | {what they need from this product} | **primary** |
33
- | {role} | {…} | secondary |
34
- | {role} | {…} | secondary |
35
-
36
- [Exactly one row MUST be `primary`. Every user and stakeholder who touches the product belongs in this table — including the ones who never open it, but pay for it, approve it, or are accountable for it. Shared goals that cut across roles go in a line under the table.]
37
-
38
- ## Goals
39
-
40
- [What the product is trying to achieve, one line each. Number them `BG-1`, `BG-2`, … `BG` is the first link of the traceability chain `BG CAP FR/NFR → UC → DEC → Story → Test`, so these IDs are cited downstream and MUST stay stable once written.]
41
-
42
- - **BG-1** core value: [the goal that justifies the product existing at all]
43
- - **BG-2**: [...]
44
-
45
- [MUST NOT be numbered `G1`, `G2` — `G1`–`G5` already name the five gates.]
46
-
47
- ## Success Criteria
48
-
49
- [How we know this is working. Mix of user success signals and business objectives. Measurable.]
50
-
51
- ## Scope
52
-
53
- [Boundary document, not a feature list. Keep both lists tight.]
54
-
55
- ### Scope In
56
-
57
- [What is in for the first version.]
58
-
59
- ### Scope Out
60
-
61
- [What is explicitly out, written as items. MUST NOT be left to be inferred from absence — the value of this list is that it names what someone will otherwise assume is coming. Per-release MVP scope belongs in the PRD; this is the product boundary.]
62
-
63
- ## Constraints
64
-
65
- [What is fixed before design starts and cannot be traded away: platform scope, integration boundary, regulatory limit, milestone boundary, a timeline that is genuinely immovable. One line each, and each MUST say what it forbids.]
66
-
67
- [Technical constraints that only shape implementation belong in `addendum.md`, not here. A constraint that emerges from a design decision becomes `AD-N` in the architecture spine — MUST NOT be appended to this list later.]
68
-
69
- ## Assumptions
70
-
71
- [What is believed true but not verified, and that the brief would be wrong without. State each so it could be proven false.]
72
-
73
- [An assumption that starts to wobble MUST be promoted to a row in `.control/registry/risks.yaml` with an owner. An assumption nobody would act differently about is not worth listing.]
74
-
75
- ## Prerequisites
76
-
77
- [What MUST exist or be granted before work can start: access, accounts, data, an upstream system, a decision someone else owns.]
78
-
79
- [Any prerequisite not yet satisfied MUST have a matching row in `.control/questions/external.md` naming who is being waited on and by when.]
80
-
81
- ## Vision
82
-
83
- [Where this goes if it succeeds. What it becomes in 2-3 years. Inspiring but grounded.]
84
- ```
85
-
86
- ---
87
-
88
- ## Project overrides — WDI
89
-
90
- - **Home.** `.what/_product-brief/brief.md`, with `addendum.md` beside it. Set through
91
- `run_folder_pattern = "_product-brief"`; both filenames are fixed by the skill and MUST NOT be
92
- expected to change.
93
- - **Singleton.** One brief per product, spanning every release. A second product MUST get its own
94
- repository rather than a second brief.
95
- - **Decision Summary.** MUST name exactly one problem, one **primary** user, and one measure of
96
- success. Secondary users and stakeholders are listed, not ranked away. If the primary cannot be
97
- chosen, the discovery is not finished.
98
- - **Six sections above the BMad default.** `Who This Serves` carries a full stakeholder table;
99
- `Scope` is split into In and Out; and `Goals`, `Constraints`, `Assumptions`, and `Prerequisites`
100
- are added. The last three have no home anywhere else in the corpus.
101
- - **No Product Component list.** The slicing is born at the tail of G2 through `wdi-init` intent
102
- `component`, which reads
103
- the brief and every PRD once a domain model exists. A list guessed at G1 is a guess made before
104
- there is anything to guess from.
105
- - **Raw material stays out.** Research, brainstorming, and pressure-test output live in
106
- `_bmad-output/` and stay there. It MUST NOT be folded in, and MUST NOT be promoted into `.what/` —
107
- a `DEC-` or the PRD cites it by path instead.
108
- - **Dying cheap is a pass.** A brief that concludes the idea is not worth building is a valid G1
109
- outcome, and the most profitable one.
110
- - **Memlog.** Written to `.control/memlog/brief.md` via `--path`.
1
+ # Product Brief Template
2
+
3
+ A flexible starting structure for the executive product brief. Adapt aggressively to the product, the purpose, and the domain. Drop sections that do not earn their place, add sections the product needs, reorder freely. The brief serves the product's story, not the template's shape.
4
+
5
+ **The brief states the current design. It is not a history of itself.** A section MUST NOT carry a
6
+ correction block, a "previously" note, or a record of who changed what — that belongs in
7
+ `.control/decisions/` or is not worth keeping. See `corpus-guide.md` § The corpus is written in the
8
+ present tense.
9
+
10
+ **A derived fact has exactly one home, and it is never this document.** `Goals` cites
11
+ `goals.yaml`; it does not restate what a goal says. `Assumptions` and `Prerequisites` are not
12
+ sections here at all they live in `.control/questions/`, and this brief is never their second copy.
13
+ See `corpus-guide.md` § A derived fact has exactly one home.
14
+
15
+ ## Default Structure
16
+
17
+ ```markdown
18
+ # Product Brief: {Product Name}
19
+
20
+ > **This is the working brief.** It points at the registry instead of repeating it, so `Goals` is one
21
+ > line and there is no Assumptions or Prerequisites section here.
22
+ >
23
+ > **To read or hand over one complete, self-contained document, run `/wdi-report render brief`.**
24
+ > It writes `.what-rendered/_product-brief/brief.md` with the goals, the open assumptions, and the open
25
+ > prerequisites filled in from their own homes. That file is regenerated, never hand-edited.
26
+
27
+ ## Why
28
+
29
+ [2-3 paragraphs: what this is, what problem it solves, why it matters, why now, and where it goes if
30
+ it succeeds. One narrative do not split "what this is" from "where this goes" into two sections.
31
+ Compelling enough to stand alone: if someone reads only this section, they understand the vision.]
32
+
33
+ ## The Problem
34
+
35
+ [What pain exists, who feels it, how they cope today, the cost of the status quo. Be specific: real
36
+ scenarios, real frustrations, real consequences.]
37
+
38
+ ## The Solution *(optional — one paragraph, no more)*
39
+
40
+ [What kind of thing is being built — the bet, not the feature list. "A self-serve app, not a managed
41
+ service"; "an API, not a dashboard." One paragraph. The moment this needs a second paragraph it has
42
+ started designing, and design is G2's job, not G1's.]
43
+
44
+ ## What Makes This Different *(optional)*
45
+
46
+ [Key differentiators. Why this approach over alternatives, what is the unfair advantage. Be honest. If
47
+ the moat is execution speed, say so. Do not fabricate technical moats.]
48
+
49
+ ## Who This Serves
50
+
51
+ [Primary users — vivid but brief. Who they are, what they need, what success looks like for them. Secondary users if relevant.]
52
+
53
+ | Role | Need | Tier |
54
+ |---|---|---|
55
+ | {role} | {what they need from this product} | **primary** |
56
+ | {role} | {…} | secondary |
57
+ | {role} | {…} | secondary |
58
+
59
+ [Exactly one row MUST be `primary`. Every user and stakeholder who touches the product belongs in this table — including the ones who never open it, but pay for it, approve it, or are accountable for it. Shared goals that cut across roles go in a line under the table.]
60
+
61
+ ## Goals
62
+
63
+ Goals — see `.control/registry/goals.yaml` → `goals:`.
64
+
65
+ [This section is a POINTER, not a list. `BG-N` and its statement live in the registry that is what
66
+ lets `wdi-product` cite `BG-N` without a second copy drifting from this one. If a goal needs a reason
67
+ beyond its statement, that reason is a `why:` field on the goal's own row in the registry, not a
68
+ paragraph here. `BG` is the first link of the traceability chain `BG → CAP → FR/NFR → UC → DEC →
69
+ Ticket → Test`.]
70
+
71
+ [MUST NOT be numbered `G1`, `G2` `G1`–`G5` already name the five gates.]
72
+
73
+ ## Success Criteria
74
+
75
+ [Exactly ONE measurable figure that proves this worked. Not a mission statement, not a mix of signals
76
+ — one number, with a timeframe. "40% of visitors who start checkout finish it, within three months of
77
+ launch." A criterion nobody could check without opening the code is not a criterion.]
78
+
79
+ ## Scope
80
+
81
+ [Boundary document, not a feature list. Keep both lists tight. This is the PRODUCT boundary — what
82
+ belongs in this product at all, ever. Per-release MVP scope belongs in the PRD's own Scope section,
83
+ not here.]
84
+
85
+ ### Scope In
86
+
87
+ [What belongs to this product's boundary — not "what ships first," which is the PRD's call.]
88
+
89
+ ### Scope Out
90
+
91
+ [What is explicitly out, written as items. MUST NOT be left to be inferred from absence — the value of this list is that it names what someone will otherwise assume is coming. Per-release MVP scope belongs in the PRD; this is the product boundary.]
92
+
93
+ ## Constraints
94
+
95
+ [What is fixed before design starts and cannot be traded away: platform scope, integration boundary, regulatory limit, milestone boundary, a timeline that is genuinely immovable. One line each, and each MUST say what it forbids.]
96
+
97
+ [Technical constraints that only shape implementation belong in `addendum.md`, not here. A constraint that emerges from a design decision becomes `AD-N` in the architecture spine — MUST NOT be appended to this list later.]
98
+ ```
99
+
100
+ ---
101
+
102
+ ## Project overrides — WDI
103
+
104
+ - **Home.** `.what/_product-brief/brief.md`, with `addendum.md` beside it. Set through
105
+ `run_folder_pattern = "_product-brief"`; both filenames are fixed by the skill and MUST NOT be
106
+ expected to change.
107
+ - **Singleton.** One brief per product, spanning every release. A second product MUST get its own
108
+ repository rather than a second brief.
109
+ - **Why replaces Executive Summary and Vision.** BMad's default carries both as separate sections with
110
+ near-identical instructions one narrative, told once, is what a reader actually gets.
111
+ - **Success Criteria MUST name exactly one measurable figure**, checked at G1 — this is the ★ question
112
+ the gate asks and the section the brief is most often thin on.
113
+ - **Who This Serves.** MUST name exactly one **primary** user. Secondary users and stakeholders are
114
+ listed, not ranked away. If the primary cannot be chosen, the discovery is not finished.
115
+ - **Goals is a pointer, not a list.** `BG-N` and its statement are authored straight into
116
+ `.control/registry/goals.yaml` by `wdi-problem` when it lands the brief — landing the
117
+ registry row is part of producing the brief, not a follow-up. This section MUST NOT restate a
118
+ goal's text; a stated reason beyond the statement belongs in that row's `why:` field.
119
+ - **No Assumptions or Prerequisites section.** Both moved out entirely: an assumption goes through
120
+ `wdi-question` into `.control/questions/assumptions.md`, a prerequisite into
121
+ `.control/questions/external.md`. The brief cites neither by restating it — the generated deliverable
122
+ (`.what-rendered/_product-brief/brief.md`) is where a reader sees them assembled with everything else.
123
+ - **No Product Component list.** The slicing is born at the tail of G2 through `wdi-init` intent
124
+ `component`, which reads
125
+ the brief and every PRD once a domain model exists. A list guessed at G1 is a guess made before
126
+ there is anything to guess from.
127
+ - **Raw material stays out.** Research, brainstorming, and pressure-test output live in
128
+ `_bmad-output/` and stay there. It MUST NOT be folded in, and MUST NOT be promoted into `.what/` —
129
+ a `DEC-` or the PRD cites it by path instead.
130
+ - **Dying cheap is a pass.** A brief that concludes the idea is not worth building is a valid G1
131
+ outcome, and the most profitable one.
132
+ - **Memlog.** Written to `.control/memlog/brief.md` via `--path`.
@@ -3,7 +3,6 @@ type: c4
3
3
  level: 2 # 1 (system context) · 2 (containers) · 3 (components)
4
4
  container: '{container}' # level 3 only — one file per container
5
5
  created: '{YYYY-MM-DD}'
6
- updated: '{YYYY-MM-DD}'
7
6
  ---
8
7
 
9
8
  # C4 L{n} — {title}
@@ -21,8 +20,8 @@ updated: '{YYYY-MM-DD}'
21
20
  already says which PC lives where, so a one-PC container needs no
22
21
  file of its own.
23
22
 
24
- ALL THREE LAND AT G3, and not one of them waits for a wave. Which container a PC lives in cannot
25
- be discovered by a wave, because a wave picks its stories FROM that answer.
23
+ ALL THREE LAND AT G3, and not one of them waits for a spec. Which container a PC lives in cannot
24
+ be discovered by a spec, because a spec picks its tickets FROM that answer.
26
25
 
27
26
  THE AXIS THAT CONFUSES PEOPLE: a container runs its own code or stores its own data; a Product
28
27
  Component is a domain slice. They cross. One container holds several PC boxes, and one PC may
@@ -60,16 +59,17 @@ updated: '{YYYY-MM-DD}'
60
59
 
61
60
  <!-- L2 ONLY, and MANDATORY there — complete at G3, with no exceptions and no dependence on `mode`.
62
61
 
63
- One row per container with `built: true`, listing every PC that lives in it. This table is a
64
- RENDERING of each PC's `containers:` in components.yaml; that registry is the SSOT and V25 fails
65
- when the two disagree.
62
+ The matrix's one home is each PC's `containers:` in components.yaml `container-built` demands it
63
+ be complete at G3. It is NOT written here as a table any more: `.how-rendered/blueprint.md` renders
64
+ it from the registry, so there is nothing to keep in step. (The old comment here claimed
65
+ `container-built` compared this table with the registry. It never did — it checks the registry
66
+ field alone. The table was an unguarded copy.) What THIS section states is the prose a registry
67
+ cannot hold — why a component sits where it does, when that is not obvious.
66
68
 
67
- A `built: false` container is NOT a row here. Every PC's data lives in the database by
68
- definition, so a column for it would say the same thing seven times, and the data inventory
69
- already records which PC owns which table. -->
69
+ A `built: false` container is never in the matrix. Every PC's data lives in the database by
70
+ definition, so a row for it would say the same thing seven times. -->
70
71
 
71
- | Container | Product Components living in it |
72
- | --- | --- |
72
+ Product Components per container see `.control/registry/components.yaml`, each PC's `containers:`.
73
73
 
74
74
  ## What is deliberately not shown
75
75
 
@@ -1,52 +1,51 @@
1
- ---
2
- type: contract
3
- component: '{pc}'
4
- lc: LC-{NNN} # the gateway this contract belongs to
5
- direction: exposed # exposed (we serve it) · consumed (a third party serves it)
6
- created: '{YYYY-MM-DD}'
7
- updated: '{YYYY-MM-DD}'
8
- ---
9
-
10
- # Contract — {name}
11
-
12
- <!-- TEMPLATE GUIDE — act on these comments, then delete them.
13
-
14
- Lives in .how/<pc>/02-contracts/ when we expose it, .how/<pc>/03-integrations/ when we consume
15
- someone else's.
16
-
17
- Where a machine-readable spec exists OpenAPI, protobuf, a schema file THAT is the source of
18
- truth and this document MUST point at it rather than restate it. A restated schema drifts from
19
- the generated one within a wave. Write here only what the machine spec cannot carry. -->
20
-
21
- ## Source of truth
22
-
23
- <!-- Path or URL to the machine-readable spec, or `none` if this contract is prose-only. -->
24
-
25
- ## Purpose
26
-
27
- <!-- Which UC this serves, and what the caller is trying to achieve. -->
28
-
29
- ## Operations
30
-
31
- <!-- One row per operation. Keep it thin — detail belongs to the machine spec. -->
32
-
33
- | Operation | Purpose | Realizes |
34
- | --- | --- | --- |
35
-
36
- ## Error behaviour
37
-
38
- <!-- What the caller sees when things go wrong, and which of those are expected rather than
39
- exceptional. This is the part a generated spec carries worst and a caller needs most. -->
40
-
41
- | Condition | Response | Caller should |
42
- | --- | --- | --- |
43
-
44
- ## Compatibility
45
-
46
- <!-- What counts as a breaking change here, and how it is announced. A contract with no stated
47
- breaking-change policy will be broken by someone acting in good faith. -->
48
-
49
- ## Constraints
50
-
51
- <!-- Rate limits, size limits, timeouts, idempotency, ordering guarantees. Anything the caller MUST
52
- honour that the schema does not express. -->
1
+ ---
2
+ type: contract
3
+ component: '{pc}'
4
+ lc: LC-{NNN} # the gateway this contract belongs to
5
+ direction: exposed # exposed (we serve it) · consumed (a third party serves it)
6
+ created: '{YYYY-MM-DD}'
7
+ ---
8
+
9
+ # Contract — {name}
10
+
11
+ <!-- TEMPLATE GUIDE — act on these comments, then delete them.
12
+
13
+ Lives in .how/<pc>/02-contracts/ when we expose it, .how/<pc>/03-integrations/ when we consume
14
+ someone else's.
15
+
16
+ Where a machine-readable spec exists — OpenAPI, protobuf, a schema file — THAT is the source of
17
+ truth and this document MUST point at it rather than restate it. A restated schema drifts from
18
+ the generated one within a spec. Write here only what the machine contract cannot carry. -->
19
+
20
+ ## Source of truth
21
+
22
+ <!-- Path or URL to the machine-readable spec, or `none` if this contract is prose-only. -->
23
+
24
+ ## Purpose
25
+
26
+ <!-- Which UC this serves, and what the caller is trying to achieve. -->
27
+
28
+ ## Operations
29
+
30
+ <!-- One row per operation. Keep it thin — detail belongs to the machine spec. -->
31
+
32
+ | Operation | Purpose | Realizes |
33
+ | --- | --- | --- |
34
+
35
+ ## Error behaviour
36
+
37
+ <!-- What the caller sees when things go wrong, and which of those are expected rather than
38
+ exceptional. This is the part a generated spec carries worst and a caller needs most. -->
39
+
40
+ | Condition | Response | Caller should |
41
+ | --- | --- | --- |
42
+
43
+ ## Compatibility
44
+
45
+ <!-- What counts as a breaking change here, and how it is announced. A contract with no stated
46
+ breaking-change policy will be broken by someone acting in good faith. -->
47
+
48
+ ## Constraints
49
+
50
+ <!-- Rate limits, size limits, timeouts, idempotency, ordering guarantees. Anything the caller MUST
51
+ honour that the schema does not express. -->
@@ -3,7 +3,6 @@ type: cross-cutting
3
3
  scope: _platform
4
4
  status: draft # draft · reviewed · locked · superseded
5
5
  created: '{YYYY-MM-DD}'
6
- updated: '{YYYY-MM-DD}'
7
6
  ---
8
7
 
9
8
  # Cross-Cutting — {product}
@@ -47,7 +46,7 @@ updated: '{YYYY-MM-DD}'
47
46
  ## Platform-owned
48
47
 
49
48
  <!-- REQUIRED as soon as anything is owned by `_platform` — a `platform_owns` entity, an inventory row,
50
- an LC. V21 checks it.
49
+ an LC. `entity-one-writer` checks it.
51
50
 
52
51
  Something lands here only when NO Product Component's promise is the reason it exists AND more than
53
52
  one component depends on it. corpus-guide.md owns that test, and it refuses the one use people
@@ -3,7 +3,6 @@ type: design-system
3
3
  scope: _platform
4
4
  status: draft # draft · reviewed · locked · superseded
5
5
  created: '{YYYY-MM-DD}'
6
- updated: '{YYYY-MM-DD}'
7
6
  ---
8
7
 
9
8
  # Design System — {product}
@@ -1,69 +1,68 @@
1
- ---
2
- type: integration
3
- component: '{pc}'
4
- status: draft # draft · reviewed · locked · superseded
5
- created: '{YYYY-MM-DD}'
6
- updated: '{YYYY-MM-DD}'
7
- provider: '{who owns it outside the team}'
8
- ---
9
-
10
- # Integration — {third-party name}
11
-
12
- <!-- TEMPLATE GUIDE — act on these comments, then delete them.
13
-
14
- Home: .how/<pc>/03-integrations/<name>.md. Written at G4, from mode: guarded up, and only when
15
- the component actually consumes a third party.
16
-
17
- WHY THIS IS NOT contract.md: contract.md is the shape of an endpoint WE publish, and we can
18
- change it. This is something SOMEBODY ELSE owns. Two things have no column in contract.md and
19
- are the whole reason this template exists — who owns it outside the team, and what happens when
20
- they change it without telling anyone.
21
-
22
- COMMERCIAL FACTS MUST NOT APPEAR HERE. A rate limit that exists because of what was negotiated
23
- is written as the technical fact "300 requests per minute" and never as the negotiation.
24
- repo-guide.md owns that boundary, and this file is the most common place it leaks. -->
25
-
26
- ## Who owns it
27
-
28
- | | |
29
- | --- | --- |
30
- | Provider | {the organisation} |
31
- | Our contact | {a role, and where the person's name is recorded not the name} |
32
- | Where credentials live | {the devops repo and path. NEVER the credential} |
33
- | Notice we get before a breaking change | {a period, or `none` — and `none` is the answer that changes the design} |
34
-
35
- ## What we use it for
36
-
37
- <!-- Which FR or UC depends on it, by id. An integration no promise depends on is one we are
38
- carrying for free. -->
39
-
40
- ## What we send and receive
41
-
42
- <!-- Only the surface we actually touch. A full API description belongs to their documentation, cited
43
- by URL, and copying it here creates a second version that goes stale silently. -->
44
-
45
- | Direction | Operation | Carries | Contains personal data |
46
- | --- | --- | --- | --- |
47
-
48
- ## When it changes without telling us
49
-
50
- <!-- The section that earns this file. For each: how we would notice, how long we would run wrong
51
- before noticing, and what happens meanwhile. "We would see errors" is not an answer unless
52
- something is actually watching. -->
53
-
54
- | Change | How we notice | Blast radius | What we do |
55
- | --- | --- | --- | --- |
56
-
57
- ## When it is slow, absent, or lying
58
-
59
- <!-- The same three failures the SDD's Failure Behaviour asks about, for this boundary. State the
60
- timeout, the retry policy, what the user sees, and what gets logged. A retry policy with no cap
61
- is an outage amplifier. -->
62
-
63
- | Failure | Timeout | Retry | What the user sees | What is logged |
64
- | --- | --- | --- | --- | --- |
65
-
66
- ## What we would do without them
67
-
68
- <!-- One paragraph. Not a migration plan the honest answer, which is sometimes "the feature stops".
69
- Writing it is what makes the dependency visible before it has to be replaced in a hurry. -->
1
+ ---
2
+ type: integration
3
+ component: '{pc}'
4
+ status: draft # draft · reviewed · locked · superseded
5
+ created: '{YYYY-MM-DD}'
6
+ provider: '{who owns it outside the team}'
7
+ ---
8
+
9
+ # Integration — {third-party name}
10
+
11
+ <!-- TEMPLATE GUIDE — act on these comments, then delete them.
12
+
13
+ Home: .how/<pc>/03-integrations/<name>.md. Written at G4, from mode: guarded up, and only when
14
+ the component actually consumes a third party.
15
+
16
+ WHY THIS IS NOT contract.md: contract.md is the shape of an endpoint WE publish, and we can
17
+ change it. This is something SOMEBODY ELSE owns. Two things have no column in contract.md and
18
+ are the whole reason this template exists — who owns it outside the team, and what happens when
19
+ they change it without telling anyone.
20
+
21
+ COMMERCIAL FACTS MUST NOT APPEAR HERE. A rate limit that exists because of what was negotiated
22
+ is written as the technical fact "300 requests per minute" and never as the negotiation.
23
+ repo-guide.md owns that boundary, and this file is the most common place it leaks. -->
24
+
25
+ ## Who owns it
26
+
27
+ | | |
28
+ | --- | --- |
29
+ | Provider | {the organisation} |
30
+ | Our contact | {a role, and where the person's name is recorded — not the name} |
31
+ | Where credentials live | {the devops repo and path. NEVER the credential} |
32
+ | Notice we get before a breaking change | {a period, or `none` — and `none` is the answer that changes the design} |
33
+
34
+ ## What we use it for
35
+
36
+ <!-- Which FR or UC depends on it, by id. An integration no promise depends on is one we are
37
+ carrying for free. -->
38
+
39
+ ## What we send and receive
40
+
41
+ <!-- Only the surface we actually touch. A full API description belongs to their documentation, cited
42
+ by URL, and copying it here creates a second version that goes stale silently. -->
43
+
44
+ | Direction | Operation | Carries | Contains personal data |
45
+ | --- | --- | --- | --- |
46
+
47
+ ## When it changes without telling us
48
+
49
+ <!-- The section that earns this file. For each: how we would notice, how long we would run wrong
50
+ before noticing, and what happens meanwhile. "We would see errors" is not an answer unless
51
+ something is actually watching. -->
52
+
53
+ | Change | How we notice | Blast radius | What we do |
54
+ | --- | --- | --- | --- |
55
+
56
+ ## When it is slow, absent, or lying
57
+
58
+ <!-- The same three failures the SDD's Failure Behaviour asks about, for this boundary. State the
59
+ timeout, the retry policy, what the user sees, and what gets logged. A retry policy with no cap
60
+ is an outage amplifier. -->
61
+
62
+ | Failure | Timeout | Retry | What the user sees | What is logged |
63
+ | --- | --- | --- | --- | --- |
64
+
65
+ ## What we would do without them
66
+
67
+ <!-- One paragraph. Not a migration plan — the honest answer, which is sometimes "the feature stops".
68
+ Writing it is what makes the dependency visible before it has to be replaced in a hurry. -->
@@ -4,7 +4,6 @@ kind: db # db · api · screen · endpoint — decides the row s
4
4
  scope: _platform # `_platform` for the three product-level inventories; `{pc}` for kind: endpoint
5
5
  status: draft # draft · reviewed · locked · superseded
6
6
  created: '{YYYY-MM-DD}'
7
- updated: '{YYYY-MM-DD}'
8
7
  derived_from: plan # plan · code — see the TEMPLATE GUIDE
9
8
  verified: '' # commit SHA the derivation was read at; required when derived_from: code
10
9
  ---