@zalom/plastic 1.0.3 → 1.1.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 (130) hide show
  1. package/PLASTIC-reference.md +11 -11
  2. package/PLASTIC.md +11 -9
  3. package/README.md +48 -1
  4. package/agents/plastic-enforcer.md +8 -5
  5. package/agents/plastic-future-intent-researcher.md +1 -1
  6. package/agents/plastic-intent-curator.md +9 -10
  7. package/agents/plastic-spec-specialist.md +9 -6
  8. package/bin/plastic.js +2 -2
  9. package/hooks/check-update +1 -1
  10. package/hooks/continue +1 -1
  11. package/package.json +1 -1
  12. package/scripts/dashboard.rb +29 -24
  13. package/scripts/doctor.rb +188 -9
  14. package/scripts/end-intent +330 -0
  15. package/scripts/hook-code-gate +1 -1
  16. package/scripts/hook-continue +2 -2
  17. package/scripts/hook-create-gate +2 -2
  18. package/scripts/hook-session-start +1 -1
  19. package/scripts/install.rb +2 -1
  20. package/scripts/lib/bridge.rb +116 -3
  21. package/scripts/lib/dashboard_banner.rb +8 -9
  22. package/scripts/lib/installer_core.rb +17 -8
  23. package/scripts/lib/legacy_bookend_amnesty.rb +35 -0
  24. package/scripts/lib/release_guard.rb +62 -0
  25. package/scripts/lib/roadmap_queue.rb +285 -0
  26. package/scripts/lib/roadmap_savepoint.rb +213 -0
  27. package/scripts/lib/store_provisioning.rb +1 -1
  28. package/scripts/lib/worktree.rb +21 -0
  29. package/scripts/new-intent +2 -1
  30. package/scripts/read-config +3 -3
  31. package/scripts/roadmap-next +44 -0
  32. package/scripts/roadmap-savepoint +64 -0
  33. package/scripts/{versions.rb → rollback.rb} +33 -41
  34. package/scripts/update.rb +1 -1
  35. package/skills/_active-intent-gate.md +1 -1
  36. package/skills/_decision-tables.md +50 -0
  37. package/skills/auto/SKILL.md +69 -68
  38. package/skills/auto/evals/evals.json +4 -4
  39. package/skills/auto/references/agent-architecture.md +2 -2
  40. package/skills/continuing/SKILL.md +23 -130
  41. package/skills/continuing/evals/evals.json +26 -80
  42. package/skills/dashboard/SKILL.md +18 -15
  43. package/skills/dashboard/references/classification.md +3 -3
  44. package/skills/dashboard/templates/dashboard-global.md +8 -23
  45. package/skills/dashboard/templates/dashboard-project.md +7 -26
  46. package/skills/doctor/SKILL.md +3 -3
  47. package/skills/install/SKILL.md +10 -10
  48. package/skills/{brainstorming → intent-brainstorming}/SKILL.md +43 -45
  49. package/skills/intent-brainstorming/evals/evals.json +67 -0
  50. package/skills/{brainstorming → intent-brainstorming}/references/design-principles.md +12 -17
  51. package/skills/intent-continuing/SKILL.md +99 -0
  52. package/skills/intent-continuing/evals/evals.json +145 -0
  53. package/skills/intent-continuing/references/context-management.md +28 -0
  54. package/skills/{creating-intent → intent-creating}/SKILL.md +3 -3
  55. package/skills/{creating-intent → intent-creating}/evals/evals.json +1 -1
  56. package/skills/{intent-discovery → intent-discovering}/SKILL.md +1 -1
  57. package/skills/intent-ending/SKILL.md +151 -0
  58. package/skills/intent-ending/evals/evals.json +74 -0
  59. package/skills/{executing-plan → intent-executing}/SKILL.md +75 -15
  60. package/skills/intent-executing/evals/evals.json +66 -0
  61. package/skills/{brainstorming-grill-me → intent-grilling}/SKILL.md +4 -4
  62. package/skills/{linking-intents → intent-linking}/SKILL.md +1 -1
  63. package/skills/{linking-intents → intent-linking}/evals/evals.json +1 -1
  64. package/skills/{lock → intent-locking}/SKILL.md +1 -1
  65. package/skills/{writing-plans → intent-planning}/SKILL.md +48 -20
  66. package/skills/intent-planning/evals/evals.json +66 -0
  67. package/skills/{writing-plans → intent-planning}/references/plan-format.md +31 -7
  68. package/skills/{research → intent-researching}/SKILL.md +2 -2
  69. package/skills/{research → intent-researching}/evals/evals.json +1 -1
  70. package/skills/{savepoint → intent-savepoint}/SKILL.md +13 -1
  71. package/skills/intent-speccing/SKILL.md +69 -0
  72. package/skills/intent-speccing/evals/evals.json +126 -0
  73. package/skills/intent-speccing/references/per-section-fill-rules.md +92 -0
  74. package/skills/intent-speccing/references/self-verify-checklist.md +38 -0
  75. package/skills/intent-starting/SKILL.md +2 -2
  76. package/skills/intent-starting/evals/evals.json +2 -2
  77. package/skills/project-continuing/SKILL.md +104 -0
  78. package/skills/project-continuing/evals/evals.json +100 -0
  79. package/skills/project-continuing/references/board-fill.md +33 -0
  80. package/skills/{creating-project → project-creating}/SKILL.md +2 -2
  81. package/skills/releasing/SKILL.md +66 -14
  82. package/skills/releasing/references/release-lines.md +105 -0
  83. package/skills/roadmap/SKILL.md +7 -1
  84. package/skills/roadmap/references/file-format.md +30 -1
  85. package/skills/roadmap/references/operations.md +26 -6
  86. package/skills/roadmap-continuing/SKILL.md +85 -0
  87. package/skills/roadmap-continuing/evals/evals.json +82 -0
  88. package/skills/roadmap-continuing/references/liveness-ranking.md +56 -0
  89. package/skills/{versions → rollback}/SKILL.md +30 -20
  90. package/skills/{creating-skills → skill-creating}/SKILL.md +2 -2
  91. package/skills/{creating-skills → skill-creating}/evals/evals.json +5 -5
  92. package/skills/{creating-skills → skill-creating}/references/progressive-disclosure.md +2 -2
  93. package/skills/{evaluating-skills → skill-evaluating}/SKILL.md +1 -1
  94. package/skills/{evaluating-skills → skill-evaluating}/evals/evals.json +3 -3
  95. package/skills/{intent-curator → store-curating}/SKILL.md +6 -7
  96. package/skills/{intent-curator → store-curating}/evals/evals.json +1 -1
  97. package/skills/{managing-index → store-indexing}/SKILL.md +6 -7
  98. package/skills/{managing-index → store-indexing}/evals/evals.json +1 -1
  99. package/skills/{add-project-store → store-provisioning}/SKILL.md +2 -2
  100. package/skills/tutorial/SKILL.md +65 -0
  101. package/skills/tutorial/evals/evals.json +186 -0
  102. package/skills/tutorial/references/track-1-guided.md +123 -0
  103. package/skills/tutorial/references/track-2-auto.md +95 -0
  104. package/skills/tutorial/references/track-3-projects-and-roadmaps.md +110 -0
  105. package/skills/uninstall/SKILL.md +2 -2
  106. package/skills/update/SKILL.md +3 -3
  107. package/templates/agents.md +7 -7
  108. package/templates/config.yml +2 -1
  109. package/templates/index.md +4 -1
  110. package/skills/brainstorming/evals/evals.json +0 -22
  111. package/skills/savepoint/references/context-management.md +0 -32
  112. /package/skills/{creating-intent → intent-creating}/references/lifecycle.md +0 -0
  113. /package/skills/{creating-intent → intent-creating}/references/wikilinks.md +0 -0
  114. /package/skills/{executing-plan → intent-executing}/code-quality-reviewer-prompt.md +0 -0
  115. /package/skills/{executing-plan → intent-executing}/implementer-prompt.md +0 -0
  116. /package/skills/{executing-plan → intent-executing}/spec-reviewer-prompt.md +0 -0
  117. /package/skills/{linking-intents → intent-linking}/references/zettelkasten.md +0 -0
  118. /package/skills/{continuing → intent-savepoint}/references/context-management.md +0 -0
  119. /package/skills/{creating-project → project-creating}/references/hubs-projects.md +0 -0
  120. /package/skills/{creating-project → project-creating}/references/project-scaffolding.md +0 -0
  121. /package/skills/{creating-skills → skill-creating}/references/agents.md +0 -0
  122. /package/skills/{creating-skills → skill-creating}/references/evals.md +0 -0
  123. /package/skills/{creating-skills → skill-creating}/references/hooks.md +0 -0
  124. /package/skills/{creating-skills → skill-creating}/references/scripts.md +0 -0
  125. /package/skills/{creating-skills → skill-creating}/references/skills.md +0 -0
  126. /package/skills/{creating-skills → skill-creating}/scripts/scaffold.rb +0 -0
  127. /package/skills/{evaluating-skills → skill-evaluating}/assets/eval-template.json +0 -0
  128. /package/skills/{evaluating-skills → skill-evaluating}/references/convention-checks.md +0 -0
  129. /package/skills/{evaluating-skills → skill-evaluating}/references/eval-methodology.md +0 -0
  130. /package/skills/{managing-index → store-indexing}/references/zettelkasten-linking.md +0 -0
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "skill_name": "plastic-continuing",
3
- "notes": "Intent 36, updated for 36a (boot moved into hook-session-start; the skill is now work-continuation only). Scopes: description triggering (1-8) and behavior/convention compliance of the work-continuation skill (9-14). Triggering assertions follow the plastic-auto eval style (one subagent router per case). Behavior assertions are convention checks against the SKILL.md.",
3
+ "notes": "Intent 158a1. New bare front-door router restored per intent 96 (D8). Scopes: description triggering (1-5) and routing behavior (6-9), the latter checked as convention against SKILL.md's routing table.",
4
4
  "results": {
5
- "triggering": { "cases": 8, "passed": 8, "run": "2026-06-16, one subagent per case" },
6
- "behavior": { "cases": 6, "passed": 6, "evidence": "convention checks against skills/continuing/SKILL.md after the intent-36 rewrite; doctor --core verified at 0.07s with 9 liveness checks and full doctor unchanged at 30 checks" }
5
+ "triggering": { "cases": 5, "passed": 5, "run": "2026-07-10, one subagent per case" },
6
+ "behavior": { "cases": 4, "passed": 4, "evidence": "convention checks against skills/continuing/SKILL.md's routing table" }
7
7
  },
