@nusoft/nuos-build-catalogue 0.8.1 → 0.10.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/package.json +3 -2
- package/templates/protocols/end-of-session.md +19 -0
- package/templates/protocols/persona-new.md +43 -0
- package/templates/protocols/start-of-session.md +19 -0
- package/templates/protocols/wu-new.md +52 -0
- package/templates/starter-kit/CLAUDE.md +73 -0
- package/templates/starter-kit/README.md +116 -0
- package/templates/starter-kit/docs/build/END-OF-SESSION.md +62 -0
- package/templates/starter-kit/docs/build/START-OF-SESSION.md +33 -0
- package/templates/starter-kit/docs/build/STATE.md +47 -0
- package/templates/starter-kit/docs/build/decisions/D001-template.md +38 -0
- package/templates/starter-kit/docs/build/decisions/_index.md +30 -0
- package/templates/starter-kit/docs/build/maps/01-template.md +126 -0
- package/templates/starter-kit/docs/build/maps/_index.md +63 -0
- package/templates/starter-kit/docs/build/open-questions/_index.md +26 -0
- package/templates/starter-kit/docs/build/personas/001-template.md +68 -0
- package/templates/starter-kit/docs/build/personas/_index.md +77 -0
- package/templates/starter-kit/docs/build/risks/_index.md +28 -0
- package/templates/starter-kit/docs/build/sessions/0000-00-00-template.md +47 -0
- package/templates/starter-kit/docs/build/sessions/_index.md +27 -0
- package/templates/starter-kit/docs/build/work-units/001-template.md +82 -0
- package/templates/starter-kit/docs/build/work-units/_index.md +34 -0
- package/templates/starter-kit/docs/contracts/_index.md +26 -0
- package/templates/starter-kit/docs/guides/_index.md +26 -0
- package/templates/starter-kit/docs/philosophy/_index.md +26 -0
- package/templates/starter-kit/methodfile.json +54 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Map [number] — [title]
|
|
2
|
+
|
|
3
|
+
> **The canonical operational plan for [workstream name].** Sequenced work units from "today" to "[goal state]", each with phase-step decomposition, contracts realised, and verification gates anchored in target-repo files. If a step isn't here, it isn't planned. This map is the single source of truth for [workstream name] — read this before any other planning surface.
|
|
4
|
+
|
|
5
|
+
> Replace the bracketed placeholders. Delete this hint block.
|
|
6
|
+
|
|
7
|
+
## How to read this map
|
|
8
|
+
|
|
9
|
+
The catalogue's decomposition (which this map operationalises):
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
Contracts deep-module surfaces — what the system IS
|
|
13
|
+
│
|
|
14
|
+
│ realised by
|
|
15
|
+
▼
|
|
16
|
+
Maps strategic plan — when, in what order, why
|
|
17
|
+
│
|
|
18
|
+
│ ordering
|
|
19
|
+
▼
|
|
20
|
+
Work units (WUs) executable units against contract surfaces — what ships
|
|
21
|
+
│
|
|
22
|
+
│ decomposed into
|
|
23
|
+
▼
|
|
24
|
+
Phases sub-units when a WU is too large for one shot
|
|
25
|
+
│
|
|
26
|
+
│ decomposed into
|
|
27
|
+
▼
|
|
28
|
+
Phase steps the actual moves; each has acceptance + verification gate
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Maps own **sequencing and outline**. WU files own **acceptance design and execution log**. Contracts own **the surface specs**. Sessions own **the temporal history**. No other planning artefact.
|
|
32
|
+
|
|
33
|
+
## The five agentic-age patterns this map enforces
|
|
34
|
+
|
|
35
|
+
These are the load-bearing discipline for agent-led building (codified in [`THE-NUOS-BUILD-METHOD.md`](https://github.com/DarrenJCoxon/nuos/blob/main/docs/THE-NUOS-BUILD-METHOD.md) §post-Phase-3 epistemic discipline):
|
|
36
|
+
|
|
37
|
+
1. **Verification gates anchored in target-repo files** — every phase step names a specific file/grep/test as acceptance proof. Closes the spec-vs-reality drift loop.
|
|
38
|
+
2. **Maps as single canonical plan** — story-level detail lives here, not in side docs. Closes the proliferation loop.
|
|
39
|
+
3. **Contracts as immutable truth** — phase steps cite the contract surface they realise. Closes the "agent makes things up" loop.
|
|
40
|
+
4. **Hedge words as stop signal** — "likely", "presumably", "should be" indicate a missing verification step.
|
|
41
|
+
5. **Design alternatives before implementation** — Ousterhout's "design it twice"; produce at least two fundamentally different designs, evaluate, then pick or hybrid before generating non-trivial implementation. Phase steps that generate implementation carry an implicit prerequisite: design alternatives recorded in WU notes.
|
|
42
|
+
|
|
43
|
+
## Where we are now ([date])
|
|
44
|
+
|
|
45
|
+
| WU | Title | Status | Repo / branch |
|
|
46
|
+
|---|---|---|---|
|
|
47
|
+
| [WU number] | [title] | [🔵 ready / 🟡 in flight / 🟣 in_review / ✅ done / 🔴 blocked] | [repo + branch] |
|
|
48
|
+
|
|
49
|
+
## What "[goal state]" means
|
|
50
|
+
|
|
51
|
+
The workstream is **complete** when all of the following hold simultaneously:
|
|
52
|
+
|
|
53
|
+
1. [Outcome 1]
|
|
54
|
+
2. [Outcome 2]
|
|
55
|
+
3. [Outcome 3]
|
|
56
|
+
4. ...
|
|
57
|
+
|
|
58
|
+
(List the verifiable end-state of the workstream. Each outcome should be an observable fact about the system, not a process step.)
|
|
59
|
+
|
|
60
|
+
## Critical path
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
[diagram of WU sequencing with dependencies — use ASCII art or describe in prose]
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## WU [number] — [title]
|
|
69
|
+
|
|
70
|
+
| Field | Value |
|
|
71
|
+
|---|---|
|
|
72
|
+
| Contracts realised | [which contract surface(s) this WU fulfils] |
|
|
73
|
+
| Status | [🔵 / 🟡 / 🟣 / ✅ / 🔴] |
|
|
74
|
+
| Repo | [repo + branch] |
|
|
75
|
+
| Estimate | [working days] |
|
|
76
|
+
| Depends on | [upstream WUs / npm publishes / external] |
|
|
77
|
+
|
|
78
|
+
**Design alternatives considered (Pattern N — before any non-trivial implementation step):**
|
|
79
|
+
|
|
80
|
+
> If this WU includes any non-trivial architectural choice (schema, migration, integration shape, adapter, RBAC, audit, retention, error-handling), record at least two fundamentally different design candidates here before phase steps that generate implementation. State the chosen one and why. Delete this block if the WU is purely incremental work against an already-decided design.
|
|
81
|
+
|
|
82
|
+
- **Option A:** [first fundamentally different design]. Trade-offs: [...]. Errors created: [...].
|
|
83
|
+
- **Option B:** [second fundamentally different design]. Trade-offs: [...]. Errors created: [...].
|
|
84
|
+
- *(Option C if useful)*
|
|
85
|
+
- **Chosen:** [A / B / C / hybrid] because [...]. Records as: [WU notes / D-NNN decision file].
|
|
86
|
+
|
|
87
|
+
| # | Phase step | Acceptance | Verification gate |
|
|
88
|
+
|---|---|---|---|
|
|
89
|
+
| 1 | [what move is being made] | [what proves it produced the intended outcome] | [specific file/grep/test the operator runs to confirm] |
|
|
90
|
+
| 2 | ... | ... | ... |
|
|
91
|
+
|
|
92
|
+
**Done when:** [the overall WU acceptance — usually "all N steps complete + canonical green line + integration test"].
|
|
93
|
+
|
|
94
|
+
**Risks:** [anything that could derail the WU; mitigations].
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## WU [number] — [title]
|
|
99
|
+
|
|
100
|
+
[Repeat the structure above for each WU on the critical path. Each WU with non-trivial design choices gets its own "Design alternatives considered" block; routine incremental WUs can omit it.]
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## What runs in parallel
|
|
105
|
+
|
|
106
|
+
[List independent workstreams that don't gate the critical path.]
|
|
107
|
+
|
|
108
|
+
## Trigger conditions for deferred WUs
|
|
109
|
+
|
|
110
|
+
[List WUs that are deferred and what unblocks them.]
|
|
111
|
+
|
|
112
|
+
## What this map is not
|
|
113
|
+
|
|
114
|
+
- It does NOT describe [out-of-scope topic 1] — see [other doc].
|
|
115
|
+
- It does NOT cover [out-of-scope topic 2] — see [other doc].
|
|
116
|
+
|
|
117
|
+
## How to use this map
|
|
118
|
+
|
|
119
|
+
- **At session start** — read this map plus the active WU's spec file. The map tells you which phase step is next + the verification gate; the WU spec tells you the deeper acceptance design.
|
|
120
|
+
- **Mid-step** — if you find yourself writing a hedge word ("likely", "presumably", "should be"), stop. Run the verification gate's grep/test/file-read first. Replace the hedge with the result.
|
|
121
|
+
- **At session end** — flip phase-step status here; if scope changed, edit the step description here (not in a side doc).
|
|
122
|
+
- **When a phase completes** — flip the WU's phase status; update STATE.md to reflect; confirm the dependency graph still holds.
|
|
123
|
+
|
|
124
|
+
## Pointers
|
|
125
|
+
|
|
126
|
+
- [List relevant WU files, contracts, decisions, prior maps]
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Maps — index
|
|
2
|
+
|
|
3
|
+
> Maps are the canonical operational plan for a project running the NuOS Build Method. **Story-level detail lives in maps**, not in fragmented planning docs. If a phase step isn't here, it isn't planned. The maps are the single source of truth for sequencing.
|
|
4
|
+
|
|
5
|
+
## Why maps matter (the post-Phase-3 evolution)
|
|
6
|
+
|
|
7
|
+
The NuOS catalogue has many surfaces — decisions, contracts, work units, sessions, risks, open questions. Maps are what stops planning from sprawling across all of them. Maps own:
|
|
8
|
+
|
|
9
|
+
- **Sequencing** — which work unit comes when, with explicit dependencies
|
|
10
|
+
- **Phase-step decomposition** — when a WU is too large for one shot, the phase steps live here, each with acceptance + verification gate
|
|
11
|
+
- **Contracts realised** — every WU on the path cites the contract surface(s) it fulfils
|
|
12
|
+
|
|
13
|
+
This is one of the four agentic-age patterns codified in the NuOS Build Method (see [`docs/THE-NUOS-BUILD-METHOD.md`](https://github.com/DarrenJCoxon/nuos/blob/main/docs/THE-NUOS-BUILD-METHOD.md) §post-Phase-3). The pattern: **maps as single canonical plan** closes the proliferation loop. A fresh session — human or agent — should be able to read STATE.md + the active map and have full operational context.
|
|
14
|
+
|
|
15
|
+
## Map conventions
|
|
16
|
+
|
|
17
|
+
- **Map 1 — the horizon.** The whole project journey, narrative form. Layperson-readable. If you read only one map, this is it.
|
|
18
|
+
- **Map 2 — phases-in-detail (optional).** When the project has clearly separated phases (e.g., NuOS's Phases 0–F), this map gives mid-level detail per phase.
|
|
19
|
+
- **Map N — canonical operational plan(s).** One per major workstream. Story-level detail with verification gates. This is where the active work lives.
|
|
20
|
+
|
|
21
|
+
A small project may only need Map 1 + Map 2 (canonical plan). A larger project may have several Map N variants for parallel workstreams. The convention: numbered sequentially; the latest is the most operational.
|
|
22
|
+
|
|
23
|
+
## Story-step shape
|
|
24
|
+
|
|
25
|
+
Every executable phase step in a map has the following shape (per [`01-template.md`](01-template.md)):
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
| # | Phase step | Acceptance | Verification gate |
|
|
29
|
+
|---|---|---|---|
|
|
30
|
+
| 1 | <what move is being made> | <what proves it produced the intended outcome> | <specific file/grep/test in the target repo that the operator runs to confirm the gate> |
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The **verification gate** is the load-bearing column for agent-led work. *"This works"* is not a gate. *"`grep 'createSensightMisWriteAdapter' apps/web/lib/nuos/nuflow/runtime.ts` returns a hit"* is a gate. Vague gates leave room for plausible-looking work that doesn't match reality; precise gates close that loop.
|
|
34
|
+
|
|
35
|
+
## Hedge words are a stop signal
|
|
36
|
+
|
|
37
|
+
If you find yourself writing *"likely"*, *"presumably"*, *"should be"* in a map, stop. The hedge word indicates a verification step you skipped. Replace it with the grep/test/file-read result before the map ships.
|
|
38
|
+
|
|
39
|
+
## Design alternatives before implementation
|
|
40
|
+
|
|
41
|
+
For any non-trivial architectural choice — schema, migration, integration shape, adapter design, audit composition, RBAC pattern, error-handling strategy, retention policy — **produce at least two fundamentally different designs, evaluate them, then pick or hybrid before any implementation is generated.** This is Ousterhout's "design it twice" applied to agent-led work.
|
|
42
|
+
|
|
43
|
+
Two syntactic variations of the same design (e.g., `USING` clause vs `WITH CHECK` clause for the same RLS pattern) do not count. Three fundamentally different designs (e.g., session-variable RLS / Supabase auth.uid() RLS / defense-in-depth + app-side enforcement) do count.
|
|
44
|
+
|
|
45
|
+
Record the alternatives in the WU's Design notes (or as a D-NNN decision when the choice is durable enough). The audit trail of *"we considered A, B, C; chose B because X"* is catalogue value — future sessions can re-evaluate when context changes.
|
|
46
|
+
|
|
47
|
+
In maps, any phase step whose work is *"generate non-trivial implementation"* carries an implicit prerequisite: design alternatives recorded in the WU notes. The gate fires before code is written, not after.
|
|
48
|
+
|
|
49
|
+
## Naming
|
|
50
|
+
|
|
51
|
+
- `01-the-horizon.md` — the high-level narrative (recommend keep verbatim if adopting unchanged)
|
|
52
|
+
- `02-<name>.md` — phases-in-detail or first canonical operational plan
|
|
53
|
+
- `03-<name>.md`, `04-<name>.md`, etc. — additional canonical plans per workstream
|
|
54
|
+
|
|
55
|
+
When a map is superseded (e.g., the project's operational shape changes), preserve the old map with a `(HISTORICAL)` header pointing at its replacement. Don't delete — the evolution is part of the audit trail.
|
|
56
|
+
|
|
57
|
+
## Maps in this catalogue
|
|
58
|
+
|
|
59
|
+
| File | Title | Purpose |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| `01-template.md` | Map template | Shape for a canonical operational map (copy + rename) |
|
|
62
|
+
|
|
63
|
+
Update this list as you add real maps.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Open Questions
|
|
2
|
+
|
|
3
|
+
> Questions blocking work that have not yet been resolved into decisions. Each question is Q-NNN. Open questions exist in three states: `open` (under deliberation), `resolved` (resolved into a D-NNN — link forward), `withdrawn` (no longer relevant).
|
|
4
|
+
|
|
5
|
+
## Index
|
|
6
|
+
|
|
7
|
+
| ID | Question | Status | Blocks | Date opened |
|
|
8
|
+
| --- | --- | --- | --- | --- |
|
|
9
|
+
| _none yet_ | | | | |
|
|
10
|
+
|
|
11
|
+
## How to file an open question
|
|
12
|
+
|
|
13
|
+
1. Add a new row with Q-NNN (next available number)
|
|
14
|
+
2. If the question warrants detail (multiple options, real trade-offs), write a `Q-NNN-short-title.md` file beside this index laying out the options
|
|
15
|
+
3. Reference the question from any blocked work unit
|
|
16
|
+
4. When the question resolves, file a D-NNN; mark this question `resolved` and link forward
|
|
17
|
+
|
|
18
|
+
## When a question becomes a decision
|
|
19
|
+
|
|
20
|
+
A question is "ready to resolve" when:
|
|
21
|
+
|
|
22
|
+
- The trade-offs are clear enough to choose between
|
|
23
|
+
- The information needed to choose is available (or its absence is itself a decision)
|
|
24
|
+
- An active or imminent work unit needs the answer
|
|
25
|
+
|
|
26
|
+
Resolving prematurely produces fragile decisions. Resolving late produces blocked work units. The catalogue review walks open questions and forces the choice when blocking begins.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# P001 — [Persona name, e.g., "Returning bookshop customer" or "Watling Street Primary SENCo"]
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
| --- | --- |
|
|
5
|
+
| Status | 🟢 active |
|
|
6
|
+
| Paired with | [P-NNN if this persona's outcomes are paired with another (e.g., customer ↔ organiser); `none` otherwise] |
|
|
7
|
+
| Used by WUs | [List of WU numbers that cite this persona — keep updated] |
|
|
8
|
+
| First filed | {{TODAY}} |
|
|
9
|
+
| Last refined | {{TODAY}} |
|
|
10
|
+
|
|
11
|
+
## What this persona is, in one sentence
|
|
12
|
+
|
|
13
|
+
[One sentence describing who this person is in the context of *this system*. Not "Sarah, 32, marketing manager". A relationship to the system: "a returning customer who has attended at least one event before and has an existing account", "a SENCo at a primary school managing 22 pupils on the SEN register".]
|
|
14
|
+
|
|
15
|
+
## The seven dimensions
|
|
16
|
+
|
|
17
|
+
### 1. Identity
|
|
18
|
+
|
|
19
|
+
[Who they are in the context of this system. Their relationship to it. Not their demographic profile — their position in the system's world. What account do they have? What role do they play? What other systems have they used before that shape their expectations?]
|
|
20
|
+
|
|
21
|
+
### 2. Reality
|
|
22
|
+
|
|
23
|
+
[The physical environment they are in when they use this system. Device, connection quality, noise level, time pressure. "At home on a laptop, stable connection, no time pressure." "On a phone in the staff room between lessons, intermittent wifi, four-minute window." Real conditions, not idealised ones.]
|
|
24
|
+
|
|
25
|
+
### 3. Psychology
|
|
26
|
+
|
|
27
|
+
[Technical confidence, stress level, tolerance for confusion. Will they read instructions or click around? Will they abandon if a page takes more than three seconds? Will they call a colleague for help, or give up silently? What is their emotional state when they arrive at this system?]
|
|
28
|
+
|
|
29
|
+
### 4. Trigger
|
|
30
|
+
|
|
31
|
+
[What brought them to this outcome. A real-world event, not a UI click. "They saw an event announcement on the bookshop's social media." "Their head teacher forwarded a safeguarding form that needs completing today." "A pupil disclosed something at lunch and they need to record it before the day ends."]
|
|
32
|
+
|
|
33
|
+
### 5. History
|
|
34
|
+
|
|
35
|
+
[What they have done before arriving at this outcome. Have they used the platform before? Do they have saved details? Do they understand how this kind of system works? What context do they bring with them that the system can rely on?]
|
|
36
|
+
|
|
37
|
+
### 6. Success
|
|
38
|
+
|
|
39
|
+
[What "done" looks like from *their* perspective. Not what the system logs — what they feel. "I know I have a place, I know when it is, and I will not forget." "The disclosure is recorded, the right people are notified, and I can go home knowing I did my duty." This drives the design — the system must produce that subjective state, not just write a database row.]
|
|
40
|
+
|
|
41
|
+
### 7. Constraints
|
|
42
|
+
|
|
43
|
+
[What they cannot or will not do. "Will not phone the shop to book." "Will not create a new account if their login fails — they will give up." "Will not wait more than five seconds for a page to load." "Cannot share the screen with a parent — confidentiality." These define the outer boundary of acceptable design.]
|
|
44
|
+
|
|
45
|
+
## The acid-test refinement
|
|
46
|
+
|
|
47
|
+
[The hardest legitimate user — this persona with the most demanding combination of real constraints. Not a hostile user; a legitimate user with the worst realistic conditions. Slow device, low technical confidence, time pressure, complex situation, possibly distracted or stressed.
|
|
48
|
+
|
|
49
|
+
Design for the acid-test and the standard cases hold. If only one scenario gets verified end-to-end, verify this one.]
|
|
50
|
+
|
|
51
|
+
## Paired persona
|
|
52
|
+
|
|
53
|
+
[If this persona's outcomes are paired with another's — e.g., a customer who books an event and an organiser who receives the booking — link the paired P-NNN here. The contract between them (what one outcome produces and the other consumes) lives in the WU files, but the relationship is recorded here so a future reader can find both sides quickly.
|
|
54
|
+
|
|
55
|
+
If this persona has no paired counterpart, write `none`.]
|
|
56
|
+
|
|
57
|
+
## Used by WUs
|
|
58
|
+
|
|
59
|
+
[Keep this list updated as WUs cite the persona. Format: `WU NNN — title` per line.]
|
|
60
|
+
|
|
61
|
+
- [WU NNN — title]
|
|
62
|
+
- ...
|
|
63
|
+
|
|
64
|
+
## Notes / refinements
|
|
65
|
+
|
|
66
|
+
### {{TODAY}} — first filed
|
|
67
|
+
|
|
68
|
+
[Initial draft of the seven dimensions. What was clear; what was guessed; what needs verification with a real person.]
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Personas Index
|
|
2
|
+
|
|
3
|
+
> Master list of the personas this project's work units serve. Personas are P-NNN-numbered, written along the seven dimensions, and refined with the acid-test. Reusable across multiple WUs — a "paired outcome" (e.g., a customer-side outcome paired with an organiser-side one) cites two personas, both filed here.
|
|
4
|
+
|
|
5
|
+
## What a persona is
|
|
6
|
+
|
|
7
|
+
A persona is a **specification of who will use an outcome and what situation they will be in when they use it.** It is not a demographic snapshot; it is a design constraint. A persona that does not change a design decision is decoration — rewrite it until it does.
|
|
8
|
+
|
|
9
|
+
The seven dimensions every persona addresses:
|
|
10
|
+
|
|
11
|
+
1. **Identity** — who they are in the context of *this system*. Not their age or job title in the abstract — their relationship to this particular system.
|
|
12
|
+
2. **Reality** — physical environment when they use the outcome. Device, connection quality, noise level, time pressure.
|
|
13
|
+
3. **Psychology** — technical confidence, stress level, tolerance for confusion.
|
|
14
|
+
4. **Trigger** — what brought them to this outcome. A real-world event, not a UI click.
|
|
15
|
+
5. **History** — what they have done before arriving at this outcome.
|
|
16
|
+
6. **Success** — what "done" looks like from their perspective. Not what the system logs — what they feel.
|
|
17
|
+
7. **Constraints** — what they cannot or will not do. Defines the outer boundary of acceptable design.
|
|
18
|
+
|
|
19
|
+
Every persona is then refined into an **acid-test persona** — the hardest legitimate user, with the most demanding combination of real constraints. Design for the acid-test and the standard cases hold.
|
|
20
|
+
|
|
21
|
+
## How a persona is filed
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
personas/
|
|
25
|
+
├── _index.md (this file)
|
|
26
|
+
├── 001-template.md (the template; copy when filing a new persona)
|
|
27
|
+
├── P001-<slug>.md (your first persona)
|
|
28
|
+
├── P002-<slug>.md ...
|
|
29
|
+
└── done/ (when a persona retires — e.g., the user role no longer exists)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Personas are P-NNN-numbered. Numbers are stable: a retired persona moves to `done/` but keeps its number. Cross-WU references use the stable handle (`{repo}:P-NNN` for cross-catalogue references; `[P-NNN](../personas/P-NNN-slug.md)` within the same catalogue).
|
|
33
|
+
|
|
34
|
+
## Personas — active
|
|
35
|
+
|
|
36
|
+
| ID | Name | Used by WUs | Status |
|
|
37
|
+
| --- | --- | --- | --- |
|
|
38
|
+
|
|
39
|
+
[Add a row when you file a new persona. Status: `🟢 active`, `🟡 evolving` (the persona shape is being refined), `🟣 paired-with-PNNN` (this persona's outcomes are paired with another), `⚫ retired`.]
|
|
40
|
+
|
|
41
|
+
## Status legend
|
|
42
|
+
|
|
43
|
+
- 🟢 `active` — in use; cited by one or more current WUs
|
|
44
|
+
- 🟡 `evolving` — the seven dimensions are being refined as understanding deepens
|
|
45
|
+
- 🟣 `paired-with-PNNN` — this persona pairs with another (e.g., customer + organiser)
|
|
46
|
+
- ⚫ `retired` — no longer in use; moved to `done/`
|
|
47
|
+
|
|
48
|
+
## How to write a persona
|
|
49
|
+
|
|
50
|
+
Use the file format established in `001-template.md`. A persona document has:
|
|
51
|
+
|
|
52
|
+
- Identity dimension
|
|
53
|
+
- Reality dimension
|
|
54
|
+
- Psychology dimension
|
|
55
|
+
- Trigger dimension
|
|
56
|
+
- History dimension
|
|
57
|
+
- Success dimension
|
|
58
|
+
- Constraints dimension
|
|
59
|
+
- Acid-test refinement (the worst legitimate combination of constraints)
|
|
60
|
+
- Paired persona (if any) — the persona on the other side of any outcome this persona triggers
|
|
61
|
+
- WUs this persona is cited by
|
|
62
|
+
|
|
63
|
+
A persona should be small enough to read in two minutes and specific enough that swapping it for a different persona would force at least one design decision to change. If you can substitute the persona without changing anything in the WU, the persona is decorative — rewrite it until it constrains.
|
|
64
|
+
|
|
65
|
+
## How personas connect to WUs
|
|
66
|
+
|
|
67
|
+
A WU's `Persona` field links the P-NNN that the outcome serves. A WU's `Trigger` field draws from the persona's Trigger dimension but specifies the *moment* (not just the class of event). A WU's `Walkthrough` is written from the persona's perspective, using their reality, psychology, and history to constrain what they need to be told and what they already know.
|
|
68
|
+
|
|
69
|
+
If a WU has no clear persona, it is one of two things:
|
|
70
|
+
1. An infrastructure WU (build, publish, hardening) — mark the persona field `N/A — infrastructure WU`.
|
|
71
|
+
2. An unanchored feature — the WU describes a category of capability without a person doing a thing. Rewrite as an outcome with a real persona, or split into smaller outcomes.
|
|
72
|
+
|
|
73
|
+
## How personas evolve
|
|
74
|
+
|
|
75
|
+
Personas evolve as understanding deepens. The seven dimensions get sharper; the acid-test gets harder; new constraints surface. Update the persona file in place — but record the *date* of each refinement in the file itself, so a future reader can see how the understanding changed.
|
|
76
|
+
|
|
77
|
+
If a persona's role in the system changes substantially (e.g., "customer" splits into "registered customer" + "guest customer"), file two new personas with new P-NNN numbers and mark the original `⚫ retired` rather than amending it.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Risks
|
|
2
|
+
|
|
3
|
+
> Tracked risks to the project. Each risk is R-NNN. A risk is anything that could prevent a work unit from shipping, prevent a phase from completing, or invalidate an architectural commitment if it materialises.
|
|
4
|
+
|
|
5
|
+
## Index
|
|
6
|
+
|
|
7
|
+
| ID | Risk | Severity | Status | Date opened |
|
|
8
|
+
| --- | --- | --- | --- | --- |
|
|
9
|
+
| _none yet_ | | | | |
|
|
10
|
+
|
|
11
|
+
## Severity scale
|
|
12
|
+
|
|
13
|
+
- **High** — blocks active work or threatens an architectural commitment
|
|
14
|
+
- **Medium** — would slow work materially if it materialises
|
|
15
|
+
- **Low** — worth tracking; not blocking
|
|
16
|
+
|
|
17
|
+
## Status
|
|
18
|
+
|
|
19
|
+
- **open** — being watched
|
|
20
|
+
- **mitigated** — action taken; risk reduced
|
|
21
|
+
- **materialised** — happened; see linked WU or session for response
|
|
22
|
+
- **closed** — no longer applicable
|
|
23
|
+
|
|
24
|
+
## How to add a risk
|
|
25
|
+
|
|
26
|
+
1. Add a new row to the table with R-NNN (next available number)
|
|
27
|
+
2. If the risk is large enough to warrant detail, write a `R-NNN-short-title.md` file beside this index
|
|
28
|
+
3. Reference the risk from any work unit it affects
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# {{TODAY}} — Session: [short description]
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
| --- | --- |
|
|
5
|
+
| Operator | [name] |
|
|
6
|
+
| Active WU | WU NNN — [title] |
|
|
7
|
+
| Duration | [approximate, e.g., "90 minutes"] |
|
|
8
|
+
| Outcome | [one phrase: "WU NNN advanced", "D-NNN landed", "blocked on Q-NNN", etc.] |
|
|
9
|
+
|
|
10
|
+
## What this session was about
|
|
11
|
+
|
|
12
|
+
[One paragraph framing. Why was this session run? What was the entry-point question or task?]
|
|
13
|
+
|
|
14
|
+
## What was done
|
|
15
|
+
|
|
16
|
+
[Chronological narrative. Reference any commits by hash or branch. Link any artefacts created or modified.]
|
|
17
|
+
|
|
18
|
+
- [bullet]
|
|
19
|
+
- [bullet]
|
|
20
|
+
- [bullet]
|
|
21
|
+
|
|
22
|
+
## Decisions that surfaced
|
|
23
|
+
|
|
24
|
+
| ID | Title | Status |
|
|
25
|
+
| --- | --- | --- |
|
|
26
|
+
| _none_ | | |
|
|
27
|
+
|
|
28
|
+
## Open questions raised
|
|
29
|
+
|
|
30
|
+
| ID | Question | Owner |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| _none_ | | |
|
|
33
|
+
|
|
34
|
+
## Risks identified
|
|
35
|
+
|
|
36
|
+
| ID | Risk | Severity |
|
|
37
|
+
| --- | --- | --- |
|
|
38
|
+
| _none_ | | |
|
|
39
|
+
|
|
40
|
+
## What's next
|
|
41
|
+
|
|
42
|
+
[The concrete next action. Mirrors STATE.md "What is next". Should be specific enough that the next session's start-of-session protocol can pick it up without further context.]
|
|
43
|
+
|
|
44
|
+
## Pointers
|
|
45
|
+
|
|
46
|
+
- [Link to the active WU]
|
|
47
|
+
- [Link to any decisions or open questions referenced]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Sessions
|
|
2
|
+
|
|
3
|
+
> Chronological audit trail of every session run on this project. One entry per session, named `YYYY-MM-DD-short-description.md`. The session log is the catalogue's replay history; a fresh operator (human or agent) should be able to read the most recent entries and pick up exactly where work stopped.
|
|
4
|
+
|
|
5
|
+
## Index
|
|
6
|
+
|
|
7
|
+
| Date | Session | Active WU | Notes |
|
|
8
|
+
| --- | --- | --- | --- |
|
|
9
|
+
| {{TODAY}} | [Adopt the catalogue scaffold](0000-00-00-template.md) | WU 001 | First session; catalogue bootstrapped |
|
|
10
|
+
|
|
11
|
+
## How to add a session entry
|
|
12
|
+
|
|
13
|
+
1. Copy `0000-00-00-template.md` to `YYYY-MM-DD-short-description.md` (today's date, dashes-not-spaces description)
|
|
14
|
+
2. Fill in the template
|
|
15
|
+
3. Add a row to the table above
|
|
16
|
+
4. Link the entry from STATE.md if the session significantly shifted state
|
|
17
|
+
|
|
18
|
+
## What a session entry must include
|
|
19
|
+
|
|
20
|
+
- What this session was about (one paragraph)
|
|
21
|
+
- What was done (chronological narrative)
|
|
22
|
+
- Decisions that surfaced (linked)
|
|
23
|
+
- Open questions raised (linked)
|
|
24
|
+
- Risks identified (linked)
|
|
25
|
+
- What's next (the concrete next action)
|
|
26
|
+
|
|
27
|
+
The auditor's-question test: *could a third-party auditor read this entry and answer "what happened, why, and what's next?" without contacting the team?* If yes, sufficient.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Work Unit 001 — [Outcome-bounded title, e.g., "Bookshop event booking flow" or "Bootstrap the Postgres schema"]
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
| --- | --- |
|
|
5
|
+
| Status | 🟡 in flight |
|
|
6
|
+
| Depends on | none |
|
|
7
|
+
| Blocks | [WUs that cannot start until this lands] |
|
|
8
|
+
| Implements | [the decision or pattern this realises] |
|
|
9
|
+
| Owner | [name or "—"] |
|
|
10
|
+
| Estimated effort | [days or "small/medium/large"] |
|
|
11
|
+
| Repo | [where the implementation lands] |
|
|
12
|
+
|
|
13
|
+
## Persona
|
|
14
|
+
|
|
15
|
+
[Link to the P-NNN persona this outcome serves — e.g., `[P001 — Returning bookshop customer](../personas/P001-returning-customer.md)`. For paired outcomes, link both personas. For infrastructure WUs (build, publish, hardening), write `N/A — infrastructure WU.`]
|
|
16
|
+
|
|
17
|
+
## Trigger
|
|
18
|
+
|
|
19
|
+
[The real-world event that makes this outcome necessary. Not "the user clicks the booking button" — that is a UI interaction. The trigger is what happened *before* they opened the platform: "the customer saw an event announcement on social media and wants to reserve a place", "the SENCo received an email that a child has been placed on the SEN register". For infrastructure WUs, write `N/A — infrastructure WU.`]
|
|
20
|
+
|
|
21
|
+
## Outcome
|
|
22
|
+
|
|
23
|
+
[One paragraph. The single sentence test: *what will be true when this is done that is not true now?* That sentence is the outcome.]
|
|
24
|
+
|
|
25
|
+
## Walkthrough
|
|
26
|
+
|
|
27
|
+
[Numbered steps from the persona's perspective — what they do and what they see. Include failure paths via the five injection points: (1) what if the persona cannot complete this step in one sitting? (2) what if the information they need is incorrect or missing? (3) what if the system itself fails? (4) what if the persona makes a mistake? (5) what if they realise immediately afterwards they used the wrong information?
|
|
28
|
+
|
|
29
|
+
For infrastructure WUs, write `N/A — infrastructure WU.`]
|
|
30
|
+
|
|
31
|
+
1. [Persona action; system response; including any failure handling that lives at this step]
|
|
32
|
+
2. ...
|
|
33
|
+
|
|
34
|
+
## Acceptance criteria
|
|
35
|
+
|
|
36
|
+
When this WU is `✅ merged / shipped`:
|
|
37
|
+
|
|
38
|
+
1. [Concrete, observable, checkable criterion — phrased as an inspection that passes or fails. Each criterion must be evaluable by a person looking at the running system, not inferred from technical state.]
|
|
39
|
+
2. ...
|
|
40
|
+
|
|
41
|
+
The auditor's-question test applies: *can a third-party reader read these and confirm "yes, this is shipped" by inspection alone?*
|
|
42
|
+
|
|
43
|
+
The four quality traps apply when reviewing acceptance criteria: vagueness (could this be implemented in more than one way that satisfies the wording?); technical language (does this describe implementation rather than behaviour?); happy-path-only (have failure paths been covered?); kitchen-sink (does this WU try to do more than one thing?).
|
|
44
|
+
|
|
45
|
+
## Contracts produced
|
|
46
|
+
|
|
47
|
+
[What this WU makes available to other WUs once it lands, in domain language. Not database schemas, not API endpoints — facts about the world that the system now knows. Examples:
|
|
48
|
+
|
|
49
|
+
- "A confirmed booking record, linked to a specific customer and a specific event"
|
|
50
|
+
- "A verified customer account: name, email, login credentials, saved payment method"
|
|
51
|
+
- "A published event with capacity, price, and date"
|
|
52
|
+
|
|
53
|
+
For infrastructure WUs, list the technical artefacts: "A `@nusoft/nuwiki@0.1.4` published privately on npm with caret-range trifecta deps".]
|
|
54
|
+
|
|
55
|
+
## Contracts consumed
|
|
56
|
+
|
|
57
|
+
[What must already exist before this WU can run. Each entry should map to another WU's `Contracts produced` field. If something this WU consumes is not produced by any WU in the plan, that is a planning gap — file it as an open question or a new WU before this one starts.]
|
|
58
|
+
|
|
59
|
+
## Approach
|
|
60
|
+
|
|
61
|
+
[Two or three short paragraphs. Not a design doc; just enough that an LLM teammate or a fresh operator can see how the work breaks down. If "design twice" applies (any non-trivial architectural choice), produce two fundamentally different designs in the Notes section before generating implementation.]
|
|
62
|
+
|
|
63
|
+
## What this WU does NOT do
|
|
64
|
+
|
|
65
|
+
- [Things deliberately deferred to later WUs]
|
|
66
|
+
- [Things that look in-scope but are not]
|
|
67
|
+
|
|
68
|
+
## Forward-compatibility commitments
|
|
69
|
+
|
|
70
|
+
[If this WU's shape decisions affect later WUs, name them here. Future WUs depend on these surviving.]
|
|
71
|
+
|
|
72
|
+
## Notes / log
|
|
73
|
+
|
|
74
|
+
### {{TODAY}} — session 1
|
|
75
|
+
[What was attempted, what worked, what did not, what was learned, what is next.]
|
|
76
|
+
|
|
77
|
+
## Pointers
|
|
78
|
+
|
|
79
|
+
- [Link to the decision this implements, if any]
|
|
80
|
+
- [Link to the persona(s) this serves]
|
|
81
|
+
- [Links to dependent WUs (those this consumes from, those this blocks)]
|
|
82
|
+
- [Links to relevant module-level contracts in `docs/contracts/`]
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Work Units
|
|
2
|
+
|
|
3
|
+
> Concrete, buildable pieces of work. Each work unit has an outcome, acceptance criteria, dependencies, and a status. Work units are the unit of progress; the catalogue's compounding value comes from accumulated WU notes.
|
|
4
|
+
|
|
5
|
+
## Index
|
|
6
|
+
|
|
7
|
+
| WU | Title | Status | Depends on | Notes |
|
|
8
|
+
| --- | --- | --- | --- | --- |
|
|
9
|
+
| 001 | [first WU title] | 🟡 in flight | — | First work unit |
|
|
10
|
+
|
|
11
|
+
## Status legend
|
|
12
|
+
|
|
13
|
+
- 🔵 **proposed** — written down, not yet started
|
|
14
|
+
- 🟡 **in flight** — actively being worked on
|
|
15
|
+
- 🟣 **built / awaiting review** — implementation done, review pending
|
|
16
|
+
- ✅ **merged / shipped** — complete and integrated
|
|
17
|
+
- 🔴 **blocked** — cannot proceed; see notes for blocker
|
|
18
|
+
|
|
19
|
+
## Deferred / proposed-with-trigger work units
|
|
20
|
+
|
|
21
|
+
A work unit can be `🔵 proposed` in three flavours:
|
|
22
|
+
|
|
23
|
+
- **proposed-ready** — eligible to activate at next priority review
|
|
24
|
+
- **proposed-deferred-with-trigger** — committed, awaiting a checkable condition (state the condition in the WU itself)
|
|
25
|
+
- **proposed-blocked-on-question** — cannot activate until an open question resolves; link to the Q-NNN
|
|
26
|
+
|
|
27
|
+
The quarterly catalogue review walks each deferred WU and re-evaluates its trigger.
|
|
28
|
+
|
|
29
|
+
## How to add a work unit
|
|
30
|
+
|
|
31
|
+
1. Copy `001-template.md` to `NNN-short-title-with-dashes.md` (next available number)
|
|
32
|
+
2. Fill in the template
|
|
33
|
+
3. Add a row to the table above
|
|
34
|
+
4. If the WU resolves an open question, link it; if the WU was created in response to a decision, link the decision
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Contracts
|
|
2
|
+
|
|
3
|
+
> Type-stable surfaces — what each part of {{PROJECT_NAME}} promises to its consumers. Where decisions justify *why* and philosophy frames the spirit, contracts specify *what is true at the boundary*. A contract is what an integrator (human or LLM) reads to know how to interact with this part of the system.
|
|
4
|
+
|
|
5
|
+
## When to write a contract
|
|
6
|
+
|
|
7
|
+
Not on day one. Contracts come when stable surfaces emerge — when something has been built, tested, and is being depended on by other parts of the system or other projects.
|
|
8
|
+
|
|
9
|
+
Premature contracts ossify the wrong shape. Late contracts allow drift. The signal a contract is needed: a downstream consumer is asking *"what does X actually guarantee?"* and the answer is not in any single place.
|
|
10
|
+
|
|
11
|
+
## Index
|
|
12
|
+
|
|
13
|
+
| Contract | Surface | Status |
|
|
14
|
+
| --- | --- | --- |
|
|
15
|
+
| _none yet_ | | |
|
|
16
|
+
|
|
17
|
+
## Pattern
|
|
18
|
+
|
|
19
|
+
Each contract document:
|
|
20
|
+
- Names the surface
|
|
21
|
+
- Lists the type-stable promises (what shape inputs come in, what shape outputs go out, what side effects fire)
|
|
22
|
+
- Specifies the conformance gate (the test or check that proves a candidate implementation honours the contract)
|
|
23
|
+
- Lists what is *not* covered (so consumers don't depend on incidentals)
|
|
24
|
+
- Records the contract's version (semver if it's published)
|
|
25
|
+
|
|
26
|
+
Contracts are change-controlled. Breaking a contract requires a decision (D-NNN) and a downstream-impact note.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Guides
|
|
2
|
+
|
|
3
|
+
> The persuasion layer. Where decisions are committed-to, contracts are typed, and philosophy is committed-architectural-spirit, **guides are written to persuade**. They explain {{PROJECT_NAME}} to investors, customers, partners, regulators, and domain experts. They are the artefact you send when you need a non-technical reader to understand and care.
|
|
4
|
+
|
|
5
|
+
## When to write a guide
|
|
6
|
+
|
|
7
|
+
When you need to persuade somebody. Not before. A guide written without an audience and a goal is academic. A guide written *for an audience* against a known goal is the most leveraged writing you can do — it is the artefact that opens conversations, closes deals, and aligns stakeholders.
|
|
8
|
+
|
|
9
|
+
The catalogue's other layers are the source material. A guide is the curated, audience-tuned read.
|
|
10
|
+
|
|
11
|
+
## Index
|
|
12
|
+
|
|
13
|
+
| Guide | Audience | Topic |
|
|
14
|
+
| --- | --- | --- |
|
|
15
|
+
| _none yet_ | | |
|
|
16
|
+
|
|
17
|
+
## Pattern
|
|
18
|
+
|
|
19
|
+
Each guide:
|
|
20
|
+
- States the audience explicitly (one or two reader personas)
|
|
21
|
+
- States the goal — what should the reader do or believe after reading?
|
|
22
|
+
- Stays in the language of the audience (no jargon the audience doesn't already use)
|
|
23
|
+
- Cites the catalogue (decisions, contracts, philosophy) as evidence
|
|
24
|
+
- Is dated — guides go stale; the date tells the reader whether they're reading current
|
|
25
|
+
|
|
26
|
+
A guide is not eternal. When the underlying truth shifts, the guide gets revised or retired. Catalogue decisions persist; guides are seasonal.
|