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,76 +1,100 @@
1
- ---
2
- type: questions
3
- list: blocking # blocking · assumptions · external · answered
4
- status: draft # draft · reviewed · locked · superseded
5
- created: '{YYYY-MM-DD}'
6
- updated: '{YYYY-MM-DD}'
7
- ---
8
-
9
- # {Blocking Questions | Assumptions | Waiting on an Outside Party | Answered}
10
-
11
- <!-- TEMPLATE GUIDE — act on these comments, then delete them.
12
-
13
- ONE template, four lists, all in .control/questions/. `list:` decides which row shape below
14
- survives; delete the other three.
15
-
16
- THE SPLIT IS BY WHAT THE READER HAS TO DO not by subject and not by severity. That is the whole
17
- design, and it is what the single old list could not express: it reached OQ-146 and the majority
18
- of its weight was answered entries.
19
-
20
- blocking holds a gate. Read at every gate. Target <=3 per Product Component
21
- assumptions the DEFAULT class. Swept once per gate; MAY be skipped. Holds nothing
22
- external waiting on a file, an action, or a credential from outside. Holds GO-LIVE ONLY,
23
- never a design gate. Owner and `Sebelum` required on every row
24
- answered archive. Closed in place, never deleted
25
-
26
- WHY oq.md IS NOT THIS: oq.md is the shape of ONE question whose discussion outgrew a line, and it
27
- lives beside these four as OQ-NNN-<slug>.md with a one-line pointer from the list. This is the
28
- shape of the four LISTS.
29
-
30
- A ROW MOVES BETWEEN FILES WHEN ITS CLASS CHANGES, and it MUST NOT be copied into a second one.
31
-
32
- Ids stay OQ-, allocated from the highest ever used including closed ones. An id MUST NOT be
33
- reused. The prose inside the tables follows the product's `doc_language`; a machine-facing
34
- marker such as `[NEEDS CONFIRMATION]` stays English wherever it appears — `language-guide.md`
35
- owns that split. -->
36
-
37
- ## The class test
38
-
39
- <!-- Keep this block in blocking.md and assumptions.md; delete it from the other two.
40
-
41
- A question is filed in `assumptions` unless it passes one of three tests. One is enough:
42
-
43
- 1. It touches money, personal data, or a legal obligation.
44
- 2. It changes the wording of an FR's promise.
45
- 3. Answering it wrong forces a rewrite of more than one Product Component.
46
-
47
- Failing all three, the agent takes the answer itself and records it as one line.
48
-
49
- A question MUST NOT be filed as blocking "to be safe". That habit is what produced 146 ids. -->
50
-
51
- ## Open
52
-
53
- <!-- list: blocking · external -->
54
-
55
- | id | Question | Blocks | Owner | Before |
56
- |---|---|---|---|---|
57
-
58
- <!-- list: assumptions keep this shape instead
59
- | id | Assumption | Cost if wrong | Taken | By |
60
- |---|---|---|---|---|---|
61
- -->
62
-
63
- <!-- An empty list is a legitimate state and MUST be written as one, with the date and one line
64
- saying why. An empty table with no sentence reads as an unfinished file. -->
65
-
66
- ## Answered
67
-
68
- <!-- list: answered only.
69
-
70
- | id | Question | Answer | Date | By |
71
-
72
- The answer is written beside the question, not in place of it. The record of what was once
73
- uncertain is what stops the same question being asked again in three months.
74
-
75
- An answer amounting to a decision that is expensive to reverse MUST also go to wdi-decision. This
76
- list records that an answer arrived; a DEC- records what was chosen and what it cost. -->
1
+ ---
2
+ type: questions
3
+ list: blocking # blocking · assumptions · external · answered
4
+ status: draft # draft · reviewed · locked · superseded
5
+ created: '{YYYY-MM-DD}'
6
+ ---
7
+
8
+ # {Blocking Questions | Assumptions | Waiting on an Outside Party | Answered}
9
+
10
+ <!-- TEMPLATE GUIDE — act on these comments, then delete them.
11
+
12
+ ONE template, four lists, all in .control/questions/. `list:` decides which row shape below
13
+ survives; delete the other three.
14
+
15
+ THE SPLIT IS BY WHAT THE READER HAS TO DO — not by subject and not by severity. That is the whole
16
+ design, and it is what the single old list could not express: it reached OQ-146 and the majority
17
+ of its weight was answered entries.
18
+
19
+ blocking holds a gate. Read at every gate. Target <=3 per Product Component
20
+ assumptions the DEFAULT class. Swept once per gate; MAY be skipped. Holds nothing
21
+ external waiting on a file, an action, or a credential from outside. Holds GO-LIVE ONLY,
22
+ never a design gate. Owner and `Sebelum` required on every row
23
+ answered archive. Closed in place, never deleted
24
+
25
+ WHY oq.md IS NOT THIS: oq.md is the shape of ONE question whose discussion outgrew a line, and it
26
+ lives beside these four as OQ-NNN-<slug>.md with a one-line pointer from the list. This is the
27
+ shape of the four LISTS.
28
+
29
+ A ROW MOVES BETWEEN FILES WHEN ITS CLASS CHANGES, and it MUST NOT be copied into a second one.
30
+
31
+ Ids stay OQ-, allocated from the highest ever used including closed ones. An id MUST NOT be
32
+ reused. The prose inside the tables follows the product's `doc_language`; a machine-facing
33
+ marker such as `[NEEDS CONFIRMATION]` stays English wherever it appears `language-guide.md`
34
+ owns that split. -->
35
+
36
+ ## The class test
37
+
38
+ <!-- Keep this block in blocking.md and assumptions.md; delete it from the other two.
39
+
40
+ A question is filed in `assumptions` unless it passes one of three tests. One is enough:
41
+
42
+ 1. It touches money, personal data, or a legal obligation.
43
+ 2. It changes the wording of an FR's promise.
44
+ 3. Answering it wrong forces a rewrite of more than one Product Component.
45
+
46
+ Failing all three, the agent takes the answer itself — and then THE RECORDING THRESHOLD decides
47
+ whether it becomes a row at all. Read `Cost if wrong` first: if it is *one setting changes*, *one
48
+ default changes*, or *a shortcut is added later*, with no rework and nothing built on it, then
49
+ there is NO ROW. The shipping default is the record, and the code says it more reliably than a
50
+ line here. wdi-question owns the rule.
51
+
52
+ The threshold never applies to the three tests above. Those always win.
53
+
54
+ A question MUST NOT be filed as blocking "to be safe". That habit is what produced 146 ids. -->
55
+
56
+ ## Open
57
+
58
+ <!-- list: blocking · external -->
59
+
60
+ | id | Question | Blocks | Whose | Owner | Before |
61
+ |---|---|---|---|---|---|
62
+
63
+ <!-- external.md drops `Whose`: sitting in that file already says who acts. Its shape is
64
+ | id | Question | Waiting on | Since | -->
65
+
66
+ <!-- list: assumptions — keep this shape instead
67
+ | id | Assumption | Cost if wrong | Whose | Taken | By |
68
+ |---|---|---|---|---|---|
69
+ -->
70
+
71
+ <!-- `Whose` says who acts, and whether anyone may act yet. Three values, and no others:
72
+
73
+ owner a judgement only the owner can make, and it can be made NOW
74
+ run: <what> the answer comes from running or measuring something — the AGENT's, not the
75
+ owner's. It MUST name what to run; "needs testing" is not a value
76
+ frozen: DEC-NNN an applied decision forbids answering it yet, planning included. When that
77
+ DEC- lifts or is superseded, the row becomes `owner` with no re-triage
78
+
79
+ Without this column the four files still hand the owner one flat pile: in one real corpus, 25 open
80
+ lines of which only 6 were the owner's and answerable. wdi-question MUST report only `owner` rows
81
+ to the owner, and the rest as counts. -->
82
+
83
+ <!-- An empty list is a legitimate state and MUST be written as one, with the date and one line
84
+ saying why. An empty table with no sentence reads as an unfinished file. -->
85
+
86
+ ## Answered
87
+
88
+ <!-- list: answered only.
89
+
90
+ | id | Question | Answer | Date | By |
91
+
92
+ The answer is written beside the question, not in place of it. The record of what was once
93
+ uncertain is what stops the same question being asked again in three months.
94
+
95
+ An answer amounting to a decision that is expensive to reverse MUST also go to wdi-decision. This
96
+ list records that an answer arrived; a DEC- records what was chosen and what it cost.
97
+
98
+ A FOSSIL IS CLOSED, NOT ANSWERED. A row questioning a rule, a layer, or a validator that has since
99
+ been repealed cannot bite again — it moves here with the repeal as its answer, and it MUST NOT be
100
+ put to the owner as a decision. Check for these FIRST when a list has grown long; they are free. -->
@@ -1,47 +1,46 @@
1
- ---
2
- type: rules
3
- scope: global # global · component — decides the home and the id prefix
4
- component: '{pc}' # omit entirely when scope: global
5
- status: draft # draft · reviewed · locked · superseded
6
- created: '{YYYY-MM-DD}'
7
- updated: '{YYYY-MM-DD}'
8
- ---
9
-
10
- # Business Rules — {the product | Product Component}
11
-
12
- <!-- TEMPLATE GUIDE — act on these comments, then delete them.
13
-
14
- ONE template, two scopes, and the scope decides everything about where this file lives:
15
-
16
- scope: global -> .what/business-rules.md born at G3, by wdi-blueprint
17
- scope: component -> .what/<pc>/02-rules/rules-<pc>.md born at G4, from mode: outline up
18
-
19
- THE TEST IS REACH, NOT IMPORTANCE. A rule binding more than one Product Component is global; a
20
- rule binding only one is that component's. A rule written locally that turns out to bind a
21
- second component MUST be PROMOTED to the global file, never copied. Two copies of one rule is
22
- how components start disagreeing about the same policy.
23
-
24
- A rule MUST be checkable. If a reviewer cannot tell whether the behaviour obeys it, it is not a
25
- rule yet — it is an intention, and it belongs in the SRS prose.
26
-
27
- A rule MUST NOT state a mechanism. "The turn is not consumed until commitment" is a rule; "a
28
- row is written to the queue table" is a mechanism and belongs to .how/.
29
-
30
- Ids are allocated GLOBALLY and never restart. A retired rule keeps its id and is marked retired
31
- with what replaced it — never deleted, because documents still cite it. -->
32
-
33
- ## Rules
34
-
35
- | id | Rule | Binds | Source | Status |
36
- | --- | --- | --- | --- | --- |
37
- | BR-{n} | {one checkable sentence, present tense} | {which components, or `all`} | {FR-n · DEC-n · UC-n · a person and a date} | active |
38
-
39
- <!-- `Source` MUST name where the rule came from. A rule with no source is an assumption in
40
- disguise, and it goes through wdi-question instead.
41
-
42
- `Status`: active · retired. A retired row states what replaced it in the Rule column. -->
43
-
44
- ## Retired
45
-
46
- <!-- Rows moved here keep their ids. Each MUST name what replaced it and the date it stopped
47
- holding. This section MAY be absent until the first rule retires. -->
1
+ ---
2
+ type: rules
3
+ scope: global # global · component — decides the home and the id prefix
4
+ component: '{pc}' # omit entirely when scope: global
5
+ status: draft # draft · reviewed · locked · superseded
6
+ created: '{YYYY-MM-DD}'
7
+ ---
8
+
9
+ # Business Rules — {the product | Product Component}
10
+
11
+ <!-- TEMPLATE GUIDE — act on these comments, then delete them.
12
+
13
+ ONE template, two scopes, and the scope decides everything about where this file lives:
14
+
15
+ scope: global -> .what/business-rules.md born at G3, by wdi-blueprint
16
+ scope: component -> .what/<pc>/02-rules/rules-<pc>.md born at G4, from mode: outline up
17
+
18
+ THE TEST IS REACH, NOT IMPORTANCE. A rule binding more than one Product Component is global; a
19
+ rule binding only one is that component's. A rule written locally that turns out to bind a
20
+ second component MUST be PROMOTED to the global file, never copied. Two copies of one rule is
21
+ how components start disagreeing about the same policy.
22
+
23
+ A rule MUST be checkable. If a reviewer cannot tell whether the behaviour obeys it, it is not a
24
+ rule yet it is an intention, and it belongs in the SRS prose.
25
+
26
+ A rule MUST NOT state a mechanism. "The turn is not consumed until commitment" is a rule; "a
27
+ row is written to the queue table" is a mechanism and belongs to .how/.
28
+
29
+ Ids are allocated GLOBALLY and never restart. A retired rule keeps its id and is marked retired
30
+ with what replaced it never deleted, because documents still cite it. -->
31
+
32
+ ## Rules
33
+
34
+ | id | Rule | Binds | Source | Status |
35
+ | --- | --- | --- | --- | --- |
36
+ | BR-{n} | {one checkable sentence, present tense} | {which components, or `all`} | {FR-n · DEC-n · UC-n · a person and a date} | active |
37
+
38
+ <!-- `Source` MUST name where the rule came from. A rule with no source is an assumption in
39
+ disguise, and it goes through wdi-question instead.
40
+
41
+ `Status`: active · retired. A retired row states what replaced it in the Rule column. -->
42
+
43
+ ## Retired
44
+
45
+ <!-- Rows moved here keep their ids. Each MUST name what replaced it and the date it stopped
46
+ holding. This section MAY be absent until the first rule retires. -->
@@ -3,10 +3,9 @@ type: sdd
3
3
  component: '{pc}'
