@zalom/plastic 2.0.0-alpha.8 → 2.0.1

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 (322) hide show
  1. package/PLASTIC.md +13 -136
  2. package/README.md +357 -133
  3. package/agents/plastic-enforcer.md +20 -15
  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 +6 -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/{skills/conventions/references → docs/help}/completion-and-done.md +15 -16
  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 +23 -13
  26. package/{skills/conventions/references → docs/help}/maintenance-and-revisions.md +1 -1
  27. package/{skills/conventions/references → docs/help}/roadmaps.md +2 -2
  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 +62 -1
  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 +238 -22
  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 +19 -5
  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 +48 -83
  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 +99 -0
  67. package/scripts/lib/cli/commands/auto_report.rb +50 -0
  68. package/scripts/lib/cli/commands/auto_take.rb +31 -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 +53 -0
  82. package/scripts/lib/cli/commands/intent_end.rb +62 -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 +71 -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 +42 -0
  95. package/scripts/lib/cli/commands/project_list.rb +20 -0
  96. package/scripts/lib/cli/commands/project_new.rb +72 -0
  97. package/scripts/lib/cli/commands/query.rb +31 -0
  98. package/scripts/lib/cli/commands/render.rb +33 -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 +70 -0
  104. package/scripts/lib/cli/commands/roadmap_show.rb +45 -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 +46 -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 +30 -16
  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 +229 -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 +532 -71
  152. package/scripts/lib/intent_screen.rb +9 -6
  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 +377 -173
  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 +913 -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 +1460 -74
  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 +158 -8
  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 +525 -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 +555 -0
  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 +25 -18
  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/verify_intent.rb +36 -8
  212. package/scripts/lib/version_number.rb +48 -0
  213. package/scripts/lib/work_graph.rb +59 -0
  214. package/scripts/lib/work_graph_validator.rb +201 -0
  215. package/scripts/lib/worktree.rb +27 -32
  216. package/scripts/lib/worktree_sweep.rb +6 -5
  217. package/scripts/link-suggest +2 -1
  218. package/scripts/meter-watch +57 -0
  219. package/scripts/migrate-to-global +1 -1
  220. package/scripts/new-intent +4 -13
  221. package/scripts/node-input +92 -0
  222. package/scripts/node-run +225 -0
  223. package/scripts/node-transition +291 -0
  224. package/scripts/outcome-report +74 -0
  225. package/scripts/plastic-lock +42 -33
  226. package/scripts/promote-session-item +3 -2
  227. package/scripts/read-config +53 -9
  228. package/scripts/ready-set +126 -0
  229. package/scripts/release-check +123 -0
  230. package/scripts/report-screen +192 -30
  231. package/scripts/roadmap-graph +119 -0
  232. package/scripts/roadmap-savepoint +7 -0
  233. package/scripts/runner +581 -0
  234. package/scripts/savepoint-note +11 -9
  235. package/scripts/session-commit +2 -1
  236. package/scripts/session-usage +56 -0
  237. package/scripts/skill-lint +115 -6
  238. package/scripts/spawn-preamble +2 -2
  239. package/scripts/update.rb +25 -4
  240. package/scripts/validate-work-graph +39 -0
  241. package/scripts/verify-intent +3 -2
  242. package/scripts/write-handoff +2 -1
  243. package/templates/agents.md +7 -7
  244. package/templates/config.yml +16 -9
  245. package/templates/dashboard-screen.md +22 -0
  246. package/templates/display-fixture.md +21 -0
  247. package/templates/graph.md +16 -0
  248. package/templates/index.md +1 -1
  249. package/templates/intent-screen.md +1 -1
  250. package/templates/node-decision.md +11 -0
  251. package/templates/node-research.md +13 -0
  252. package/templates/node-verify.md +13 -0
  253. package/templates/node-work.md +22 -0
  254. package/templates/outcome.md +15 -2
  255. package/templates/project.yml +1 -1
  256. package/templates/render.css +10 -0
  257. package/templates/report-plan.md +15 -0
  258. package/templates/report-roadmap-delivered.md +10 -0
  259. package/templates/report-roadmap-plan.md +9 -0
  260. package/templates/report-roadmap-state.md +9 -0
  261. package/templates/report-state.md +1 -1
  262. package/templates/roadmap.md +13 -0
  263. package/bin/plastic.js +0 -70
  264. package/scripts/lib/bridge.rb +0 -116
  265. package/skills/agent-advisor/SKILL.md +0 -92
  266. package/skills/auto/SKILL.md +0 -295
  267. package/skills/auto/evals/evals.json +0 -255
  268. package/skills/auto/references/end-tail.md +0 -66
  269. package/skills/auto/references/human-report-contract.md +0 -78
  270. package/skills/conventions/SKILL.md +0 -29
  271. package/skills/dashboard/SKILL.md +0 -169
  272. package/skills/dashboard/evals/evals.json +0 -38
  273. package/skills/dashboard/references/classification.md +0 -22
  274. package/skills/dashboard/templates/dashboard-global.md +0 -20
  275. package/skills/dashboard/templates/dashboard-project.md +0 -19
  276. package/skills/direct/SKILL.md +0 -66
  277. package/skills/direct/references/request-signals.md +0 -59
  278. package/skills/doctor/SKILL.md +0 -299
  279. package/skills/doctor/report.md +0 -102
  280. package/skills/feedback/SKILL.md +0 -98
  281. package/skills/feedback/references/transport-and-privacy.md +0 -65
  282. package/skills/feedback/report.md +0 -36
  283. package/skills/install/SKILL.md +0 -217
  284. package/skills/intent-continuing/SKILL.md +0 -154
  285. package/skills/intent-continuing/references/board-fill.md +0 -43
  286. package/skills/intent-continuing/references/boarding-matrix.md +0 -34
  287. package/skills/intent-continuing/references/context-management.md +0 -28
  288. package/skills/intent-continuing/references/liveness-ranking.md +0 -57
  289. package/skills/intent-creating/SKILL.md +0 -164
  290. package/skills/intent-creating/evals/evals.json +0 -72
  291. package/skills/intent-creating/references/lifecycle.md +0 -81
  292. package/skills/intent-creating/references/wikilinks.md +0 -8
  293. package/skills/intent-ending/SKILL.md +0 -173
  294. package/skills/intent-ending/evals/evals.json +0 -74
  295. package/skills/intent-executing/SKILL.md +0 -170
  296. package/skills/intent-executing/evals/evals.json +0 -66
  297. package/skills/intent-executing/implementer-prompt.md +0 -42
  298. package/skills/intent-executing/spec-reviewer-prompt.md +0 -27
  299. package/skills/intent-speccing/SKILL.md +0 -130
  300. package/skills/intent-speccing/evals/evals.json +0 -126
  301. package/skills/intent-speccing/references/design-principles.md +0 -44
  302. package/skills/intent-speccing/references/per-section-fill-rules.md +0 -92
  303. package/skills/intent-speccing/references/self-verify-checklist.md +0 -37
  304. package/skills/project-creating/SKILL.md +0 -162
  305. package/skills/project-creating/references/hubs-projects.md +0 -55
  306. package/skills/project-creating/references/project-scaffolding.md +0 -97
  307. package/skills/releasing/SKILL.md +0 -337
  308. package/skills/releasing/references/deprecations.md +0 -60
  309. package/skills/releasing/references/promotion-and-tagging.md +0 -66
  310. package/skills/releasing/references/release-lines.md +0 -105
  311. package/skills/roadmap/SKILL.md +0 -64
  312. package/skills/roadmap/references/file-format.md +0 -124
  313. package/skills/roadmap/references/operations.md +0 -112
  314. package/skills/rollback/SKILL.md +0 -91
  315. package/skills/tutorial/SKILL.md +0 -65
  316. package/skills/tutorial/evals/evals.json +0 -186
  317. package/skills/uninstall/SKILL.md +0 -75
  318. package/skills/update/SKILL.md +0 -126
  319. /package/{skills/auto/references → docs/help}/agent-report-contract.md +0 -0
  320. /package/{skills/intent-executing → docs/help}/code-quality-reviewer-prompt.md +0 -0
  321. /package/{skills/conventions/references → docs/help}/lifecycle-and-savepoints.md +0 -0
  322. /package/{skills/intent-executing → docs/help}/plan-reviewer-prompt.md +0 -0
