@x0rium/devkit-cli 0.5.0 → 0.7.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 (66) hide show
  1. package/dist/constitution.d.ts.map +1 -1
  2. package/dist/constitution.js +62 -8
  3. package/dist/constitution.js.map +1 -1
  4. package/dist/dashboard.d.ts.map +1 -1
  5. package/dist/dashboard.js +6 -2
  6. package/dist/dashboard.js.map +1 -1
  7. package/dist/detector.d.ts.map +1 -1
  8. package/dist/detector.js +5 -2
  9. package/dist/detector.js.map +1 -1
  10. package/dist/escalate.d.ts.map +1 -1
  11. package/dist/escalate.js +8 -3
  12. package/dist/escalate.js.map +1 -1
  13. package/dist/gate.d.ts.map +1 -1
  14. package/dist/gate.js +57 -10
  15. package/dist/gate.js.map +1 -1
  16. package/dist/index.js +14 -7
  17. package/dist/index.js.map +1 -1
  18. package/dist/investigate.d.ts.map +1 -1
  19. package/dist/investigate.js +8 -10
  20. package/dist/investigate.js.map +1 -1
  21. package/dist/rfc.d.ts.map +1 -1
  22. package/dist/rfc.js +8 -10
  23. package/dist/rfc.js.map +1 -1
  24. package/dist/scaffold.d.ts +2 -0
  25. package/dist/scaffold.d.ts.map +1 -1
  26. package/dist/scaffold.js +52 -4
  27. package/dist/scaffold.js.map +1 -1
  28. package/dist/schemas.js +2 -2
  29. package/dist/schemas.js.map +1 -1
  30. package/dist/status.d.ts.map +1 -1
  31. package/dist/status.js +7 -4
  32. package/dist/status.js.map +1 -1
  33. package/dist/validator.js +1 -1
  34. package/dist/validator.js.map +1 -1
  35. package/dist/watch.js +10 -10
  36. package/dist/watch.js.map +1 -1
  37. package/package.json +4 -5
  38. package/skills/arch-kit/README.md +195 -0
  39. package/skills/arch-kit/SKILL.md +190 -0
  40. package/skills/arch-kit/references/adr.md +25 -0
  41. package/skills/arch-kit/references/impact.md +13 -0
  42. package/skills/arch-kit/references/invariants.md +9 -0
  43. package/skills/arch-kit/references/investigation.md +37 -0
  44. package/skills/arch-kit/references/rfc.md +36 -0
  45. package/skills/devkit-init/SKILL.md +74 -0
  46. package/skills/devkit-init/references/brownfield.md +147 -0
  47. package/skills/devkit-init/references/greenfield.md +44 -0
  48. package/skills/devkit-init/references/upgrade.md +103 -0
  49. package/skills/product-kit/README.md +135 -0
  50. package/skills/product-kit/SKILL.md +126 -0
  51. package/skills/product-kit/references/roadmap.md +16 -0
  52. package/skills/product-kit/references/users.md +14 -0
  53. package/skills/product-kit/references/ux_invariants.md +8 -0
  54. package/skills/qa-kit/README.md +188 -0
  55. package/skills/qa-kit/SKILL.md +155 -0
  56. package/skills/qa-kit/references/assumption_checks.md +10 -0
  57. package/skills/qa-kit/references/coverage_map.md +19 -0
  58. package/skills/qa-kit/references/test_contracts.md +10 -0
  59. package/skills/research-kit/README.md +139 -0
  60. package/skills/research-kit/SKILL.md +106 -0
  61. package/skills/research-kit/references/assumptions.md +9 -0
  62. package/skills/research-kit/references/feasibility.md +15 -0
  63. package/skills/research-kit/references/market.md +13 -0
  64. package/skills/research-kit/references/unknowns.md +9 -0
  65. package/skills/spec-kit/README.md +139 -0
  66. package/skills/spec-kit/SKILL.md +202 -0
