@arjunkhera/atlas 0.3.8 → 0.3.9

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 (43) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/agents/artifact-renderer.md +22 -22
  3. package/door/cli.mjs +36 -11
  4. package/door/lib/design-build.mjs +409 -0
  5. package/door/lib/design.mjs +199 -118
  6. package/door/lib/markdown.mjs +160 -0
  7. package/package.json +1 -1
  8. package/skills/lead/SKILL.md +1 -1
  9. package/skills/sdlc-task/SKILL.md +33 -24
  10. package/skills/sdlc-task/design/README.md +187 -0
  11. package/skills/sdlc-task/design/parts/actors.md +26 -0
  12. package/skills/sdlc-task/design/parts/alternatives.md +24 -0
  13. package/skills/sdlc-task/design/parts/build.md +23 -0
  14. package/skills/sdlc-task/design/parts/calls.md +25 -0
  15. package/skills/sdlc-task/design/parts/change.md +27 -0
  16. package/skills/sdlc-task/design/parts/data.md +22 -0
  17. package/skills/sdlc-task/design/parts/done.md +23 -0
  18. package/skills/sdlc-task/design/parts/edges.md +24 -0
  19. package/skills/sdlc-task/design/parts/goals.md +27 -0
  20. package/skills/sdlc-task/design/parts/key.md +25 -0
  21. package/skills/sdlc-task/design/parts/migration.md +22 -0
  22. package/skills/sdlc-task/design/parts/order.md +24 -0
  23. package/skills/sdlc-task/design/parts/problem.md +22 -0
  24. package/skills/sdlc-task/design/parts/proof.md +24 -0
  25. package/skills/sdlc-task/design/parts/proposal.md +24 -0
  26. package/skills/sdlc-task/design/parts/records.md +24 -0
  27. package/skills/sdlc-task/design/parts/repos.md +25 -0
  28. package/skills/sdlc-task/design/parts/risks.md +24 -0
  29. package/skills/sdlc-task/design/parts/rollout.md +24 -0
  30. package/skills/sdlc-task/design/parts/routes.md +24 -0
  31. package/skills/sdlc-task/design/parts/scorecard.md +25 -0
  32. package/skills/sdlc-task/design/parts/security.md +22 -0
  33. package/skills/sdlc-task/design/parts/shared-decisions.md +24 -0
  34. package/skills/sdlc-task/design/parts/states.md +25 -0
  35. package/skills/sdlc-task/design/parts/stories.md +26 -0
  36. package/skills/sdlc-task/design/parts/summary.md +33 -0
  37. package/skills/sdlc-task/design/parts/why.md +22 -0
  38. package/skills/sdlc-task/design/parts/words.md +29 -0
  39. package/skills/sdlc-task/design/parts/yardstick.md +25 -0
  40. package/skills/sdlc-task/design/parts.yaml +306 -0
  41. package/skills/sdlc-task/lifecycle.yaml +2 -2
  42. package/agents/artifact-format/walkthrough.html +0 -706
  43. package/skills/sdlc-task/templates/design-doc.md +0 -126
