@zalom/plastic 2.0.0-alpha.9 → 2.0.2

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 (326) hide show
  1. package/PLASTIC.md +13 -136
  2. package/README.md +357 -133
  3. package/agents/plastic-enforcer.md +21 -16
  4. package/agents/plastic-executor.md +15 -4
  5. package/agents/plastic-node-research.md +30 -0
  6. package/agents/plastic-node-verify.md +28 -0
  7. package/agents/plastic-node-work.md +33 -0
  8. package/agents/{plastic-advisor.md → plastic-primary-advisor.md} +7 -9
  9. package/agents/{plastic-faux-advisor.md → plastic-secondary-advisor.md} +9 -12
  10. package/assets/plastic-logo.svg +1 -0
  11. package/bin/crap +4 -0
  12. package/bin/lib/context_budget.rb +43 -6
  13. package/bin/lib/skill_census.rb +839 -0
  14. package/bin/plastic +8 -0
  15. package/bin/plastic-skill-census +114 -0
  16. package/bin/test +24 -4
  17. package/bin/verify-change +345 -0
  18. package/config_asks.yml +4 -4
  19. package/deprecations.yml +1 -1
  20. package/{skills/agent-advisor/references → docs/help}/advisor-protocol.md +19 -24
  21. package/{skills/auto/references → docs/help}/agent-architecture.md +16 -14
  22. package/docs/help/completion-and-done.md +53 -0
  23. package/docs/help/human-report-contract.md +152 -0
  24. package/{skills/conventions/references → docs/help}/knowledge-graph.md +9 -0
  25. package/{skills/conventions/references → docs/help}/locks-and-worktrees.md +11 -13
  26. package/{skills/conventions/references → docs/help}/maintenance-and-revisions.md +1 -1
  27. package/{skills/conventions/references → docs/help}/roadmaps.md +5 -4
  28. package/{skills/tutorial/references → docs/help}/track-1-guided.md +28 -47
  29. package/{skills/tutorial/references → docs/help}/track-2-auto.md +8 -8
  30. package/{skills/tutorial/references → docs/help}/track-3-projects-and-roadmaps.md +24 -17
  31. package/hooks/call-budget +4 -0
  32. package/hooks/hooks.json +24 -0
  33. package/hooks/message-display +55 -2
  34. package/hooks/session-start +5 -1
  35. package/hooks/statusline +32 -27
  36. package/hooks/stop +5 -0
  37. package/package.json +5 -3
  38. package/scripts/append-ledger +2 -1
  39. package/scripts/dashboard.rb +267 -16
  40. package/scripts/day-summary +2 -1
  41. package/scripts/doctor.rb +680 -39
  42. package/scripts/end-intent +378 -56
  43. package/scripts/exec-worktree +5 -5
  44. package/scripts/file-session-intent +2 -1
  45. package/scripts/graph-measure +249 -0
  46. package/scripts/hook-call-budget +222 -0
  47. package/scripts/hook-capture +24 -123
  48. package/scripts/hook-close +2 -1
  49. package/scripts/hook-message-display +7 -0
  50. package/scripts/hook-record +24 -16
  51. package/scripts/hook-savepoint +27 -3
  52. package/scripts/hook-session-start +359 -321
  53. package/scripts/hook-stop +58 -0
  54. package/scripts/index-projection +74 -0
  55. package/scripts/insight-append +17 -4
  56. package/scripts/install.rb +9 -7
  57. package/scripts/lib/action_graph_shim.rb +279 -0
  58. package/scripts/lib/active_delivery.rb +105 -0
  59. package/scripts/lib/agent_models.rb +63 -25
  60. package/scripts/lib/arm.rb +74 -91
  61. package/scripts/lib/atomic_write.rb +31 -0
  62. package/scripts/lib/backup.rb +65 -0
  63. package/scripts/lib/cli/command.rb +92 -0
  64. package/scripts/lib/cli/commands/auto.rb +18 -0
  65. package/scripts/lib/cli/commands/auto_brief.rb +44 -0
  66. package/scripts/lib/cli/commands/auto_lock.rb +111 -0
  67. package/scripts/lib/cli/commands/auto_report.rb +50 -0
  68. package/scripts/lib/cli/commands/auto_take.rb +68 -0
  69. package/scripts/lib/cli/commands/backup.rb +43 -0
  70. package/scripts/lib/cli/commands/checkout.rb +25 -0
  71. package/scripts/lib/cli/commands/continue.rb +66 -0
  72. package/scripts/lib/cli/commands/doctor.rb +81 -0
  73. package/scripts/lib/cli/commands/feedback.rb +40 -0
  74. package/scripts/lib/cli/commands/help.rb +69 -0
  75. package/scripts/lib/cli/commands/hook.rb +32 -0
  76. package/scripts/lib/cli/commands/index.rb +23 -0
  77. package/scripts/lib/cli/commands/install.rb +21 -0
  78. package/scripts/lib/cli/commands/installer_verb.rb +37 -0
  79. package/scripts/lib/cli/commands/intent.rb +19 -0
  80. package/scripts/lib/cli/commands/intent_answer.rb +37 -0
  81. package/scripts/lib/cli/commands/intent_command.rb +58 -0
  82. package/scripts/lib/cli/commands/intent_end.rb +75 -0
  83. package/scripts/lib/cli/commands/intent_new.rb +62 -0
  84. package/scripts/lib/cli/commands/intent_note.rb +43 -0
  85. package/scripts/lib/cli/commands/intent_rule.rb +36 -0
  86. package/scripts/lib/cli/commands/intent_show.rb +32 -0
  87. package/scripts/lib/cli/commands/intent_spec.rb +44 -0
  88. package/scripts/lib/cli/commands/intent_step.rb +79 -0
  89. package/scripts/lib/cli/commands/intent_verify.rb +26 -0
  90. package/scripts/lib/cli/commands/migrate.rb +16 -0
  91. package/scripts/lib/cli/commands/migrate_stores.rb +31 -0
  92. package/scripts/lib/cli/commands/next.rb +54 -0
  93. package/scripts/lib/cli/commands/project.rb +19 -0
  94. package/scripts/lib/cli/commands/project_links.rb +46 -0
  95. package/scripts/lib/cli/commands/project_list.rb +20 -0
  96. package/scripts/lib/cli/commands/project_new.rb +95 -0
  97. package/scripts/lib/cli/commands/query.rb +31 -0
  98. package/scripts/lib/cli/commands/render.rb +35 -0
  99. package/scripts/lib/cli/commands/roadmap.rb +19 -0
  100. package/scripts/lib/cli/commands/roadmap_check.rb +54 -0
  101. package/scripts/lib/cli/commands/roadmap_log.rb +54 -0
  102. package/scripts/lib/cli/commands/roadmap_migrate.rb +53 -0
  103. package/scripts/lib/cli/commands/roadmap_next.rb +77 -0
  104. package/scripts/lib/cli/commands/roadmap_show.rb +65 -0
  105. package/scripts/lib/cli/commands/rollback.rb +20 -0
  106. package/scripts/lib/cli/commands/search.rb +60 -0
  107. package/scripts/lib/cli/commands/session.rb +18 -0
  108. package/scripts/lib/cli/commands/session_commit.rb +42 -0
  109. package/scripts/lib/cli/commands/session_handoff.rb +34 -0
  110. package/scripts/lib/cli/commands/session_summary.rb +35 -0
  111. package/scripts/lib/cli/commands/status.rb +68 -0
  112. package/scripts/lib/cli/commands/subcommand_list.rb +36 -0
  113. package/scripts/lib/cli/commands/sync.rb +55 -0
  114. package/scripts/lib/cli/commands/uninstall.rb +20 -0
  115. package/scripts/lib/cli/commands/update.rb +20 -0
  116. package/scripts/lib/cli/commands/version.rb +53 -0
  117. package/scripts/lib/cli/frontier.rb +86 -0
  118. package/scripts/lib/cli/intent_progress.rb +36 -0
  119. package/scripts/lib/cli/legacy.rb +80 -0
  120. package/scripts/lib/cli/output.rb +137 -0
  121. package/scripts/lib/cli/scope.rb +134 -0
  122. package/scripts/lib/cli/table.rb +65 -0
  123. package/scripts/lib/cli.rb +94 -0
  124. package/scripts/lib/codex_adapter.rb +198 -0
  125. package/scripts/lib/compact_instructions.rb +13 -5
  126. package/scripts/lib/core_integrity.rb +71 -0
  127. package/scripts/lib/dashboard_screen.rb +40 -0
  128. package/scripts/lib/data_boundary.rb +132 -0
  129. package/scripts/lib/day_summary.rb +23 -14
  130. package/scripts/lib/doctor_core.rb +114 -38
  131. package/scripts/lib/doctor_session_ledger.rb +5 -53
  132. package/scripts/lib/engine_permissions.rb +88 -0
  133. package/scripts/lib/exec_worktree.rb +24 -21
  134. package/scripts/lib/feedback_report.rb +1 -1
  135. package/scripts/lib/graph_edges.rb +137 -0
  136. package/scripts/lib/graph_file.rb +246 -0
  137. package/scripts/lib/graph_measure.rb +645 -0
  138. package/scripts/lib/graph_measure_budget.rb +409 -0
  139. package/scripts/lib/graph_measure_cohorts.rb +487 -0
  140. package/scripts/lib/graph_measure_models.rb +413 -0
  141. package/scripts/lib/graph_measure_report.rb +532 -0
  142. package/scripts/lib/graph_tree.rb +98 -0
  143. package/scripts/lib/guarded_append.rb +155 -0
  144. package/scripts/lib/handoff.rb +40 -13
  145. package/scripts/lib/harness_adapter.rb +184 -0
  146. package/scripts/lib/hook_registry.rb +27 -3
  147. package/scripts/lib/hook_replay.rb +235 -0
  148. package/scripts/lib/index_entry.rb +62 -0
  149. package/scripts/lib/index_projection.rb +201 -0
  150. package/scripts/lib/insights.rb +1 -1
  151. package/scripts/lib/installer_core.rb +543 -71
  152. package/scripts/lib/intent_screen.rb +4 -4
  153. package/scripts/lib/intent_screen_ansi.rb +73 -12
  154. package/scripts/lib/intent_validator.rb +2 -2
  155. package/scripts/lib/lock.rb +10 -11
  156. package/scripts/lib/message_display.rb +350 -54
  157. package/scripts/lib/meter_watch.rb +185 -0
  158. package/scripts/lib/node_file.rb +234 -0
  159. package/scripts/lib/node_ids.rb +99 -0
  160. package/scripts/lib/node_input.rb +921 -0
  161. package/scripts/lib/node_input_compatibility.rb +62 -0
  162. package/scripts/lib/node_ledger.rb +386 -0
  163. package/scripts/lib/node_progress.rb +153 -0
  164. package/scripts/lib/node_return.rb +204 -0
  165. package/scripts/lib/node_worktree.rb +337 -0
  166. package/scripts/lib/outcome_report.rb +440 -0
  167. package/scripts/lib/preflight.rb +4 -6
  168. package/scripts/lib/project_config.rb +46 -0
  169. package/scripts/lib/project_validator.rb +3 -2
  170. package/scripts/lib/qmd_sync.rb +8 -7
  171. package/scripts/lib/ready_set.rb +462 -0
  172. package/scripts/lib/reference_archive.rb +45 -0
  173. package/scripts/lib/release_guard.rb +18 -0
  174. package/scripts/lib/report_screen.rb +1371 -47
  175. package/scripts/lib/rlm/corpus.rb +13 -0
  176. package/scripts/lib/rlm/probe.rb +29 -0
  177. package/scripts/lib/rlm/query.rb +22 -0
  178. package/scripts/lib/roadmap_graph.rb +210 -0
  179. package/scripts/lib/roadmap_migration.rb +95 -0
  180. package/scripts/lib/roadmap_queue.rb +170 -12
  181. package/scripts/lib/roadmap_render.rb +150 -0
  182. package/scripts/lib/roadmap_savepoint.rb +64 -14
  183. package/scripts/lib/runner_absorb.rb +703 -0
  184. package/scripts/lib/runner_answer.rb +206 -0
  185. package/scripts/lib/runner_core.rb +194 -0
  186. package/scripts/lib/runner_dispatch.rb +526 -0
  187. package/scripts/lib/runner_policy.rb +191 -0
  188. package/scripts/lib/runner_proposals.rb +275 -0
  189. package/scripts/lib/runner_rewind.rb +201 -0
  190. package/scripts/lib/runner_sweep.rb +231 -0
  191. package/scripts/lib/runner_until_empty.rb +252 -0
  192. package/scripts/lib/runner_watch.rb +389 -0
  193. package/scripts/lib/savepoint.rb +141 -19
  194. package/scripts/lib/scaffold_intent.rb +6 -3
  195. package/scripts/lib/screen_paint.rb +365 -28
  196. package/scripts/lib/screens/dashboard.rb +20 -0
  197. package/scripts/lib/screens/plan.rb +18 -0
  198. package/scripts/lib/screens/roadmap.rb +15 -0
  199. package/scripts/lib/search_index.rb +55 -0
  200. package/scripts/lib/session_close.rb +30 -28
  201. package/scripts/lib/session_git.rb +67 -19
  202. package/scripts/lib/session_ledger.rb +48 -4
  203. package/scripts/lib/session_usage.rb +190 -0
  204. package/scripts/lib/sqlite.rb +22 -0
  205. package/scripts/lib/stop_gate.rb +95 -0
  206. package/scripts/lib/store_discovery.rb +7 -6
  207. package/scripts/lib/store_layout.rb +54 -0
  208. package/scripts/lib/store_provisioning.rb +2 -1
  209. package/scripts/lib/store_sync.rb +85 -0
  210. package/scripts/lib/stores_move.rb +93 -0
  211. package/scripts/lib/untouched_scaffold.rb +51 -0
  212. package/scripts/lib/verify_intent.rb +36 -8
  213. package/scripts/lib/version_number.rb +48 -0
  214. package/scripts/lib/work_graph.rb +59 -0
  215. package/scripts/lib/work_graph_validator.rb +201 -0
  216. package/scripts/lib/worktree.rb +27 -32
  217. package/scripts/lib/worktree_sweep.rb +6 -5
  218. package/scripts/link-suggest +2 -1
  219. package/scripts/meter-watch +57 -0
  220. package/scripts/migrate-to-global +1 -1
  221. package/scripts/new-intent +4 -13
  222. package/scripts/node-input +92 -0
  223. package/scripts/node-run +225 -0
  224. package/scripts/node-transition +291 -0
  225. package/scripts/outcome-report +74 -0
  226. package/scripts/plastic-lock +65 -60
  227. package/scripts/project-links +6 -21
  228. package/scripts/promote-session-item +3 -2
  229. package/scripts/read-config +53 -9
  230. package/scripts/ready-set +126 -0
  231. package/scripts/release-check +123 -0
  232. package/scripts/report-screen +177 -16
  233. package/scripts/roadmap-graph +125 -0
  234. package/scripts/roadmap-savepoint +7 -0
  235. package/scripts/rollback.rb +5 -1
  236. package/scripts/runner +581 -0
  237. package/scripts/savepoint-note +11 -9
  238. package/scripts/session-commit +2 -1
  239. package/scripts/session-usage +56 -0
  240. package/scripts/skill-lint +115 -6
  241. package/scripts/spawn-preamble +2 -2
  242. package/scripts/update.rb +31 -4
  243. package/scripts/validate-work-graph +39 -0
  244. package/scripts/verify-intent +3 -2
  245. package/scripts/write-handoff +2 -1
  246. package/templates/agents.md +7 -7
  247. package/templates/config.yml +16 -9
  248. package/templates/dashboard-screen.md +22 -0
  249. package/templates/display-fixture.md +21 -0
  250. package/templates/graph.md +16 -0
  251. package/templates/index.md +1 -1
  252. package/templates/intent-screen.md +1 -1
  253. package/templates/node-decision.md +11 -0
  254. package/templates/node-research.md +13 -0
  255. package/templates/node-verify.md +13 -0
  256. package/templates/node-work.md +22 -0
  257. package/templates/outcome.md +8 -3
  258. package/templates/project.yml +1 -1
  259. package/templates/render.css +10 -0
  260. package/templates/report-plan.md +15 -0
  261. package/templates/report-roadmap-delivered.md +10 -0
  262. package/templates/report-roadmap-plan.md +9 -0
  263. package/templates/report-roadmap-state.md +9 -0
  264. package/templates/report-state.md +1 -1
  265. package/templates/roadmap.md +13 -0
  266. package/bin/plastic.js +0 -70
  267. package/scripts/lib/bridge.rb +0 -116
  268. package/skills/agent-advisor/SKILL.md +0 -92
  269. package/skills/auto/SKILL.md +0 -296
  270. package/skills/auto/evals/evals.json +0 -255
  271. package/skills/auto/references/end-tail.md +0 -66
  272. package/skills/auto/references/human-report-contract.md +0 -78
  273. package/skills/conventions/SKILL.md +0 -29
  274. package/skills/conventions/references/completion-and-done.md +0 -43
  275. package/skills/dashboard/SKILL.md +0 -169
  276. package/skills/dashboard/evals/evals.json +0 -38
  277. package/skills/dashboard/references/classification.md +0 -22
  278. package/skills/dashboard/templates/dashboard-global.md +0 -20
  279. package/skills/dashboard/templates/dashboard-project.md +0 -19
  280. package/skills/direct/SKILL.md +0 -66
  281. package/skills/direct/references/request-signals.md +0 -59
  282. package/skills/doctor/SKILL.md +0 -299
  283. package/skills/doctor/report.md +0 -102
  284. package/skills/feedback/SKILL.md +0 -98
  285. package/skills/feedback/references/transport-and-privacy.md +0 -65
  286. package/skills/feedback/report.md +0 -36
  287. package/skills/install/SKILL.md +0 -217
  288. package/skills/intent-continuing/SKILL.md +0 -154
  289. package/skills/intent-continuing/references/board-fill.md +0 -43
  290. package/skills/intent-continuing/references/boarding-matrix.md +0 -34
  291. package/skills/intent-continuing/references/context-management.md +0 -28
  292. package/skills/intent-continuing/references/liveness-ranking.md +0 -57
  293. package/skills/intent-creating/SKILL.md +0 -164
  294. package/skills/intent-creating/evals/evals.json +0 -72
  295. package/skills/intent-creating/references/lifecycle.md +0 -81
  296. package/skills/intent-creating/references/wikilinks.md +0 -8
  297. package/skills/intent-ending/SKILL.md +0 -176
  298. package/skills/intent-ending/evals/evals.json +0 -74
  299. package/skills/intent-executing/SKILL.md +0 -170
  300. package/skills/intent-executing/evals/evals.json +0 -66
  301. package/skills/intent-executing/implementer-prompt.md +0 -42
  302. package/skills/intent-executing/spec-reviewer-prompt.md +0 -27
  303. package/skills/intent-speccing/SKILL.md +0 -130
  304. package/skills/intent-speccing/evals/evals.json +0 -126
  305. package/skills/intent-speccing/references/design-principles.md +0 -44
  306. package/skills/intent-speccing/references/per-section-fill-rules.md +0 -92
  307. package/skills/intent-speccing/references/self-verify-checklist.md +0 -37
  308. package/skills/project-creating/SKILL.md +0 -162
  309. package/skills/project-creating/references/hubs-projects.md +0 -55
  310. package/skills/project-creating/references/project-scaffolding.md +0 -97
  311. package/skills/releasing/SKILL.md +0 -337
  312. package/skills/releasing/references/deprecations.md +0 -60
  313. package/skills/releasing/references/promotion-and-tagging.md +0 -66
  314. package/skills/releasing/references/release-lines.md +0 -105
  315. package/skills/roadmap/SKILL.md +0 -64
  316. package/skills/roadmap/references/file-format.md +0 -124
  317. package/skills/roadmap/references/operations.md +0 -112
  318. package/skills/rollback/SKILL.md +0 -91
  319. package/skills/tutorial/SKILL.md +0 -65
  320. package/skills/tutorial/evals/evals.json +0 -186
  321. package/skills/uninstall/SKILL.md +0 -75
  322. package/skills/update/SKILL.md +0 -126
  323. /package/{skills/auto/references → docs/help}/agent-report-contract.md +0 -0
  324. /package/{skills/intent-executing → docs/help}/code-quality-reviewer-prompt.md +0 -0
  325. /package/{skills/conventions/references → docs/help}/lifecycle-and-savepoints.md +0 -0
  326. /package/{skills/intent-executing → docs/help}/plan-reviewer-prompt.md +0 -0