4
4
  status: draft # draft · reviewed · locked · superseded
5
5
  created: '{YYYY-MM-DD}'
6
- updated: '{YYYY-MM-DD}'
7
6
  realizes: [] # UC ids this design realizes, from usecases.yaml
8
7
  binds: [] # AD ids from the spine that bind here
9
- reviewed: # V13. Filled only after wdi-review has actually run
8
+ reviewed: # `review-trace`. Filled only after wdi-review has actually run
10
9
  date: '' # '{YYYY-MM-DD}'
11
10
  sha: '' # commit it was reviewed at; without the SHA, staleness cannot be measured
12
11
  lenses: [] # the set risk_accepted names — NOT a fixed list
@@ -19,7 +18,7 @@ reviewed: # V13. Filled only after wdi-review has actually run
19
18
 
20
19
  <!-- NOT an HLD, and NOT a one-shot LLD. What the system consists of belongs to C4 L1-L2; architecture
21
20
  constraints belong to ARCHITECTURE-SPINE.md; deployment topology belongs to the devops repository.
22
- This document is LIVING: one per Product Component, amended every wave. -->
21
+ This document is LIVING: one per Product Component, amended every spec. -->
23
22
 
24
23
  <!-- EVERY SECTION MARKS THE MINIMUM `mode` THAT DEMANDS IT. Below that minimum it MUST NOT be written