@@ -0,0 +1,24 @@
1
+ # Records
2
+
3
+ It holds: The records each step reads and writes.
4
+
5
+ Needs: Decide: none, Flow: needed, Contract: optional, Initiative: none.
6
+
7
+ Rules:
8
+
9
+ 1. List each record a step reads or writes.
10
+ 2. Say which step writes it, and where it lives.
11
+ 3. Name the fields that matter.
12
+
13
+ Example, in a file of its own:
14
+
15
+ ````markdown
16
+ ---
17
+ part: records
18
+ ---
19
+ # Records
20
+
21
+ | Record | Written by | Holds |
22
+ |---|---|---|
23
+ | Check run | The gate | The result and the log link |
24
+ ````
@@ -0,0 +1,25 @@
1
+ # Each kind of repo
2
+
3
+ It holds: What the design means for a service, a library, a schema, a CLI and a plugin.
4
+
5
+ Needs: Decide: shared, Flow: shared, Contract: shared, Initiative: none.
6
+
7
+ Rules:
8
+
9
+ 1. Say what the design means for a service, a library, a schema, a CLI and a plugin.
10
+ 2. Needed when many repos use the design. Optional for a design in one product.
11
+ 3. Say what stays the same for every kind.
12
+
13
+ Example, in a file of its own:
14
+
15
+ ````markdown
16
+ ---
17
+ part: repos
18
+ ---
19
+ # Each kind of repo
20
+
21
+ | Kind | What changes |
22
+ |---|---|
23
+ | Service | The gate also waits for the deploy check. |
24
+ | Library | The gate runs the unit tests only. |
25
+ ````
@@ -0,0 +1,24 @@
1
+ # Risks
2
+
3
+ It holds: What breaks, and what we do. "Accepted" with a reason is valid.
4
+
5
+ Needs: Decide: needed, Flow: needed, Contract: needed, Initiative: needed.
6
+
7
+ Rules:
8
+
9
+ 1. List what can break, and what we do about it.
10
+ 2. "Accepted" with a reason is a valid answer.
11
+ 3. Put the worst risk first.
12
+
13
+ Example, in a file of its own:
14
+
15
+ ````markdown
16
+ ---
17
+ part: risks
18
+ ---
19
+ # Risks
20
+
21
+ | Risk | What we do |
22
+ |---|---|
23
+ | The gate is slow | Accepted: ten minutes is fine for now. |
24
+ ````
@@ -0,0 +1,24 @@
1
+ # Rollout
2
+
3
+ It holds: The order of release, and how we watch it.
4
+
5
+ Needs: Decide: optional, Flow: optional, Contract: needed, Initiative: none.
6
+
7
+ Rules:
8
+
9
+ 1. Give the order of release.
10
+ 2. Say how we watch it after the release.
11
+ 3. Say what makes us roll back.
12
+
13
+ Example, in a file of its own:
14
+
15
+ ````markdown
16
+ ---
17
+ part: rollout
18
+ ---
19
+ # Rollout
20
+
21
+ 1. Release behind a flag.
22
+ 2. Turn it on for the owner.
23
+ 3. Watch the error rate for one day, then turn it on for all.
24
+ ````
@@ -0,0 +1,24 @@
1
+ # Routes and interface
2
+
3
+ It holds: Every route, exported function, command, tool or schema object that is added, changed or removed.
4
+
5
+ Needs: Decide: none, Flow: none, Contract: needed, Initiative: none.
6
+
7
+ Rules:
8
+
9
+ 1. List every route, function, command or tool that is added, changed or removed.
10
+ 2. Mark each row as new, changed or removed.
11
+ 3. For a library, list exported functions; for a CLI, commands and flags.
12
+
13
+ Example, in a file of its own:
14
+
15
+ ````markdown
16
+ ---
17
+ part: routes
18
+ ---
19
+ # Routes and interface
20
+
21
+ | | Route | What it does |
22
+ |---|---|---|
23
+ | new | `GET /documents/:id/view` | Returns the viewer page for one document. |
24
+ ````
@@ -0,0 +1,25 @@
1
+ # Scorecard
2
+
3
+ It holds: Each option against each yardstick test.
4
+
5
+ Needs: Decide: needed, Flow: none, Contract: none, Initiative: none.
6
+
7
+ Rules:
8
+
9
+ 1. Score each option against each yardstick test.
10
+ 2. Use words, not only marks: yes, no or part.
11
+ 3. The picked option is the first row.
12
+
13
+ Example, in a file of its own:
14
+
15
+ ````markdown
16
+ ---
17
+ part: scorecard
18
+ ---
19
+ # Scorecard
20
+
21
+ | Option | Stops red | Fast |
22
+ |---|---|---|
23
+ | Gate before merge | yes | yes |
24
+ | Run after merge | no | yes |
25
+ ````
@@ -0,0 +1,22 @@
1
+ # Security
2
+
3
+ It holds: Who may call it, what it may reach, and what it never leaks.
4
+
5
+ Needs: Decide: optional, Flow: optional, Contract: needed, Initiative: none.
6
+
7
+ Rules:
8
+
9
+ 1. Say who may call it, and what it may reach.
10
+ 2. Say what it never leaks, and how the tests prove it.
11
+ 3. Name the repo's own rules first.
12
+
13
+ Example, in a file of its own:
14
+
15
+ ````markdown
16
+ ---
17
+ part: security
18
+ ---
19
+ # Security
20
+
21
+ Only the document's owner may open the view. A call from another tenant gets 404, and a test proves it.
22
+ ````
@@ -0,0 +1,24 @@
1
+ # Shared decisions
2
+
3
+ It holds: The decisions every design in the family follows, and why.
4
+
5
+ Needs: Decide: none, Flow: none, Contract: none, Initiative: needed.
6
+
7
+ Rules:
8
+
9
+ 1. List the decisions every design in the family follows.
10
+ 2. Give the reason for each one.
11
+ 3. Link the tracker decision when one exists.
12
+
13
+ Example, in a file of its own:
14
+
15
+ ````markdown
16
+ ---
17
+ part: shared-decisions
18
+ ---
19
+ # Shared decisions
20
+
21
+ | Decision | Why |
22
+ |---|---|
23
+ | One queue for every reader | One place to watch and retry. |
24
+ ````
@@ -0,0 +1,25 @@
1
+ # States
2
+
3
+ It holds: The states a thing moves through, and what moves it.
4
+
5
+ Needs: Decide: none, Flow: optional, Contract: none, Initiative: none.
6
+
7
+ Rules:
8
+
9
+ 1. List the states a thing moves through.
10
+ 2. Say what moves it from each state to the next.
11
+ 3. Draw it as a state figure.
12
+
13
+ Example, in a file of its own:
14
+
15
+ ````markdown
16
+ ---
17
+ part: states
18
+ ---
19
+ # States
20
+
21
+ | From | Event | To |
22
+ |---|---|---|
23
+ | Waiting | The tests start | Running |
24
+ | Running | A test fails | Red |
25
+ ````
@@ -0,0 +1,26 @@
1
+ # Stories
2
+
3
+ It holds: One walkthrough for each story, step by step.
4
+
5
+ Needs: Decide: optional, Flow: needed, Contract: optional, Initiative: none.
6
+
7
+ Rules:
8
+
9
+ 1. Write one walkthrough for each story, step by step.
10
+ 2. Each step has a title and one or two sentences.
11
+ 3. Give each story a code, such as `US-1`, and put the code in the Key.
12
+
13
+ Example, in a file of its own:
14
+
15
+ ````markdown
16
+ ---
17
+ part: stories
18
+ ---
19
+ # Stories
20
+
21
+ ### US-1: a test goes red
22
+
23
+ 1. The lead opens a pull request.
24
+ 2. The gate runs the tests, and one goes red.
25
+ 3. The merge button stays blocked, and the owner sees the failing check.
26
+ ````
@@ -0,0 +1,33 @@
1
+ # Summary
2
+
3
+ It holds: The answer in a few lines, and one picture.
4
+
5
+ Needs: Decide: needed, Flow: needed, Contract: needed, Initiative: needed.
6
+
7
+ Rules:
8
+
9
+ 1. Lead with the answer: what changes, for whom, and why now.
10
+ 2. Keep it to two short paragraphs and one picture.
11
+ 3. A reader who stops here knows the whole design.
12
+
13
+ Example, in a file of its own:
14
+
15
+ ````markdown
16
+ ---
17
+ part: summary
18
+ ---
19
+ # Summary
20
+
21
+ Atlas runs the tests of a pull request before the merge, not after it.
22
+ A red test stops the merge and names the failing check.
23
+
24
+ ```figure
25
+ <svg viewBox="0 0 420 60" role="img" aria-label="Pull request, then tests, then merge">
26
+ <g font-family="var(--mono)" font-size="13" fill="var(--ink)">
27
+ <rect x="2" y="14" width="120" height="32" rx="6" fill="var(--card)" stroke="var(--line-strong)"/><text x="20" y="35">Pull request</text>
28
+ <rect x="150" y="14" width="120" height="32" rx="6" fill="var(--accent-bg)" stroke="var(--accent)"/><text x="188" y="35">Tests</text>
29
+ <rect x="298" y="14" width="120" height="32" rx="6" fill="var(--card)" stroke="var(--line-strong)"/><text x="336" y="35">Merge</text>
30
+ </g>
31
+ </svg>
32
+ ```
33
+ ````
@@ -0,0 +1,22 @@
1
+ # Why one initiative
2
+
3
+ It holds: Why these designs belong together.
4
+
5
+ Needs: Decide: none, Flow: none, Contract: none, Initiative: needed.
6
+
7
+ Rules:
8
+
9
+ 1. Say why these designs belong together.
10
+ 2. Name the one goal they serve.
11
+ 3. Say what would go wrong if each went alone.
12
+
13
+ Example, in a file of its own:
14
+
15
+ ````markdown
16
+ ---
17
+ part: why
18
+ ---
19
+ # Why one initiative
20
+
21
+ Each file type needs its own reader, but all share one viewer and one queue. Alone, each would build its own queue.
22
+ ````
@@ -0,0 +1,29 @@
1
+ # Your words
2
+
3
+ It holds: The owner's words, word for word. Claude's reading stays apart.
4
+
5
+ Needs: Decide: needed, Flow: needed, Contract: needed, Initiative: needed.
6
+
7
+ Rules:
8
+
9
+ 1. Quote the owner word for word, in a block quote, with the date and the place.
10
+ 2. Put your own reading after the quote, as a short list headed "What we take from it".
11
+ 3. Never change a word inside the quote.
12
+
13
+ Example, in a file of its own:
14
+
15
+ ````markdown
16
+ ---
17
+ part: words
18
+ ---
19
+ # Your words
20
+
21
+ > "I want tests to run before the merge, not after."
22
+
23
+ The owner, 9 October, in the project thread.
24
+
25
+ What we take from it:
26
+
27
+ - A red test stops the merge.
28
+ - The owner sees the failing check, not a log.
29
+ ````
@@ -0,0 +1,25 @@
1
+ # Yardstick
2
+
3
+ It holds: The tests every option must pass, set before the options.
4
+
5
+ Needs: Decide: needed, Flow: none, Contract: none, Initiative: none.
6
+
7
+ Rules:
8
+
9
+ 1. Set the tests every option must pass before you list the options.
10
+ 2. Give each test a short name, so the scorecard can use it.
11
+ 3. Keep it to five tests or fewer.
12
+
13
+ Example, in a file of its own:
14
+
15
+ ````markdown
16
+ ---
17
+ part: yardstick
18
+ ---
19
+ # Yardstick
20
+
21
+ | Test | What it asks |
22
+ |---|---|
23
+ | Stops red | Does a red test stop the merge? |
24
+ | Fast | Does the check finish in ten minutes? |
25
+ ````
@@ -0,0 +1,306 @@
1
+ # The parts of an Atlas design, and which kind needs each one.
2
+ #
3
+ # A design is a folder. design.yaml names its kinds. Each part is one
4
+ # markdown file in the folder, with `part: <id>` in its front matter.
5
+ # The design check reads this file to find a missing or empty part.
6
+ # The page builder reads it for the order and the groups of the rail.
7
+ # The guide in design/README.md shows the same table; a test keeps the two equal.
8
+ #
9
+ # Each part says what each kind needs:
10
+ # needed the part must be in the folder and must not be empty
11
+ # optional write it when it applies
12
+ # none the kind does not use it
13
+ # shared needed when design.yaml says `shared: true`, optional when not
14
+ #
15
+ # A design keeps no state. The tracker parts at the end are read from the
16
+ # tracker at build time. No part file may hold them.
17
+
18
+ kinds:
19
+ - id: decide
20
+ name: Decide
21
+ pick: There are several ways, and one must win.
22
+ - id: flow
23
+ name: Flow
24
+ pick: The behaviour is the hard part.
25
+ - id: contract
26
+ name: Contract
27
+ pick: An interface, a schema or a command changes.
28
+ - id: initiative
29
+ name: Initiative
30
+ pick: Many designs serve one goal.
31
+
32
+ groups:
33
+ - id: start
34
+ name: Start here
35
+ - id: decide
36
+ name: Decide
37
+ - id: flow
38
+ name: Flow
39
+ - id: contract
40
+ name: Contract
41
+ - id: initiative
42
+ name: Initiative
43
+ - id: prove
44
+ name: Prove it
45
+ - id: tracker
46
+ name: From the tracker
47
+
48
+ parts:
49
+ - id: summary
50
+ name: Summary
51
+ group: start
52
+ holds: The answer in a few lines, and one picture.
53
+ decide: needed
54
+ flow: needed
55
+ contract: needed
56
+ initiative: needed
57
+ - id: words
58
+ name: Your words
59
+ group: start
60
+ holds: The owner's words, word for word. Claude's reading stays apart.
61
+ decide: needed
62
+ flow: needed
63
+ contract: needed
64
+ initiative: needed
65
+ - id: goals
66
+ name: Goals and non-goals
67
+ group: start
68
+ holds: What it is for, what it is not, and how we know it worked.
69
+ decide: needed
70
+ flow: needed
71
+ contract: needed
72
+ initiative: needed
73
+
74
+ - id: problem
75
+ name: Problem today
76
+ group: decide
77
+ holds: What happens today, with a real example.
78
+ decide: needed
79
+ flow: optional
80
+ contract: optional
81
+ initiative: none
82
+ - id: yardstick
83
+ name: Yardstick
84
+ group: decide
85
+ holds: The tests every option must pass, set before the options.
86
+ decide: needed
87
+ flow: none
88
+ contract: none
89
+ initiative: none
90
+ - id: proposal
91
+ name: Proposal
92
+ group: decide
93
+ holds: The option we pick, and how it works.
94
+ decide: needed
95
+ flow: none
96
+ contract: none
97
+ initiative: none
98
+ - id: alternatives
99
+ name: Alternatives
100
+ group: decide
101
+ holds: The other options, and why each one lost.
102
+ decide: needed
103
+ flow: optional
104
+ contract: optional
105
+ initiative: none
106
+ - id: scorecard
107
+ name: Scorecard
108
+ group: decide
109
+ holds: Each option against each yardstick test.
110
+ decide: needed
111
+ flow: none
112
+ contract: none
113
+ initiative: none
114
+ - id: build
115
+ name: Build list
116
+ group: decide
117
+ holds: The pieces to build, in order.
118
+ decide: needed
119
+ flow: optional
120
+ contract: optional
121
+ initiative: none
122
+
123
+ - id: actors
124
+ name: Who and what
125
+ group: flow
126
+ holds: The people, agents and systems in the flow.
127
+ decide: optional
128
+ flow: needed
129
+ contract: optional
130
+ initiative: none
131
+ - id: stories
132
+ name: Stories
133
+ group: flow
134
+ holds: One walkthrough for each story, step by step.
135
+ decide: optional
136
+ flow: needed
137
+ contract: optional
138
+ initiative: none
139
+ - id: edges
140
+ name: Edge cases
141
+ group: flow
142
+ holds: What happens when a step fails or comes in a strange order.
143
+ decide: optional
144
+ flow: needed
145
+ contract: optional
146
+ initiative: none
147
+ - id: records
148
+ name: Records
149
+ group: flow
150
+ holds: The records each step reads and writes.
151
+ decide: none
152
+ flow: needed
153
+ contract: optional
154
+ initiative: none
155
+ - id: states
156
+ name: States
157
+ group: flow
158
+ holds: The states a thing moves through, and what moves it.
159
+ decide: none
160
+ flow: optional
161
+ contract: none
162
+ initiative: none
163
+
164
+ - id: routes
165
+ name: Routes and interface
166
+ group: contract
167
+ holds: Every route, exported function, command, tool or schema object that is added, changed or removed.
168
+ decide: none
169
+ flow: none
170
+ contract: needed
171
+ initiative: none
172
+ - id: calls
173
+ name: Calls and answers
174
+ group: contract
175
+ holds: A real call and its real answer for each entry of the interface. A schema repo shows a real query; a plugin shows a tool call.
176
+ decide: none
177
+ flow: none
178
+ contract: needed
179
+ initiative: none
180
+ - id: data
181
+ name: Data change
182
+ group: contract
183
+ holds: The schema or data change. Write "No change" and why, when there is none, as a library or a CLI often does.
184
+ decide: none
185
+ flow: none
186
+ contract: needed
187
+ initiative: none
188
+ - id: migration
189
+ name: Migration and undo
190
+ group: contract
191
+ holds: How old data moves to the new shape, and how the data change is undone.
192
+ decide: none
193
+ flow: none
194
+ contract: needed
195
+ initiative: none
196
+ - id: security
197
+ name: Security
198
+ group: contract
199
+ holds: Who may call it, what it may reach, and what it never leaks.
200
+ decide: optional
201
+ flow: optional
202
+ contract: needed
203
+ initiative: none
204
+ - id: rollout
205
+ name: Rollout
206
+ group: contract
207
+ holds: The order of release, and how we watch it.
208
+ decide: optional
209
+ flow: optional
210
+ contract: needed
211
+ initiative: none
212
+
213
+ - id: why
214
+ name: Why one initiative
215
+ group: initiative
216
+ holds: Why these designs belong together.
217
+ decide: none
218
+ flow: none
219
+ contract: none
220
+ initiative: needed
221
+ - id: shared-decisions
222
+ name: Shared decisions
223
+ group: initiative
224
+ holds: The decisions every design in the family follows, and why.
225
+ decide: none
226
+ flow: none
227
+ contract: none
228
+ initiative: needed
229
+ - id: order
230
+ name: Order and dependencies
231
+ group: initiative
232
+ holds: Which design comes first, and what each one waits on.
233
+ decide: none
234
+ flow: none
235
+ contract: none
236
+ initiative: needed
237
+
238
+ - id: risks
239
+ name: Risks
240
+ group: prove
241
+ holds: What breaks, and what we do. "Accepted" with a reason is valid.
242
+ decide: needed
243
+ flow: needed
244
+ contract: needed
245
+ initiative: needed
246
+ - id: proof
247
+ name: Test and proof plan
248
+ group: prove
249
+ holds: How each piece proves itself.
250
+ decide: needed
251
+ flow: needed
252
+ contract: needed
253
+ initiative: none
254
+ - id: repos
255
+ name: Each kind of repo
256
+ group: prove
257
+ holds: What the design means for a service, a library, a schema, a CLI and a plugin.
258
+ decide: shared
259
+ flow: shared
260
+ contract: shared
261
+ initiative: none
262
+ - id: change
263
+ name: Change and undo
264
+ group: prove
265
+ holds: The kind of change, its impact, how to undo it, and each existing test it changes.
266
+ decide: needed
267
+ flow: needed
268
+ contract: needed
269
+ initiative: optional
270
+ - id: done
271
+ name: Done line
272
+ group: prove
273
+ holds: Lines someone else can check. The approval lives in the tracker.
274
+ decide: needed
275
+ flow: needed
276
+ contract: needed
277
+ initiative: needed
278
+ - id: key
279
+ name: Key
280
+ group: prove
281
+ holds: Every word and code the design uses.
282
+ decide: needed
283
+ flow: needed
284
+ contract: needed
285
+ initiative: needed
286
+
287
+ # Read from the tracker at build time. The page shows them read only.
288
+ tracker:
289
+ - id: questions
290
+ name: Questions
291
+ holds: Each question to the owner, open or answered, with the answer.
292
+ - id: decisions
293
+ name: Decisions
294
+ holds: Each decision, in the owner's words, with its date.
295
+ - id: approval
296
+ name: Approval and lock
297
+ holds: The owner's approval and the lock, with the words and the date.
298
+ - id: since
299
+ name: Since approval
300
+ holds: Each change after approval, the part it touched, and the owner's words.
301
+ - id: family
302
+ name: Family
303
+ holds: The designs linked to this one, with their state.
304
+ - id: rollup
305
+ name: Roll-up
306
+ holds: How far the family has come. Initiative designs only.
@@ -25,7 +25,7 @@ tripwires: [definition_of_done, security, schema_migrations, money_cost]
25
25
  tiers: [hotfix, standard, initiative]
26
26
  tier_escalators: [migrations, auth_rls_surface, new_external_dependency, money_cost]
27
27
 
28
- # Both templates travel with the package, beside the kernel.
28
+ # The design format and the resume anchor travel with the package, beside the kernel.
29
29
  templates:
30
- design_doc: templates/design-doc.md
30
+ design_doc: design/README.md
31
31
  resume_anchor: templates/resume-anchor.md