@@ -28,13 +28,14 @@ in 2.0, intent 304; the lead writes the Why and How record itself):
28
28
  reviewed before code; dispatches the executor; applies the risk rule; closes.
29
29
  - **plastic-executor** (Exec): commits the matrix's tests red, writes the code, checks off
30
30
  `checklist.md`, appends `## Insights`, and drives the suite green.
31
- - **the plan reviewer**: a fresh agent on `plastic-intent-executing`'s
32
- `plan-reviewer-prompt.md`, dispatched once before any code exists.
33
- - **the post-execution reviewer**: a fresh agent on `code-quality-reviewer-prompt.md`,
31
+ - **the plan reviewer**: a fresh agent on the auto skill's
32
+ `references/plan-reviewer-prompt.md`, an optional dispatch before any code exists.
33
+ - **the post-execution reviewer**: a fresh agent on `references/code-quality-reviewer-prompt.md`,
34
34
  dispatched only when the auto skill's risk rule fires; never the maker.
35
35
 
36
- Two agent boots is the normal delivery (the plan reviewer, the executor); the post-execution
37
- reviewer is the third only when risk calls for it.
36
+ One agent boot (the executor) is the minimum delivery; the plan reviewer is a second,
37
+ optional boot when the lead calls for review before code, and the post-execution reviewer is
38
+ a third only when risk calls for it.
38
39
 
