@zalom/plastic 2.0.0-alpha.26 → 2.0.0-alpha.28

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 (224) hide show
  1. package/PLASTIC.md +13 -139
  2. package/README.md +337 -133
  3. package/agents/plastic-enforcer.md +12 -12
  4. package/agents/plastic-executor.md +2 -1
  5. package/agents/plastic-node-research.md +4 -2
  6. package/agents/plastic-node-verify.md +1 -0
  7. package/agents/plastic-node-work.md +1 -0
  8. package/agents/{plastic-advisor.md → plastic-primary-advisor.md} +6 -8
  9. package/agents/{plastic-faux-advisor.md → plastic-secondary-advisor.md} +9 -12
  10. package/bin/crap +4 -0
  11. package/bin/lib/context_budget.rb +35 -1
  12. package/bin/lib/skill_census.rb +839 -0
  13. package/bin/plastic +6 -0
  14. package/bin/plastic-skill-census +114 -0
  15. package/bin/verify-change +345 -0
  16. package/config_asks.yml +4 -4
  17. package/deprecations.yml +1 -1
  18. package/{skills/agent-advisor/references → docs/help}/advisor-protocol.md +19 -24
  19. package/{skills/auto/references → docs/help}/agent-architecture.md +7 -7
  20. package/{skills/conventions/references → docs/help}/completion-and-done.md +1 -1
  21. package/{skills/auto/references → docs/help}/human-report-contract.md +17 -19
  22. package/{skills/conventions/references → docs/help}/roadmaps.md +2 -2
  23. package/{skills/tutorial/references → docs/help}/track-1-guided.md +8 -8
  24. package/{skills/tutorial/references → docs/help}/track-2-auto.md +5 -5
  25. package/{skills/tutorial/references → docs/help}/track-3-projects-and-roadmaps.md +24 -17
  26. package/package.json +3 -2
  27. package/scripts/append-ledger +2 -1
  28. package/scripts/dashboard.rb +10 -9
  29. package/scripts/day-summary +2 -1
  30. package/scripts/doctor.rb +57 -49
  31. package/scripts/end-intent +2 -8
  32. package/scripts/file-session-intent +2 -1
  33. package/scripts/hook-capture +4 -3
  34. package/scripts/hook-close +2 -1
  35. package/scripts/hook-record +3 -2
  36. package/scripts/hook-savepoint +3 -2
  37. package/scripts/hook-session-start +5 -4
  38. package/scripts/hook-stop +2 -1
  39. package/scripts/insight-append +1 -2
  40. package/scripts/install.rb +7 -5
  41. package/scripts/lib/action_graph_shim.rb +3 -1
  42. package/scripts/lib/active_delivery.rb +1 -1
  43. package/scripts/lib/agent_models.rb +44 -26
  44. package/scripts/lib/arm.rb +2 -1
  45. package/scripts/lib/backup.rb +63 -0
  46. package/scripts/lib/cli/command.rb +85 -0
  47. package/scripts/lib/cli/commands/auto.rb +18 -0
  48. package/scripts/lib/cli/commands/auto_brief.rb +44 -0
  49. package/scripts/lib/cli/commands/auto_lock.rb +60 -0
  50. package/scripts/lib/cli/commands/auto_report.rb +50 -0
  51. package/scripts/lib/cli/commands/auto_take.rb +25 -0
  52. package/scripts/lib/cli/commands/backup.rb +43 -0
  53. package/scripts/lib/cli/commands/checkout.rb +25 -0
  54. package/scripts/lib/cli/commands/continue.rb +66 -0
  55. package/scripts/lib/cli/commands/doctor.rb +20 -0
  56. package/scripts/lib/cli/commands/feedback.rb +40 -0
  57. package/scripts/lib/cli/commands/help.rb +69 -0
  58. package/scripts/lib/cli/commands/hook.rb +32 -0
  59. package/scripts/lib/cli/commands/index.rb +23 -0
  60. package/scripts/lib/cli/commands/install.rb +21 -0
  61. package/scripts/lib/cli/commands/installer_verb.rb +37 -0
  62. package/scripts/lib/cli/commands/intent.rb +19 -0
  63. package/scripts/lib/cli/commands/intent_answer.rb +37 -0
  64. package/scripts/lib/cli/commands/intent_command.rb +53 -0
  65. package/scripts/lib/cli/commands/intent_end.rb +61 -0
  66. package/scripts/lib/cli/commands/intent_new.rb +62 -0
  67. package/scripts/lib/cli/commands/intent_note.rb +43 -0
  68. package/scripts/lib/cli/commands/intent_rule.rb +36 -0
  69. package/scripts/lib/cli/commands/intent_show.rb +25 -0
  70. package/scripts/lib/cli/commands/intent_spec.rb +44 -0
  71. package/scripts/lib/cli/commands/intent_step.rb +43 -0
  72. package/scripts/lib/cli/commands/intent_verify.rb +26 -0
  73. package/scripts/lib/cli/commands/migrate.rb +16 -0
  74. package/scripts/lib/cli/commands/migrate_stores.rb +31 -0
  75. package/scripts/lib/cli/commands/next.rb +49 -0
  76. package/scripts/lib/cli/commands/project.rb +19 -0
  77. package/scripts/lib/cli/commands/project_links.rb +42 -0
  78. package/scripts/lib/cli/commands/project_list.rb +20 -0
  79. package/scripts/lib/cli/commands/project_new.rb +72 -0
  80. package/scripts/lib/cli/commands/query.rb +31 -0
  81. package/scripts/lib/cli/commands/render.rb +25 -0
  82. package/scripts/lib/cli/commands/roadmap.rb +19 -0
  83. package/scripts/lib/cli/commands/roadmap_check.rb +44 -0
  84. package/scripts/lib/cli/commands/roadmap_log.rb +54 -0
  85. package/scripts/lib/cli/commands/roadmap_next.rb +34 -0
  86. package/scripts/lib/cli/commands/roadmap_show.rb +45 -0
  87. package/scripts/lib/cli/commands/rollback.rb +20 -0
  88. package/scripts/lib/cli/commands/search.rb +60 -0
  89. package/scripts/lib/cli/commands/session.rb +18 -0
  90. package/scripts/lib/cli/commands/session_commit.rb +42 -0
  91. package/scripts/lib/cli/commands/session_handoff.rb +34 -0
  92. package/scripts/lib/cli/commands/session_summary.rb +35 -0
  93. package/scripts/lib/cli/commands/status.rb +68 -0
  94. package/scripts/lib/cli/commands/subcommand_list.rb +36 -0
  95. package/scripts/lib/cli/commands/sync.rb +46 -0
  96. package/scripts/lib/cli/commands/uninstall.rb +20 -0
  97. package/scripts/lib/cli/commands/update.rb +20 -0
  98. package/scripts/lib/cli/commands/version.rb +53 -0
  99. package/scripts/lib/cli/frontier.rb +84 -0
  100. package/scripts/lib/cli/legacy.rb +50 -0
  101. package/scripts/lib/cli/output.rb +102 -0
  102. package/scripts/lib/cli/scope.rb +127 -0
  103. package/scripts/lib/cli/table.rb +64 -0
  104. package/scripts/lib/cli.rb +94 -0
  105. package/scripts/lib/codex_adapter.rb +5 -4
  106. package/scripts/lib/compact_instructions.rb +8 -0
  107. package/scripts/lib/day_summary.rb +4 -3
  108. package/scripts/lib/doctor_core.rb +7 -32
  109. package/scripts/lib/doctor_session_ledger.rb +2 -1
  110. package/scripts/lib/feedback_report.rb +1 -1
  111. package/scripts/lib/graph_measure_models.rb +4 -2
  112. package/scripts/lib/index_entry.rb +9 -0
  113. package/scripts/lib/installer_core.rb +175 -56
  114. package/scripts/lib/intent_screen.rb +3 -3
  115. package/scripts/lib/lock.rb +2 -2
  116. package/scripts/lib/node_file.rb +22 -2
  117. package/scripts/lib/node_input.rb +11 -6
  118. package/scripts/lib/node_return.rb +8 -3
  119. package/scripts/lib/preflight.rb +2 -4
  120. package/scripts/lib/project_config.rb +2 -1
  121. package/scripts/lib/project_validator.rb +3 -2
  122. package/scripts/lib/qmd_sync.rb +8 -7
  123. package/scripts/lib/reference_archive.rb +45 -0
  124. package/scripts/lib/release_guard.rb +2 -0
  125. package/scripts/lib/report_screen.rb +4 -3
  126. package/scripts/lib/rlm/corpus.rb +13 -0
  127. package/scripts/lib/rlm/probe.rb +29 -0
  128. package/scripts/lib/rlm/query.rb +22 -0
  129. package/scripts/lib/roadmap_queue.rb +2 -2
  130. package/scripts/lib/roadmap_savepoint.rb +1 -1
  131. package/scripts/lib/runner_absorb.rb +59 -2
  132. package/scripts/lib/runner_dispatch.rb +12 -8
  133. package/scripts/lib/runner_policy.rb +28 -10
  134. package/scripts/lib/search_index.rb +55 -0
  135. package/scripts/lib/session_git.rb +4 -3
  136. package/scripts/lib/sqlite.rb +22 -0
  137. package/scripts/lib/store_discovery.rb +7 -6
  138. package/scripts/lib/store_layout.rb +54 -0
  139. package/scripts/lib/store_provisioning.rb +2 -1
  140. package/scripts/lib/store_sync.rb +85 -0
  141. package/scripts/lib/stores_move.rb +93 -0
  142. package/scripts/lib/verify_intent.rb +2 -7
  143. package/scripts/lib/version_number.rb +48 -0
  144. package/scripts/lib/work_graph.rb +59 -0
  145. package/scripts/lib/worktree.rb +3 -8
  146. package/scripts/lib/worktree_sweep.rb +3 -2
  147. package/scripts/link-suggest +2 -1
  148. package/scripts/migrate-to-global +1 -1
  149. package/scripts/new-intent +3 -12
  150. package/scripts/node-run +2 -1
  151. package/scripts/plastic-lock +3 -2
  152. package/scripts/promote-session-item +3 -2
  153. package/scripts/read-config +44 -6
  154. package/scripts/release-check +10 -5
  155. package/scripts/report-screen +1 -1
  156. package/scripts/session-commit +2 -1
  157. package/scripts/spawn-preamble +2 -2
  158. package/scripts/update.rb +25 -4
  159. package/scripts/write-handoff +2 -1
  160. package/templates/agents.md +6 -6
  161. package/templates/config.yml +13 -6
  162. package/templates/node-research.md +4 -2
  163. package/templates/render.css +10 -0
  164. package/bin/plastic.js +0 -70
  165. package/skills/agent-advisor/SKILL.md +0 -92
  166. package/skills/auto/SKILL.md +0 -297
  167. package/skills/auto/evals/evals.json +0 -255
  168. package/skills/auto/references/end-tail.md +0 -64
  169. package/skills/conventions/SKILL.md +0 -29
  170. package/skills/dashboard/SKILL.md +0 -180
  171. package/skills/dashboard/evals/evals.json +0 -38
  172. package/skills/dashboard/references/classification.md +0 -22
  173. package/skills/dashboard/templates/dashboard-global.md +0 -20
  174. package/skills/dashboard/templates/dashboard-project.md +0 -19
  175. package/skills/direct/SKILL.md +0 -66
  176. package/skills/direct/references/request-signals.md +0 -59
  177. package/skills/doctor/SKILL.md +0 -305
  178. package/skills/doctor/report.md +0 -102
  179. package/skills/feedback/SKILL.md +0 -98
  180. package/skills/feedback/references/transport-and-privacy.md +0 -65
  181. package/skills/feedback/report.md +0 -36
  182. package/skills/install/SKILL.md +0 -217
  183. package/skills/intent-continuing/SKILL.md +0 -156
  184. package/skills/intent-continuing/references/board-fill.md +0 -52
  185. package/skills/intent-continuing/references/boarding-matrix.md +0 -35
  186. package/skills/intent-continuing/references/context-management.md +0 -28
  187. package/skills/intent-continuing/references/liveness-ranking.md +0 -57
  188. package/skills/intent-creating/SKILL.md +0 -89
  189. package/skills/intent-creating/evals/evals.json +0 -72
  190. package/skills/intent-creating/references/lifecycle.md +0 -81
  191. package/skills/intent-creating/references/wikilinks.md +0 -8
  192. package/skills/intent-ending/SKILL.md +0 -182
  193. package/skills/intent-ending/evals/evals.json +0 -74
  194. package/skills/intent-executing/SKILL.md +0 -87
  195. package/skills/intent-executing/evals/evals.json +0 -66
  196. package/skills/intent-executing/implementer-prompt.md +0 -47
  197. package/skills/intent-executing/spec-reviewer-prompt.md +0 -27
  198. package/skills/intent-speccing/SKILL.md +0 -136
  199. package/skills/intent-speccing/evals/evals.json +0 -126
  200. package/skills/intent-speccing/references/design-principles.md +0 -44
  201. package/skills/intent-speccing/references/per-section-fill-rules.md +0 -92
  202. package/skills/intent-speccing/references/self-verify-checklist.md +0 -37
  203. package/skills/project-creating/SKILL.md +0 -162
  204. package/skills/project-creating/references/hubs-projects.md +0 -55
  205. package/skills/project-creating/references/project-scaffolding.md +0 -97
  206. package/skills/releasing/SKILL.md +0 -376
  207. package/skills/releasing/references/deprecations.md +0 -60
  208. package/skills/releasing/references/promotion-and-tagging.md +0 -70
  209. package/skills/releasing/references/release-lines.md +0 -105
  210. package/skills/roadmap/SKILL.md +0 -90
  211. package/skills/roadmap/references/file-format.md +0 -134
  212. package/skills/roadmap/references/operations.md +0 -112
  213. package/skills/rollback/SKILL.md +0 -91
  214. package/skills/tutorial/SKILL.md +0 -66
  215. package/skills/tutorial/evals/evals.json +0 -186
  216. package/skills/uninstall/SKILL.md +0 -75
  217. package/skills/update/SKILL.md +0 -126
  218. /package/{skills/auto/references → docs/help}/agent-report-contract.md +0 -0
  219. /package/{skills/intent-executing → docs/help}/code-quality-reviewer-prompt.md +0 -0
  220. /package/{skills/conventions/references → docs/help}/knowledge-graph.md +0 -0
  221. /package/{skills/conventions/references → docs/help}/lifecycle-and-savepoints.md +0 -0
  222. /package/{skills/conventions/references → docs/help}/locks-and-worktrees.md +0 -0
  223. /package/{skills/conventions/references → docs/help}/maintenance-and-revisions.md +0 -0
  224. /package/{skills/intent-executing → docs/help}/plan-reviewer-prompt.md +0 -0
