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.
- package/README.md +436 -271
- package/bin/wdi-method.js +198 -5
- package/kit/.constitution/method/README.md +76 -75
- package/kit/.constitution/method/constitution.md +2 -1
- package/kit/.constitution/method/document/architecture-guide.md +10 -10
- package/kit/.constitution/method/document/bmad-guide.md +50 -16
- package/kit/.constitution/method/document/bmad-skill-register.md +74 -71
- package/kit/.constitution/method/document/brief-guide.md +42 -11
- package/kit/.constitution/method/document/corpus-guide.md +146 -11
- package/kit/.constitution/method/document/decision-guide.md +199 -134
- package/kit/.constitution/method/document/delivery-flow-guide.md +154 -83
- package/kit/.constitution/method/document/prd-guide.md +63 -20
- package/kit/.constitution/method/document/sdd-guide.md +5 -4
- package/kit/.constitution/method/document/srs-guide.md +150 -147
- package/kit/.constitution/method/document/templates/addendum.md +70 -71
- package/kit/.constitution/method/document/templates/architecture-spine.md +6 -4
- package/kit/.constitution/method/document/templates/brief.md +132 -110
- package/kit/.constitution/method/document/templates/c4.md +11 -11
- package/kit/.constitution/method/document/templates/contract.md +51 -52
- package/kit/.constitution/method/document/templates/cross-cutting.md +1 -2
- package/kit/.constitution/method/document/templates/design-system.md +0 -1
- package/kit/.constitution/method/document/templates/integration.md +68 -69
- package/kit/.constitution/method/document/templates/inventory.md +0 -1
- package/kit/.constitution/method/document/templates/lc.md +49 -47
- package/kit/.constitution/method/document/templates/lifecycle.md +51 -52
- package/kit/.constitution/method/document/templates/model.md +68 -55
- package/kit/.constitution/method/document/templates/oq.md +45 -45
- package/kit/.constitution/method/document/templates/prd.md +244 -226
- package/kit/.constitution/method/document/templates/questions.md +100 -76
- package/kit/.constitution/method/document/templates/rules.md +46 -47
- package/kit/.constitution/method/document/templates/sdd.md +26 -11
- package/kit/.constitution/method/document/templates/srs.md +46 -25
- package/kit/.constitution/method/document/templates/uc.md +1 -1
- package/kit/.constitution/method/document/templates/ux.md +76 -77
- package/kit/.constitution/method/document/ux-guide.md +115 -99
- package/kit/.constitution/method/language-guide.md +1 -1
- package/kit/.constitution/method/method-glossary.md +29 -16
- package/kit/.constitution/method/scripts/timeline.py +663 -665
- package/kit/.constitution/method/scripts/validate.py +1143 -362
- package/kit/.constitution/method/structure-guide.md +3 -3
- package/kit/.constitution/method/why/README.md +184 -169
- package/kit/.constitution/method/why/artifact-map.md +15 -13
- package/kit/.constitution/method/why/mode-risk-map.md +140 -0
- package/kit/.constitution/method/why/portability.md +1 -1
- package/kit/.constitution/method/why/rationale.md +12 -5
- package/kit/.constitution/project/README.md +2 -2
- package/kit/.constitution/project/codebase-brownfield-guide.md +18 -18
- package/kit/.constitution/project/codebase-conventions-guide.md +18 -18
- package/kit/.constitution/project/codebase-stack-guide.md +18 -18
- package/kit/assets/bmad-custom/bmad-architecture.toml +1 -1
- package/kit/assets/bmad-custom/bmad-correct-course.toml +5 -5
- package/kit/assets/bmad-custom/bmad-prd.toml +9 -3
- package/kit/assets/bmad-custom/bmad-product-brief.toml +6 -2
- package/kit/skills/wdi-blueprint/SKILL.md +71 -10
- package/kit/skills/wdi-build/SKILL.md +233 -122
- package/kit/skills/wdi-component/SKILL.md +8 -6
- package/kit/skills/wdi-decision/SKILL.md +187 -183
- package/kit/skills/wdi-help/SKILL.md +8 -7
- package/kit/skills/wdi-init/SKILL.md +20 -6
- package/kit/skills/wdi-problem/SKILL.md +31 -13
- package/kit/skills/wdi-product/SKILL.md +30 -17
- package/kit/skills/wdi-question/SKILL.md +170 -88
- package/kit/skills/wdi-reconcile/SKILL.md +33 -10
- package/kit/skills/wdi-report/SKILL.md +77 -25
- package/kit/skills/wdi-review/SKILL.md +201 -118
- package/kit/skills/wdi-systematic-debugging/SKILL.md +7 -7
- package/kit/skills/wdi-upgrade/SKILL.md +179 -0
- package/kit/skills/wdi-ux/SKILL.md +35 -11
- package/kit-overlay/AGENTS.md +2 -2
- package/kit-overlay/README.md +76 -75
- package/kit-overlay/constitution.md +2 -1
- package/kit-overlay/portability.md +1 -1
- package/package.json +43 -43
- package/scaffold/.control/product-glossary.md +1 -1
- package/scaffold/.control/registry/goals.yaml +25 -0
- package/scaffold/.control/registry/index.yaml +5 -5
- package/scaffold/.control/registry/specs.yaml +5 -0
- package/scaffold/.control/structure-codebase.md +19 -19
- package/scaffold/.control/structure-document.md +25 -25
- package/kit/.constitution/method/document/templates/rtr.md +0 -61
- package/kit/assets/bmad-custom/bmad-build-auto.toml +0 -10
- package/kit/assets/bmad-custom/bmad-build.toml +0 -52
- package/kit/assets/bmad-custom/bmad-code-review.toml +0 -13
- package/kit/assets/bmad-custom/bmad-retrospective.toml +0 -9
- package/kit/assets/bmad-custom/bmad-spec.toml +0 -16
- package/scaffold/.control/registry/requirements.yaml +0 -15
- 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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
##
|
|
39
|
-
|
|
40
|
-
[What
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
[
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
[
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
-
|
|
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
|
|
25
|
-
be discovered by a
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
|
68
|
-
definition, so a
|
|
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
|
-
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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.
|
|
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
|
|
@@ -1,69 +1,68 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: integration
|
|
3
|
-
component: '{pc}'
|
|
4
|
-
status: draft # draft · reviewed · locked · superseded
|
|
5
|
-
created: '{YYYY-MM-DD}'
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
| | |
|
|
29
|
-
|
|
|
30
|
-
|
|
|
31
|
-
|
|
|
32
|
-
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
---
|