25
24
  to fill a slot; above it, it is required. Read the component's mode from its row in
@@ -29,13 +28,21 @@ reviewed: # V13. Filled only after wdi-review has actually run
29
28
  That is a FINISHED state, not an unfinished one: G4 is skipped at catalog, and the code is written
30
29
  from the use case catalogue, the three inventories, and C4.
31
30
 
31
+ `reviewed.lenses` carries what ACTUALLY ran at that sha. The risk-mandated set applies to a first
32
+ review and a gate-opening review; a re-review runs the lighter set over the delta only.
33
+
32
34
  `reviewed.lenses` MUST match what risk_accepted names, NOT what `mode` says. One component MAY sit
33
35
  at catalog and still be reviewed the hardest. -->
34
36
 
35
37
  ## Decision Summary · [outline]
36
38
 
37
39
  <!-- <=1 page, business language. What this component is built as, and the one or two choices that cost
38
- the most to reverse. This is what the Product Owner reads at G4. -->
40
+ the most to reverse. This is what the Product Owner reads at G4.
41
+
42
+ NO DERIVED FACT. `mode`, `risk_accepted`, which `DEC-` bind this file — "none yet" included —
43
+ how many UC or FR there are, and which slots exist are all held elsewhere and MUST NOT be
44
+ stated here. `corpus-guide.md` § A derived fact has exactly one home says where each lives, and
45
+ that the remedy for one already written is DELETION, not correction. -->
39
46
 