@@ -1,22 +0,0 @@
1
- # How Classification Works (Deterministic)
2
-
3
- The script (`dashboard.rb`) computes Effort/Value/Flags/Override/Caps deterministically;
4
- the agent never re-derives them. Read this to explain or debug a ranking or disposition.
5
-
6
- - **Effort** — small for `research`/`exploration`/`bugfix`, for already-scoped intents
7
- (plan/checklist exists), or a **branch id** (folgezettel depth ≥ 2, e.g. `4a`, `12b3`); big
8
- otherwise. A root id (a bare number) is always depth 1, so it is never demoted by this rule.
9
- - **Value → high** when any of: explicit `value: high`; a human-authored **root** intent; or
10
- an intent that is a `source` of ≥1 other intent (it has spawned follow-on work). A purely
11
- relational `chain` entry alone is **not** a value signal (intent 68) — else low.
12
- - **Flags** — `unblocked` only when a **future** intent has **all** its `sources` done AND at
13
- least one source's completion date is strictly later than the intent's own `created` date (a
14
- genuine wait, not a birth-time default); `in-progress` only when the savepoint ledger shows
15
- real post-birth activity, not just the creation stamp; `stale` only on future intents past
16
- the staleness threshold. All three kept low-noise by design.
17
- - **Override** — a `value: high|low` frontmatter field always wins (pre-stamped data, never
18
- model judgment at render time).
19
- - **Caps**: the next-work list and the project board's `active`/`future` lists are capped at
20
- 8 entries plus a trailing "+N more" line; each entry's text is truncated to 120 characters
21
- with a trailing ellipsis. Applies to the Markdown board only (the ASCII renderer has its own
22
- separate `CELL_CAP`).
@@ -1,20 +0,0 @@
1
- # 🧩 Plastic · Global Board, {{date}}
2
-
3
- {{summary}}
4
-
5
- ## Where we are
6
-
7
- {{counts.active}} intents active, {{counts.done}} done, {{counts.future}} queued for later.
8
-
9
- ## Projects, active {{project_totals.active}}, done {{project_totals.done}}, future {{project_totals.future}}
10
- {{projects.lines}}
11
-
12
- ## Most-valuable next work
13
-
14
- | Id | What | Value | Disposition | Flags |
15
- | --- | --- | --- | --- | --- |
16
- {{next_work.rows}}
17
-
18
- {{footer}}
19
-
20
- **What would you like to work on next?** (type an **intent id**, a **project name**, or anything **new** you'd like to start)
@@ -1,19 +0,0 @@
1
- # 📦 {{slug}} · Project Board, {{date}}
2
-
3
- {{summary}}
4
-
5
- **Active**
6
-
7
- | Id | What | Stage | Worker | Activity |
8
- | --- | --- | --- | --- | --- |
9
- {{active.rows}}
10
-
11
- **Most-valuable next work**
12
-
13
- | Id | What | Value | Disposition | Flags |
14
- | --- | --- | --- | --- | --- |
15
- {{next_work.rows}}
16
-
17
- {{footer}}
18
-
19
- **What would you like to work on next?** (type an **intent id**, or **global** to go back)
@@ -1,66 +0,0 @@
1
- ---
2
- name: plastic-direct
3
- description: Use when a prompt asks for a change, a fix, an edit, a file, or an answer, and no thinking conversation is open on an intent. Judges whether the work is small enough to run right now, asks one clarifying question when one answer would settle it, or offers a thinking intent when it would not. Do not use for a prompt that says "auto" or "continue", a prompt asking to start a new intent, or a prompt inside an open thinking conversation, which belong to plastic-auto, plastic-intent-continuing, plastic-intent-creating, and plastic-intent-speccing.
4
- user-invocable: false
5
- ---
6
-
7
- # Direct mode
8
-
9
- Route the prompt in one read, then act. Direct work runs inline in this session, never through a
10
- dispatched agent, unless the user asks for agents.
11
-
12
- ## 1. Estimate before you start
13
-
14
- Judge the prompt alone, before doing any of the work:
15
-
16
- 1. Count the targets the prompt names, or that one grep finds.
17
- 2. Require each change to be a named operation on a known target (rename this, add a check there,
18
- delete that line), not an outcome ("clean it up", "make it faster").
19
- 3. Budget about one minute per target and sum.
20
- 4. At or under five minutes, run it now. Five minutes is an owner ruling, not a measured
21
- threshold.
22
- 5. A bounded sum above five minutes, offer a dedicated intent.
23
- 6. An unknown target, or a change described only by its outcome, cannot be bounded. Ask one
24
- question when one answer would supply the missing operation or target. Otherwise offer a
25
- thinking intent. A target that only investigation can find is never settled by one
26
- question.
27
-
28
- Tests or a build the prompt implies do not count against the budget. Verification is part of
29
- direct work, not a reason to leave direct mode.
30
-
31
- ## 2. One question, then run
32
-
33
- A clarifying question is allowed in direct mode and does not by itself turn the request into a
34
- thinking intent. Ask one, then run. If the answer is still vague, offer a thinking intent rather
35
- than asking a second question or guessing.
36
-
37
- ## 3. The routes
38
-
39
- | What the prompt looks like | Where it goes |
40
- |---|---|
41
- | Clear, and bounded at or under five minutes | Run it now, inline |
42
- | Clear, but the bounded estimate is above five minutes | Offer a dedicated intent, `plastic-intent-creating` |
43
- | Vague, and one answer would resolve it | Ask one clarifying question, then run |
44
- | Still vague after that one answer | Offer a thinking intent, `plastic-intent-speccing` |
45
- | Phrased as needing help rather than as an instruction | Offer grill plus a thinking conversation, `plastic-intent-speccing` |
46
- | Says "auto" explicitly | Hand off to `plastic-auto` |
47
-
48
- Read `references/request-signals.md` when a prompt sits on the boundary between two routes, for
49
- the 15 observable signals and the response each one selects.
50
-
51
- ## 4. Record and verify
52
-
53
- - Verification in direct mode is the UI, the tests, or the user. There is no reviewer agent per
54
- item.
55
- - Only a prompt that changes something on disk or produces an artifact becomes a checklist item.
56
- A pure question is answered inline and recorded nowhere.
57
- - Direct work records into the day ledger that the per-session pointer names. Assume the pointer
58
- exists. Never write it.
59
-
60
- ## 5. What direct does not take
61
-
62
- The capture hook detects `auto` and `continue` before you read the prompt, so defer rather than
63
- keyword-match them yourself. `auto` goes to `plastic-auto`, and `continue` goes to
64
- `plastic-intent-continuing`. On `auto` with no registered intent, route through
65
- `plastic-intent-creating` first, because auto requires a registered intent. A prompt that arrives
66
- inside an open thinking conversation belongs to that conversation, not here.
@@ -1,59 +0,0 @@
1
- # Request signals
2
-
3
- The table below is reproduced from
4
- `296--make-plastic-faster-small-work/resources/research--request-analysis.md`, the
5
- request-analysis research deposit of intent 296, with its source column renumbered against the
6
- eight-source list below. Read it when a prompt sits on the boundary between two routes. That
7
- deposit also carries seven worked examples, one per boundary, for a reader who wants them.
8
-
9
- ## The signal table
10
-
11
- | Signal | What it looks like in a real prompt | Response it selects | Source or ruling |
12
- |---|---|---|---|
13
- | A concrete file and a concrete operation are named | "Rename `foo` to `bar` in `app/models/user.rb` and update its three callers." | execute now | D13, D14 |
14
- | The target is a single, already-known location | "Fix the typo in README.md line 12." | execute now | D14 |
15
- | The change is described only by its outcome, with no operation named | "Clean up the user model, it's gotten messy." | ask one clarifying question | Kamsties, "Understanding Ambiguity in Requirements Engineering" (source 5); D13 |
16
- | The prompt uses weak, hedging modal language ("might", "could", "maybe", "somewhere") | "This might need better error handling somewhere in the payment flow." | ask one clarifying question | "Automatic Detection of Ambiguous Terminology for Software Requirements" (weakness ambiguity, source 6); D13 |
17
- | The prompt admits several equally plausible readings with no cue that favors one | "Make the form better." (styling, validation, and accessibility are all live readings) | ask one clarifying question | "Knowing but Not Showing" (source 3); "Ask or Assume?" (source 1) |
18
- | One answer to the clarifying question fully resolves scope | User answers: "Just the null check on line 42, nothing else." | execute now | D10 |
19
- | The answer to the clarifying question is itself vague or open-ended | User answers: "I don't know, whatever seems right." | offer a thinking intent | D13; "Ask or Assume?" (source 1) |
20
- | The prompt is phrased as a request for help rather than an instruction | "I need help figuring out how to structure the billing refactor, not sure where to start." | offer a thinking intent | D13 |
21
- | The number of named or discoverable targets is small (roughly one to three) and each change is additive | "Update the copyright year in these three footer partials." | execute now | D14 |
22
- | The number of targets is large, or the work is described as spanning many files | "Migrate all 40 view partials to the new component library." | offer a thinking intent | D14 |
23
- | The target is not yet known and must be found by investigation before any edit is possible | "Something is causing the checkout page to be slow, find it and fix it." | offer a thinking intent | D14; sources 7 and 8 |
24
- | The action is destructive or hard to reverse and its scope is ambiguous | "Delete the old migrations directory." | ask one clarifying question | "Structured Uncertainty guided Clarification for LLM Agents" (source 4) |
25
- | The action is destructive but small, self-contained, and obviously scoped | "Delete the unused `tmp_debug.rb` file I just created." | execute now | D14 |
26
- | The request implies running tests or a build step the agent can run itself as part of verification | "Fix the failing test in user_test.rb." | execute now | D15 |
27
- | The prompt changes nothing on disk and produces no artifact | "What does the PaymentProcessor class do?" | execute now (answered inline; never admitted as a checklist item) | D17 |
28
-
29
- Row 8 uses the deposit's wording. Ruling D13 makes the help-needed route grill plus a
30
- thinking conversation, as `SKILL.md` section 3 states.
31
-
32
- ## Rulings, not findings
33
-
34
- Four things in the table above are owner rulings with no literature behind them. Apply
35
- them, and know they are policy knobs the owner can turn, not measured results.
36
-
37
- - The five-minute total and the one-minute-per-target budget. Task-complexity research (sources 7
38
- and 8) correlates target count and search depth with lower agent success, which supports
39
- counting targets, but no source sets these numbers.
40
- - The one-question cap. The clarification research (sources 1, 2, and 4) treats question count as
41
- a calibrated, cost-weighted choice that can be zero, one, or more. A hard cap of one is the
42
- owner's choice.
43
- - "Auto" meaning auto mode. It is an interface convention, a keyword that names the mode instead
44
- of asking for a judgement.
45
- - "Help needed" phrasing meaning grill plus a thinking conversation. It is a register cue
46
- specific to how this owner phrases requests, not a general finding.
47
-
48
- ## Sources
49
-
50
- 1. "Ask or Assume? Uncertainty-Aware Clarification-Seeking in Coding Agents." https://arxiv.org/abs/2603.26233
51
- 2. "Learning to Ask: When LLM Agents Meet Unclear Instruction." EMNLP 2025. https://aclanthology.org/2025.emnlp-main.1104.pdf
52
- 3. "Knowing but Not Showing: LLMs Recognize Ambiguity but Rarely Ask Clarifying Questions." https://arxiv.org/pdf/2605.25284
53
- 4. "Structured Uncertainty guided Clarification for LLM Agents." https://openreview.net/forum?id=dc8ebScygC
54
- 5. Kamsties, Erik. "Understanding Ambiguity in Requirements Engineering." https://link.springer.com/chapter/10.1007/3-540-28244-0_11
55
- 6. "Automatic Detection of Ambiguous Terminology for Software Requirements." https://www.eecis.udel.edu/~yuewang/paper/nldb2013.pdf
56
- 7. "An Approach for Systematic Decomposition of Complex LLM Tasks." https://arxiv.org/html/2510.07772v1
57
- 8. "On the Importance of Task Complexity in Evaluating LLM-Based Multi-Agent Systems." https://arxiv.org/html/2510.04311
58
-
59
- All eight were accessed 2026-08-29. The D-numbers in the table are decisions in `296/spec.md`.
@@ -1,299 +0,0 @@
1
- ---
2
- name: plastic-doctor
3
- description: Use when diagnosing Plastic installation health, after updates, or when something seems broken. Runs checks and reports findings with fix options.
4
- user-invocable: true
5
- ---
6
-
7
- # Doctor: Plastic Health Check
8
-
9
- ## Scopes
10
-
11
- Doctor has three scopes. Pick the right one for the situation:
12
-
13
- | Scope | Flag | When it runs | States |
14
- |-------|------|--------------|--------|
15
- | Core check | `--core` | SessionStart hook (automatic), also available on demand | Binary: pass or error |
16
- | Store check | `--store [global\|<slug>]` | Dashboard load, the project route of `plastic-intent-continuing` | Three-state: pass / warn / fail |
17
- | Full check | (no flag) | After every update (automatic), or `/plastic-doctor` | Three-state: pass / warn / fail |
18
-
19
- ### `--core` (binary, operational-readiness only)
20
-
21
- Checks ONLY that Plastic is loaded and ready for work: agent registration (skills,
22
- subagents, hooks/harnesses present and registered), core files (manifest-backed
23
- presence/hash checks, excluding `agent_model_drift`, which is a non-boot
24
- config-honoring check, never run at core), manifest sync (global + agent manifest
25
- SHA256), every registered project's path resolving to a real, existing directory,
26
- and the global store being reachable (`INDEX.md` present; no orphan/ghost content
27
- scanning). Result is binary: exit 0 on pass, non-zero on error. It never produces
28
- warnings, and it never scans store content.
29
-
30
- It checks two install manifests as part of core files and manifest sync:
31
-
32
- - `~/.plastic/manifest.json` (global manifest, covers PLASTIC.md and global scripts)
33
- - `~/.claude/plastic/manifest.json` (agent-side manifest, covers agent scripts and hooks)
34
-
35
- Each manifest maps a file path to its SHA256.
36
-
37
- **On failure**, the report states this guided route, in order:
38
-
39
- 1. Offer fixes in the `/plastic-doctor` conversation (the Fix all / Select individually /
40
- Skip router from Steps 4-5 below); doctor itself only reports, and each chosen repair
41
- is dispatched to the maintenance tool or skill that owns it.
42
- 2. If that does not resolve it, roll back to the last known-good version via
43
- `plastic-rollback` (restores from the local, append-only `versions.json` ledger of
44
- versions actually run).
45
- 3. Optionally report the issue via the feedback command (`scripts/feedback-report`,
46
- backing the `plastic-feedback` skill), which composes a local report plus a
47
- prefilled GitHub issue URL and never holds a credential or contacts GitHub
48
- directly.
49
-
50
- ### `--store [global|<slug>]`
51
-
52
- Checks the operations Plastic itself depends on in one store: QMD search reachability (scoped
53
- to that store's own collection; global uses `plastic-global`, a project slug uses
54
- `plastic-<slug>`), sources/chain resolution, cross-store resolution, INDEX parsing, links
55
- projection, done signals (including `backfilled_complete`: a terminal intent still missing a
56
- real spec.md, plan.md, or action file), and, for the global store only, the session ledger
57
- (`orphaned_session_tmp`: a `.tmp/<session>/` directory whose heartbeat is older than 24
58
- hours; `day_ledger_shape`: a `.sessions/` entry that is not a `YYYYMMDD` day directory with
59
- its `<day>.md`). A project slug also checks tool readiness (Serena, Enola): each is a pass whether
60
- present or absent, present naming it available, absent noting it as an optional integration
61
- never installed by doctor. Scope options:
62
-
63
- - No argument (`:all`): checks all stores (global and all project stores), QMD reachability
64
- unscoped across every collection.
65
- - `global`: checks only the global store, QMD scoped to `plastic-global`, no tool-readiness
66
- checks (code-navigation tools have no meaning against the global store).
67
- - A project slug (e.g. `--store plastic`): checks only that project's store, QMD scoped to
68
- `plastic-<slug>`, plus Serena/Enola readiness for that project.
69
-
70
- Produces three-state results (pass / warn / fail) and is run per-scope at dashboard load time:
71
- the global board uses `--store global`, a project board uses `--store <slug>`. **This IS the
72
- load-time full project check** named by 219's doctrine: no separate mechanism exists or is
73
- needed, since a project slug's scan already carries every per-project finding scoped to that
74
- project alone.
75
-
76
- ### Full doctor (no flag)
77
-
78
- Runs the install-wide surface: agent registration, core files (including config-honoring
79
- drift), manifest sync is core-only and not part of this run, deprecation checks, config-ask
80
- checks, install-integrity checks, skill-lint (advisory), QMD reachability (unscoped, every
81
- collection), and the global store's own conventions/done-signals content. **Never carries a
82
- per-project finding**; that is `--store <slug>`'s job (see above). This is what
83
- `/plastic-doctor` invokes, and it also runs automatically after every `plastic-update`
84
- (informational, does not block or revert the update).
85
-
86
- ## When to Use
87
-
88
- - User invokes `/plastic-doctor` (full check)
89
- - After `plastic-update` completes (automatically, full check)
90
- - When hooks aren't firing, skills aren't loading, or something seems broken
91
- - When the user says "check plastic", "diagnose", "what's wrong with plastic"
92
-
93
- ## Procedure
94
-
95
- ### Step 1: Run the diagnostic script
96
-
97
- ```bash
98
- ruby ~/.plastic/scripts/doctor.rb --agent claude
99
- ```
100
-
101
- Replace `claude` with the current agent type if known (`codex`, `hermes`).
102
-
103
- Parse the JSON output from stdout. The script is read-only and never modifies
104
- files. Errors go to stderr.
105
-
106
- Exit codes indicate check results, not script failure:
107
- - `0`: all checks passed
108
- - `1`: warnings found
109
- - `2`: failures found
110
-
111
- All three exit codes mean the script ran successfully. Do not treat non-zero
112
- as an error.
113
-
114
- ### Step 2: Determine overall status
115
-
116
- Read the `status` field from the JSON root:
117
-
118
- | Status | Meaning |
119
- |--------|---------|
120
- | `pass` | Everything is healthy |
121
- | `warn` | Warnings found but Plastic works normally |
122
- | `fail` | Blocking issues that prevent Plastic from operating |
123
-
124
- ### Step 3: Fill the report template
125
-
126
- Read `report.md` from the same directory as this SKILL.md
127
- (`~/.plastic/skills/doctor/report.md` at runtime, or the plugin source
128
- `skills/doctor/report.md` during development).
129
-
130
- Group checks by category. For each category, list the checks with their
131
- status icon and message. If a check has `details`, list them as sub-items.
132
-
133
- Present the filled template to the user.
134
-
135
- ### Step 4: Offer fixes (if applicable)
136
-
137
- If any checks have `fixable: true` AND status is not `pass`:
138
-
139
- 1. Group fixable items by category
140
- 2. Show what each fix would do (from `fix_hint`)
141
- 3. Ask the user: **"Fix all / Select individually / Skip"**
142
-
143
- If no fixable issues exist, skip this step.
144
-
145
- This "Fix all / Select individually / Skip" prompt IS the router the spec calls
146
- `doctor --fix-all` (intent 197): doctor itself never mutates anything (see Step 5's table and
147
- "Important Notes" below); "Fix all" means "dispatch every fixable finding to the maintenance
148
- tool or skill that owns that class of repair," one row per fix_hint pattern.
149
-
150
- ### Step 5: Apply fixes
151
-
152
- Use the `fix_hint` value to determine the correct action:
153
-
154
- | Fix hint pattern | Agent action |
155
- |---|---|
156
- | "chmod +x on the listed files" | Run `chmod +x` on each file listed in `details` |
157
- | "Create missing directory" | Run `mkdir -p` on the path |
158
- | "Create INDEX.md with required sections" | Write INDEX.md with the 5 sections: Active, Future, Clusters, Abandoned, Completed |
159
- | "Add missing entries to INDEX.md" | Add orphaned intents to the appropriate INDEX.md section |
160
- | "Remove stale references from INDEX.md" | Edit INDEX.md to remove ghost references |
161
- | "Inject the missing required frontmatter field(s)" | Edit the intent's `{ID}--{slug}.md` frontmatter to add the missing key (e.g. `chain: []`) without touching other keys |
162
- | "Run: provision-project-store {slug}" | Run `provision-project-store <slug>` (see Provisioning a project store below) to create the missing store |
163
- | "Re-run installer" | Run `npx -y @zalom/plastic@<channel> install --claude` (or `--codex`/`--hermes`/`--all` for that agent; channel: -alpha->@alpha, -beta->@beta, else @latest) |
164
- | "Run the Plastic installer to bootstrap the store" | Run `npx -y @zalom/plastic@<channel> install --claude` (or `--codex`/`--hermes`/`--all`; channel: -alpha->@alpha, -beta->@beta, else @latest) to restore the global store's plastic_home directory or INDEX.md |
165
- | "Relocate ... revisions.md ..." | Relocate the flagged section or ref into the intent's `revisions.md` via move-and-record (one dated, `[rule: <tag>]`-tagged entry per item), per plastic-conventions > references/maintenance-and-revisions.md. For a missing required section, restore or reproject it instead. |
166
- | "Write the missing documents from the record via `scaffold-intent backfill ...`" | Run `ruby ~/.plastic/scripts/scaffold-intent backfill --store <store> --id <id> --disposition <delivered\|abandoned>` for each listed intent; it fills only missing or placeholder files and never touches real content |
167
- | "Remove each listed .tmp/<session>/ directory after confirming that session is gone" | For each listed directory, confirm no live session uses it (a live session rewrites its heartbeat on every prompt and edit), then remove that directory by hand; never remove an unlisted one |
168
- | "For a day directory missing its <day>.md, run `file-session-intent --day <day> ...`" | Run `ruby ~/.plastic/scripts/file-session-intent --day <day> --carry-to <today> --store <store>` for the named day; rename or remove an entry that is not a `YYYYMMDD` day directory |
169
- | "Run scripts/project-links ... PRESERVES ... --drop-unbacked-links" | Run `ruby ~/.plastic/scripts/maintenance-run --tool project-links --intent <id> --apply` for the one flagged id (never run bare `project-links` against a real store outside the rare owner-approved batch exception, D2) |
170
-
171
- For fixes the agent cannot handle automatically, explain what the user needs
172
- to do manually. The `revisions.md` remedy is curator-applied (a move-and-record
173
- relocation, not a mechanical edit) and stays human-gated by the Step 4
174
- Fix / Select / Skip prompt.
175
-
176
- Read `../plastic-conventions/references/maintenance-and-revisions.md` for WORK versus
177
- MAINTENANCE, the `revisions.md` move-and-record contract, and the violation-tag catalog behind
178
- the `revisions.md` remedy above.
179
-
180
- ### Step 6: Verify
181
-
182
- After applying fixes, re-run the diagnostic script:
183
-
184
- ```bash
185
- ruby ~/.plastic/scripts/doctor.rb --agent claude
186
- ```
187
-
188
- Show the updated results.
189
-
190
- - If all checks pass: announce success.
191
- - If issues remain: explain what is still wrong and what the user can do.
192
-
193
- ## Post-Update Mode
194
-
195
- When invoked from `plastic-update` (not directly by the user):
196
-
197
- 1. Run the diagnostic script as in Step 1.
198
- 2. If all checks pass, show a single line: **"Health check: all clear."**
199
- 3. If issues are found: show the full report (Steps 3-6).
200
-
201
- This keeps the update flow clean when nothing is wrong.
202
-
203
- ## Important Notes
204
-
205
- - The script is **read-only**. It inspects but never modifies files.
206
- All fixes are performed by the agent using standard tools.
207
- - The script outputs JSON to stdout. Any diagnostic errors go to stderr.
208
- - Non-zero exit codes mean "issues found", not "script crashed".
209
- Always parse stdout regardless of exit code.
210
-
211
- ## Doctor-Exclusions: Known-Exempt Findings
212
-
213
- Some `savepoint_operational` findings can never legitimately close (a terminal intent with no
214
- real `outcome.md` has no disposition to echo, and doctor never invents one), so each store
215
- carries a `doctor-exclusions` file, sibling to that store's `INDEX.md`, recording
216
- knowingly-exempt `(intent_id, rule)` pairs. Format: one `rule_name id id id` line per rule,
217
- blank lines and `#` comments ignored. v1 honors exactly one rule, `savepoint_operational`.
218
-
219
- **Reading the count.** When any exclusion applies, the `savepoint_operational` check's message
220
- folds in the count and the file's path, e.g. `"... (3 excluded via ~/.plastic/doctor-exclusions)"`.
221
- A malformed line in the file forces the check to `warn` with the parse error in `details`, even
222
- when zero real gaps remain, so a broken file is never silently permissive.
223
-
224
- **Both surfaces, one line.** A registration is honored by the store-wide `savepoint_operational`
225
- check and by the per-intent `doctor.rb --intent <id>` run, which reports the same missing
226
- `savepoint.md` under the check name `intent_savepoint_truthful`. Register the id once. The
227
- per-intent run honors it only for an intent that is terminal in `INDEX.md`, and never suppresses
228
- a phantom-savepoint-line finding.
229
-
230
- **Hand-editing.** The file is plain text; add a line (or append ids to an existing rule line) and
231
- save. No installer step, no reindex, and no `revisions.md` entry is required or written.
232
-
233
- **Populating it in bulk.** Run the maintenance tool, dry-run first:
234
-
235
- ```bash
236
- ruby ~/.plastic/scripts/maintenance-run --tool register-exclusions
237
- ```
238
-
239
- This computes every current `savepoint_operational` violation across all stores (or one store
240
- via `--store <key>`), through doctor's own finding function, and prints what it would register
241
- without writing anything. Review the output, then re-run with `--apply` to write the file(s) and
242
- land one scoped git commit. It unions with any existing hand-added ids (never drops one) and
243
- skips, rather than aborts on, any intent dir holding a fresh delivery lock.
244
-
245
- **Dead-row notice.** A registered row can go dead (gap repaired, id mistyped, or the intent
246
- directory gone). When any row is dead, the message adds a second suffix next to the exclusion
247
- count naming the count, the file, and the prune command - purely informational, status and exit
248
- code unchanged. Prune it the same way, dry-run first: register-exclusions --prune [--apply]. It
249
- removes exactly the dead rows through the same writer and commit, but holds back an id whose
250
- intent dir carries a fresh lock or has not gone terminal yet (nothing to suppress there yet),
251
- naming both as kept.
252
-
253
- ## Locks (auto teams only)
254
-
255
- Locks exist for auto teams: a `delivery.lock` file in the intent directory names the owning
256
- session, and the `record` hook refreshes its mtime on every edit (the lease heartbeat; stale
257
- means older than the TTL). Direct work takes no lock. When a lock reads held by a session
258
- that is gone, when work resumes after a crash, reboot, or `/tmp` wipe, or when the user says
259
- "fix the lock", "who holds the lock", or "reclaim the lock", use the CLI (intent 304 folded
260
- the former locking skill here):
261
-
262
- | Verb | What it does | When |
263
- |---|---|---|
264
- | `who` | Owner, heartbeat, claims, delegates, from durable files only | Safe inspection; needs `--intent-dir` |
265
- | `status` | Lock file, freshness, the derived worktree, whether this session's pointer names the intent, claims | Always safe; run first |
266
- | `fix` | Idempotent repair from disk truth for this session; never touches a fresh foreign lock | Interrupted work, corrupt state, `/tmp` wiped |
267
- | `release` | The owner clears the lock | Ending or abandoning an auto delivery |
268
- | `reclaim` | Explicit takeover of a stale lock; appends an audit line to `savepoint.md` | The owner is gone and the lease expired |
269
- | `delegate` | The owner registers a subagent session, or marks it `finished` or `failed` | Auto-team orchestration |
270
-
271
- ```
272
- ruby ~/.plastic/scripts/plastic-lock status --intent-dir <store>/<id>--<slug>
273
- ruby ~/.plastic/scripts/plastic-lock who --intent-dir <store>/<id>--<slug>
274
- ruby ~/.plastic/scripts/plastic-lock fix --intent-dir <store>/<id>--<slug>
275
- ruby ~/.plastic/scripts/plastic-lock reclaim --intent-dir <store>/<id>--<slug>
276
- ```
277
-
278
- `fix` exits non-zero when another session holds a fresh lock: back off, `status` shows the
279
- owner. `reclaim` refuses a fresh lock; every takeover is audited. The lock file's mtime is the
280
- sole freshness truth. Never delete a lock file by hand. Read
281
- `../plastic-conventions/references/locks-and-worktrees.md` when a lock question goes beyond
282
- these verbs (claims, worktrees, the station ledger).
283
-
284
- ## Provisioning a project store
285
-
286
- When a project is registered in `~/.plastic/projects.yml` but has no store on disk (doctor
287
- reports `project_store_dir`), provision it (intent 304 folded the former provisioning skill
288
- here). The slug is the project's key under `projects`; an unregistered slug exits non-zero and
289
- creates nothing, and this procedure never edits `projects.yml`.
290
-
291
- ```bash
292
- ruby ~/.plastic/scripts/provision-project-store <slug>
293
- ruby ~/.plastic/scripts/qmd-sync register --store ~/.plastic/projects/<slug>/store
294
- ```
295
-
296
- The provisioner is pure filesystem and idempotent: it creates
297
- `~/.plastic/projects/<slug>/store/` with `.gitkeep`, writes `INDEX.md` and `project.yml` only
298
- when missing, and never clobbers. The QMD registration is a separate, optional step that
299
- no-ops when QMD is absent. New projects are provisioned by `plastic-project-creating`, not here.
@@ -1,102 +0,0 @@
1
- # Plastic Doctor Report
2
-
3
- <!-- =======================================================================
4
- AGENT INSTRUCTIONS -- How to fill this template
5
- =========================================================================
6
- 1. Run the doctor script. It outputs JSON with check results.
7
- 2. Replace every {{placeholder}} below with the corresponding JSON value.
8
- 3. For the category sections: the template shows ONE example section.
9
- Repeat that pattern for each unique category in the checks array.
10
- The scope determines which categories appear:
11
- --core scope: agent_registration, core_files (binary pass/error only)
12
- --store scope: global_store, conventions, project_stores
13
- full (no flag): all six categories below
14
- The six known categories and their display names are:
15
- global_store -> "Global Store"
16
- conventions -> "Conventions"
17
- agent_registration -> "Agent Registration"
18
- core_files -> "Core Files"
19
- project_stores -> "Project Stores"
20
- deprecations -> "Deprecations"
21
- done_signals -> "Done Signals"
22
- session_ledger -> "Session Ledger" (global store only)
23
- 4. For each check within a category, emit one line with the status icon
24
- and the check message. If the check has non-empty details, list them
25
- as indented sub-items.
26
- 5. The "Fixable Issues" section should ONLY appear if at least one check
27
- has fixable=true AND status is not "pass". Omit the entire section
28
- otherwise.
29
- 6. Status icons (plain text, no emoji):
30
- pass -> [PASS]
31
- warn -> [WARN]
32
- fail -> [FAIL]
33
- 7. The overall status icon in the header uses the same mapping.
34
- 8. After filling, remove all HTML comments -- they are instructions only.
35
- ======================================================================= -->
36
-
37
- ## {{overall_status_icon}} Overall: {{status}} -- Plastic v{{version}}
38
-
39
- Checked at: {{timestamp}}
40
-
41
- ### Summary
42
-
43
- {{pass}} passed, {{warn}} warnings, {{fail}} failed -- {{total}} checks total
44
-
45
- ---
46
-
47
- <!-- =====================================================================
48
- CATEGORY SECTIONS
49
- ======================================================================
50
- Repeat the block below ONCE PER CATEGORY present in the checks array.
51
- Group checks by their "category" field. Use the display name mapping
52
- above for the heading. Within each category, list every check as a
53
- single line: status icon + message. If a check has non-empty "details",
54
- list each detail as an indented bullet beneath.
55
-
56
- Example category section (for agent_registration with two checks):
57
- ===================================================================== -->
58
-
59
- ### Agent Registration
60
-
61
- - [PASS] Claude Code adapter registered
62
- - [FAIL] 2 hook scripts not executable
63
- - ~/.claude/hooks/plastic-session-start
64
- - ~/.claude/hooks/plastic-record
65
-
66
- <!-- =====================================================================
67
- Repeat the above pattern for each category found in the checks array.
68
- Only include categories that have at least one check.
69
- Order categories as they appear in the checks array.
70
- ===================================================================== -->
71
-
72
- ---
73
-
74
- <!-- =====================================================================
75
- FIXABLE ISSUES SECTION
76
- ======================================================================
77
- Include this section ONLY if one or more checks have fixable=true AND
78
- status is "warn" or "fail". If no fixable issues exist, omit everything
79
- from the "Fixable Issues" heading through the end of the horizontal
80
- rule that follows the table.
81
-
82
- For each fixable check that is not "pass", emit one table row:
83
- | status_icon | check_message | fix_hint |
84
- ===================================================================== -->
85
-
86
- ### Fixable Issues
87
-
88
- | Status | Issue | Fix |
89
- |--------|-------|-----|
90
- | [FAIL] | 2 hook scripts not executable | chmod +x on the listed files |
91
-
92
- <!-- =====================================================================
93
- Repeat one row per fixable non-pass check.
94
- ===================================================================== -->
95
-
96
- ---
97
-
98
- <!-- =====================================================================
99
- FOOTER -- always include this line exactly as written.
100
- ===================================================================== -->
101
-
102
- Doctor only reports; it never fixes anything itself. Ask me to fix these issues and I will offer Fix all / Select individually / Skip, then route each chosen repair through the tool that owns it.