39
40
  ### Handoff Contracts
40
41
 
@@ -44,8 +45,8 @@ the code, the red and green commits, a checked-off checklist, `## Insights`, and
44
45
  report. Dispatch is sequential on a single branch, because the deliverables share files.
45
46
 
46
47
  The chain: intent `## Intent` / `## Context`, then enriched `## Context` plus `### Decisions`,
47
- then `spec.md`, then `plan.md` plus `actions/` plus `checklist.md`, then the plan review, then
48
- the code changes plus a checked-off checklist plus `## Insights`.
48
+ then `spec.md`, then `plan.md` plus `actions/` plus `checklist.md`, then an optional plan
49
+ review, then the code changes plus a checked-off checklist plus `## Insights`.
49
50
 
50
51
  ### Spawn Preamble (L2 live-state injection)
51
52
 
@@ -88,9 +89,10 @@ not revoke the registered delegate's authorization.
88
89
 
89
90
  ### Review Ownership
90
91
 
91
- The lead owns every review decision: it dispatches the plan reviewer before code, folds the
92
- findings itself, and decides from the risk rule whether the post-execution reviewer runs. It
93
- never delegates that decision, and neither reviewer is ever the maker of what it reviews.
92
+ The lead owns every review decision: it dispatches the plan reviewer before code when one
93
+ runs, takes the review into its own record, and decides from the risk rule whether the
94
+ post-execution reviewer runs. It never delegates that decision, and neither reviewer is ever
95
+ the maker of what it reviews.
94
96
  Nothing blocks a write in 2.0 (the gate hooks were removed, intent 302); the lock, the