40
47
  ## Structure · [outline]
41
48
 
@@ -43,7 +50,7 @@ reviewed: # V13. Filled only after wdi-review has actually run
43
50
  rule, not decoration.
44
51
 
45
52
  Every LC named here MUST be registered in .control/registry/components.yaml, and the registration
46
- is checked WHEN THE WAVE CLOSES — V12 — not before a story is ready-for-dev. The old timing
53
+ is checked WHEN THE SPEC CLOSES — `lc-registered` — not before a ticket is picked up. The old timing
47
54
  demanded the answer at the moment the information was thinnest. -->
48
55
 
49
56
  | LC | type | Responsibility |
@@ -51,15 +58,18 @@ reviewed: # V13. Filled only after wdi-review has actually run
51
58
 
52
59
  ## Inherited Constraints · [guarded]
53
60
 
54
- <!-- Every AD-N from ARCHITECTURE-SPINE.md that reaches this component, QUOTED VERBATIM under its
55
- ORIGINAL id. A paraphrase drifts, and the drift is invisible because both texts read reasonably.
61
+ <!-- The AD-N ids from ARCHITECTURE-SPINE.md that reach this component, and how each lands HERE.
62
+ IDS ONLY never the rule's text. `AD-` is a living rule edited in place, so a copy of its text
63
+ goes stale the moment the spine changes and nothing sees it. The rendered SDD
64
+ (`.how-rendered/<pc>/SDD-<pc>.md`) shows every invariant with its current text, pulled from the
65
+ spine, and marks which ones bind this component.
56
66
 