@@ -0,0 +1,147 @@
1
+ # Brownfield Mode
2
+
3
+ Code exists. No .devkit/. May or may not have .specify/.
4
+
5
+ ## Phase 1: Project Scan
6
+
7
+ Read the codebase to understand what exists:
8
+
9
+ ```
10
+ Scan for:
11
+ - Main language and framework
12
+ - Entry points (main files, index, app)
13
+ - Database / storage patterns
14
+ - External services and integrations
15
+ - Test files (understand what's already tested)
16
+ - README or docs (understand stated intent)
17
+ - Package files (dependencies reveal architecture)
18
+ ```
19
+
20
+ Summarize findings before proceeding:
21
+ ```
22
+ Found: [framework], [database], [key integrations]
23
+ Size: ~N files, ~M lines
24
+ Tests: yes/no, coverage unknown
25
+ Docs: yes/no
26
+ ```
27
+
28
+ ## Phase 2: Invariant Extraction
29
+
30
+ Read source code deeply. Look for patterns that reveal implicit invariants:
31
+
32
+ **Signals of technical invariants:**
33
+ - Transactions wrapping multiple operations → atomicity invariant
34
+ - Locks, mutexes, SELECT FOR UPDATE → concurrency invariant
35
+ - Retry logic → reliability invariant
36
+ - Auth checks on every endpoint → security invariant
37
+ - Validation before DB writes → data integrity invariant
38
+
39
+ **Signals of broken invariants:**
40
+ - TODO/FIXME/HACK comments
41
+ - Exception swallowed silently
42
+ - Missing error handling on critical paths
43
+ - Race conditions (no locking where needed)
44
+
45
+ For each extracted invariant, create entry with status `inferred`:
46
+
47
+ ```markdown
48
+ ## I1: [name]
49
+ STATEMENT: what the system appears to guarantee
50
+ STATUS: inferred
51
+ CONFIDENCE: high / medium / low
52
+ SOURCE: code-analysis
53
+ EVIDENCE: [file:line that shows this]
54
+ NEEDS_REVIEW: true
55
+ ```
56
+
57
+ ## Phase 3: Decision Archaeology
58
+
59
+ Look for evidence of past architectural decisions:
60
+
61
+ **Where to look:**
62
+ - Git history and commit messages
63
+ - PR descriptions (if accessible)
64
+ - Comments explaining "why" not "what"
65
+ - Unusual patterns that suggest a workaround
66
+ - Dependencies that seem overengineered for the task
67
+
68
+ For each discovered decision:
69
+
70
+ ```markdown
71
+ ## ADR-XXX: [inferred decision name]
72
+ STATUS: inferred
73
+ CONFIDENCE: high / medium / low
74
+ EVIDENCE: [what in code suggests this]
75
+ UNKNOWN: [what context is lost]
76
+ NEEDS_REVIEW: true
77
+ ```
78
+
79
+ ## Phase 4: Gap Analysis
80
+
81
+ What can't be reconstructed from code alone?
82
+
83
+ ```markdown
84
+ # Gaps
85
+
86
+ ## UNKNOWN: [topic]
87
+ QUESTION: what we can't determine from code
88
+ WHY_MATTERS: impact on future development
89
+ HOW_TO_RESOLVE: ask developer / check git history / accept unknown
90
+ ```
91
+
92
+ Present gaps to developer and ask them to fill what they remember.
93
+
94
+ ## Phase 5: Produce Artifacts
95
+
96
+ Save to `.devkit/arch/`:
97
+ - `invariants.md` — all inferred invariants (status: inferred, needs_review: true)
98
+ - `decisions/ADR-*.md` — all inferred decisions
99
+ - `impact.md` — dependency map extracted from imports/calls
100
+
101
+ ## Status File
102
+
103
+ Create `.devkit/STATUS.md`:
104
+
105
+ ```markdown
106
+ # DevKit Status
107
+
108
+ MODE: brownfield
109
+ INITIALIZED: [date]
110
+ CURRENT_PHASE: arch-review
111
+
112
+ ## Reconstruction Summary
113
+ INVARIANTS_INFERRED: N
114
+ DECISIONS_INFERRED: M
115
+ GAPS: K (see arch/gaps.md)
116
+
117
+ ## Required Actions Before Development
118
+ - [ ] Review and confirm invariants.md
119
+ - [ ] Fill gaps in arch/gaps.md
120
+ - [ ] Run /arch-kit to verify and fill missing decisions
121
+
122
+ ## Phase Status
123
+ - [~] ResearchKit (skipped — existing project)
124
+ - [~] ProductKit (partially reconstructed)
125
+ - [ ] ArchKit (review required)
126
+ - [ ] SpecKit
127
+ - [ ] QAKit
128
+ ```
129
+
130
+ ## Message to Developer
131
+
132
+ ```
133
+ DevKit initialized in brownfield mode.
134
+
135
+ Reconstructed from your codebase:
136
+ Invariants: N (all marked as 'inferred', need your review)
137
+ Decisions: M (inferred from code patterns)
138
+ Gaps: K unknowns that couldn't be reconstructed
139
+
140
+ Next steps:
141
+ 1. Review .devkit/arch/invariants.md — confirm or correct each one
142
+ 2. Check .devkit/arch/gaps.md — fill what you remember
143
+ 3. Run /arch-kit to verify architecture and fill remaining gaps
144
+
145
+ Important: 'inferred' invariants are AI's best guess from code.
146
+ They may be wrong. Please review before trusting them.
147
+ ```
@@ -0,0 +1,44 @@
1
+ # Greenfield Mode
2
+
3
+ Fresh project. No code, no .devkit/, no .specify/.
4
+
5
+ ## What to Do
6
+
7
+ 1. Create .devkit/ structure (done by SKILL.md)
8
+ 2. Run `specify init . --ai claude` (done by SKILL.md)
9
+ 3. Tell developer to start with ResearchKit
10
+
11
+ ## Starting Message to Developer
12
+
13
+ ```
14
+ DevKit initialized for a new project.
15
+
16
+ Your development cycle:
17
+ /research-kit → explore feasibility and unknowns
18
+ /product-kit → define users and UX invariants
19
+ /arch-kit → verify architecture
20
+ /spec-kit → implement (via spec-kit workflow)
21
+ /qa-kit → verify against all decisions
22
+
23
+ Start with /research-kit — describe your idea.
24
+ ```
25
+
26
+ ## Files to Create
27
+
28
+ Create `.devkit/STATUS.md`:
29
+
30
+ ```markdown
31
+ # DevKit Status
32
+
33
+ MODE: greenfield
34
+ INITIALIZED: [date]
35
+ CURRENT_PHASE: research
36
+ SPEC_KIT: initialized
37
+
38
+ ## Phase Status
39
+ - [ ] ResearchKit
40
+ - [ ] ProductKit
41
+ - [ ] ArchKit
42
+ - [ ] SpecKit
43
+ - [ ] QAKit
44
+ ```
@@ -0,0 +1,103 @@
1
+ # Upgrade Mode
2
+
3
+ spec-kit exists (.specify/ present). No .devkit/ yet.
4
+ Developer is already using spec-kit and wants to add the full DevKit layer.
5
+
6
+ ## What This Means
7
+
8
+ spec-kit is already running. There are specs, possibly a constitution.md.
9
+ We need to reverse-engineer DevKit artifacts from what spec-kit has,
10
+ then connect them so ArchKit owns constitution.md going forward.
11
+
12
+ ## Phase 1: Read Existing spec-kit Artifacts
13
+
14
+ Read all files in `.specify/`:
15
+ - `constitution.md` — project principles and constraints
16
+ - `spec.md` — feature specifications
17
+ - `plan.md` — technical plans
18
+ - `tasks/` — implementation tasks
19
+
20
+ Understand what's already been built and decided.
21
+
22
+ ## Phase 2: Extract ArchKit Artifacts from constitution.md
23
+
24
+ constitution.md contains decisions that belong in ArchKit.
25
+
26
+ Extract:
27
+ - Tech stack decisions → ADR entries
28
+ - Constraints and rules → invariant candidates
29
+ - Patterns and standards → more invariants
30
+
31
+ Create `.devkit/arch/invariants.md` from these.
32
+ Create `.devkit/arch/decisions/` ADR files.
33
+
34
+ Mark all as `inferred` with `SOURCE: constitution.md`.
35
+
36
+ ## Phase 3: Extract ProductKit Artifacts
37
+
38
+ Look in constitution.md and spec.md for:
39
+ - Who the user is
40
+ - UX rules and constraints
41
+ - What's in scope / out of scope
42
+
43
+ Create `.devkit/product/users.md` and `ux_invariants.md`.
44
+ Mark as `inferred`.
45
+
46
+ ## Phase 4: Link DevKit to spec-kit
47
+
48
+ Going forward, constitution.md is OWNED by ArchKit.
49
+ Add a note at the top of `.specify/constitution.md`:
50
+
51
+ ```markdown
52
+ <!-- GENERATED BY DEVKIT — do not edit manually -->
53
+ <!-- Source: .devkit/arch/invariants.md + decisions/ -->
54
+ <!-- Regenerate with: /arch-kit generate-constitution -->
55
+ ```
56
+
57
+ ## Phase 5: Produce Status File
58
+
59
+ Create `.devkit/STATUS.md`:
60
+
61
+ ```markdown
62
+ # DevKit Status
63
+
64
+ MODE: upgrade-from-speckit
65
+ INITIALIZED: [date]
66
+ CURRENT_PHASE: arch-review
67
+
68
+ ## Migration Summary
69
+ SPEC_KIT_SPECS_FOUND: N
70
+ INVARIANTS_EXTRACTED: M
71
+ CONSTITUTION: linked (DevKit now owns it)
72
+
73
+ ## Required Actions
74
+ - [ ] Review .devkit/arch/invariants.md
75
+ - [ ] Confirm or correct extracted decisions
76
+ - [ ] Run /arch-kit to fill gaps
77
+
78
+ ## Phase Status
79
+ - [~] ResearchKit (not available — existing project)
80
+ - [~] ProductKit (partially extracted)
81
+ - [ ] ArchKit (review required)
82
+ - [x] SpecKit (already in use)
83
+ - [ ] QAKit
84
+ ```
85
+
86
+ ## Message to Developer
87
+
88
+ ```
89
+ DevKit initialized over your existing spec-kit project.
90
+
91
+ Extracted from your spec-kit artifacts:
92
+ Invariants: N (from constitution.md — review required)
93
+ Decisions: M (inferred — review required)
94
+
95
+ constitution.md is now managed by ArchKit.
96
+ Changes to architecture go through /arch-kit,
97
+ which regenerates constitution.md automatically.
98
+
99
+ Next steps:
100
+ 1. Review .devkit/arch/invariants.md
101
+ 2. Run /arch-kit to verify and complete the picture
102
+ 3. Continue using spec-kit as normal — it now has a verified foundation
103
+ ```
@@ -0,0 +1,135 @@
1
+ # ProductKit
2
+
3
+ > Уровень 2. "Что именно строим и для кого?"
4
+
5
+ ---
6
+
7
+ ## Когда использовать
8
+
9
+ - feasibility подтверждена в ResearchKit
10
+ - нужно определить что именно строить
11
+ - нужно понять как пользователь будет это использовать
12
+ - нужно зафиксировать UX инварианты до архитектуры
13
+ - нужно определить роадмап и приоритеты
14
+
15
+ ---
16
+
17
+ ## Ключевая идея
18
+
19
+ UX инварианты определяются **до** архитектуры. Они ограничивают архитектурные решения так же жёстко как технические требования.
20
+
21
+ Пример: если U1 = "CLI запускается с максимум 3 обязательными параметрами" зафиксирован здесь — архитектура с 60 параметрами станет блокером в ArchKit, а не открытием после реализации.
22
+
23
+ ---
24
+
25
+ ## Фазы
26
+
27
+ ### Phase 1: User Definition
28
+ ```
29
+ QUESTIONS:
30
+ - Кто конкретно будет это использовать?
31
+ - Какую проблему они решают сейчас без этого инструмента?
32
+ - Что они знают / умеют заранее?
33
+ - В каком контексте используют: вручную, в скрипте, в CI?
34
+
35
+ FORBIDDEN:
36
+ - думать о технической реализации
37
+ - выбирать стек
38
+ ```
39
+
40
+ ### Phase 2: UX Invariants
41
+ ```
42
+ Формализуем что система гарантирует пользователю.
43
+ Не "как выглядит" а "что обещает".
44
+
45
+ EXAMPLES:
46
+ U1: новый пользователь достигает результата за N шагов
47
+ U2: без конфига работает разумный default
48
+ U3: ошибка всегда содержит что делать дальше
49
+ U4: операция X занимает не более Y секунд субъективно
50
+ ```
51
+
52
+ ### Phase 3: Roadmap
53
+ ```
54
+ Фазы разработки с точки зрения продукта.
55
+ Что входит в MVP, что в v1, что позже.
56
+
57
+ BASIS: UX инварианты + assumptions из ResearchKit
58
+ CONSTRAINTS: будут дополнены техническими из ArchKit
59
+ ```
60
+
61
+ ---
62
+
63
+ ## Артефакты
64
+
65
+ ### users.md
66
+ ```markdown
67
+ # Users
68
+
69
+ ## Primary User
70
+ PROFILE: кто это
71
+ CONTEXT: как и где использует
72
+ KNOWLEDGE: что знает заранее
73
+ GOAL: чего хочет достичь
74
+ HAPPY_PATH: типичный сценарий (80% случаев)
75
+
76
+ ## Edge Cases
77
+ ...
78
+ ```
79
+
80
+ ### ux_invariants.md
81
+ ```markdown
82
+ # UX Invariants
83
+
84
+ ## U1: [название]
85
+ STATEMENT: что система гарантирует пользователю
86
+ RATIONALE: почему это важно
87
+ VALIDATION: как проверить что инвариант соблюдён
88
+ PRIORITY: must / should / could
89
+ STATUS: active / suspended / rejected
90
+ ```
91
+
92
+ ### roadmap.md
93
+ ```markdown
94
+ # Roadmap
95
+
96
+ ## MVP
97
+ GOAL: минимум для первого реального использования
98
+ UX_INVARIANTS: [какие инварианты покрывает]
99
+ EXCLUDES: [что явно не входит]
100
+
101
+ ## V1
102
+ ...
103
+
104
+ ## Later
105
+ ...
106
+
107
+ ## Never (явный anti-scope)
108
+ ...
109
+ ```
110
+
111
+ ---
112
+
113
+ ## Переход к ArchKit
114
+
115
+ **ALLOWED** когда:
116
+ - все пользовательские сценарии описаны
117
+ - UX инварианты зафиксированы для MVP
118
+ - роадмап имеет явный anti-scope
119
+ - нет open questions о том кто пользователь
120
+
121
+ **BLOCKED** когда:
122
+ - UX инварианты противоречат друг другу
123
+ - happy path не определён
124
+
125
+ ---
126
+
127
+ ## Команды
128
+
129
+ ```
130
+ /product init
131
+ /product users
132
+ /product ux-invariants
133
+ /product roadmap
134
+ /product status
135
+ ```
@@ -0,0 +1,126 @@
1
+ ---
2
+ name: product-kit
3
+ description: DevKit Level 2. Use after ResearchKit when developer needs to define who the user is, establish UX invariants, and set the roadmap before architecture. Triggers on phrases like "who is this for", "how will people use this", "what's the MVP", "user experience", or when ResearchKit handoff is complete.
4
+ license: MIT
5
+ metadata:
6
+ author: devkit
7
+ version: "1.1"
8
+ layer: "2-of-5"
9
+ prev: research-kit
10
+ next: arch-kit
11
+ ---
12
+
13
+ # ProductKit — Level 2: "What exactly are we building and for whom?"
14
+
15
+ You are operating in ProductKit phase. Your job is to define the user, establish UX invariants, and set roadmap priorities before any architecture decisions are made.
16
+
17
+ ## Start
18
+
19
+ ```bash
20
+ devkit status
21
+ ```
22
+
23
+ Confirm you are in the product phase. If not, check gate status of the previous phase.
24
+
25
+ ## Your Role
26
+
27
+ - Define who the user is and how they interact with the product
28
+ - Establish UX invariants that constrain architecture
29
+ - Prioritize ruthlessly: MVP vs later vs never
30
+ - Do NOT recommend technical solutions
31
+ - Do NOT write code or architecture
32
+
33
+ ## Critical Principle
34
+
35
+ UX invariants are defined HERE, before ArchKit. They constrain architecture just as hard as technical requirements. If defined after, you get 60-parameter CLIs that formally work but are unusable.
36
+
37
+ ## Phases
38
+
39
+ ### Phase 1: User Definition
40
+ Identify the real user. Ask:
41
+ - Who specifically will use this? (developer, devops, manager, end user?)
42
+ - What do they already know?
43
+ - What context are they in when they use this? (manually, in CI, in a script?)
44
+ - What is their happy path — the 80% case?
45
+
46
+ ### Phase 2: UX Invariants
47
+ Formalize what the system PROMISES the user. Not how it looks — what it guarantees.
48
+
49
+ Examples:
50
+ - "New user reaches result in under N steps"
51
+ - "No required config to get started — sensible defaults"
52
+ - "Every error message tells you what to do next"
53
+ - "Core operation completes in under N seconds"
54
+
55
+ Each invariant gets: PRIORITY (must/should/could) and VALIDATION method.
56
+
57
+ ### Phase 3: Roadmap
58
+ Define phases from user perspective:
59
+ - MVP: minimum to be genuinely useful
60
+ - V1: full intended experience
61
+ - Later: good ideas for the future
62
+ - Never (anti-scope): explicitly out of scope — prevents scope creep
63
+
64
+ ## Artifacts to Produce
65
+
66
+ Read templates from:
67
+ - [Users template](references/users.md)
68
+ - [UX Invariants template](references/ux_invariants.md)
69
+ - [Roadmap template](references/roadmap.md)
70
+
71
+ Save artifacts to `.devkit/product/`.
72
+
73
+ **After creating or updating artifacts, always run:**
74
+ ```bash
75
+ devkit validate
76
+ ```
77
+ Fix any errors before proceeding.
78
+
79
+ ## Gate: When Can We Move to ArchKit?
80
+
81
+ ```bash
82
+ devkit gate
83
+ ```
84
+
85
+ ALLOWED to proceed when:
86
+ - Primary user and happy path defined
87
+ - UX invariants established for MVP scope
88
+ - Roadmap has explicit anti-scope
89
+ - No contradictions between UX invariants
90
+
91
+ BLOCKED when:
92
+ - UX invariants contradict each other
93
+ - Happy path unclear
94
+ - "Who is the user" still open
95
+
96
+ ## Event Detection
97
+
98
+ ### Product Blocker (triggered during SpecKit or later)
99
+ If developer says: "this is awkward to use", "too many parameters", "users won't understand this" — this is a UX invariant violation.
100
+
101
+ Response:
102
+ > "This looks like a UX invariant violation. Let me check product-kit artifacts.
103
+ > [check ux_invariants.md]
104
+ > This conflicts with [U_N]. Running ProductKit investigation before continuing."
105
+
106
+ Review ux_invariants.md, explore options, update invariants if needed, propagate changes to ArchKit via `devkit rfc`.
107
+
108
+ ## Handoff
109
+
110
+ When `devkit gate` shows ALLOWED:
111
+
112
+ ```bash
113
+ devkit advance
114
+ devkit status
115
+ ```
116
+
117
+ Then generate summary:
118
+ ```
119
+ PRODUCT COMPLETE
120
+ USER: [one-line description]
121
+ HAPPY PATH: [one sentence]
122
+ UX INVARIANTS: N defined (M must, K should)
123
+ MVP SCOPE: [summary]
124
+ ANTI-SCOPE: [what we explicitly won't do]
125
+ READY FOR: ArchKit
126
+ ```
@@ -0,0 +1,16 @@
1
+ # Roadmap Template
2
+
3
+ ## MVP
4
+ GOAL: minimum to be genuinely useful to the primary user
5
+ UX_INVARIANTS_COVERED: [U1, U2, ...]
6
+ EXCLUDES: [what is explicitly out of MVP]
7
+
8
+ ## V1
9
+ GOAL: full intended experience
10
+ ADDS: [what MVP lacks]
11
+
12
+ ## Later
13
+ [Good ideas that are not V1]
14
+
15
+ ## Never (Anti-Scope)
16
+ [What we explicitly will NOT do — this prevents scope creep]
@@ -0,0 +1,14 @@
1
+ # Users Template
2
+
3
+ ## Primary User
4
+ PROFILE: who they are
5
+ CONTEXT: when and where they use this
6
+ KNOWLEDGE: what they know coming in
7
+ GOAL: what they want to achieve
8
+ HAPPY_PATH: the typical 80% scenario (one sentence)
9
+
10
+ ## Secondary Users
11
+ [Other users and their scenarios if applicable]
12
+
13
+ ## Anti-Users
14
+ [Who this is explicitly NOT for — prevents over-engineering]
@@ -0,0 +1,8 @@
1
+ # UX Invariants Template
2
+
3
+ ## U1: [name]
4
+ STATEMENT: what the system promises the user
5
+ RATIONALE: why this matters
6
+ VALIDATION: how to verify the invariant holds
7
+ PRIORITY: must / should / could
8
+ STATUS: active / suspended / rejected