95
97
  worktree, and the record are how the team keeps one delivery in one place.
96
98
 
@@ -116,14 +118,14 @@ written path, and the lead verifies state from the files (`plastic-lock status`,
116
118
  ### Delegation
117
119
 
118
120
  The roles are thin handoff contracts, not a spawning engine. Dispatch runs through Plastic's
119
- own engine, `plastic-intent-executing`: one executor for the consolidated action, the two
121
+ own engine, `plastic intent step`: one executor for the consolidated action, the two
120
122
  reviewer prompts as fresh agents. The team model defines who hands what to whom and where the
121
123
  reviews sit; the engine does the actual spawning.
122
124
 
123
125
  ### Fallback by Case
124
126
 
125
127
  If the harness supports agent dispatch, auto mode dispatches through
126
- `plastic-intent-executing`. If the harness has no agent dispatch at all (Codex CLI today), the
128
+ `plastic intent step`. If the harness has no agent dispatch at all (Codex CLI today), the
127
129
  lead walks the five steps itself: it still writes the matrix and the tests first, and reviews
128
130
  its own plan against the matrix before code, saying so in `## Insights`.
129
131
 
@@ -145,8 +147,8 @@ tests first, one suite run per intent.
145
147
  ## Autonomous Delivery
146
148
 
147
149
  Human owns What and Why for human-initiated intents. The team assists (research, exploration)
148
- but the human drives until handoff. When Why is complete, or the human triggers `plastic-auto`,
149
- the auto team takes over How and Exec autonomously.
150
+ but the human drives until handoff. When Why is complete, or the human runs
151
+ `plastic auto take ID`, the auto team takes over How and Exec autonomously.
150
152
 
151
153
  - **Safe-by-default:** the executor always prefers non-destructive routes (rename vs delete,
152
154
  additive migrations, backups before changes). Destructive actions on existing projects
@@ -0,0 +1,53 @@
1
+ # Completion and the End Tail
2
+
3
+ This chapter holds what "intent done" means and the End-stage tail.
4
+
5
+ #### What "intent done" means (intent 93)
6
+
7
+ Completion is one law with three signals, and they must agree. INDEX `## Completed` /
8
+ `## Abandoned` is the single canonical terminal marker: it is the store-wide ledger a fresh
9
+ session reads first, so it wins on any conflict. `outcome.md` is the "deliverable exists"
10
+ signal, and the savepoint's terminal `delivered|abandoned` line is the audit echo. All three
11
+ must agree; when they disagree, INDEX is authoritative and `doctor` flags the mismatch (the
12
+ `done_signals` check: `outcome.md` real but still under `## Active`, or terminal without a
13
+ real `outcome.md`, or a terminal intent whose savepoint carries no terminal disposition line).
14
+
15
+ `outcome.md` is mandatory at every terminal transition, delivered and abandoned alike. It
16
+ self-declares its disposition through a `disposition: delivered|abandoned` frontmatter
17
+ header. The delivered path authors it with the result; the abandoned path authors it with
18
+ the abandonment reason and no longer leaves the scaffolded placeholder sentinel in place.
19
+
20
+ The canonical End tail runs in this order: `outcome.md -> INDEX terminal -> the terminal
21
+ savepoint line -> commit -> disarm (Worktree.release -> Lock.release) -> QMD reindex`, the
22
+ reindex always LAST. Running the reindex last keeps the index from ever referencing a lock
23
+ that disarm just removed.
24
+
25
+ `scripts/end-intent` never merges code. Before a delivered close writes anything, it checks
26
+ that the intent's code is already merged into the current branch of the repo checkout. It
27
+ checks the commit the code worktree is on, even when that worktree is on a renamed branch or
28
+ a detached HEAD, and it checks the code branch after the worktree is gone. The repo checkout
29
+ must be on the branch you release from, not detached and not on the code branch. If the code
30
+ isn't merged, or Git can't tell, the close exits 9 and changes nothing: INDEX, the savepoint, the
31
+ lock, and the worktree all stay as they were. `--dry-run` refuses the same way. The refusal
32
+ names the merge to run, for example `git -C <repo> merge plastic/<id>--<slug>`. Run that
33
+ ordinary merge, or release the work through your usual process, and then run the close
34
+ again. An abandoned close and an intent with no code repository skip this check.
35
+
36
+ `scripts/end-intent` performs this order's disarm step (verify the code worktree is clean,
37
+ then remove the worktree, then clear the lock) as its own step 5, mechanically, since
38
+ intent 188: a session no longer needs a separate one-liner for it, and the script's own
39
+ exit code (0) is the single fact a caller needs that the intent is closed AND its delivery
40
+ lock is gone. A pre-flight lock guard runs before anything is written (refuses a live
41
+ foreign session, reclaims a stale one with an audit line), and a dirty code worktree
42
+ refuses before removal rather than force-discarding uncommitted changes.
43
+
44
+ The post-done access window is lock-bounded: `[INDEX terminal -> Lock.release]`. Through it
45
+ the completing session keeps full read and write access to the terminal directory (108's
46
+ lock-held keep-guard holds it open while `delivery.lock` exists). Once the lock is released
47
+ the window closes and the directory is frozen. A crash mid-tail is recovered by stale-lock
48
+ reclaim plus finishing the tail; `doctor` surfaces this as a "stalled completion" (terminal in
49
+ INDEX but the lock is still present or stale). Finishing the tail is FINISHING a completion, never a reactivation:
50
+ a done intent is never moved back to `## Active`.
51
+
52
+ One report per audience: a delivery produces `outcome.md` plus one EM-to-CTO owner report, and
53
+ no other step restates either (see `plastic help human-report-contract`).
@@ -0,0 +1,152 @@
1
+ # Human Report Contract (the report screens, intent 317)
2
+
3
+ D15: the prose EM-to-CTO briefing this doc used to define is retired. The orchestrator now
4
+ prints one of these report screens, filled from the record by `scripts/report-screen`, never
5
+ written by eye:
6
+
7
+ - **`report-screen plan <intent_dir>`** - the pre-delivery report (intent 331b), printed once
8
+ at the How boundary, before the executor is dispatched: Asked, Decisions, Steps, Mode,
9
+ Reviewer, then the Steps table (Step, Action, What) and the Risks table.
10
+ - **`report-screen state <intent_dir> [--changed "<text>"]`** - the mid-delivery report. One
11
+ intent's field table (Store, Status, Stage, Savepoint, Progress, Next, Insight) plus a
12
+ `Changed` row naming what caused the print, and its Steps table.
13
+ - **`report-screen state --all <store_root>`** - the roster across every in-delivery intent,
14
+ most recently changed first, then one collapsed block (Stage, Next, Changed, first three
15
+ open steps) per intent.
16
+ - **`report-screen delivered <intent_dir>`** - the post-delivery report, printed once at close:
17
+ Asked, Delivered (with a Proven-by column), Evidence, Needs you.
18
+ - **`report-screen delay <intent_dir>`** - printed only on request ("why did X take so long"):
19
+ the delivery as a timeline plus the derived `Where the time went` line.
20
+ - **`report-screen session <tier_root>`** - the answer to an UNNAMED status ask ("where are we
21
+ with delivery", "what is the status"): one `delivered` screen per intent this session
22
+ completed, oldest first, then the `state --all` roster. Intent 330's ruling: a status ask
23
+ answers with what actually shipped, not the in-flight roster alone.
24
+ - **`dashboard.rb continue|project <slug> --screen`** - the dashboard screen (intent 331d):
25
+ Active, In delivery, Delivered, Roadmap, Sessions, Changed, then the Where-we-are and
26
+ Where-we-go-next tables. A separate script from the other four (`dashboard.rb`, not
27
+ `report-screen`), since it aggregates across a whole store or project rather than one
28
+ intent; it prints on `continue` and on loading a project, not as a delivery trigger.
29
+
30
+ ## Binding table (intent 331f)
31
+
32
+ Every command or lead role that shows state names its own report verb, one row per binding
33
+ and trigger. Each one carries the SAME rule next to its verb: print the screen as the first
34
+ characters of the reply, nothing before it, no fence, or the hook cannot paint it.
35
+
36
+ | Command or lead | Trigger | Verb |
37
+ |---|---|---|
38
+ | `plastic continue` | project route (continue, load project) | `dashboard.rb ... --screen` |
39
+ | `plastic continue` | a named intent | `report-screen state` |
40
+ | `plastic continue` | "where are we" (a status ask) | `report-screen session` |
41
+ | `plastic continue` | "why so long" | `report-screen delay` |
42
+ | `plastic continue` | a roadmap route | `report-screen roadmap ... state` |
43
+ | the auto team's lead | the How boundary, before the executor | `report-screen plan` |
44
+ | the auto team's lead | each of the five triggers | `report-screen state` |
45
+ | the auto team's lead | close | `report-screen delivered` |
46
+ | `plastic intent end` | the close | `report-screen delivered` |
47
+ | `plastic intent spec` | the action files are written | `report-screen plan` |
48
+ | `plastic roadmap show` | any invocation | `report-screen roadmap ... state` |
49
+ | `plastic status` | any invocation | in-process (`Scope#stores`) |
50
+ | `plastic intent step` | after the red commit, and after the suite | `report-screen state` |
51
+
52
+ ## A roadmap's own three reports (intent 331c)
53
+
54
+ A roadmap gets the same pre-, in-, and post-delivery shape as an intent, through
55
+ `report-screen roadmap <roadmap.md> plan|state|delivered [--ansi] [--store-root <dir>]`:
56
+
57
+ - **`roadmap plan`** - the pre-delivery report: the Goal's first sentence, the batch (or legacy
58
+ wave) count and intent count, the batch order, and when the roadmap was created; then the
59
+ full entries table.
60
+ - **`roadmap state`** - the in-delivery report: Goal, a Progress bar over intents delivered of
61
+ intents total (never batches), the frontier batch, who is delivering it and their lead, the
62
+ next queued entry, and the last ledger event; then the entries table with each entry's own
63
+ checklist progress and lead.
64
+ - **`roadmap delivered`** - the post-delivery report: a meta line (closed time, or `in progress`
65
+ when the goal is not yet reached; intent count; duration) directly under the title, the
66
+ delivered table with each entry's merge sha, and the `## Log` table.
67
+
68
+ Every cell traces to the roadmap file, `INDEX.md` (which always wins on status), the roadmap's
69
+ own savepoint ledger, or (falling back when no ledger file exists) the roadmap's `## Log` -
70
+ never a second parser: `RoadmapQueue`'s own public `roadmap` reader supplies every entry.
71
+
72
+ ## The five triggers for `state`
73
+
74
+ Print `state` (one intent, or `--all` for the roster) on any of these; a checklist tick alone,
75
+ an executor's intermediate commit, or an agent going idle is NOT one of them:
76
+
77
+ | Trigger | Scope |
78
+ |---|---|
79
+ | A savepoint line lands (a stage boundary: Why, How, Exec started, outcome written, End) | that intent |
80
+ | A review verdict returns (plan review or post-execution review), naming what it changed | that intent |
81
+ | A blocker or needs-input is logged | that intent |
82
+ | A merge or a release lands | that intent |
83
+ | The owner asks ("where are we", "state of X", "continue X") | all in delivery, or the one named |
84
+
85
+ `delivered` prints exactly once, at Completion. `delay` prints only when the owner asks why a
86
+ delivery took long.
87
+
88
+ Every verb prints the same plain Markdown on every harness (owner ruling 2026-08-31); where a
89
+ harness can paint it (Claude Code, through 316a's message-display hook), it substitutes a
90
+ painted rendering of that same output, never a different one, and no skill or script branches
91
+ on harness name to decide.
92
+
93
+ ## Depth for small work
94
+
95
+ For small work in auto mode, only the How-boundary `plan` screen prints mid-flight (intent
96
+ 331f moved this print off `state`, since there is no separate briefing per stage any more).
97
+ Larger work prints `state` at every trigger in the table above. This is a
98
+ depth cut, not a different report: the screen's shape never changes, only how often it fires.
99
+ A delivery still ends with `outcome.md` plus one `delivered` screen.
100
+
101
+ ## One report per audience
102
+
103
+ A delivery produces exactly two artifacts: `outcome.md` (generated by `scripts/end-intent`
104
+ from `graph.md`, `nodes/`, and the ledger when the intent has one, intent 339; hand-authored
105
+ by `plastic intent end` otherwise) and one `delivered` screen at the End stage. No stage or skill restates a delivery already
106
+ written to `outcome.md`; point at it instead. Skills do not open with a banner that names the
107
+ skill or restates the intent id and name the owner just typed. Announce only what the reader
108
+ cannot already know: an error, a result, a choice with its reason, or a handoff.
109
+
110
+ ## Boundary vs intent 74
111
+
112
+ Intent 74's report contract (`references/agent-report-contract.md`) is the INTERNAL,
113
+ machine-checked handoff from a dispatched specialist back to the orchestrator: a structured
114
+ envelope plus a per-role payload. This contract is the OUTWARD screen shown to the owner.
115
+ Different direction, different audience, different form. The orchestrator reads the intent 74
116
+ report and reflects it into the record (savepoint, outcome.md) that `report-screen` then
117
+ renders. The two never merge.
118
+
119
+ ## Brevity: point, don't repeat
120
+
121
+ Surface rules are owned by the `plain-writing` skill. This contract does not restate them. Its
122
+ job is naming which screen prints when, not the wording inside it - `report-screen` derives
123
+ every cell from the record (D14), so there is no prose left to style here.
124
+
125
+ ## Emission: guided vs auto
126
+
127
+ In guided mode, `state` prints at each stage boundary and the human decides before the next
128
+ stage starts.
129
+
130
+ In auto mode, `state` prints at every trigger for larger work; for small work only the How
131
+ boundary's `plan` screen prints (see `## Depth for small work` above). The orchestrator takes
132
+ the go-ahead itself and moves on, except at the existing hard stops (destructive action without
133
+ a safe alternative, project-path confirm).
134
+
135
+ ## Column vocabulary (D5, intent 331f)
136
+
137
+ Owner ruling 2026-09-05 11:05 UTC: "What" is never a column name, because What is a stage, not
138
+ a value. The id column reads `Graph ID`; the title column reads `Intent`. Every Steps table
139
+ reads `Step | Status | Detail` (the plan screen's own Steps table reads
140
+ `Step | Action | Detail`); every Risks table reads `N | Risk`; the Delivered/Evidence/Needs-you
141
+ tables on the `delivered` screen read `Row | Detail | Proven by`, `Kind | Detail | Source`, and
142
+ `N | Need | Reason`. The plan screen's Asked row prints the intent title before its first
143
+ colon, never the whole intent line. This applies to every screen the family prints: `state`,
144
+ `roster`, `session`, `delivered`, `delay`, `plan`, `roadmap` (`plan`/`state`/`delivered`), and
145
+ `dashboard`. `outcome.md`'s own `| Row | What |` heading is an AUTHORING convention inside the
146
+ file a human writes, never a rendered header, and stays unchanged.
147
+
148
+ ## Width bound (D7, intent 331f)
149
+
150
+ No rendered row passes 115 visible columns. A long cell (the roadmap Goal, an intent title, an
151
+ Asked line) truncates on a word boundary with a single ellipsis; `ReportScreen.fit_screen`
152
+ shrinks a table's widest column first, floor 8, before it ever truncates a whole row.
@@ -45,3 +45,12 @@ This chapter holds the linking doctrine from Frontmatter and the branch-vs-root
45
45
  the relation on the PREDECESSOR's `chain` (and mirror it as a
46
46
  `[[id--slug|<target's full intent: text>]]` wikilink in `## Links`).