57
67
  A local choice contradicting one is a conflict to surface through wdi-decision, never an override
58
68
  made here. Below `guarded` this section is absent and the AD-N still binds — an invariant does not
59
69
  stop holding because a document is thin. -->
60
70
 
61
- | AD | Quoted rule | How it lands here |
62
- | --- | --- | --- |
71
+ | AD | How it lands here |
72
+ | --- | --- |
63
73
 
64
74
  ## Failure Behaviour · [guarded]
65
75
 
@@ -139,8 +149,13 @@ reviewed: # V13. Filled only after wdi-review has actually run
139
149
  a third party. Lane order is fixed once for the project in
140
150
  ../../../project/codebase-conventions-guide.md; the No-op lane rule is REPEALED
141
151
 
142
- supplements/ is REPEALED along with the ANX- concept it existed for. -->
152
+ supplements/ is REPEALED along with the ANX- concept it existed for.
153
+
154
+ THIS SECTION EXPLAINS THE CLASSIFICATION, NOT THE CONTENTS. It MUST NOT say which slots exist,
155
+ which are empty, or which are "not written yet" — that is `.control/structure-document.md`,
156
+ derived from the tree on disk. -->
143
157
 
144
158
  ## Open Items
145
159
 
146
- <!-- Unresolved design questions, each pointing at its row in .control/questions/. -->
160
+ <!-- A POINTER, not a copy: ids only. Whether an OQ- is still open is held by .control/questions/,
161
+ and restating its status here creates a second answer on a slower clock. -->
@@ -3,9 +3,8 @@ type: srs
3
3
  component: '{pc}'
4
4
  status: draft # draft · reviewed · locked · superseded
5
5
  created: '{YYYY-MM-DD}'
