@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
@@ -1,255 +0,0 @@
1
- {
2
- "skill_name": "plastic-auto",
3
- "notes": "Intent 27. Scopes: description triggering (1-8) and behavior/output quality (9). Assertions written after observing Step-3 runs (one clean subagent router per case). Intent 63 added cases 10-11 (auto-mode enforcer-led team spin-up and solo fallback).",
4
- "results": {
5
- "triggering": {
6
- "cases": 8,
7
- "passed": 8,
8
- "pass_at_1": 1.0,
9
- "run": "2026-06-10, one subagent per case"
10
- },
11
- "behavior": {
12
- "cases": 1,
13
- "passed": 1,
14
- "evidence": "dogfood: intent 27 itself delivered via auto produced spec->plan->checklist before any code edit; code-gate unit test proves pre-How project-code edits are blocked"
15
- }
16
- },
17
- "evals": [
18
- {
19
- "id": 1,
20
- "scope": "triggering",
21
- "set": "train",
22
- "prompt": "auto",
23
- "expected_output": "Activates plastic-auto (the bare 'auto' keyword is the documented trigger).",
24
- "files": [],
25
- "assertions": [
26
- {
27
- "type": "code",
28
- "check": "router CHOICE == plastic-auto",
29
- "observed": "plastic-auto",
30
- "result": "pass"
31
- }
32
- ]
33
- },
34
- {
35
- "id": 2,
36
- "scope": "triggering",
37
- "set": "train",
38
- "prompt": "take it from here and deliver intent 27 end to end",
39
- "expected_output": "Activates plastic-auto (autonomous delivery of an active intent).",
40
- "files": [],
41
- "assertions": [
42
- {
43
- "type": "code",
44
- "check": "router CHOICE == plastic-auto",
45
- "observed": "plastic-auto",
46
- "result": "pass"
47
- }
48
- ]
49
- },
50
- {
51
- "id": 3,
52
- "scope": "triggering",
53
- "set": "validation",
54
- "prompt": "go fully autonomous on the active intent, don't ask me questions",
55
- "expected_output": "Activates plastic-auto.",
56
- "files": [],
57
- "assertions": [
58
- {
59
- "type": "code",
60
- "check": "router CHOICE == plastic-auto",
61
- "observed": "plastic-auto",
62
- "result": "pass"
63
- }
64
- ]
65
- },
66
- {
67
- "id": 4,
68
- "scope": "triggering",
69
- "set": "train",
70
- "prompt": "deliver this intent for me",
71
- "expected_output": "Activates plastic-auto.",
72
- "files": [],
73
- "assertions": [
74
- {
75
- "type": "code",
76
- "check": "router CHOICE == plastic-auto",
77
- "observed": "plastic-auto",
78
- "result": "pass"
79
- }
80
- ]
81
- },
82
- {
83
- "id": 5,
84
- "scope": "triggering",
85
- "set": "train",
86
- "prompt": "set up a hook to automatically format the file on every save",
87
- "expected_output": "Does NOT activate plastic-auto. Near-miss: shares 'auto*' but is a settings/hooks task (update-config).",
88
- "files": [],
89
- "assertions": [
90
- {
91
- "type": "code",
92
- "check": "router CHOICE != plastic-auto",
93
- "observed": "update-config",
94
- "result": "pass"
95
- }
96
- ]
97
- },
98
- {
99
- "id": 6,
100
- "scope": "triggering",
101
- "set": "validation",
102
- "prompt": "deliver the built package to the dist directory",
103
- "expected_output": "Does NOT activate plastic-auto. Near-miss: shares 'deliver' but is a build/file task.",
104
- "files": [],
105
- "assertions": [
106
- {
107
- "type": "code",
108
- "check": "router CHOICE != plastic-auto",
109
- "observed": "none",
110
- "result": "pass"
111
- }
112
- ]
113
- },
114
- {
115
- "id": 7,
116
- "scope": "triggering",
117
- "set": "train",
118
- "prompt": "create a new intent for the dashboard idea",
119
- "expected_output": "Does NOT activate plastic-auto; activates plastic-intent-creating.",
120
- "files": [],
121
- "assertions": [
122
- {
123
- "type": "code",
124
- "check": "router CHOICE != plastic-auto",
125
- "observed": "plastic-intent-creating",
126
- "result": "pass"
127
- }
128
- ]
129
- },
130
- {
131
- "id": 8,
132
- "scope": "triggering",
133
- "set": "validation",
134
- "prompt": "what's the status of my active intents?",
135
- "expected_output": "Does NOT activate plastic-auto; this is a read/intent-continuing query.",
136
- "files": [],
137
- "assertions": [
138
- {
139
- "type": "code",
140
- "check": "router CHOICE != plastic-auto",
141
- "observed": "plastic-intent-continuing",
142
- "result": "pass"
143
- }
144
- ]
145
- },
146
- {
147
- "id": 9,
148
- "scope": "behavior",
149
- "set": "train",
150
- "prompt": "Active intent X exists with only a '## Intent' section. Deliver it in auto mode.",
151
- "expected_output": "Arms the lifecycle gate first, then produces spec.md (Why), then plan.md + actions/ + checklist.md (How), and edits NO project code before plan.md + checklist.md exist. Disarms on completion.",
152
- "files": [],
153
- "assertions": [
154
- {
155
- "type": "human",
156
- "check": "spec.md written before plan.md before any project-code edit",
157
- "observed": "dogfood run of intent 27 followed this order",
158
- "result": "pass"
159
- },
160
- {
161
- "type": "code",
162
- "check": "code-gate blocks project-code Edit/Write while pre-How (test/code_gate_test.rb)",
163
- "observed": "test green",
164
- "result": "pass"
165
- }
166
- ]
167
- },
168
- {
169
- "id": 10,
170
- "scope": "behavior",
171
- "set": "train",
172
- "prompt": "Active intent X exists. Deliver it in auto mode on a harness that supports subagents.",
173
- "expected_output": "Spins up one enforcer-led team per intent (plastic-enforcer, executor, an on-request reviewer). The enforcer IS the orchestrator: it writes spec.md, the action files, and checklist.md itself, dispatches one executor for the consolidated action on one branch, and dispatches an independent reviewer subagent at the final gate only.",
174
- "files": [],
175
- "assertions": [
176
- {
177
- "type": "human",
178
- "check": "enforcer writes Why and How itself; one executor dispatched; independent reviewer only at final gate",
179
- "observed": "dogfood: intents 60-62 delivered by exactly this enforcer-led team on a shared branch",
180
- "result": "pass"
181
- },
182
- {
183
- "type": "code",
184
- "check": "agents/plastic-*.md role files ship and install into the harness agent dir, manifest-tracked (test/install_packaging_test.rb)",
185
- "observed": "test green",
186
- "result": "pass"
187
- }
188
- ]
189
- },
190
- {
191
- "id": 11,
192
- "scope": "behavior",
193
- "set": "validation",
194
- "prompt": "Active intent X exists. Deliver it in auto mode on a harness with no subagent dispatch.",
195
- "expected_output": "Falls back to a single agent walking the full What, Why, How, Exec cycle itself, preserving current behavior. The enforcer gate discipline still applies (arm the gate first, no project-code edits before plan.md + checklist.md exist).",
196
- "files": [],
197
- "assertions": [
198
- {
199
- "type": "human",
200
- "check": "solo agent walks the full cycle when subagent dispatch is unavailable; gate discipline preserved",
201
- "observed": "SKILL.md Team Spin-Up documents the solo fallback explicitly",
202
- "result": "pass"
203
- }
204
- ]
205
- },
206
- {
207
- "id": 12,
208
- "scope": "behavior",
209
- "set": "validation",
210
- "prompt": "A power-tool is present (qmd on PATH, or a .serena marker / serena on PATH). A substantive prompt arrives in auto mode.",
211
- "expected_output": "The agent prefers the present tool because PLASTIC.md (loaded at session start) recommends QMD for intents and Enola, or Serena when Enola is absent, for code navigation. No hook appends a per-prompt line: the power-tools hook was removed in 2.0 (intent 309).",
212
- "files": [],
213
- "assertions": [
214
- {
215
- "type": "code",
216
- "check": "PLASTIC.md carries the recommendation (doctrine_305_test) and PowerTools presence probes still back doctor's readiness checks (power_tools_test.rb)",
217
- "observed": "doctrine_305_test test_plastic_md_carries_the_power_tools_mandate_as_a_recommendation; power_tools_test.rb presence probes",
218
- "result": "pass"
219
- }
220
- ]
221
- },
222
- {
223
- "id": 13,
224
- "scope": "behavior",
225
- "set": "validation",
226
- "prompt": "Neither qmd nor serena is present (no qmd on PATH, no .serena marker, no serena on PATH). A substantive prompt arrives.",
227
- "expected_output": "Detect-then-degrade: PLASTIC.md's recommendation applies only when a tool is present, so nothing is required to install and no per-prompt line appears (there is no hook to emit one since intent 309).",
228
- "files": [],
229
- "assertions": [
230
- {
231
- "type": "code",
232
- "check": "PowerTools.mandate returns nil when neither tool is present",
233
- "observed": "power_tools_test.rb test_mandate_neither_is_nil",
234
- "result": "pass"
235
- }
236
- ]
237
- },
238
- {
239
- "id": 14,
240
- "scope": "behavior",
241
- "set": "validation",
242
- "prompt": "QMD is present. In auto mode the user says: deliver the work on the uploader retry policy (no intent id given).",
243
- "expected_output": "Before scanning the store with grep/Read to find the matching intent, runs `ruby ~/.plastic/scripts/qmd-sync search \"uploader retry policy\"` to surface the candidate intent, then opens the authoritative intent file for the hit it takes over. This discovery step is distinct from the completion-time reindex step. No-op fallback to INDEX.md / file scan when QMD is absent.",
244
- "files": [],
245
- "assertions": [
246
- {
247
- "type": "human",
248
- "check": "qmd-sync search is run before grep/Read during discovery; authoritative file opened for the hit; reindex step stays separate",
249
- "observed": "SKILL.md (or agent file) carries the QMD-first step: run qmd-sync search before grep/Read, then open the authoritative file; no-op fallback when QMD is absent",
250
- "result": "pass"
251
- }
252
- ]
253
- }
254
- ]
255
- }
@@ -1,66 +0,0 @@
1
- # End-Tail Mechanics: Arm.disarm and the Ordering
2
-
3
- Deep mechanics behind two spots in `SKILL.md`: how `plastic-lock arm` resolves a session id
4
- when it takes an intent, and why the End-tail steps in Completion (release the worktree, clear
5
- the lock, reset the pointer, reindex) run in that exact order. The `/tmp` bridge JSON these
6
- steps once also purged was removed in 2.0 (intent 307); `scripts/lib/arm.rb` is what remains.
7
-
8
- ## Table of Contents
9
-
10
- - [Session resolution](#session-resolution)
11
- - [Disarm ordering and worktree cleanup rationale](#disarm-ordering-and-worktree-cleanup-rationale)
12
- - [QMD reindex ordering rationale](#qmd-reindex-ordering-rationale)
13
-
14
- ## Session resolution
15
-
16
- `Arm.resolve_session` picks the first non-empty of: the explicit id (`--session`, or the hook
17
- stdin `session_id` when a caller has it), the `CLAUDE_CODE_SESSION_ID` the CLI read, then a
18
- deterministic derived key (a hash of the store and the intent id). It never returns nil, so
19
- the arm verb works even when every session variable is empty; a session-less arm and a later
20
- session-less close resolve to the same key.
21
-
22
- Arming acquires the durable `delivery.lock` in the intent dir, keyed by that resolved session
23
- and stamped with `run_mode`. Ownership is session-keyed, not process-keyed, so the arm command
24
- exiting is fine by construction: the lock stays yours for every later tool call in this
25
- session, and the record hook refreshes its lease on every write you make. The same call writes
26
- the intent id into the session pointer (`~/.plastic/store/.tmp/<session>/current`), which is
27
- why the capture and record hooks stop treating your prompts as day-ledger items for the rest
28
- of the delivery.
29
-
30
- ## Disarm ordering and worktree cleanup rationale
31
-
32
- `Arm.disarm` runs the ordered End tail: it releases the worktree first, then clears the
33
- intent's `delivery.lock` as its recorded owner, and only then resets the session pointer to
34
- today's day id (when it still names this intent). The worktree goes first so a released lock
35
- never points at a checkout another session could claim; the pointer goes last so the record
36
- hook keeps heartbeating the lock until the lock is gone.
37
-
38
- **Mechanized since intent 188.** `scripts/end-intent` performs this disarm itself, as its own
39
- step 5, after steps 1-4 (outcome/INDEX/savepoint/commit) commit. A pre-flight lock guard
40
- refuses on a live foreign session (exit 4) and reclaims a stale foreign lock automatically
41
- (audited to savepoint.md); a dirty code worktree refuses before removal (exit 5,
42
- `--discard-worktree-changes` overrides deliberately); and the durable lock file is checked
43
- again after disarm, never merely trusted (exit 3 if it is somehow still present).
44
-
45
- **Worktree cleanup (mandatory, intent 73c3).** `end-intent`'s step 5 calls `Arm.disarm` by
46
- default, which calls `Worktree.release` on the block `Arm.worktree_block` derives from
47
- `projects.yml` and the intent id, removing the intent's code worktree under
48
- `<repo>/.claude/worktrees/{id}--{slug}` and pruning the repo. This is the plain remove path:
49
- the disarm route does NOT merge, so use it only when no release merges the branch (the branch
50
- survives and can be reclaimed).
51
-
52
- When the work is being shipped through a release, do NOT rely on this plain remove.
53
- `skills/releasing/SKILL.md` runs its worktree-merge step BEFORE its `end-intent` call, merging
54
- the intent's code branch (`plastic/{id}--{slug}`) back to the repo's default branch BEFORE
55
- the worktree is removed, via `Worktree.finish(Arm.bridge_hash(intent_dir: ...), merge: true)`
56
- (merge-then-remove), so the integrated work is not lost. By the time `end-intent`'s own step 5
57
- runs afterward, the worktree is already gone (a harmless no-op) and only the delivery lock and
58
- the pointer are left to clear. Never leave an orphaned worktree, and run `git worktree prune`
59
- if you hit a stale reference.
60
-
61
- ## QMD reindex ordering rationale
62
-
63
- Completion is the lifecycle event that keeps the search index fresh. `<store-root>` is the
64
- store that holds this intent (the global store or the project store). The reindex is the LAST
65
- End-tail step, run after the disarm, so the index never references a lock that is about to
66
- disappear.
@@ -1,78 +0,0 @@
1
- # Human Report Contract (the three 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 three report screens, filled from the record by `scripts/report-screen`, never
5
- written by eye:
6
-
7
- - **`report-screen state <intent_dir> [--changed "<text>"]`** - the mid-delivery report. One
8
- intent's field table (Store, Status, Stage, Savepoint, Progress, Next, Insight) plus a
9
- `Changed` row naming what caused the print, and its Steps table.
10
- - **`report-screen state --all <store_root>`** - the roster across every in-delivery intent,
11
- most recently changed first, then one collapsed block (Stage, Next, Changed, first three
12
- open steps) per intent.
13
- - **`report-screen delivered <intent_dir>`** - the post-delivery report, printed once at close:
14
- Asked, Delivered (with a Proven-by column), Evidence, Needs you.
15
- - **`report-screen delay <intent_dir>`** - printed only on request ("why did X take so long"):
16
- the delivery as a timeline plus the derived `Where the time went` line.
17
-
18
- ## The five triggers for `state`
19
-
20
- Print `state` (one intent, or `--all` for the roster) on any of these; a checklist tick alone,
21
- an executor's intermediate commit, or an agent going idle is NOT one of them:
22
-
23
- | Trigger | Scope |
24
- |---|---|
25
- | A savepoint line lands (a stage boundary: Why, How, Exec started, outcome written, Done) | that intent |
26
- | A review verdict returns (plan review or post-execution review), naming what it changed | that intent |
27
- | A blocker or needs-input is logged | that intent |
28
- | A merge or a release lands | that intent |
29
- | The owner asks ("where are we", "state of X", "continue X") | all in delivery, or the one named |
30
-
31
- `delivered` prints exactly once, at Completion. `delay` prints only when the owner asks why a
32
- delivery took long.
33
-
34
- Every verb prints the same plain Markdown on every harness (owner ruling 2026-08-31); where a
35
- harness can paint it (Claude Code, through 316a's message-display hook), it substitutes a
36
- painted rendering of that same output, never a different one, and no skill or script branches
37
- on harness name to decide.
38
-
39
- ## Depth for small work
40
-
41
- For small work in auto mode, only the How-boundary `state` screen prints mid-flight (its
42
- `Changed` row names what the What and Why steps did, since there is no separate briefing per
43
- stage any more). Larger work prints `state` at every trigger in the table above. This is a
44
- depth cut, not a different report: the screen's shape never changes, only how often it fires.
45
- A delivery still ends with `outcome.md` plus one `delivered` screen.
46
-
47
- ## One report per audience
48
-
49
- A delivery produces exactly two artifacts: `outcome.md` (authored by `plastic-intent-ending`)
50
- and one `delivered` screen at the End stage. No stage or skill restates a delivery already
51
- written to `outcome.md`; point at it instead. Skills do not open with a banner that names the
52
- skill or restates the intent id and name the owner just typed. Announce only what the reader
53
- cannot already know: an error, a result, a choice with its reason, or a handoff.
54
-
55
- ## Boundary vs intent 74
56
-
57
- Intent 74's report contract (`references/agent-report-contract.md`) is the INTERNAL,
58
- machine-checked handoff from a dispatched specialist back to the orchestrator: a structured
59
- envelope plus a per-role payload. This contract is the OUTWARD screen shown to the owner.
60
- Different direction, different audience, different form. The orchestrator reads the intent 74
61
- report and reflects it into the record (savepoint, outcome.md) that `report-screen` then
62
- renders. The two never merge.
63
-
64
- ## Brevity: point, don't repeat
65
-
66
- Surface rules are owned by the `writing-style` skill. This contract does not restate them. Its
67
- job is naming which screen prints when, not the wording inside it - `report-screen` derives
68
- every cell from the record (D14), so there is no prose left to style here.
69
-
70
- ## Emission: guided vs auto
71
-
72
- In guided mode, `state` prints at each stage boundary and the human decides before the next
73
- stage starts.
74
-
75
- In auto mode, `state` prints at every trigger for larger work; for small work only the How
76
- boundary prints (see `## Depth for small work` above). The orchestrator takes the go-ahead
77
- itself and moves on, except at the existing hard stops (destructive action without a safe
78
- alternative, project-path confirm).
@@ -1,29 +0,0 @@
1
- ---
2
- name: plastic-conventions
3
- description: >
4
- Chapters of Plastic doctrine used by more than one skill: the knowledge graph,
5
- lifecycle and savepoints, locks and
6
- worktrees, completion, maintenance, and roadmaps. Read a chapter when its trigger
7
- applies to the work in front of you.
8
- user-invocable: false
9
- ---
10
-
11
- # Plastic Conventions
12
-
13
- The chapters below hold Plastic doctrine that more than one skill needs. Core always-on
14
- conventions stay in `~/.plastic/PLASTIC.md`, which is injected at session start. Read a chapter
15
- when the trigger in the second column applies to the work in front of you.
16
-
17
- | Chapter | Read it when |
18
- |---|---|
19
- | `references/knowledge-graph.md` | when creating, linking, curating, or indexing intents and you need the sources-vs-chain doctrine, the tiers of influence, the `## Links` projection, or branch-vs-root directory semantics |
20
- | `references/lifecycle-and-savepoints.md` | when running a lifecycle stage or a savepoint and you need the subagent report-home contract for how an insight reaches the intent |
21
- | `references/locks-and-worktrees.md` | before taking or releasing a delivery lock, and when working with claims, worktrees, solo mode, or the station ledger |
22
- | `references/completion-and-done.md` | when ending an intent, for what "intent done" means and the End-stage tail |
23
- | `references/maintenance-and-revisions.md` | before any structural maintenance edit, for WORK vs MAINTENANCE, the `revisions.md` move-and-record contract, the violation-tag catalog, and the context-economy measurement buckets |
24
- | `references/roadmaps.md` | when creating, ordering, closing, or consuming a roadmap, for the file format and the status-mirror rule |
25
-
26
- Other skills read these chapters directly at
27
- `../plastic-conventions/references/<chapter>.md`, resolved relative to their own installed
28
- directory. All three harnesses install skills flat into one shared skills root through the same
29
- `install_skills_flat` call, so that path is harness-independent.
@@ -1,43 +0,0 @@
1
- # Completion and Done
2
-
3
- This chapter holds what "intent done" means and the End-stage tail.
4
-
5
- #### What "intent done" means (intent 93)
6
-
7
- Done 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 `Done delivered|abandoned` line is the audit echo. All three must
11
- 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 `Done` 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, and the QMD reindex is always LAST, after the
21
- purge: `outcome.md -> INDEX terminal -> savepoint Done -> commit -> disarm (Worktree.release
22
- -> Lock.release -> purge) -> QMD reindex`. Running the reindex last keeps the index from
23
- ever referencing a bridge or lock that disarm is about to remove.
24
-
25
- `scripts/end-intent` performs this order's disarm step (verify the code worktree is clean,
26
- then merge/remove worktrees, then clear the lock) as its own step 5, mechanically, since
27
- intent 188: a session no longer needs a separate one-liner for it, and the script's own
28
- exit code (0) is the single fact a caller needs that the intent is closed AND its delivery
29
- lock is gone. A pre-flight lock guard runs before anything is written (refuses a live
30
- foreign session, reclaims a stale one with an audit line), and a dirty code worktree
31
- refuses before removal rather than force-discarding uncommitted changes.
32
-
33
- The post-done access window is lock-bounded: `[INDEX terminal -> Lock.release]`. Through it
34
- the completing session keeps full read and write access to the terminal directory and no
35
- purge can fire (108's lock-held keep-guard keeps the bridge while `delivery.lock` exists).
36
- Once the lock is released the window closes: the bridge becomes purge-eligible and the
37
- directory is frozen. A crash mid-tail is recovered by stale-lock reclaim plus finishing the
38
- tail; `doctor` surfaces this as a "stalled completion" (terminal in INDEX but the lock is
39
- still present or stale). Finishing the tail is FINISHING a completion, never a reactivation:
40
- a done intent is never moved back to `## Active`.
41
-
42
- One report per audience: a delivery produces `outcome.md` plus one EM-to-CTO owner report, and
43
- no other step restates either (see `skills/auto/references/human-report-contract.md`).
@@ -1,169 +0,0 @@
1
- ---
2
- name: plastic-dashboard
3
- description: Use when the user wants an overview of intents, asks "where are we", "what's next", "what should I work on", "show the dashboard", or invokes /plastic-dashboard. Renders the intent store(s) as Markdown prose, the global board as a narrative of work done, each project board as a short summary plus its most-valuable next work, and emits a machine-readable queue that auto mode consumes.
4
- user-invocable: false
5
- ---
6
-
7
- # Dashboard — Plastic Work Cockpit
8
-
9
- A deterministic overview of the intent store(s). It answers three questions at a glance:
10
- **where we are** (recently worked), **where we go next** (the most-valuable next work), and
11
- **how to conduct it** (a disposition per intent). The human-facing surface is **Markdown**,
12
- because the user's UI renders Markdown natively but collapses raw tool-call stdout.
13
-
14
- The script does all the data work. The agent fills a Markdown template from the script's
15
- payload with near-zero reasoning and **presents the filled board in its reply**. Same store
16
- state → byte-identical payload, regardless of model. Do NOT hand-summarize intents.
17
-
18
- ## When to Use
19
-
20
- - User invokes `/plastic-dashboard`
21
- - User asks "where are we", "what's next", "what should I work on", "show me the intents"
22
- - `plastic-intent-continuing` lands on the board on a bare resume
23
- - `plastic-auto` reads `--json` to choose the next dispatchable intent
24
-
25
- ## Procedure (the Markdown board — default human surface)
26
-
27
- ### Step 1 — Get the data payload
28
-
29
- ```bash
30
- ruby ~/.plastic/scripts/dashboard.rb [continue|project <slug>] --data
31
- ```
32
-
33
- - `continue` (default) → the **global** board payload (`mode: "global"`).
34
- - `project <slug>` → that **project** board payload (`mode: "project"`).
35
-
36
- The payload is read-only JSON. Global-board fields: `date`, `store_health`, `summary`,
37
- `next_work`, `next_total`, `next_shown`, `counts`, `projects`, `project_totals`, `footer`.
38
- Project-board fields: `slug`, `store_health`, `description`, `summary`, `counts`, `active`,
39
- `active_total`, `active_shown`, `next_work`, `next_total`, `next_shown`, `footer`. `summary`
40
- and `footer` are finished prose strings (2-3 sentences and one line respectively), built in
41
- `dashboard.rb` and substituted verbatim, exactly like `{{date}}`/`{{description}}` already
42
- are - never re-worded or re-derived by the skill. Each list carries cell-ready fields for
43
- its table: `next_work` rows are
44
- `{id, intent, scope, lifecycle, value, disposition, flags, what, flags_label, line}`;
45
- `active` rows carry
46
- `{id, intent, created, bullet, scope, what, stage, worker, activity, line}`. The `what`,
47
- `scope`, `worker`, `activity`, and `flags_label` cell fields arrive pipe-escaped and
48
- whitespace-normalized.
49
-
50
- Each board load runs the scoped store check (`doctor --store <scope>`): the global board runs
51
- `--store global` and a project board runs `--store <slug>`. The result rides in the payload as
52
- `store_health` (`{scope, status, summary, failing_checks}`). Surface it as a one-line
53
- store-health note on the board (for example `store health: pass (3/3)` or
54
- `store health: warn (orphaned_intents)`). It is non-fatal: a warn or fail is shown as data and
55
- never blocks the board.
56
-
57
- ### Step 2 — Fill the matching template
58
-
59
- Templates live in this skill's `templates/` directory:
60
- `~/.claude/skills/plastic-dashboard/templates/dashboard-global.md` and
61
- `dashboard-project.md`.
62
-
63
- Fill mechanically, no rewriting, no re-sorting:
64
- - `{{a.b.count}}` → the integer (e.g. `counts.active` = that count).
65
- - `{{<list>.rows}}` → the two intent lists (`active`, `next_work`) render as **Markdown table
66
- rows**. The template hard-codes each table's header and separator; this placeholder becomes
67
- one data row per list entry, joined with real newlines, in that table's fixed column order
68
- (below). Drop each cell from the named payload field **verbatim**: cells arrive pre-escaped
69
- and whitespace-normalized from the script (pipes escaped as `\|`), so never re-escape,
70
- re-truncate, or reword them. Never emit `<br>`.
71
- - `next_work` → `| {id} | {what} | {value} | {disposition} | {flags_label} |`
72
- - `active` → `| {id} | {what} | {stage} | {worker} | {activity} |`
73
- Empty list → one full-width row with `_(none)_` in the Id column and every other cell blank,
74
- matching that table's column count (e.g. `| _(none)_ | | | | |` for the 5-column next_work
75
- table, `| _(none)_ | | | |` for the 5-column active table). Neither list carries an overflow
76
- "+N more" row anymore (D5, intent 202): the true pool size rides on the payload as
77
- `active_total`/`next_total` (shown counts as `active_shown`/`next_shown`), and `{{footer}}`
78
- states it in prose instead.
79
- - `{{projects.lines}}` (global board only) → the project rollup stays **prose**, one line per
80
- project (not a table):
81
- `- **{slug}**: {description}, active {active}, done {done}, future {future}, last accessed {last_accessed_at[0,10]}`.
82
- - Scalars (`{{date}}`, `{{slug}}`, `{{summary}}`, `{{footer}}`) → substitute verbatim. `summary`
83
- and `footer` are finished prose built in `dashboard.rb`; do not rewrite, shorten, or
84
- re-derive them from the counts - that is exactly the non-determinism D5 rules out.
85
-
86
- ### Paging (conversational, D4)
87
-
88
- The board shows a short page by default (Active capped at 3, Next-work at 5). When the
89
- user asks for "more" or "all", re-invoke Step 1 with an explicit flag and re-fill the
90
- template with the new payload - nothing is persisted to disk, the offset lives only in the
91
- chat turn:
92
- - "all" → add `--all` (lifts both caps to unbounded; the footer then shows equal shown/total).
93
- - "more" → add `--limit-active N`/`--limit-next N` with a larger `N` for whichever list the
94
- user is paging.
95
-
96
- For a real, own-terminal pager instead, point the owner at `--plain`:
97
- `ruby ~/.plastic/scripts/dashboard.rb project <slug> --plain | less` (or `continue --plain`
98
- for the global board). `--plain` prints the full, uncapped board as plain text with no
99
- Markdown table syntax; it is a separate CLI mode from `--data`, not something this skill
100
- fills a template from.
101
-
102
- ### Step 3 — Present it (mandatory, every invocation)
103
-
104
- **Paste the filled Markdown into your reply.** This is non-optional: if the reply does not
105
- contain the filled Markdown, the user sees nothing — tool-call stdout and hook
106
- `additionalContext` are both invisible to them. Never describe the board instead of showing
107
- it, and never assume a hook already showed it for you.
108
-
109
- `hook-continue` also emits a one-line `systemMessage` summary (counts, and the next big thing
110
- when there is one) as a hook-owned fallback, independent of the agent's reply. Treat that line
111
- as a floor only, not a substitute for this step: it carries no matrix, no recently-worked
112
- section, and no entry-flow prompt. Presenting the full board here remains mandatory regardless
113
- of whether the summary line fired. This stays a soft, agent-followed mechanism — there is no
114
- stronger enforcement for a full multi-section Markdown document in this harness today.
115
-
116
- ### Step 4 — Entry flow (the board is the menu)
117
-
118
- QMD-first (when available): when the user navigates by describing an intent rather than giving its
119
- id, before scanning the store with grep/Read run `ruby ~/.plastic/scripts/qmd-sync search "<terms>"`
120
- to surface the candidate intent, then open the authoritative intent file for the hit. The command is
121
- a no-op when QMD is absent, so fall back to the existing INDEX.md / file scan.
122
-
123
- The board lists everything; the user navigates by free prose (no capped picker):
124
- - On the **global** board, the user replies with an **intent id** (work it), a **project
125
- name** (re-run `project <slug> --data` and present that board), or **"new"** (start a new
126
- intent in global via `plastic-intent-creating`).
127
- - On a **project** board, the user replies with an **intent id**, or **"global"** to return.
128
-
129
- ## Auto-mode contract (`--json`)
130
-
131
- `plastic-auto` consumes a separate machine-readable manifest (unchanged):
132
-
133
- ```bash
134
- ruby ~/.plastic/scripts/dashboard.rb [continue|project <slug>|all] --json
135
- ```
136
-
137
- ```json
138
- { "generated_for": "auto-mode", "scope": "<scope|all>",
139
- "next_big_thing": "<id|null>",
140
- "dispatchable_queue": [ {"id","scope","disposition","type","value","effort","flags","rank"} ],
141
- "human_only": ["<id>", "..."] }
142
- ```
143
-
144
- Work `dispatchable_queue` in `rank` order (`defer`/`research`); leave `human_only` for the user.
145
-
146
- ## Text modes (terminal / legacy)
147
-
148
- `dashboard.rb [continue|project <slug>|all]` with no flag still prints the ASCII cockpit for
149
- a raw terminal. The Markdown board (`--data` + template) is the surface for the chat UI.
150
-
151
- ## How classification works (deterministic)
152
-
153
- The script computes Effort/Value/Flags/Override/Caps; the agent never re-derives them.
154
- To explain or debug a ranking or disposition, read `references/classification.md`.
155
-
156
- ## Eval
157
-
158
- The eval is the payload + golden snapshots: run the engine against the fixture store and
159
- assert the `--data` payload shape/sorting/classification and the byte-identical `--json` +
160
- text goldens in [`test/fixtures/dashboard/`](https://github.com/zalom/plastic/tree/main/test/fixtures/dashboard). See [`dashboard_test.rb`](https://github.com/zalom/plastic/blob/main/test/dashboard_test.rb). Drift without an
161
- intentional change means the skill is broken.
162
-
163
- ## Notes
164
-
165
- - The two intent lists (active, next work) render as Markdown tables; the prose summary,
166
- footer, counts, and the project rollup stay prose (intent 202). No Value x Effort grid
167
- returns. Never emit `<br>`.
168
- - Clusters (Zettelkasten grouping in INDEX.md) are intentionally not rendered.
169
- - Additive: changes no core lifecycle, gate, or cycle logic.