@@ -1,180 +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; `Graph ID | Intent | Stage | Progress | Lead`),
11
- **where we go next** (the most-valuable next work; `Rank | Graph ID | Intent | Reason`), and
12
- **how to conduct it** (a disposition per intent). The human-facing surface is **Markdown**,
13
- because the user's UI renders Markdown natively but collapses raw tool-call stdout.
14
-
15
- The script does all the data work. The agent fills a Markdown template from the script's
16
- payload with near-zero reasoning and **presents the filled board in its reply**. Same store
17
- state → byte-identical payload, regardless of model. Do NOT hand-summarize intents.
18
-
19
- ## When to Use
20
-
21
- - User invokes `/plastic-dashboard`
22
- - User asks "where are we", "what's next", "what should I work on", "show me the intents"
23
- - `plastic-intent-continuing` lands on the board on a bare resume
24
- - `plastic-auto` reads `--json` to choose the next dispatchable intent
25
-
26
- ## The screen surface (intent 331d/331f)
27
-
28
- `dashboard.rb project <slug> --screen` (or `continue --screen` for the global board) is the
29
- default surface on every invocation: print it as the first characters of the reply, nothing
30
- before it, no fence, or the hook cannot paint it. It carries a title, six fields (Active, In
31
- delivery, Delivered, Roadmap, Sessions, Changed), then the Where-we-are and Where-we-go-next
32
- tables, its own grammar and painted form standing in for the filled Markdown template below.
33
- `plastic-intent-continuing`'s project route prints it this way. The Markdown board (Step 1-4
34
- below) stays available as the deeper prose surface a reader can ask for.
35
-
36
- ## Procedure (the Markdown board — default human surface)
37
-
38
- ### Step 1 — Get the data payload
39
-
40
- ```bash
41
- ruby ~/.plastic/scripts/dashboard.rb [continue|project <slug>] --data
42
- ```
43
-
44
- - `continue` (default) → the **global** board payload (`mode: "global"`).
45
- - `project <slug>` → that **project** board payload (`mode: "project"`).
46
-
47
- The payload is read-only JSON. Global-board fields: `date`, `store_health`, `summary`,
48
- `next_work`, `next_total`, `next_shown`, `counts`, `projects`, `project_totals`, `footer`.
49
- Project-board fields: `slug`, `store_health`, `description`, `summary`, `counts`, `active`,
50
- `active_total`, `active_shown`, `next_work`, `next_total`, `next_shown`, `footer`. `summary`
51
- and `footer` are finished prose strings (2-3 sentences and one line respectively), built in
52
- `dashboard.rb` and substituted verbatim, exactly like `{{date}}`/`{{description}}` already
53
- are - never re-worded or re-derived by the skill. Each list carries cell-ready fields for
54
- its table: `next_work` rows are
55
- `{id, intent, scope, lifecycle, value, disposition, flags, what, flags_label, line}`;
56
- `active` rows carry
57
- `{id, intent, created, bullet, scope, what, stage, worker, activity, line}`. The `what`,
58
- `scope`, `worker`, `activity`, and `flags_label` cell fields arrive pipe-escaped and
59
- whitespace-normalized.
60
-
61
- Each board load runs the scoped store check (`doctor --store <scope>`): the global board runs
62
- `--store global` and a project board runs `--store <slug>`. The result rides in the payload as
63
- `store_health` (`{scope, status, summary, failing_checks}`). Surface it as a one-line
64
- store-health note on the board (for example `store health: pass (3/3)` or
65
- `store health: warn (orphaned_intents)`). It is non-fatal: a warn or fail is shown as data and
66
- never blocks the board.
67
-
68
- ### Step 2 — Fill the matching template
69
-
70
- Templates live in this skill's `templates/` directory:
71
- `~/.claude/skills/plastic-dashboard/templates/dashboard-global.md` and
72
- `dashboard-project.md`.
73
-
74
- Fill mechanically, no rewriting, no re-sorting:
75
- - `{{a.b.count}}` → the integer (e.g. `counts.active` = that count).
76
- - `{{<list>.rows}}` → the two intent lists (`active`, `next_work`) render as **Markdown table
77
- rows**. The template hard-codes each table's header and separator; this placeholder becomes
78
- one data row per list entry, joined with real newlines, in that table's fixed column order
79
- (below). Drop each cell from the named payload field **verbatim**: cells arrive pre-escaped
80
- and whitespace-normalized from the script (pipes escaped as `\|`), so never re-escape,
81
- re-truncate, or reword them. Never emit `<br>`.
82
- - `next_work` → `| {id} | {what} | {value} | {disposition} | {flags_label} |`
83
- - `active` → `| {id} | {what} | {stage} | {worker} | {activity} |`
84
- Empty list → one full-width row with `_(none)_` in the Graph ID column and every other cell blank,
85
- matching that table's column count (e.g. `| _(none)_ | | | | |` for the 5-column next_work
86
- table, `| _(none)_ | | | |` for the 5-column active table). Neither list carries an overflow
87
- "+N more" row anymore (D5, intent 202): the true pool size rides on the payload as
88
- `active_total`/`next_total` (shown counts as `active_shown`/`next_shown`), and `{{footer}}`
89
- states it in prose instead.
90
- - `{{projects.lines}}` (global board only) → the project rollup stays **prose**, one line per
91
- project (not a table):
92
- `- **{slug}**: {description}, active {active}, done {done}, future {future}, last accessed {last_accessed_at[0,10]}`.
93
- - Scalars (`{{date}}`, `{{slug}}`, `{{summary}}`, `{{footer}}`) → substitute verbatim. `summary`
94
- and `footer` are finished prose built in `dashboard.rb`; do not rewrite, shorten, or
95
- re-derive them from the counts - that is exactly the non-determinism D5 rules out.
96
-
97
- ### Paging (conversational, D4)
98
-
99
- The board shows a short page by default (Active capped at 3, Next-work at 5). When the
100
- user asks for "more" or "all", re-invoke Step 1 with an explicit flag and re-fill the
101
- template with the new payload - nothing is persisted to disk, the offset lives only in the
102
- chat turn:
103
- - "all" → add `--all` (lifts both caps to unbounded; the footer then shows equal shown/total).
104
- - "more" → add `--limit-active N`/`--limit-next N` with a larger `N` for whichever list the
105
- user is paging.
106
-
107
- For a real, own-terminal pager instead, point the owner at `--plain`:
108
- `ruby ~/.plastic/scripts/dashboard.rb project <slug> --plain | less` (or `continue --plain`
109
- for the global board). `--plain` prints the full, uncapped board as plain text with no
110
- Markdown table syntax; it is a separate CLI mode from `--data`, not something this skill
111
- fills a template from.
112
-
113
- ### Step 3 — Present it (mandatory, every invocation)
114
-
115
- **Paste the filled Markdown into your reply.** This is non-optional: if the reply does not
116
- contain the filled Markdown, the user sees nothing — tool-call stdout and hook
117
- `additionalContext` are both invisible to them. Never describe the board instead of showing
118
- it, and never assume a hook already showed it for you.
119
-
120
- `hook-continue` also emits a one-line `systemMessage` summary (counts, and the next big thing
121
- when there is one) as a hook-owned fallback, independent of the agent's reply. Treat that line
122
- as a floor only, not a substitute for this step: it carries no matrix, no recently-worked
123
- section, and no entry-flow prompt. Presenting the full board here remains mandatory regardless
124
- of whether the summary line fired. This stays a soft, agent-followed mechanism — there is no
125
- stronger enforcement for a full multi-section Markdown document in this harness today.
126
-
127
- ### Step 4 — Entry flow (the board is the menu)
128
-
129
- QMD-first (when available): when the user navigates by describing an intent rather than giving its
130
- id, before scanning the store with grep/Read run `ruby ~/.plastic/scripts/qmd-sync search "<terms>"`
131
- to surface the candidate intent, then open the authoritative intent file for the hit. The command is
132
- a no-op when QMD is absent, so fall back to the existing INDEX.md / file scan.
133
-
134
- The board lists everything; the user navigates by free prose (no capped picker):
135
- - On the **global** board, the user replies with an **intent id** (work it), a **project
136
- name** (re-run `project <slug> --data` and present that board), or **"new"** (start a new
137
- intent in global via `plastic-intent-creating`).
138
- - On a **project** board, the user replies with an **intent id**, or **"global"** to return.
139
-
140
- ## Auto-mode contract (`--json`)
141
-
142
- `plastic-auto` consumes a separate machine-readable manifest (unchanged):
143
-
144
- ```bash
145
- ruby ~/.plastic/scripts/dashboard.rb [continue|project <slug>|all] --json
146
- ```
147
-
148
- ```json
149
- { "generated_for": "auto-mode", "scope": "<scope|all>",
150
- "next_big_thing": "<id|null>",
151
- "dispatchable_queue": [ {"id","scope","disposition","type","value","effort","flags","rank"} ],
152
- "human_only": ["<id>", "..."] }
153
- ```
154
-
155
- Work `dispatchable_queue` in `rank` order (`defer`/`research`); leave `human_only` for the user.
156
-
157
- ## Text modes (terminal / legacy)
158
-
159
- `dashboard.rb [continue|project <slug>|all]` with no flag still prints the ASCII cockpit for
160
- a raw terminal. The Markdown board (`--data` + template) is the surface for the chat UI.
161
-
162
- ## How classification works (deterministic)
163
-
164
- The script computes Effort/Value/Flags/Override/Caps; the agent never re-derives them.
165
- To explain or debug a ranking or disposition, read `references/classification.md`.
166
-
167
- ## Eval
168
-
169
- The eval is the payload + golden snapshots: run the engine against the fixture store and
170
- assert the `--data` payload shape/sorting/classification and the byte-identical `--json` +
171
- 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
172
- intentional change means the skill is broken.
173
-
174
- ## Notes
175
-
176
- - The two intent lists (active, next work) render as Markdown tables; the prose summary,
177
- footer, counts, and the project rollup stay prose (intent 202). No Value x Effort grid
178
- returns. Never emit `<br>`.
179
- - Clusters (Zettelkasten grouping in INDEX.md) are intentionally not rendered.
180
- - Additive: changes no core lifecycle, gate, or cycle logic.
@@ -1,38 +0,0 @@
1
- {
2
- "skill_name": "plastic-dashboard",
3
- "notes": "Intent 66a. Spec for the QMD-first step in the entry flow (resolve a free-prose intent reference before grep/Read). Runner is intent 76; spec only.",
4
- "evals": [
5
- {
6
- "id": 1,
7
- "scope": "behavior",
8
- "set": "validation",
9
- "prompt": "QMD is present. On the board, the user navigates by describing an intent (the search verb work) instead of giving its id.",
10
- "expected_output": "Before scanning the store with grep/Read to resolve the free-prose reference, runs `ruby ~/.plastic/scripts/qmd-sync search \"search verb\"` to surface the candidate intent, then opens the authoritative intent file for the hit. No-op fallback to INDEX.md / file scan when QMD is absent.",
11
- "files": [],
12
- "assertions": [
13
- {
14
- "type": "human",
15
- "check": "qmd-sync search is run before grep/Read when the user navigates by description; authoritative file opened for the hit",
16
- "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",
17
- "result": "pass"
18
- }
19
- ]
20
- },
21
- {
22
- "id": 2,
23
- "scope": "behavior",
24
- "set": "validation",
25
- "prompt": "How does the project board render after intent 202 (short by default, paged on request)?",
26
- "expected_output": "The project board shows, in order, and nothing else: a 2-3 sentence prose summary of what was delivered most recently (built in dashboard.rb from completed/completed_on data, not the 24h-windowed recently_worked), an Active table capped at 3 rows (Id|What|Stage, ordered lifecycle-stage descending with a savepoint tie-break), a Next-work table capped at 5 rows (Id|What|Value|Disposition|Flags), and a one-line footer stating true totals (e.g. '3 of 12 active, 5 of 47 next work') plus how to see everything. The raw Future table and its {{future.rows}} placeholder, and the separate Recently-worked table, are both gone from dashboard-project.md. dashboard-global.md carries the equivalent fix (D6): a prose summary in place of its recently-worked table, the same honest footer, and the same --limit-active/--limit-next/--all/--plain mechanics.",
27
- "files": ["skills/dashboard/templates/dashboard-global.md", "skills/dashboard/templates/dashboard-project.md", "skills/dashboard/SKILL.md"],
28
- "assertions": [
29
- {
30
- "type": "convention",
31
- "check": "project board template has summary+active+next_work+footer only (no future, no recently_worked table); global template has summary+footer added; SKILL.md documents the new payload fields and CLI flags",
32
- "observed": "templates carry {{summary}}, {{active.rows}} (Id|What|Stage), {{next_work.rows}} (Id|What|Value|Disposition|Flags), {{footer}}; {{future.rows}} and the recently-worked table are removed from both; SKILL.md Step 1/2 document summary/footer/active_total/active_shown/next_total/next_shown and --limit-active/--limit-next/--all/--plain",
33
- "result": "pass"
34
- }
35
- ]
36
- }
37
- ]
38
- }
@@ -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
- | Graph ID | Intent | 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
- | Graph ID | Intent | Stage | Worker | Activity |
8
- | --- | --- | --- | --- | --- |
9
- {{active.rows}}
10
-
11
- **Most-valuable next work**
12
-
13
- | Graph ID | Intent | 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 for the session's day (the oldest day in the last
58
- seven whose checklist carries the session's line, else today). Never write that lookup by hand.
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`.