6
- updated: '{YYYY-MM-DD}'
7
- satisfies: [] # FR / NFR ids this component carries, from requirements.yaml
8
- reviewed: # V13. Filled only after wdi-review has actually run
6
+ satisfies: [] # FR / NFR ids this component carries, from requirements-<slug>.yaml
7
+ reviewed: # `review-trace`. Filled only after wdi-review has actually run
9
8
  date: '' # '{YYYY-MM-DD}'
10
9
  sha: '' # commit it was reviewed at; without the SHA, staleness cannot be measured
11
10
  lenses: [] # the set risk_accepted names — NOT a fixed list
@@ -18,7 +17,7 @@ reviewed: # V13. Filled only after wdi-review has actually run
18
17
  left in English per the controlled vocabulary. -->
19
18
 
20
19
  <!-- NOT a one-shot document. Despite the IEEE name, this SRS is LIVING: one per Product Component,
21
- amended every wave, never signed off and frozen. -->
20
+ amended every spec, never signed off and frozen. -->
22
21
 
23
22
  <!-- TWO SKILLS WRITE IT, AT TWO GATES, and every section below says which:
24
23
  [G3] wdi-blueprint intent `catalog`. Exists at EVERY mode, including catalog
@@ -28,12 +27,21 @@ reviewed: # V13. Filled only after wdi-review has actually run
28
27
  what is absent there is 04-usecases/UC-<n>-<slug>.md — the step-by-step flows.
29
28
 
30
29
  `reviewed.lenses` MUST match what this component's risk_accepted names in components.yaml —
31
- edge-case-hunter at low and medium, structure + prose at high. It is NOT read off `mode`. -->
30
+ edge-case-hunter at low and medium, structure + prose at high. It is NOT read off `mode`.
31
+
32
+ That set is what a FIRST review and a gate-opening review carry. A later re-review runs
33
+ structure + prose, covers only the delta since `sha`, and puts edge-case-hunter back when that
34
+ delta touches money, personal data, an irreversible action, or a third party. wdi-review owns it. -->
32
35
 
33
36
  ## Decision Summary · [G3]
34
37
 
35
38
  <!-- <=1 page, business language, no jargon lacking a Glossary entry. What the Product Owner reads.
36
- A summary that cannot be read inside the gate's time budget IS the finding. -->
39
+ A summary that cannot be read inside the gate's time budget IS the finding.
40
+
41
+ NO DERIVED FACT. `mode`, `risk_accepted`, which `DEC-` bind this file — "none yet" included —
42
+ how many UC or FR there are, and which slots exist are all held elsewhere and MUST NOT be
43
+ stated here. `corpus-guide.md` § A derived fact has exactly one home says where each lives, and
44
+ that the remedy for one already written is DELETION, not correction. -->
37
45
 
38
46
  ## Why · [G3]
39
47
 
@@ -52,21 +60,17 @@ reviewed: # V13. Filled only after wdi-review has actually run
52
60
 
53
61
  ## UC Catalogue · [G3]
54
62
 
55
- <!-- THE use case list, and at mode: catalog it is the whole use-case record. One line each, and the
56
- line is the artifact — not a placeholder waiting for a file.
57
-
58
- A title MUST be a sentence a user would say, never a system term. G3 asks this as a starred
59
- question.
63
+ UC Catalogue see `.control/registry/usecases.yaml`, rows where `component: {pc}`.
60
64
 
61
- `critical` is yes ONLY when the use case touches money, personal data, or an irreversible action.
62
- Nothing else. If more than a third of this component's use cases are marked, the definition was
63
- misapplied derive it again rather than negotiating it.
65
+ <!-- A POINTER, not a table. The catalogue's one home is `usecases.yaml`; this section used to carry a
66
+ second copy, and `uc-catalogue-matches` existed only to keep the two agreeing it once caught 26
67
+ rows that had drifted. The rendered SRS (`.what-rendered/<pc>/SRS-<pc>.md`) and the blueprint
68
+ both show the table, from the registry.
64
69
 