8
8
  "evals": [
9
9
  {
10
10
  "id": 1, "scope": "triggering", "set": "train",
11
11
  "prompt": "continue",
12
- "expected_output": "Activates plastic-continuing (the bare 'continue' keyword is the documented trigger).",
12
+ "expected_output": "Activates plastic-continuing (the bare 'continue' keyword is the router's documented trigger).",
13
13
  "files": [],
14
14
  "assertions": [
15
15
  { "type": "code", "check": "router CHOICE == plastic-continuing", "observed": "plastic-continuing", "result": "pass" }
@@ -26,7 +26,7 @@
26
26
  },
27
27
  {
28
28
  "id": 3, "scope": "triggering", "set": "validation",
29
- "prompt": "pick up where we left off in this project",
29
+ "prompt": "pick up where we left off",
30
30
  "expected_output": "Activates plastic-continuing.",
31
31
  "files": [],
32
32
  "assertions": [
@@ -34,26 +34,17 @@
34
34
  ]
35
35
  },
36
36
  {
37
- "id": 4, "scope": "triggering", "set": "train",
38
- "prompt": "boot plastic and show me where things stand",
39
- "expected_output": "Activates plastic-continuing (continuing work + presenting state is the skill's purpose; boot itself is hook-owned).",
37
+ "id": 4, "scope": "triggering", "set": "validation",
38
+ "prompt": "where was I",
39
+ "expected_output": "Activates plastic-continuing (indirect trigger: a continue request that never says 'continue').",
40
40
  "files": [],
41
41
  "assertions": [
42
42
  { "type": "code", "check": "router CHOICE == plastic-continuing", "observed": "plastic-continuing", "result": "pass" }
43
43
  ]
44
44
  },
45
45
  {
46
- "id": 5, "scope": "triggering", "set": "train",
47
- "prompt": "continue delivering this intent autonomously, don't ask me",
48
- "expected_output": "Does NOT settle on plastic-continuing for execution. Shares 'continue' but the autonomous-delivery intent routes to plastic-auto.",
49
- "files": [],
50
- "assertions": [
51
- { "type": "code", "check": "router CHOICE == plastic-auto", "observed": "plastic-auto", "result": "pass" }
52
- ]
53
- },
54
- {
55
- "id": 6, "scope": "triggering", "set": "validation",
56
- "prompt": "continue the for-loop to the next iteration in this function",
46
+ "id": 5, "scope": "triggering", "set": "validation",
47
+ "prompt": "continue the for-loop in this function",
57
48
  "expected_output": "Does NOT activate plastic-continuing. Near-miss: shares 'continue' but is a code-editing task.",
58
49
  "files": [],
59
50
  "assertions": [
@@ -61,84 +52,39 @@
61
52
  ]
62
53
  },
63
54
  {
64
- "id": 7, "scope": "triggering", "set": "train",
65
- "prompt": "resume the paused background download",
66
- "expected_output": "Does NOT activate plastic-continuing. Near-miss: shares 'resume' but is unrelated to Plastic sessions.",
67
- "files": [],
68
- "assertions": [
69
- { "type": "code", "check": "router CHOICE != plastic-continuing", "observed": "none", "result": "pass" }
70
- ]
71
- },
72
- {
73
- "id": 8, "scope": "triggering", "set": "validation",
74
- "prompt": "what's the dashboard look like right now",
75
- "expected_output": "May activate plastic-dashboard rather than plastic-continuing; an overview request without 'continue/resume' is a dashboard task.",
76
- "files": [],
77
- "assertions": [
78
- { "type": "code", "check": "router CHOICE != plastic-continuing", "observed": "plastic-dashboard", "result": "pass" }
79
- ]
80
- },
81
- {
82
- "id": 9, "scope": "behavior", "set": "train",
83
- "prompt": "Does the skill defer boot to the SessionStart hook rather than running it itself?",
84
- "expected_output": "SKILL.md states boot (health check, core context, version banner, statusline) is owned by hook-session-start / plastic-statusline, not this skill.",
85
- "files": ["skills/continuing/SKILL.md"],
86
- "assertions": [
87
- { "type": "convention", "check": "SKILL.md says boot is owned by the SessionStart hook and the skill does not run it", "observed": "'Boot is not this skill's job.' paragraph naming hook-session-start and plastic-statusline", "result": "pass" }
88
- ]
89
- },
90
- {
91
- "id": 10, "scope": "behavior", "set": "train",
92
- "prompt": "Does the skill avoid running doctor / setting the statusline itself?",
93
- "expected_output": "SKILL.md does NOT instruct running doctor.rb --core or setting the statusline; it attributes those to the hooks.",
94
- "files": ["skills/continuing/SKILL.md"],
95
- "assertions": [
96
- { "type": "convention", "check": "no in-skill boot step invokes doctor.rb --core or sets the statusline; both are attributed to hooks", "observed": "doctor --core and statusline mentioned only as hook-owned in the 'Boot is not this skill's job' note", "result": "pass" }
97
- ]
98
- },
99
- {
100
- "id": 11, "scope": "behavior", "set": "train",
101
- "prompt": "Is dashboard selection project-aware?",
102
- "expected_output": "Project loaded -> `dashboard.rb project <slug>`; otherwise -> `dashboard.rb continue`. Skill only invokes, does not render.",
103
- "files": ["skills/continuing/SKILL.md"],
104
- "assertions": [
105
- { "type": "convention", "check": "both dashboard invocations present and gated on project detection", "observed": "'dashboard.rb project <slug>' and 'dashboard.rb continue' in the 'Continue (present the dashboard)' section", "result": "pass" }
106
- ]
107
- },
108
- {
109
- "id": 12, "scope": "behavior", "set": "validation",
110
- "prompt": "Is ledger-resume conditional and ledger-driven?",
111
- "expected_output": "Resume fires only when a specific intent is named; reads savepoint.md last line as stage, verifies the stage file, rebuilds on drift, derives next step from first unchecked checklist item.",
55
+ "id": 6, "scope": "behavior", "set": "train",
56
+ "prompt": "continue",
57
+ "expected_output": "Bare 'continue' with no further target dispatches to the project route (plastic-project-continuing), the routing table's default.",
112
58
  "files": ["skills/continuing/SKILL.md"],
113
59
  "assertions": [
114
- { "type": "convention", "check": "Conditional Ledger-Resume section reads last ledger line, verifies stage file, calls rebuild_savepoint on drift, uses first unchecked checklist item", "observed": "all four present in 'Conditional Ledger-Resume'", "result": "pass" }
60
+ { "type": "convention", "check": "routing table's default row maps bare continue/resume/no target to plastic-project-continuing", "observed": "present", "result": "pass" }
115
61
  ]
116
62
  },
117
63
  {
118
- "id": 13, "scope": "behavior", "set": "validation",
119
- "prompt": "Are the stale prose-savepoint fields gone?",
120
- "expected_output": "No 'In progress' / 'Blockers' fields read from a prose savepoint remain; the ledger model is used instead.",
64
+ "id": 7, "scope": "behavior", "set": "train",
65
+ "prompt": "continue --intent 4a",
66
+ "expected_output": "Dispatches to the intent route (plastic-intent-continuing).",
121
67
  "files": ["skills/continuing/SKILL.md"],
122
68
  "assertions": [
123
- { "type": "convention", "check": "no prose-savepoint announce template (In progress / Blockers from prose)", "observed": "absent; announce uses Stage/Next step/Context/Drift derived from ledger + checklist", "result": "pass" }
69
+ { "type": "convention", "check": "routing table maps --intent {id} to plastic-intent-continuing", "observed": "present", "result": "pass" }
124
70
  ]
125
71
  },
126
72
  {
127
- "id": 14, "scope": "behavior", "set": "validation",
128
- "prompt": "Is the 'Determine Store' local-store gap filled?",
129
- "expected_output": "Step 2 of Determine Store describes local/project-store detection (no empty step).",
73
+ "id": 8, "scope": "behavior", "set": "validation",
74
+ "prompt": "resume the statusline-coloring intent",
75
+ "expected_output": "Dispatches to the intent route (plastic-intent-continuing): a specific intent named by description.",
130
76
  "files": ["skills/continuing/SKILL.md"],
131
77
  "assertions": [
132
- { "type": "convention", "check": "Determine Store step 2 documents local/project store detection via projects.yml + CWD match", "observed": "filled", "result": "pass" }
78
+ { "type": "convention", "check": "routing table maps a named specific intent (by id or description) to plastic-intent-continuing", "observed": "present", "result": "pass" }
133
79
  ]
134
80
  },
135
81
  {
136
- "id": 15, "scope": "behavior", "set": "validation",
137
- "prompt": "QMD is present. The user says: continue the work on the statusline coloring (names the intent by description, not id).",
138
- "expected_output": "Before scanning the store with grep/Read to locate the named intent, runs `ruby ~/.plastic/scripts/qmd-sync search \"statusline coloring\"` to surface the candidate intent, then opens the authoritative intent file for the hit it resumes. No-op fallback to INDEX.md / file scan when QMD is absent.",
82
+ "id": 9, "scope": "behavior", "set": "validation",
83
+ "prompt": "continue the consistency-dividend roadmap",
84
+ "expected_output": "Dispatches to the roadmap route (plastic-roadmap-continuing).",
139
85
  "files": ["skills/continuing/SKILL.md"],
140
86
  "assertions": [
141
- { "type": "human", "check": "qmd-sync search is run before grep/Read when the intent is named by description; authoritative file opened for the hit", "observed": "Conditional Ledger-Resume carries the QMD-first step: run qmd-sync search before grep/Read, then open the authoritative file; no-op fallback when QMD is absent", "result": "pass" }
87
+ { "type": "convention", "check": "routing table maps a named roadmap/delivery batch to plastic-roadmap-continuing", "observed": "present", "result": "pass" }
142
88
  ]
143
89
  }
144
90
  ]
@@ -1,13 +1,13 @@
1
1
  ---
2
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 a deterministic Value×Effort work cockpit as Markdown across the global store and all projects, and emits a machine-readable queue that auto mode consumes.
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
4
  user-invocable: false
5
5
  ---
6
6
 
7
7
  # Dashboard — Plastic Work Cockpit
8
8
 
9
9
  A deterministic overview of the intent store(s). It answers three questions at a glance:
10
- **where we are** (recently worked), **where we go next** (a Value×Effort matrix), and
10
+ **where we are** (recently worked), **where we go next** (the most-valuable next work), and
11
11
  **how to conduct it** (a disposition per intent). The human-facing surface is **Markdown**,
12
12
  because the user's UI renders Markdown natively but collapses raw tool-call stdout.
13
13
 
@@ -19,7 +19,7 @@ state → byte-identical payload, regardless of model. Do NOT hand-summarize int
19
19
 
20
20
  - User invokes `/plastic-dashboard`
21
21
  - User asks "where are we", "what's next", "what should I work on", "show me the intents"
22
- - `plastic-continuing` lands on the board on resume
22
+ - `plastic-project-continuing` lands on the board on resume
23
23
  - `plastic-auto` reads `--json` to choose the next dispatchable intent
24
24
 
25
25
  ## Procedure (the Markdown board — default human surface)
@@ -34,9 +34,9 @@ ruby ~/.plastic/scripts/dashboard.rb [continue|project <slug>] --data
34
34
  - `project <slug>` → that **project** board payload (`mode: "project"`).
35
35
 
36
36
  The payload is read-only JSON. Global-board fields: `date`, `store_health`, `recently_worked`,
37
- `matrix` (`quick_win`/`next_big`/`defer`/`triage`/`research`, each a list of `{line, bullet, ...}`),
38
- `counts`, `projects`, `project_totals`. Project-board fields: `slug`, `store_health`,
39
- `description`, `recently_worked`, `matrix`, `counts`, `active`, `future`.
37
+ `next_work` (a flat, rank-ordered list of `{id, intent, scope, lifecycle, value, disposition,
38
+ flags, line}`), `counts`, `projects`, `project_totals`. Project-board fields: `slug`,
39
+ `store_health`, `description`, `recently_worked`, `next_work`, `counts`, `active`, `future`.
40
40
 
41
41
  Each board load runs the scoped store check (`doctor --store <scope>`): the global board runs
42
42
  `--store global` and a project board runs `--store <slug>`. The result rides in the payload as
@@ -51,13 +51,16 @@ Templates live in this skill's `templates/` directory:
51
51
  `~/.claude/skills/plastic-dashboard/templates/dashboard-global.md` and
52
52
  `dashboard-project.md`.
53
53
 
54
- Fill mechanically no rewriting, no re-sorting:
55
- - `{{a.b.count}}` → the integer (e.g. `matrix.quick_win.count` = that list's length).
54
+ Fill mechanically, no rewriting, no re-sorting:
55
+ - `{{a.b.count}}` → the integer (e.g. `counts.active` = that count).
56
56
  - `{{...lines}}` → join the list's `.line` strings with **real newlines** (one per line).
57
- These lines are already glyph-led (the glyph is the bullet — never add `-`, never emit
58
- `<br>`). If a matrix quadrant list is empty, render `_(none)_`.
57
+ These are ordinary prose lines, not glyph-led bullets: never add a Markdown `-` bullet,
58
+ never emit `<br>`. If a list is empty, render `_(none)_`.
59
+ - `next_work.lines` → the most-valuable next work, already ranked; each line reads
60
+ `"<id> <intent, truncated>"`. Use each entry's `disposition`/`flags` fields when the prose
61
+ needs to say why an item is next.
59
62
  - `projects.lines` → one line per project:
60
- `- **{slug}** {description} · active {active} · done {done} · future {future} · last accessed {last_accessed_at[0,10]}`.
63
+ `- **{slug}**: {description}, active {active}, done {done}, future {future}, last accessed {last_accessed_at[0,10]}`.
61
64
  - Scalars (`{{date}}`, `{{slug}}`, `{{description}}`) → substitute verbatim.
62
65
 
63
66
  ### Step 3 — Present it (mandatory, every invocation)
@@ -84,7 +87,7 @@ a no-op when QMD is absent, so fall back to the existing INDEX.md / file scan.
84
87
  The board lists everything; the user navigates by free prose (no capped picker):
85
88
  - On the **global** board, the user replies with an **intent id** (work it), a **project
86
89
  name** (re-run `project <slug> --data` and present that board), or **"new"** (start a new
87
- intent in global via `plastic-creating-intent`).
90
+ intent in global via `plastic-intent-creating`).
88
91
  - On a **project** board, the user replies with an **intent id**, or **"global"** to return.
89
92
 
90
93
  ## Auto-mode contract (`--json`)
@@ -112,7 +115,7 @@ a raw terminal. The Markdown board (`--data` + template) is the surface for the
112
115
  ## How classification works (deterministic)
113
116
 
114
117
  The script computes Effort/Value/Flags/Override/Caps; the agent never re-derives them.
115
- To explain or debug a quadrant assignment, read `references/classification.md`.
118
+ To explain or debug a ranking or disposition, read `references/classification.md`.
116
119
 
117
120
  ## Eval
118
121
 
@@ -123,7 +126,7 @@ intentional change means the skill is broken.
123
126
 
124
127
  ## Notes
125
128
 
126
- - Quadrant lists are **not** Markdown `-` bullets the glyph is the bullet (the boards are
127
- UI-only and may evolve, so they need not be valid Markdown lists). Never emit `<br>`.
129
+ - Board lines are ordinary prose, not a rigid grid: the boards are UI-only and may evolve,
130
+ so they need not be valid Markdown lists. Never emit `<br>`.
128
131
  - Clusters (Zettelkasten grouping in INDEX.md) are intentionally not rendered.
129
132
  - Additive: changes no core lifecycle, gate, or cycle logic.
@@ -1,7 +1,7 @@
1
1
  # How Classification Works (Deterministic)
2
2
 
3
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 quadrant assignment.
4
+ the agent never re-derives them. Read this to explain or debug a ranking or disposition.
5
5
 
6
6
  - **Effort** — small for `research`/`exploration`/`bugfix`, for already-scoped intents
7
7
  (plan/checklist exists), or a **branch id** (folgezettel depth ≥ 2, e.g. `4a`, `12b3`); big
@@ -16,7 +16,7 @@ the agent never re-derives them. Read this to explain or debug a quadrant assign
16
16
  the staleness threshold. All three kept low-noise by design.
17
17
  - **Override** — a `value: high|low` frontmatter field always wins (pre-stamped data, never
18
18
  model judgment at render time).
19
- - **Caps** quadrant lists and the project board's `active`/`future` lists are capped at 8
20
- entries plus a trailing "+N more" line; each entry's text is truncated to 120 characters
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
21
  with a trailing ellipsis. Applies to the Markdown board only (the ASCII renderer has its own
22
22
  separate `CELL_CAP`).
@@ -1,31 +1,16 @@
1
- # 🧩 Plastic · Global Board {{date}}
1
+ # 🧩 Plastic · Global Board, {{date}}
2
2
 
3
- **Recently worked** · last 24h
3
+ **Recently worked** (last 24h)
4
4
  {{recently_worked.lines}}
5
5
 
6
- ## Where we go next · Value × Effort *(global intents only)*
6
+ ## Where we are
7
7
 
8
- | | Small effort | Big effort |
9
- |---|---|---|
10
- | **High value** | ⚡ **Quick win** · {{matrix.quick_win.count}} | ★ **Next big thing** · {{matrix.next_big.count}} |
11
- | **Low value** | → **Defer (agent)** · {{matrix.defer.count}} | ⚑ **Triage** · {{matrix.triage.count}} |
8
+ {{counts.active}} intents active, {{counts.done}} done, {{counts.future}} queued for later.
12
9
 
13
- **⚡ Quick win** small effort, high value
14
- {{matrix.quick_win.lines}}
15
-
16
- **★ Next big thing** — big effort, high value
17
- {{matrix.next_big.lines}}
18
-
19
- **→ Defer (agent)** — small effort, low value
20
- {{matrix.defer.lines}}
21
-
22
- **⚑ Triage** — big effort, low value
23
- {{matrix.triage.lines}}
24
-
25
- 🔬 **Research → agent**
26
- {{matrix.research.lines}}
27
-
28
- ## Projects · active {{project_totals.active}} · done {{project_totals.done}} · future {{project_totals.future}}
10
+ ## Projects, active {{project_totals.active}}, done {{project_totals.done}}, future {{project_totals.future}}
29
11
  {{projects.lines}}
30
12
 
13
+ ## Most-valuable next work
14
+ {{next_work.lines}}
15
+
31
16
  **What would you like to work on next?** (type an **intent id**, a **project name**, or anything **new** you'd like to start)
@@ -1,33 +1,11 @@
1
- # 📦 {{slug}} · Project Board {{date}}
1
+ # 📦 {{slug}} · Project Board, {{date}}
2
2
 
3
3
  {{description}}
4
4
 
5
- **Recently worked** · last 24h
5
+ **Recently worked** (last active work, last 24h)
6
6
  {{recently_worked.lines}}
7
7
 
8
- ## Where we go next · Value × Effort
9
-
10
- | | Small effort | Big effort |
11
- |---|---|---|
12
- | **High value** | ⚡ **Quick win** · {{matrix.quick_win.count}} | ★ **Next big thing** · {{matrix.next_big.count}} |
13
- | **Low value** | → **Defer (agent)** · {{matrix.defer.count}} | ⚑ **Triage** · {{matrix.triage.count}} |
14
-
15
- **⚡ Quick win** — small effort, high value
16
- {{matrix.quick_win.lines}}
17
-
18
- **★ Next big thing** — big effort, high value
19
- {{matrix.next_big.lines}}
20
-
21
- **→ Defer (agent)** — small effort, low value
22
- {{matrix.defer.lines}}
23
-
24
- **⚑ Triage** — big effort, low value
25
- {{matrix.triage.lines}}
26
-
27
- 🔬 **Research → agent**
28
- {{matrix.research.lines}}
29
-
30
- ## Intents · active {{counts.active}} · done {{counts.done}} · future {{counts.future}}
8
+ ## Intents, active {{counts.active}}, done {{counts.done}}, future {{counts.future}}
31
9
 
32
10
  **Active**
33
11
  {{active.lines}}
@@ -35,6 +13,9 @@
35
13
  **Future**
36
14
  {{future.lines}}
37
15
 
38
- **Legend** · What ◔ Why ◑ How ◕ Exec ● Done · ⚡ quick win ★ big → defer ⚑ triage 🔬 research
16
+ ## Most-valuable next work
17
+ {{next_work.lines}}
18
+
19
+ **Legend** · ○ What ◔ Why ◑ How ◕ Exec ● Done
39
20
 
40
21
  **What would you like to work on next?** (type an **intent id**, or **global** to go back)
@@ -13,7 +13,7 @@ Doctor has three scopes. Pick the right one for the situation:
13
13
  | Scope | Flag | When it runs | States |
14
14
  |-------|------|--------------|--------|
15
15
  | Core check | `--core` | SessionStart hook (automatic), also available on demand | Binary: pass or error |
16
- | Store check | `--store [global\|<slug>]` | Dashboard load, `plastic-continuing` | Three-state: pass / warn / fail |
16
+ | Store check | `--store [global\|<slug>]` | Dashboard load, `plastic-project-continuing` | Three-state: pass / warn / fail |
17
17
  | Full check | (no flag) | After every update (automatic), or `/plastic-doctor` | Three-state: pass / warn / fail |
18
18
 
19
19
  ### `--core` (binary, manifest-backed)
@@ -118,9 +118,9 @@ Use the `fix_hint` value to determine the correct action:
118
118
  | "Add missing entries to INDEX.md" | Add orphaned intents to the appropriate INDEX.md section |
119
119
  | "Remove stale references from INDEX.md" | Edit INDEX.md to remove ghost references |
120
120
  | "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 |
121
- | "Run: provision-project-store {slug}" | Run `provision-project-store <slug>` (or invoke the `plastic-add-project-store` skill) to create the missing store |
121
+ | "Run: provision-project-store {slug}" | Run `provision-project-store <slug>` (or invoke the `plastic-store-provisioning` skill) to create the missing store |
122
122
  | "Re-run installer" | Run `npx -y @zalom/plastic@<channel> install --agent <agent>` (channel: -alpha->@alpha, -beta->@beta, else @latest) |
123
- | "Dispatch plastic-intent-curator ... revisions.md ..." | Invoke the `plastic-intent-curator` (or the agent) to 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.md > Structural maintenance and revisions.md. For a missing required section, restore or reproject it instead. |
123
+ | "Dispatch plastic-store-curating ... revisions.md ..." | Invoke the `plastic-store-curating` (or the agent) to 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.md > Structural maintenance and revisions.md. For a missing required section, restore or reproject it instead. |
124
124
 
125
125
  For fixes the agent cannot handle automatically, explain what the user needs
126
126
  to do manually. The `revisions.md` remedy is curator-applied (a move-and-record
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: plastic-install
3
- description: Use when initializing Plastic globally (~/.plastic/) or locally in a project, or to re-install/repair a broken installation. Accepts channel flags (--alpha, --beta, --latest) to select release channel. First install defaults to --beta; reinstalls match the already-installed channel. Global install is recommended: it creates the global intent store as a git-backed repository. Local install creates .plastic/ in the current project for testing.
3
+ description: 'Use when initializing Plastic globally (~/.plastic/) or locally in a project, or to re-install/repair a broken installation. Accepts channel flags (--alpha, --beta, --latest) to select release channel. First install defaults to --latest (stable); reinstalls match the already-installed channel. Global install is recommended: it creates the global intent store as a git-backed repository. Local install creates .plastic/ in the current project for testing.'
4
4
  user-invocable: true
5
5
  ---
6
6
 
7
7
  # Install Plastic
8
8
 
9
- > **Recommended path:** for a first install, run `npx -y @zalom/plastic@beta install --claude`
10
- > in your shell (or `bunx -y @zalom/plastic@beta install --claude` if you use Bun). This skill
9
+ > **Recommended path:** for a first install, run `npx -y @zalom/plastic@latest install --claude`
10
+ > in your shell (or `bunx -y @zalom/plastic@latest install --claude` if you use Bun). This skill
11
11
  > exists to **re-install or repair** an existing setup from inside the agent, and to
12
12
  > drive interactive global configuration. Whenever this skill performs an install or
13
13
  > re-install, it **runs `/plastic-doctor` afterward** and reports the result.
@@ -16,7 +16,7 @@ user-invocable: true
16
16
 
17
17
  If Plastic is installed, derive `<channel>` from `~/.plastic/VERSION`: a version containing
18
18
  `-alpha` means `@alpha`, `-beta` means `@beta`, otherwise `@latest`. If not installed
19
- (first install), default to `@beta`. The user can always override with
19
+ (first install), default to `@latest`. The user can always override with
20
20
  `--alpha` / `--beta` / `--latest`.
21
21
 
22
22
  ## Re-install / repair
@@ -35,18 +35,18 @@ Then **run `/plastic-doctor`** and report what it found.
35
35
 
36
36
  | Flag | Behavior |
37
37
  |------|----------|
38
- | `--latest` | Install from the stable channel |
39
- | `--beta` | Install from the beta channel (default on a first install) |
38
+ | `--latest` | Install from the stable channel (default on a first install) |
39
+ | `--beta` | Install from the beta channel |
40
40
  | `--alpha` | Install from the alpha channel |
41
41
 
42
42
  When invoked from within Claude Code (re-install or channel switch), the skill
43
43
  runs the appropriate npx command:
44
44
 
45
45
  ```bash
46
- # Stable
46
+ # Stable (default on a first install)
47
47
  npx -y @zalom/plastic@latest install --claude
48
48
 
49
- # Beta (default on a first install)
49
+ # Beta
50
50
  npx -y @zalom/plastic@beta install --claude
51
51
 
52
52
  # Alpha
@@ -68,10 +68,10 @@ Run `/plastic-install` with no arguments.
68
68
  Check if `~/.plastic/VERSION` exists.
69
69
  - If yes: announce "Plastic is already installed at ~/.plastic/. Run `/plastic-update` to
70
70
  sync core files, or use the re-install command above to repair in place."
71
- - If no: run the fresh install command (default `@beta`, or the channel the user named):
71
+ - If no: run the fresh install command (default `@latest`, or the channel the user named):
72
72
 
73
73
  ```bash
74
- npx -y @zalom/plastic@beta install --claude
74
+ npx -y @zalom/plastic@latest install --claude
75
75
  ```
76
76
 
77
77
  This single command, via `install.rb` (`bootstrap` + `distribute`), creates `store/`,
@@ -1,19 +1,19 @@
1
1
  ---
2
- name: plastic-brainstorming
3
- description: "Explore intent requirements and design before implementation. Produces spec.md in the active intent directory."
2
+ name: plastic-intent-brainstorming
3
+ description: "Explore intent requirements and design before implementation, through conversational prose questions asked one at a time (no multiple-choice chips), persisting each owner ruling immediately as an insight. Produces the enriched Why (Context and Decisions) in the active intent directory; hands off to /plastic-intent-speccing for spec.md."
4
4
  user-invocable: true
5
5
  ---
6
6
 
7
7
  # Brainstorming Ideas Into Designs
8
8
 
9
- Help turn ideas into fully formed designs and specs through natural collaborative dialogue.
9
+ Help turn ideas into fully formed designs through natural collaborative dialogue.
10
10
 
11
- Announce: "I'm using the brainstorming skill to explore the design for intent {id} {name}."
11
+ Announce: "I'm using the brainstorming skill to explore the design for intent {id}: {name}."
12
12
 
13
- Start by understanding the current project context, then ask questions one at a time to refine the idea. Once you understand what you're building, present the design and get user approval.
13
+ Start by understanding the current project context, then ask questions one at a time, in prose, to refine the idea. Once you understand what you're building, present the design and collect the owner's rulings on it. This skill's product is the enriched Why, not spec.md.
14
14
 
15
15
  <HARD-GATE>
16
- Do NOT invoke any implementation skill, write any code, scaffold any project, or take any implementation action until you have presented a design and the user has approved it. This applies to EVERY project regardless of perceived simplicity.
16
+ Do NOT invoke any implementation skill, write any code, scaffold any project, or take any implementation action until you have presented a design and the user has ruled on it. This applies to EVERY project regardless of perceived simplicity.
17
17
  </HARD-GATE>
18
18
 
19
19
  ## Active Intent Gate
@@ -21,34 +21,32 @@ Do NOT invoke any implementation skill, write any code, scaffold any project, or
21
21
  Before proceeding, resolve the active intent:
22
22
 
23
23
  1. **Detect store:** Read `~/.plastic/projects.yml`, match CWD against registered project paths. If match → project store at `~/.plastic/projects/{slug}/store/`. If no match → global store at `~/.plastic/store/`.
24
- 2. **Find active intent:** Read `INDEX.md` from the detected store. Look under `## Active`. If exactly one → use it. If multiple → ask which. If none → refuse: "No active intent. Create one first with /plastic-creating-intent"
24
+ 2. **Find active intent:** Read `INDEX.md` from the detected store. Look under `## Active`. If exactly one → use it. If multiple → ask which. If none → refuse: "No active intent. Create one first with /plastic-intent-creating"
25
25
  3. **Resolve intent directory:** `{store}/store/{id}--{slug}/`
26
26
 
27
27
  All artifacts go to the intent directory. Never write to external paths.
28
28
 
29
29
  ## Anti-Pattern: "This Is Too Simple To Need A Design"
30
30
 
31
- Every project goes through this process. A todo list, a single-function utility, a config change all of them. "Simple" projects are where unexamined assumptions cause the most wasted work. The design can be short (a few sentences for truly simple projects), but you MUST present it and get approval.
31
+ Every project goes through this process. A todo list, a single-function utility, a config change: all of them. "Simple" projects are where unexamined assumptions cause the most wasted work. The design can be short (a few sentences for truly simple projects), but you MUST present it and get a ruling.
32
32
 
33
33
  ## Checklist
34
34
 
35
35
  You MUST create a task for each of these items and complete them in order:
36
36
 
37
- 1. **Explore project context** check files, docs, recent commits, read active intent
38
- 2. **Ask clarifying questions** one at a time, understand purpose/constraints/success criteria
39
- 3. **Propose 2-3 approaches** with trade-offs and your recommendation
40
- 4. **Present design** in sections scaled to their complexity, get user approval after each section
41
- 5. **Write spec** save to `{intent_dir}/spec.md` and commit to store repo
42
- 6. **Spec self-review** placeholder scan, consistency, scope, ambiguity
43
- 7. **User reviews written spec** — ask user to review before proceeding
44
- 8. **Transition to planning** — invoke `plastic-writing-plans`
37
+ 1. **Explore project context**: check files, docs, recent commits, read active intent
38
+ 2. **Grill in prose**: ask conversational prose questions, one at a time, no multiple-choice chips; understand purpose/constraints/success criteria
39
+ 3. **Propose 2-3 approaches**: with trade-offs and your recommendation
40
+ 4. **Present design**: in sections scaled to their complexity, get a ruling after each section
41
+ 5. **Collect rulings**: for each owner ruling, immediately persist it (see Collect rulings below); never batch
42
+ 6. **Hand off to /plastic-intent-speccing**: the enriched Why is done; do not author spec.md here
45
43
 
46
44
  ## Process Flow
47
45
 
48
- The Checklist above states the ordered flow (steps 1-8). For the same flow as a
46
+ The Checklist above states the ordered flow (steps 1-6). For the same flow as a
49
47
  diagram, read `references/design-principles.md`.
50
48
 
51
- **The terminal state is invoking `plastic-writing-plans`.** Do NOT invoke any other implementation skill. The ONLY skill you invoke after brainstorming is `plastic-writing-plans`.
49
+ **The terminal state is the handoff below.** Do NOT invoke any implementation skill and do NOT write spec.md. Brainstorming's product is the enriched Why.
52
50
 
53
51
  ## The Process
54
52
 
@@ -56,9 +54,9 @@ diagram, read `references/design-principles.md`.
56
54
  - QMD-first (when available): before scanning the store with grep/Read for prior decisions, specs, or outcomes, run `ruby ~/.plastic/scripts/qmd-sync search "<terms>"` to surface candidate, prior, or related intents, then open the authoritative intent file for any hit you act on. The command is a no-op when QMD is absent, so fall back to the existing INDEX.md / file scan.
57
55
  - Check out the current project state first (files, docs, recent commits)
58
56
  - Before asking detailed questions, assess scope: if the request describes multiple independent subsystems (e.g., "build a platform with chat, file storage, billing, and analytics"), flag this immediately. Don't spend questions refining details of a project that needs to be decomposed first.
59
- - If the project is too large for a single spec, help the user decompose into sub-projects: what are the independent pieces, how do they relate, what order should they be built? Then brainstorm the first sub-project through the normal design flow. Each sub-project gets its own spec → plan → implementation cycle.
60
- - For appropriately-scoped projects, ask questions one at a time to refine the idea
61
- - Prefer multiple choice questions when possible, but open-ended is fine too
57
+ - If the project is too large for a single spec, help the user decompose into sub-projects: what are the independent pieces, how do they relate, what order should they be built? Then brainstorm the first sub-project through the normal design flow. Each sub-project gets its own Why → spec → plan → implementation cycle.
58
+ - For appropriately-scoped projects, ask questions one at a time, in prose, to refine the idea
59
+ - Ask conversational prose questions, not multiple-choice chips. A short menu of named options is fine when the choice is genuinely enumerable, but phrase it as a sentence, not a bulleted picker.
62
60
  - Only one question per message - if a topic needs more exploration, break it into multiple questions
63
61
  - Focus on understanding: purpose, constraints, success criteria
64
62
 
@@ -80,39 +78,39 @@ guidance (what makes a good interface, when a file has grown too large) and
80
78
  existing-codebase guidance (follow established patterns, fold in targeted
81
79
  improvements without unrelated refactoring).
82
80
 
83
- ## After the Design
84
- **Documentation:**
85
- - Write the validated design (spec) to `{intent_dir}/spec.md` using the `${CLAUDE_PLUGIN_ROOT}/templates/spec.md` form
86
- - Use elements-of-style:writing-clearly-and-concisely skill if available
87
- - Commit to the store repo:
88
- ```
89
- cd {store_root} && git add . && git commit -m "docs: spec for intent {id} — {name}"
90
- ```
81
+ ## Collect rulings
91
82
 
92
- **Spec Self-Review:**
93
- After writing the spec document, look at it with fresh eyes:
94
- 1. **Placeholder scan:** Any "TBD", "TODO", incomplete sections, or vague requirements? Fix them.
95
- 2. **Internal consistency:** Do any sections contradict each other? Does the architecture match the feature descriptions?
96
- 3. **Scope check:** Is this focused enough for a single implementation plan, or does it need decomposition?
97
- 4. **Ambiguity check:** Could any requirement be interpreted two different ways? If so, pick one and make it explicit.
83
+ Each owner ruling triggers one immediate persist call, never a batch. The moment the
84
+ owner rules on a question or a design section, before moving to the next one, run:
98
85
 
99
- Fix any issues inline. No need to re-review — just fix and move on.
86
+ ```
87
+ ruby ~/.plastic/scripts/insight-append {intent_dir} "<ruling text>" --stage Why --author human
88
+ ```
100
89
 
101
- **User Review Gate:**
102
- After the spec review loop passes, ask the user to review the written spec before proceeding:
103
- > "Spec written and committed to `{intent_dir}/spec.md`. Please review it and let me know if you want to make any changes before we start writing out the implementation plan."
90
+ When a later ruling conflicts with an earlier one already on record, append a new
91
+ insight that names the superseded ruling and states plainly that this one supersedes
92
+ it. Both insights stay on record; the later one wins.
104
93
 
105
- Wait for the user's response. If they request changes, make them and re-run the spec review loop. Only proceed once the user approves.
94
+ When presenting a batch of design options or rulings for the owner to choose, read
95
+ `~/.plastic/_decision-tables.md` and follow the numbered-table procedure.
106
96
 
107
- **Implementation:**
108
- - Invoke `plastic-writing-plans` to create the implementation plan
109
- - Do NOT invoke any other skill. `plastic-writing-plans` is the next step.
97
+ ## Handoff
98
+
99
+ Why exploration complete. The enriched Why is captured (Context, Decisions, one
100
+ insight per ruling). Invoke /plastic-intent-speccing to consolidate it into spec.md.
101
+ Do not author spec.md here.
102
+
103
+ ## Gate position
104
+
105
+ - **Before:** an active intent exists with the lock armed.
106
+ - **Produces:** the enriched Why (`## Context`, `### Decisions`, one `## Insights` entry per ruling).
107
+ - **Next:** /plastic-intent-speccing consolidates the enriched Why into spec.md.
110
108
 
111
109
  ## Key Principles
112
110
 
113
111
  - **One question at a time** - Don't overwhelm with multiple questions
114
- - **Multiple choice preferred** - Easier to answer than open-ended when possible
112
+ - **Prose, not chips** - Ask conversational prose questions; skip multiple-choice menus
115
113
  - **YAGNI ruthlessly** - Remove unnecessary features from all designs
116
114
  - **Explore alternatives** - Always propose 2-3 approaches before settling
117
- - **Incremental validation** - Present design, get approval before moving on
115
+ - **Incremental validation** - Present design, collect a ruling before moving on
118
116
  - **Be flexible** - Go back and clarify when something doesn't make sense