47
47
  - **Rule of thumb:** if the intent could exist without its parent, it's a root.
48
+
49
+ ## Naming
50
+
51
+ A thing is named after the concept family it lives under. A node is a graph-engineering
52
+ concept, so its name comes from graph engineering (node, edge, ready set, critical path),
53
+ from the Plastic concepts coined on top of it (intent, ledger, node input, lease, gate, runner),
54
+ and from the software and AI engineering concepts those rest on (review, fix, test, verify,
55
+ dispatch, executor, reviewer). A name from outside that stack is refused. Where no existing
56
+ concept fits, that is a design finding to raise, not a word to coin.
@@ -4,10 +4,10 @@ This chapter holds the delivery lock, claims, worktrees, the fail-safe doctrine,
4
4
 
5
5
  ### Delivery Isolation and the Single-Owner Lock
6
6
 
7
- Locks and worktrees exist only for auto teams. An interactive session working direct or
8
- thinking takes no lock: it records into the day ledger, or into the intent its per-session
9
- pointer names (`~/.plastic/store/.tmp/<session>/current`, where `<session>` is the first eight
10
- characters of the session id; the file holds today's day id or an intent id).
7
+ The delivery lock names the session delivering an intent, as its owner or a delegate. Locks
8
+ and worktrees exist only for auto teams: an interactive session working direct or thinking
9
+ takes no lock and records into its day ledger instead (the oldest day in the last seven whose
10
+ checklist carries the session's line, else today).
11
11
 
12
12
  For an auto team, exactly one team develops an intent's delivery at a time. Ownership is
13
13
  session-keyed and durable: arming acquires `delivery.lock` inside the intent directory
@@ -17,9 +17,7 @@ but never grants access and is never inferred from transcripts or filesystem pat
17
17
  fields on legacy locks display as `Unknown`. Liveness is a lease: the record hook refreshes
18
18
  the lock file's mtime on every write the owning session makes, and that mtime is the sole
19
19
  heartbeat truth. The lock counts as stale only when the mtime is older than the TTL. No
20
- process id is consulted anywhere. The pointer file is a cache of which intent a session
21
- records into; the lock file is the truth of who owns a delivery, and wins on any
22
- disagreement. Another team that finds a fresh lock backs off; a stale lock is reclaimed only
20
+ process id is consulted anywhere. The lock file is the truth of who owns a delivery. Another team that finds a fresh lock backs off; a stale lock is reclaimed only
23
21
  by explicit takeover, which replaces the lock and appends an audit line to the intent's
24
22
  savepoint.md. Rearming the same session preserves its acquired identity and refreshes known
25
23
  provenance; an explicit takeover replaces the controller and starts new provenance.
@@ -31,7 +29,7 @@ retained as descriptive history, bounded to the 20 most recent terminal entries.
31
29
  a delegate, and an artifact claim are distinct evidence: controller ownership authorizes the
32
30
  delivery, delegate registration authorizes a child session, and a claim selects one current
33
31
  writer for one artifact. Disarm clears the lock; the End tail is ordered: verify, merge and
34
- remove worktrees, clear the lock, and only then is the session pointer purge-eligible. Repair
32
+ remove worktrees, then clear the lock. Repair
35
33
  is one idempotent function with two entry points: the `plastic-lock` command (`who`, status,
36
34
  fix, release, reclaim, delegate) and the `plastic-doctor` skill's lock section, so repair
37
35
  self-heals. `who` is read-only and reports the controller, mtime heartbeat, delegates, and
@@ -84,24 +82,24 @@ Provisioning fails open for intents that touch no project code (pure research or
84
82
  intents in the global store, or a non-git repo): those get the lock only, and the worktree
85
83
  block stays unprovisioned. The fail-open path is always logged, never silent.
86
84
 
87
- Cleanup is part of Done: the End tail merges the branch, then removes the worktree. Never leave
85
+ Cleanup is part of the End tail: it merges the branch, then removes the worktree. Never leave
88
86
  an orphaned worktree behind, and clear a stale worktree reference with `git worktree prune`.
89
87
 
90
88
 
91
89
  #### Intent delivery, station by station
92
90
 
93
- How one auto-team intent travels from boarding to Done, and what the lock, the pointer, and
91
+ How one auto-team intent travels from boarding to the End tail, and what the lock and
94
92
  the record hook do at each station. Nothing in the third column blocks; the fourth column is
95
93
  what gets written down.
96
94
 
97
- | Station | Delivered artifact | Lock and pointer steps | Record |
95
+ | Station | Delivered artifact | Lock steps | Record |
98
96
  |---|---|---|---|
99
- | Start (board) | none (a procedure, not a stage) | `plastic-lock fix` self-heals stale, corrupt, or legacy state; arm acquires `delivery.lock` (O_EXCL, session-keyed), provisions the code worktree, writes the session pointer | savepoint confirms the boarding station |
97
+ | Start (board) | none (a procedure, not a stage) | `plastic-lock fix` self-heals stale, corrupt, or legacy state; arm acquires `delivery.lock` (O_EXCL, session-keyed), provisions the code worktree | savepoint confirms the boarding station |
100
98
  | What (create) | `<id>--<slug>.md`, born complete | no lock yet; `new-intent` validates the file it writes (`scripts/validate-intent`) | savepoint `What` line; intent listed in INDEX `## Active` |
101
99
  | Why | `spec.md` | owner writes refresh the lease (lock file mtime heartbeat) | savepoint `Why started`, `Why spec.md created` |
102
100
  | How | `plan.md`, `actions/ACTION_N.md` (at least one), `checklist.md` | heartbeat on writes | savepoint `How started`, `How plan.md created`, `How checklist.md created`, `Exec started` |
103
101
  | Exec | code on the intent branch, checklist checked off | heartbeat; code edits confined to the provisioned worktree; delegates write under the owner's lock | checklist boxes; savepoint milestones; the day-ledger line promotes when a project file lands |
104
- | End (done) | mandatory `outcome.md` (`disposition: delivered\|abandoned`), INDEX moves to Completed or Abandoned | ordered End tail: verify, merge and remove worktrees, disarm clears `delivery.lock`, then the pointer is purge-eligible, and the QMD reindex runs LAST (after purge); `end-intent` backfills a placeholder `outcome.md` from the record and its structure check reports (never refuses) | savepoint `Done delivered` (or `abandoned`); takeover audits, if any, remain in savepoint.md |
102
+ | End (done) | mandatory `outcome.md` (`disposition: delivered\|abandoned`), INDEX moves to Completed or Abandoned | ordered End tail: verify, merge and remove worktrees, disarm clears `delivery.lock`, and the QMD reindex runs LAST; `end-intent` backfills a placeholder `outcome.md` from the record and its structure check reports (never refuses) | the savepoint's terminal `delivered` (or `abandoned`) line; takeover audits, if any, remain in savepoint.md |
105
103
  | Maintenance (Future, Terminal, or Active-with-a-stale-or-no-lock) | `revisions.md` move-and-record entries | detects (never acquires) `delivery.lock`; defers and reports while the target's lock is FRESH (`Lock.fresh?`); a stale or absent lock is not-active, maintenance proceeds | append-only, rule-tagged `revisions.md` entry written in the same operation as the change, or the change is refused; lands via a fresh branch off store main merged back as one closed op, never `git add -A` |
106
104
 
107
105
  ## The write guard is not residue
@@ -8,7 +8,7 @@ Plastic separates two different things an earlier doctrine blurred under one wor
8
8
  "immutable." WORK is the delivered CONTENT an intent produced: the code and project files a
9
9
  delivery changed, the research it recorded, the outcome it wrote. Once the intent is terminal
10
10
  (Completed or Abandoned), that content is immutable - the only way to change it is another
11
- intent that continues or reverts it. Editing a Done intent's own artifacts so it looks like it
11
+ intent that continues or reverts it. Editing a terminal intent's own artifacts so it looks like it
12
12
  delivered something different, or that parts are missing, is forbidden (the book analogy:
13
13
  never rewrite the text on the pages of an old, valuable book).
14
14
 
@@ -6,13 +6,14 @@ This chapter holds the full roadmap file format and its relationship to INDEX.md
6
6
 
7
7
  Roadmaps exist for planned parallel delivery of intents in a coherent and organized way. A roadmap
8
8
  is a named, ordered, delivery-side collection of intents: the delivery-side counterpart to a
9
- release (completion-side, tracked in `CHANGELOG.md`). Use `plastic-roadmap` to create, order,
10
- close, and consume one.
9
+ release (completion-side, tracked in `CHANGELOG.md`). Create one by hand from the template, then
10
+ use `plastic roadmap show`, `next`, `log`, and `check` to read, drive, and audit it.
11
11
 
12
12
  File location: `roadmaps/{slug}.md`, a sibling of `INDEX.md`, wherever `INDEX.md` lives, never
13
13
  inside `store/` (store holds intent directories, not project artifacts). For a project that is its
14
- root, `~/.plastic/projects/{slug}/roadmaps/`, beside `project.yml`; for the global tier it is
15
- `~/.plastic/roadmaps/`, beside `~/.plastic/INDEX.md`. `roadmaps/` lists only live (open or
14
+ root, `~/.plastic/stores/{slug}/roadmaps/`, beside `project.yml`; for the global store it is
15
+ `~/.plastic/stores/global/roadmaps/`, beside its `INDEX.md`. Legacy homes keep their
16
+ previous paths until `plastic migrate stores` moves them. `roadmaps/` lists only live (open or
16
17
  in-flight) roadmaps: once a roadmap's goal is reached, it moves to `roadmaps/archived/{slug}.md`,
17
18
  a sibling subdirectory scaffolded once with a `.gitkeep`.
18
19
 
@@ -9,7 +9,7 @@ end to end: a piece of work moved through What, Why, How, and Exec, with a finis
9
9
 
10
10
  ## Before you start
11
11
 
12
- Run `/plastic-update` first (`$plastic-update` on Codex), so the commands below match what is
12
+ Run `plastic update` first, so the commands below match what is
13
13
  actually installed.
14
14
 
15
15
  Work in a sandbox: this track always creates a global-store intent; the throwaway repo below
@@ -22,7 +22,7 @@ directory instead (see station 6). Either way, nothing in this track touches a r
22
22
 
23
23
  ### 1. Create the intent
24
24
 
25
- Type `/plastic-intent-creating` and describe the work in plain words, for example "add a
25
+ Run `plastic intent new` and describe the work in plain words, for example "add a
26
26
  short Usage section to this project's README."
27
27
 
28
28
  Artifact: a new intent directory, `{id}--slug.md`, plus the sentinel placeholder lifecycle
@@ -35,7 +35,7 @@ tool, never written by hand.
35
35
 
36
36
  ### 2. Board the intent
37
37
 
38
- Type `/plastic-intent-continuing` and name the intent.
38
+ Run `plastic continue` and name the intent.
39
39
 
40
40
  Artifact: a delivery lock (a `delivery.lock` file in the intent directory) naming this
41
41
  session as the one owner, and a line in `savepoint.md` recording the stage. The agent then
@@ -46,78 +46,59 @@ sessions from editing the same intent at the same time.
46
46
 
47
47
  ### 3. Why, rulings one at a time
48
48
 
49
- Type `/plastic-intent-speccing` (say "grill me" for a harder, interview-style pass over
49
+ Run `plastic intent spec` (say "grill me" for a harder, interview-style pass over
50
50
  the same ground). It asks conversational prose questions, one at a
51
51
  time, never a multiple-choice menu, and answers them one at a time in return.
52
52
 
53
53
  Artifact: `## Context` and `### Decisions` in the intent file fill in as each answer lands, and
54
54
  each ruling also lands as its own `## Insights` entry the moment it is made, never batched for
55
- later. This station's product is the enriched Why; it hands off to `/plastic-intent-speccing`
55
+ later. This station's product is the enriched Why; it hands off to `plastic intent spec`
56
56
  next, it does not write `spec.md` itself.
57
57
 
58
58
  Checkpoint: after two or three answers, look at the intent file. Every ruling given out loud
59
59
  is already sitting in `### Decisions` and in `## Insights`, in writing.
60
60
 
61
- ### 4. Consolidate the spec
61
+ ### 4. How, write the graph
62
62
 
63
- Type `/plastic-intent-speccing`.
63
+ Ask the same conversation (`plastic intent spec`) to turn the rulings into the graph.
64
64
 
65
- Artifact: `spec.md`, its eight sections filled from the rulings recorded in station 3.
65
+ Artifact: `graph.md` (nodes, edges, dispatch policy) and one `nodes/N.md` file per node this
66
+ small delivery needs. A delivery this size is one node; many independent tasks instead get
67
+ one node each, dispatched in parallel by the runner.
66
68
 
67
- Checkpoint: point at one sentence in `spec.md` that traces back to an answer given in
68
- station 3.
69
+ Checkpoint: open `graph.md` and point at the one node this worked example needs.
69
70
 
70
- ### 5. Plan
71
+ ### 5. Exec, drive the runner loop
71
72
 
72
- Ask the same conversation to write the action files and the plan.
73
+ Run `plastic intent step`.
73
74
 
74
- Artifact: `plan.md`, `checklist.md`, and at least one real `actions/ACTION_N.md`. A small
75
- delivery like this one consolidates the whole delivery into a single `actions/ACTION_1.md`
76
- (the ordered steps plus the exact changes); many independent tasks, dispatched in parallel,
77
- instead get one `actions/ACTION_N.md` file per task. `checklist.md` follows a fixed form: tasks start under `## In Progress`, move to
78
- `## Completed` as they land, and a `## Session Log` table records what happened each session.
79
- A task that depends on an owner decision landing first (a destructive step, a structural
80
- ruling) gets an `[ORCHESTRATOR]` prefix and blocks every other item until that decision is
81
- made; this worked example has none.
82
-
83
- Checkpoint: open `checklist.md`. Every task in `plan.md` has a matching checkbox under
84
- `## In Progress`; that checklist, not `plan.md` itself, is what gets ticked off and moved to
85
- `## Completed` during Exec.
86
-
87
- ### 6. Exec, verify before you report
88
-
89
- Type `/plastic-intent-executing`.
90
-
91
- Teach the order: first the agent syncs its working copy with the main line, so no edit lands
92
- on a path a merged change upstream has already touched or removed. Then it makes the change,
93
- runs whatever verifies it (a test suite, or a manual check for a docs change like this one),
94
- and only then ticks the checklist box, moving the task from `## In Progress` to
95
- `## Completed` and adding a `## Session Log` row, before moving to the next task. Verifying
96
- always comes before checking a box, never after, and each task is ticked the moment it lands,
97
- never batched for later.
75
+ Teach the loop: `ruby scripts/runner step <intent_dir>` computes which nodes are ready and
76
+ prints a spawn block to dispatch, `ruby scripts/runner status <intent_dir>` reads the
77
+ ledger (running, done, blocked, or waiting on a decision), and `ruby scripts/runner answer`
78
+ closes a node that needs an owner's ruling. Call `step` again after each dispatched node
79
+ returns, until the graph is empty.
98
80
 
99
81
  Artifact: the actual change on disk (the new README Usage section, or, in the global-store
100
- fallback, a short written note saved as the intent's deliverable) and a fully ticked
101
- `checklist.md`.
82
+ fallback, a short written note saved as the intent's deliverable) and every node in
83
+ `graph.md` at a terminal status.
102
84
 
103
- Checkpoint: find the new Usage section in the README (or the written note) and confirm every
104
- box in `checklist.md` is checked and moved to `## Completed`, with a `## Session Log` row for
105
- this session, before moving to station 7.
85
+ Checkpoint: run `runner status` and confirm no node is left running or blocked, before
86
+ moving to station 6.
106
87
 
107
- ### 7. Done
88
+ ### 6. End
108
89
 
109
- Type `/plastic-intent-ending`.
90
+ Run `plastic intent end`.
110
91
 
111
- Artifact: a real `outcome.md` (Summary, Delivered, Verification, Follow-ups), the intent
112
- moved from `## Active` to `## Completed` in `INDEX.md`, and a closing `Done` line in
113
- `savepoint.md`.
92
+ Artifact: a real `outcome.md` (Summary, Delivered, Verification, Follow-ups) generated by
93
+ `scripts/outcome-report` from `graph.md` and the ledger, the intent moved from `## Active`
94
+ to `## Completed` in `INDEX.md`, and the terminal savepoint line.
114
95
 
115
96
  Checkpoint: open `outcome.md` and read its Summary. It should describe, in a sentence or
116
97
  two, exactly the README section (or note) just delivered.
117
98
 
118
99
  ## Wrap and where to go next
119
100
 
120
- That is the full cycle once: create, board, decide, spec, plan, build, done. Read
101
+ That is the full cycle once: create, graph, runner step, end. Read
121
102
  [`your-first-intent-in-10-minutes.md`](https://github.com/zalom/plastic/blob/main/docs/guides/your-first-intent-in-10-minutes.md) for the same path condensed to a single
122
103
  read, and [`reading-the-ledgers.md`](https://github.com/zalom/plastic/blob/main/docs/guides/reading-the-ledgers.md) for where each station wrote its
123
104
  work down.
@@ -9,7 +9,7 @@ agent end to end, and pausing and resuming that delivery will feel familiar.
9
9
 
10
10
  ## Before you start
11
11
 
12
- Run `/plastic-update` first (`$plastic-update` on Codex), so the commands below match what is
12
+ Run `plastic update` first, so the commands below match what is
13
13
  actually installed.
14
14
 
15
15
  Work in a sandbox: a throwaway git repository, or a global-store intent. Nothing in this
@@ -19,8 +19,8 @@ track touches a real project.
19
19
 
20
20
  ### 1. Board a small intent and choose auto
21
21
 
22
- Start from an active intent (create one first with `/plastic-intent-creating` if none
23
- exists, the same way as track 1 station 1). Type `/plastic-auto`.
22
+ Start from an active intent (create one first with `plastic intent new` if none
23
+ exists, the same way as track 1 station 1). Run `plastic auto take ID`.
24
24
 
25
25
  Artifact: the delivery lock arms, and the agent announces it is taking over the intent for
26
26
  autonomous delivery.
@@ -33,7 +33,7 @@ queued intent from the dashboard's queue itself.)
33
33
 
34
34
  No new command at this station. Watch how the work splits.
35
35
 
36
- Auto owns How (the plan, the checklist, the action files) and Exec (the code, the tests, the
36
+ Auto owns How (`graph.md`, `nodes/`) and Exec (the code, the tests, the
37
37
  mechanical close) from here on. Inside Exec it follows a few fixed habits: it syncs its
38
38
  working copy with the main line before touching anything, ticks each task the moment it
39
39
  lands rather than batching several into one later edit, and independently verifies its own
@@ -45,7 +45,7 @@ can review how it checked, not just what it found.
45
45
  The user keeps two things: the rulings made along the way, and the review points, moments
46
46
  auto is built to pause for, such as confirming a project path or stopping before a
47
47
  destructive action with no safe way back. When auto tells you to run a command yourself
48
- ("run /plastic-intent-speccing"), that is an instruction for you to type; it is a different
48
+ ("run plastic intent spec"), that is an instruction for you to type; it is a different
49
49
  thing from the prompts auto hands to its own dispatched subagents, and the two are never
50
50
  mixed up in what it tells you.
51
51
 
@@ -63,18 +63,18 @@ Checkpoint: open the intent's `savepoint.md` and name the stage its last line re
63
63
 
64
64
  ### 4. Reading the per-stage reports
65
65
 
66
- No new command. At each stage boundary (What, Why, How, Exec, Done) the agent briefs in a
66
+ No new command. At each stage boundary (What, Why, How, Exec) the agent briefs in a
67
67
  fixed three-line shape: State (what happened and why it matters), Risk (the one thing that
68
68
  could bite, or "nothing flagged"), and Call (the decision left to the user, or the call the
69
69
  agent is taking on its own). That is the depth for a medium or large intent. A small intent
70
- gets one briefing, at How, folding in what the earlier stages would have said.
70
+ gets one briefing, at How, merging in what the earlier stages would have said.
71
71
 
72
72
  Checkpoint: in the most recent report, point at the State line, the Risk line, and the Call
73
73
  line.
74
74
 
75
75
  ### 5. Continue and where-was-I after time away
76
76
 
77
- Type `/plastic-intent-continuing`.
77
+ Run `plastic continue`.
78
78
 
79
79
  Artifact: the current state, presented and then the session stops. If a specific intent is
80
80
  named, the agent reads its stage and savepoint and resumes exactly there, rather than