65
- `critical` decides something only at mode: deep, where every critical UC gets a full flow. -->
66
-
67
- | id | Use case | Actor | Satisfies | critical |
68
- | --- | --- | --- | --- | --- |
69
- | UC-{n} | {a sentence a user would say} | {from the Actor Register} | {FR-n} | no |
70
+ What is still decided HERE, when wdi-blueprint lands the rows: a title MUST be a sentence a user
71
+ would say, never a system term — G3 asks this as a starred question. `critical` is yes ONLY when
72
+ the use case touches money, personal data, or an irreversible action; more than a third marked
73
+ means the definition was misapplied. -->
70
74
 
71
75
  ## Constraints · [G3]
72
76
 
@@ -108,12 +112,21 @@ reviewed: # V13. Filled only after wdi-review has actually run
108
112
 
109
113
  <!-- The gate questions as they apply to THIS component, answered yes / no / change. The full list
110
114
  lives in delivery-flow-guide.md and MUST NOT be copied here. At mode: catalog only the starred
111
- questions are asked. -->
115
+ questions are asked.
116
+
117
+ An answer MUST NOT carry a COUNT of registry rows — "all four use cases are covered" is a claim
118
+ about usecases.yaml that a fifth UC falsifies without touching this file. Answer the question. -->
112
119
 
113
120
  ## Design Reference · [G3]
114
121
 
115
- <!-- One line pointing at the paired SDD, plus any AD-N or applied DEC- that binds this component.
116
- Nothing else solution shape MUST NOT appear in this document: no framework, no table, no
122
+ <!-- One line pointing at the paired SDD, plus any AD-N that binds this component — the spine's
123
+ `binds:` is authored, not derived, so an AD-N citation belongs here.
124
+
125
+ APPLIED `DEC-` DO NOT. They are derived from `touches:` and live in .control/generated/decisions.md;
126
+ point at it. A line saying "no applied DEC- binds this component yet" is the worst version — true
127
+ the day it is written, silently false forever after, and it looks like diligence.
128
+
129
+ Nothing else: solution shape MUST NOT appear in this document — no framework, no table, no
117
130
  endpoint, no class, no queue, no file path. -->
118
131
 
119
132
  ---
@@ -141,9 +154,17 @@ reviewed: # V13. Filled only after wdi-review has actually run
141
154
  05-scenarios/ SCN-<nn>-<slug>.md, long branches hanging off one UC. From mode: deep only
142
155
 
143
156
  01-requirements/ and supplements/ are REPEALED. The first was permanently empty — FR live in the
144
- PRD and this document cites them by id. The second existed for the ANX- concept, which is gone. -->
157
+ PRD and this document cites them by id. The second existed for the ANX- concept, which is gone.
158
+
159
+ THIS SECTION EXPLAINS THE SHAPE, NOT THE CONTENTS. It MUST NOT say which slots exist, which are
160
+ empty, or which are "not written yet". That is `.control/structure-document.md`, derived from the
161
+ tree on disk. One real SDD claimed four of its five slots unwritten while one of them held 223
162
+ lines. -->
145
163
 
146
164
  ## Open Items
147
165
 
148
- <!-- Anything still unresolved, each pointing at its row in .control/questions/. An assumption left
149
- here with no id is the failure wdi-question exists to prevent. -->
166
+ <!-- A POINTER, not a copy. Ids only, and the id is enough: whether an OQ- is still open is held by
167
+ .control/questions/, so restating its status here creates a second answer on a slower clock.
168
+
169
+ An assumption left here with no id is the failure wdi-question exists to prevent. An id listed
170
+ here that has been answered for weeks is the failure this rule exists to prevent. -->
@@ -2,7 +2,7 @@
2
2
  type: uc
3
3
  id: UC-{NN} # allocated from .control/registry/usecases.yaml
4
4
  component: '{pc}'
5
- satisfies: [] # FR ids — V2 checks every FR has at least one UC
5
+ satisfies: [] # FR ids — `fr-has-uc` checks every FR has at least one UC
6
6
  critical: false # true ONLY when it touches money, personal data, or an irreversible
7
7
  # action. Nothing else — the two elastic criteria are repealed
8
8
  created: '{YYYY-MM-DD}'