@zalom/plastic 1.0.2 → 1.1.0

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 (105) hide show
  1. package/PLASTIC-reference.md +11 -11
  2. package/PLASTIC.md +37 -7
  3. package/README.md +47 -0
  4. package/agents/plastic-enforcer.md +3 -3
  5. package/agents/plastic-intent-curator.md +9 -10
  6. package/agents/plastic-intent-discovery.md +1 -0
  7. package/agents/plastic-spec-specialist.md +9 -6
  8. package/bin/plastic.js +2 -2
  9. package/package.json +1 -1
  10. package/scripts/dashboard.rb +2 -2
  11. package/scripts/doctor.rb +55 -7
  12. package/scripts/end-intent +330 -0
  13. package/scripts/hook-code-gate +1 -1
  14. package/scripts/hook-continue +1 -1
  15. package/scripts/hook-create-gate +2 -2
  16. package/scripts/hook-session-start +1 -1
  17. package/scripts/lib/bridge.rb +46 -13
  18. package/scripts/lib/dashboard_banner.rb +1 -1
  19. package/scripts/lib/installer_core.rb +8 -6
  20. package/scripts/lib/lock.rb +3 -3
  21. package/scripts/lib/store_provisioning.rb +1 -1
  22. package/scripts/new-intent +1 -1
  23. package/scripts/{versions.rb → rollback.rb} +33 -41
  24. package/scripts/update.rb +1 -1
  25. package/skills/_active-intent-gate.md +1 -1
  26. package/skills/_decision-tables.md +50 -0
  27. package/skills/auto/SKILL.md +48 -64
  28. package/skills/auto/evals/evals.json +4 -4
  29. package/skills/auto/references/agent-architecture.md +2 -2
  30. package/skills/auto/references/agent-report-contract.md +3 -0
  31. package/skills/dashboard/SKILL.md +3 -2
  32. package/skills/doctor/SKILL.md +4 -3
  33. package/skills/humanizer/SKILL.md +1 -0
  34. package/skills/install/SKILL.md +2 -1
  35. package/skills/{brainstorming → intent-brainstorming}/SKILL.md +44 -45
  36. package/skills/intent-brainstorming/evals/evals.json +67 -0
  37. package/skills/{brainstorming → intent-brainstorming}/references/design-principles.md +12 -17
  38. package/skills/{continuing → intent-continuing}/SKILL.md +4 -3
  39. package/skills/{continuing → intent-continuing}/evals/evals.json +24 -24
  40. package/skills/{creating-intent → intent-creating}/SKILL.md +4 -3
  41. package/skills/{creating-intent → intent-creating}/evals/evals.json +1 -1
  42. package/skills/{intent-discovery → intent-discovering}/SKILL.md +3 -1
  43. package/skills/intent-ending/SKILL.md +151 -0
  44. package/skills/intent-ending/evals/evals.json +74 -0
  45. package/skills/{executing-plan → intent-executing}/SKILL.md +76 -15
  46. package/skills/intent-executing/evals/evals.json +66 -0
  47. package/skills/{brainstorming-grill-me → intent-grilling}/SKILL.md +5 -4
  48. package/skills/{linking-intents → intent-linking}/SKILL.md +2 -1
  49. package/skills/{linking-intents → intent-linking}/evals/evals.json +1 -1
  50. package/skills/{lock → intent-locking}/SKILL.md +2 -1
  51. package/skills/{writing-plans → intent-planning}/SKILL.md +49 -20
  52. package/skills/intent-planning/evals/evals.json +66 -0
  53. package/skills/{writing-plans → intent-planning}/references/plan-format.md +31 -7
  54. package/skills/{research → intent-researching}/SKILL.md +5 -2
  55. package/skills/{research → intent-researching}/evals/evals.json +1 -1
  56. package/skills/{savepoint → intent-savepoint}/SKILL.md +2 -1
  57. package/skills/intent-speccing/SKILL.md +69 -0
  58. package/skills/intent-speccing/evals/evals.json +126 -0
  59. package/skills/intent-speccing/references/per-section-fill-rules.md +92 -0
  60. package/skills/intent-speccing/references/self-verify-checklist.md +38 -0
  61. package/skills/intent-starting/SKILL.md +3 -2
  62. package/skills/intent-starting/evals/evals.json +2 -2
  63. package/skills/{creating-project → project-creating}/SKILL.md +3 -2
  64. package/skills/releasing/SKILL.md +19 -14
  65. package/skills/roadmap/SKILL.md +1 -0
  66. package/skills/{versions → rollback}/SKILL.md +31 -20
  67. package/skills/{creating-skills → skill-creating}/SKILL.md +3 -2
  68. package/skills/{creating-skills → skill-creating}/evals/evals.json +5 -5
  69. package/skills/{creating-skills → skill-creating}/references/progressive-disclosure.md +2 -2
  70. package/skills/{creating-skills → skill-creating}/references/skills.md +1 -0
  71. package/skills/{evaluating-skills → skill-evaluating}/SKILL.md +2 -1
  72. package/skills/{evaluating-skills → skill-evaluating}/evals/evals.json +3 -3
  73. package/skills/{intent-curator → store-curating}/SKILL.md +7 -7
  74. package/skills/{intent-curator → store-curating}/evals/evals.json +1 -1
  75. package/skills/{managing-index → store-indexing}/SKILL.md +7 -7
  76. package/skills/{managing-index → store-indexing}/evals/evals.json +1 -1
  77. package/skills/{add-project-store → store-provisioning}/SKILL.md +3 -2
  78. package/skills/tutorial/SKILL.md +65 -0
  79. package/skills/tutorial/evals/evals.json +186 -0
  80. package/skills/tutorial/references/track-1-guided.md +123 -0
  81. package/skills/tutorial/references/track-2-auto.md +95 -0
  82. package/skills/tutorial/references/track-3-projects-and-roadmaps.md +110 -0
  83. package/skills/uninstall/SKILL.md +1 -0
  84. package/skills/update/SKILL.md +2 -1
  85. package/templates/agents.md +7 -7
  86. package/skills/brainstorming/evals/evals.json +0 -22
  87. /package/skills/{continuing → intent-continuing}/references/context-management.md +0 -0
  88. /package/skills/{creating-intent → intent-creating}/references/lifecycle.md +0 -0
  89. /package/skills/{creating-intent → intent-creating}/references/wikilinks.md +0 -0
  90. /package/skills/{executing-plan → intent-executing}/code-quality-reviewer-prompt.md +0 -0
  91. /package/skills/{executing-plan → intent-executing}/implementer-prompt.md +0 -0
  92. /package/skills/{executing-plan → intent-executing}/spec-reviewer-prompt.md +0 -0
  93. /package/skills/{linking-intents → intent-linking}/references/zettelkasten.md +0 -0
  94. /package/skills/{savepoint → intent-savepoint}/references/context-management.md +0 -0
  95. /package/skills/{creating-project → project-creating}/references/hubs-projects.md +0 -0
  96. /package/skills/{creating-project → project-creating}/references/project-scaffolding.md +0 -0
  97. /package/skills/{creating-skills → skill-creating}/references/agents.md +0 -0
  98. /package/skills/{creating-skills → skill-creating}/references/evals.md +0 -0
  99. /package/skills/{creating-skills → skill-creating}/references/hooks.md +0 -0
  100. /package/skills/{creating-skills → skill-creating}/references/scripts.md +0 -0
  101. /package/skills/{creating-skills → skill-creating}/scripts/scaffold.rb +0 -0
  102. /package/skills/{evaluating-skills → skill-evaluating}/assets/eval-template.json +0 -0
  103. /package/skills/{evaluating-skills → skill-evaluating}/references/convention-checks.md +0 -0
  104. /package/skills/{evaluating-skills → skill-evaluating}/references/eval-methodology.md +0 -0
  105. /package/skills/{managing-index → store-indexing}/references/zettelkasten-linking.md +0 -0
@@ -2,20 +2,24 @@
2
2
  # encoding: UTF-8
3
3
  # frozen_string_literal: true
4
4
 
5
- # Plastic — `versions` verb. Runs via `npx @zalom/plastic versions` (bin/plastic.js) or directly.
6
- # Usage: ruby scripts/versions.rb [--downgrade [--version <v>] | --upgrade] [--help]
5
+ # Plastic — `rollback` verb. Runs via `npx @zalom/plastic rollback` (bin/plastic.js) or directly.
6
+ # Usage: ruby scripts/rollback.rb [--version <v> [--downgrade | --upgrade]] [--help]
7
7
  #
8
8
  # Local time-machine over the append-only versions.json ledger. Navigates ONLY versions you
9
9
  # have actually run (the ledger), never npm's full list — fetching brand-new versions is
10
10
  # `update`'s job. Lets you roll back to a known-good build after a bad release.
11
- # - no flag print the ledger table (and offer to continue a rollback)
12
- # - --downgrade step back one version in your history
13
- # - --downgrade --version V jump to a specific previously-run version
14
- # - --upgrade step forward one version (after a rollback)
11
+ # - no flag read-only: print the version-history table, never switch
12
+ # - --version V switch to a specific previously-run version (direction derived)
13
+ # - --downgrade --version V synonym of --version V (direction flag is descriptive only)
14
+ # - --upgrade --version V synonym of --version V (direction flag is descriptive only)
15
+ # - --downgrade / --upgrade alone no target given: error, no switch
16
+ #
17
+ # Switching always requires an explicit --version V. A rollback tool whose job is safety
18
+ # during a bad release must never switch versions without a named target.
15
19
 
16
20
  require_relative "lib/installer_core"
17
21
 
18
- class Versions < InstallerCore
22
+ class Rollback < InstallerCore
19
23
  PKG = "@zalom/plastic"
20
24
 
21
25
  def cli(argv = ARGV)
@@ -32,31 +36,24 @@ class Versions < InstallerCore
32
36
 
33
37
  timeline = version_timeline(ledger)
34
38
  current = installed_version || timeline.last
39
+ explicit = flag_value(argv, "--version")
35
40
 
36
- if argv.include?("--downgrade")
37
- explicit = flag_value(argv, "--version")
38
- target = explicit || step_target(timeline, current, :back)
39
- return no_target("No earlier version in your history.") unless target
40
- unless timeline.include?(target)
41
- warn "#{target} is not in your version history. Choose one of: #{timeline.join(", ")}"
41
+ if explicit
42
+ unless timeline.include?(explicit)
43
+ warn "#{explicit} is not in your version history. Choose one of: #{timeline.join(", ")}"
42
44
  return 1
43
45
  end
44
- return switch_to(target, current)
45
- elsif argv.include?("--upgrade")
46
- target = step_target(timeline, current, :forward)
47
- return no_target("No later version in your history. Use `update` for new releases.") unless target
48
- return switch_to(target, current)
46
+ return switch_to(explicit, current)
49
47
  end
50
48
 
51
- # No flag: show the table, and detect an in-progress rollback.
52
- print_table(ledger, current)
53
- if ledger.last && ledger.last["action"] == "downgrade"
54
- prev = step_target(timeline, current, :back)
55
- if prev && $stdin.tty?
56
- print "\nYou recently rolled back. Go back further to #{prev}? [y/N]: "
57
- return switch_to(prev, current) if ($stdin.gets&.strip || "").downcase.start_with?("y")
58
- end
49
+ if argv.include?("--downgrade") || argv.include?("--upgrade")
50
+ warn "An explicit target is required: pass --version <v>. Run `rollback` with no " \
51
+ "flags to see your version history and pick a target."
52
+ return 1
59
53
  end
54
+
55
+ # No flags at all: read-only. Print the table and stop; never switch, never prompt.
56
+ print_table(ledger, current)
60
57
  0
61
58
  end
62
59
 
@@ -93,11 +90,6 @@ class Versions < InstallerCore
93
90
  argv[i + 1]
94
91
  end
95
92
 
96
- def no_target(msg)
97
- puts msg
98
- 0
99
- end
100
-
101
93
  def switch_to(target, current)
102
94
  action = action_for(target, current)
103
95
  puts "#{action == "downgrade" ? "\u{23ea}" : "\u{23e9}"} #{current} \u{2192} #{target} (#{action})"
@@ -119,23 +111,23 @@ class Versions < InstallerCore
119
111
  def show_help
120
112
  puts <<~HELP
121
113
 
122
- plastic versionsmanage and roll back your local Plastic versions
114
+ plastic rollbackread installed and available versions, and switch on request
123
115
 
124
116
  Usage:
125
- npx @zalom/plastic versions [options]
117
+ npx @zalom/plastic rollback [options]
126
118
 
127
119
  Options:
128
- (none) Show the version-history table
129
- --downgrade Roll back one version in your history
130
- --downgrade --version V Roll back to a specific previously-run version
131
- --upgrade Step forward one version in your history
132
- -h, --help Show this help
120
+ (none) Show the version-history table (read-only, no switch)
121
+ --version V Switch to version V (direction derived automatically)
122
+ --downgrade --version V Synonym of --version V
123
+ --upgrade --version V Synonym of --version V
124
+ -h, --help Show this help
133
125
 
134
- Navigates only versions you have already run (the append-only ledger). To move to a
135
- brand-new release, use `update`.
126
+ Switching always requires an explicit --version V. Navigates only versions you have
127
+ already run (the append-only ledger). To move to a brand-new release, use `update`.
136
128
 
137
129
  HELP
138
130
  end
139
131
  end
140
132
 
141
- exit(Versions.new(package_root: ENV["PLASTIC_PACKAGE_ROOT"] || File.expand_path("..", __dir__)).cli(ARGV)) if $PROGRAM_NAME == __FILE__
133
+ exit(Rollback.new(package_root: ENV["PLASTIC_PACKAGE_ROOT"] || File.expand_path("..", __dir__)).cli(ARGV)) if $PROGRAM_NAME == __FILE__
package/scripts/update.rb CHANGED
@@ -164,7 +164,7 @@ class Update < InstallerCore
164
164
  Behaviour:
165
165
  No flag advances to the next version on your current channel. Switching toward a
166
166
  more stable channel is frictionless; switching toward bleeding edge is confirmed.
167
- Use `versions` to roll back to a previously-installed version.
167
+ Use `rollback` to roll back to a previously-installed version.
168
168
 
169
169
  HELP
170
170
  end
@@ -13,7 +13,7 @@ Before proceeding, resolve the active intent:
13
13
  - Look under `## Active` for intent entries
14
14
  - If exactly one active intent → use it
15
15
  - If multiple active intents → ask user which one
16
- - If no active intent → refuse: "No active intent. Create one first with /plastic-creating-intent"
16
+ - If no active intent → refuse: "No active intent. Create one first with /plastic-intent-creating"
17
17
 
18
18
  3. **Resolve paths:**
19
19
  - Intent directory: `{store}/store/{id}--{slug}/`
@@ -0,0 +1,50 @@
1
+ ## Numbered Decision Tables
2
+
3
+ The shared procedure for collecting owner rulings during any stage (Why, How, Exec).
4
+ Any stage skill that needs the owner to choose between options or rule on a batch of
5
+ open questions follows this procedure instead of improvising its own format.
6
+
7
+ Read this when a stage skill's own text says to.
8
+
9
+ ### The procedure
10
+
11
+ 1. **Collect the candidate decisions.** Gather every open question or option set that
12
+ needs an owner ruling right now. Do not present them one at a time across separate
13
+ messages; batch them into a single collection first.
14
+
15
+ 2. **Present exactly ONE table.** Its first column is the row number. One decision per
16
+ row. Add a recommendation column stating the agent's recommended choice and a short
17
+ reason. Example shape:
18
+
19
+ | # | Decision | Recommendation |
20
+ |---|---|---|
21
+ | 1 | Ship the setting as a CLI flag or a config file? | Config file: survives across invocations |
22
+ | 2 | Retry, circuit breaker, or fallback for the flaky call? | Retry: matches existing error handling elsewhere in this module |
23
+
24
+ 3. **Let the owner rule by row number.** The owner responds with a ruling per row
25
+ number (e.g. "1: config file, 2: retry"). Do not require prose paragraphs back; a
26
+ row-number ruling is enough.
27
+
28
+ 4. **Persist each ruling immediately, one at a time.** For every ruling, before moving
29
+ to the next row, run:
30
+
31
+ ```
32
+ ruby ~/.plastic/scripts/insight-append {intent_dir} "<ruling text>" --stage <stage> --author human
33
+ ```
34
+
35
+ Never batch rulings into a single call and never wait until all rows are ruled to
36
+ start persisting. `<stage>` is the current stage (Why, How, or Exec). If a ruling
37
+ supersedes an earlier one already on record, append a second insight that names the
38
+ superseded decision and states plainly that this ruling supersedes it. Both insights
39
+ stay on record; the later one wins.
40
+
41
+ 5. **Write the full ruling set to a rulings file.** After the last row is ruled and
42
+ persisted, write the complete table plus every ruling to
43
+ `{intent_dir}/resources/rulings--<slug>.md` so the full set is readable in one place
44
+ alongside the per-row insights.
45
+
46
+ ### Why one table, not a chip per row
47
+
48
+ A single table lets the owner rule on everything in one pass and reference row numbers
49
+ in their reply. Multiple small prompts force the owner to context-switch per decision
50
+ and make later replies ambiguous about which decision they answer.
@@ -1,14 +1,15 @@
1
1
  ---
2
2
  name: plastic-auto
3
3
  description: >-
4
- Autonomous intent delivery agent takes over How and Exec. Use when user says
4
+ Autonomous intent delivery - agent takes over How and Exec. Use when user says
5
5
  "auto", "take it from here", "deliver this", or when brainstorming-grill-me concludes
6
6
  and user confirms autonomous execution. Requires an active intent in INDEX.md.
7
+ user-invocable: true
7
8
  ---
8
9
 
9
- # Auto Autonomous Intent Delivery
10
+ # Auto - Autonomous Intent Delivery
10
11
 
11
- Announce: "Taking over intent [ID] [name] for autonomous delivery."
12
+ Announce: "Taking over intent [ID] - [name] for autonomous delivery."
12
13
 
13
14
  **Advisory (not a gate).** At auto-mode start, recommend once that the user run this
14
15
  orchestrating main session on the best available thinking model (Fable, Opus, or whatever
@@ -18,7 +19,7 @@ subagents keep their pinned tier and never resolve to Fable.
18
19
 
19
20
  ## Precondition
20
21
 
21
- An active intent MUST exist in INDEX.md. If none exists, refuse: "No active intent found. Create one first with /plastic-creating-intent."
22
+ An active intent MUST exist in INDEX.md. If none exists, refuse: "No active intent found. Create one first with /plastic-intent-creating."
22
23
 
23
24
  If multiple active intents exist, ask the user which one to deliver (this is the only question auto asks).
24
25
 
@@ -30,8 +31,8 @@ next dispatchable intent:
30
31
  ruby ~/.plastic/scripts/dashboard.rb all --json
31
32
  ```
32
33
 
33
- Work `dispatchable_queue` in `rank` order (these are `defer`/`research` dispositions
34
- safe to deliver autonomously). Leave `human_only` and `next_big_thing` for the user those
34
+ Work `dispatchable_queue` in `rank` order (these are `defer`/`research` dispositions -
35
+ safe to deliver autonomously). Leave `human_only` and `next_big_thing` for the user - those
35
36
  are `drive`/`triage` items the human should lead. See the `plastic-dashboard` skill.
36
37
 
37
38
  QMD-first (when available): when the user describes the work to deliver rather than naming an
@@ -64,7 +65,7 @@ and artifact depth to that size. Extended walkthrough: `references/tiers.md`.
64
65
 
65
66
  ## Arm the Lifecycle Gate (do this FIRST)
66
67
 
67
- Immediately after selecting the intent before any other work arm auto mode. This
68
+ Immediately after selecting the intent - before any other work - arm auto mode. This
68
69
  writes the session bridge that makes the code-edit gate live, so project code cannot be
69
70
  edited before the plan exists (the gate applies to YOU, the orchestrator):
70
71
 
@@ -87,7 +88,7 @@ Honor the cycle: What → Why (spec.md) → How (plan.md + actions/ + checklist.
87
88
 
88
89
  ## Flags
89
90
 
90
- - `--skip-permissions` bypass hard stops on destructive actions on existing projects. Full trust mode. Default: off.
91
+ - `--skip-permissions` - bypass hard stops on destructive actions on existing projects. Full trust mode. Default: off.
91
92
 
92
93
  ## Team Spin-Up
93
94
 
@@ -103,7 +104,7 @@ Roster (one role per cycle stage):
103
104
  - **plastic-executor** (code + checklist + `## Insights`)
104
105
  - **plastic-enforcer** (orchestrates + gates; that is YOU)
105
106
 
106
- Dispatch rule: sequential, one specialist per stage on one branch (the deliverables share files). Gate each deliverable against the stage's exit criteria before handing off. The How and Exec phases below default to Plastic's native dispatch (`plastic-executing-plan`) and delegate to the superpowers skills only when they are available or the user asks; do not restate the phase mechanics here.
107
+ Dispatch rule: sequential, one specialist per stage on one branch (the deliverables share files). Gate each deliverable against the stage's exit criteria before handing off. The How and Exec phases below default to Plastic's native dispatch (`plastic-intent-executing`) and delegate to the superpowers skills only when they are available or the user asks; do not restate the phase mechanics here.
107
108
 
108
109
  Spawn preamble (live-state injection): before dispatching any specialist, run `scripts/spawn-preamble <intent_dir> --role <role>` and PREPEND its output to that specialist's prompt. The preamble is a deterministic, filesystem-only snapshot of the active intent (id, intent line, current stage, and the provisioned code worktree path when one exists on disk) plus the honoring instruction, so every spawned agent boots with accurate live state instead of guessing. This is the authoritative L2 mechanism for harnesses whose sub-agents do not inherit a top-level session event (see `docs/reference/harness-adapters.md`).
109
110
 
@@ -167,15 +168,15 @@ this is worth doing, or proceed).
167
168
  When entering at Why stage:
168
169
 
169
170
  1. Read existing `## Context` and `### Decisions` from the intent file
170
- 2. Assess gaps what decisions are missing? What context is incomplete?
171
- 3. Self-directed research read code, search docs, explore related intents (via wikilinks in `## Links`), web search if needed. NO questions to human.
172
- 4. Adaptive budget assess complexity and set your own research budget:
171
+ 2. Assess gaps - what decisions are missing? What context is incomplete?
172
+ 3. Self-directed research - read code, search docs, explore related intents (via wikilinks in `## Links`), web search if needed. NO questions to human.
173
+ 4. Adaptive budget - assess complexity and set your own research budget:
173
174
  - Simple (config change, small feature): 2-3 research steps
174
175
  - Medium (new feature, integration): 5-8 research steps
175
176
  - Complex (new project, architecture): 10-15 research steps
176
- 5. Make decisions pick best option, document in `## Context > ### Decisions` with rationale
177
+ 5. Make decisions - pick best option, document in `## Context > ### Decisions` with rationale
177
178
  6. Log all autonomous decisions in `## Insights` with `(autonomous)` marker: "Decision: chose X because Y (autonomous)"
178
- 7. Write `spec.md` consolidated specification
179
+ 7. Write `spec.md` - consolidated specification
179
180
  8. Notify user (Why briefing): brief per `references/human-report-contract.md`
180
181
  (State: the approach chosen, one line; Risk: the main trade-off; Call: the one decision
181
182
  needed, approve or pick an option).
@@ -190,9 +191,9 @@ intent birth and persists at every tier; only writing `ACTION_N.md` files into i
190
191
  only (S/M leave the directory empty).
191
192
 
192
193
  1. If `superpowers:writing-plans` is available as a skill, delegate plan creation to it. Tell it the plan saves to the active intent's directory (not `docs/superpowers/plans/`).
193
- 2. Otherwise, write `plan.md` directly implementation plan with numbered tasks
194
- 3. Write `ACTION_N.md` files into the existing `actions/` directory (one per task, self-contained) L only
195
- 4. Write `checklist.md` execution registry with checkboxes covering all actions
194
+ 2. Otherwise, write `plan.md` directly - implementation plan with numbered tasks
195
+ 3. Write `ACTION_N.md` files into the existing `actions/` directory (one per task, self-contained) - L only
196
+ 4. Write `checklist.md` - execution registry with checkboxes covering all actions
196
197
  5. Notify user (How briefing): brief per `references/human-report-contract.md`
197
198
  (State: the plan shape, task count and what it builds; Risk: the riskiest task or
198
199
  dependency; Call: approve the plan to build).
@@ -204,9 +205,9 @@ Then proceed to Exec.
204
205
  If the plan calls for creating a new project (the intent is an implementation intent that needs a new codebase):
205
206
 
206
207
  1. Determine project path from `~/.plastic/config.yml` `project_roots` or from intent context
207
- 2. **Confirm path with user** this is the ONE human interaction during auto delivery:
208
+ 2. **Confirm path with user** - this is the ONE human interaction during auto delivery:
208
209
  > "Creating project `<slug>` at `<path>`. Confirm path, or provide alternative."
209
- 3. Invoke `plastic-creating-project` skill
210
+ 3. Invoke `plastic-project-creating` skill
210
211
  4. The global intent is now Completed (creating-project handles this)
211
212
  5. The tactical mirror in the project store becomes the active intent
212
213
  6. Continue execution from the project directory using the tactical intent
@@ -214,7 +215,7 @@ If the plan calls for creating a new project (the intent is an implementation in
214
215
  ## Exec Phase
215
216
 
216
217
  1. If `superpowers:subagent-driven-development` or `superpowers:executing-plans` is available, delegate execution to it
217
- 2. Otherwise invoke `plastic-executing-plan`
218
+ 2. Otherwise invoke `plastic-intent-executing`
218
219
  3. Execute actions from checklist sequentially
219
220
  4. Check off items in `checklist.md` as completed
220
221
  5. Append observations to `## Insights` with `(autonomous)` marker
@@ -223,7 +224,7 @@ If the plan calls for creating a new project (the intent is an implementation in
223
224
  (State: what got built and the test result; Risk: residual failures or deviations;
224
225
  Call: go to review, or done).
225
226
 
226
- ## Permission Model Safe-by-Default
227
+ ## Permission Model - Safe-by-Default
227
228
 
228
229
  The agent MUST prefer non-destructive routes:
229
230
 
@@ -231,7 +232,7 @@ The agent MUST prefer non-destructive routes:
231
232
  |---|---|
232
233
  | Drop table | Rename to `_deprecated_<table>`, flag for cleanup |
233
234
  | Delete files | Move to `.archive/` or backup branch |
234
- | Alter column | Additive migration new column + backfill |
235
+ | Alter column | Additive migration - new column + backfill |
235
236
  | Remove feature | Feature flag off, code stays until human confirms |
236
237
  | Database migration | Backup before migration, keep rollback path |
237
238
 
@@ -246,7 +247,7 @@ With `--skip-permissions`, the agent logs the action in Insights but proceeds wi
246
247
 
247
248
  ### Greenfield Exception
248
249
 
249
- During initial project creation, all decisions are non-destructive by definition (there's nothing to destroy). The agent has full autonomy for greenfield choices DB engine, framework, gems, architecture.
250
+ During initial project creation, all decisions are non-destructive by definition (there's nothing to destroy). The agent has full autonomy for greenfield choices - DB engine, framework, gems, architecture.
250
251
 
251
252
  ## Completion
252
253
 
@@ -257,55 +258,38 @@ During initial project creation, all decisions are non-destructive by definition
257
258
  and End tail in PLASTIC.md `## Delivery Isolation and the Single-Owner Lock`).
258
259
  3. Write `## Outcome` summary in the intent file (1-2 sentences)
259
260
  4. **Release (if configured)**
260
- 1. Detect project match CWD against paths in `~/.plastic/projects.yml` to find the project slug. If no match, skip to step 5 (default commit-only behavior).
261
+ 1. Detect project - match CWD against paths in `~/.plastic/projects.yml` to find the project slug. If no match, skip to step 5 (default commit-only behavior).
261
262
  2. Read `~/.plastic/projects/{slug}/project.yml`. If the file doesn't exist or has no `release` key, skip to step 5.
262
263
  3. Based on `release.on_complete`:
263
- - `commit` git add + commit (same as default, proceed to step 5)
264
- - `commit_and_push` git add + commit + push
265
- - `manual` skip auto-commit, notify user: "Release configured as manual commit when ready."
264
+ - `commit` - git add + commit (same as default, proceed to step 5)
265
+ - `commit_and_push` - git add + commit + push
266
+ - `manual` - skip auto-commit, notify user: "Release configured as manual - commit when ready."
266
267
  4. If `release.verify` is set, run the verify command (e.g. `bundle exec rake test`):
267
268
  - **Exit 0 (green):** proceed to sub-step 5
268
269
  - **Non-zero (red):** check `release.on_red`:
269
- - `fix_and_retry` attempt to fix the failure, re-run verify (max 2 retries)
270
- - `stop` write `savepoint.md` with current state, notify user: "Verify failed savepoint written.", **STOP**
271
- - `manual` notify user: "Verify failed: [summary]. Resolve manually."
272
- 5. If `release.on_green` has items, invoke `plastic-releasing` to handle them (tag, changelog, publish, etc.). Do NOT duplicate release logic delegate entirely.
270
+ - `fix_and_retry` - attempt to fix the failure, re-run verify (max 2 retries)
271
+ - `stop` - write `savepoint.md` with current state, notify user: "Verify failed - savepoint written.", **STOP**
272
+ - `manual` - notify user: "Verify failed: [summary]. Resolve manually."
273
+ 5. If `release.on_green` has items, invoke `plastic-releasing` to handle them (tag, changelog, publish, etc.). Do NOT duplicate release logic - delegate entirely.
273
274
  5. Review `## Insights` for observations that should spawn future intents. If any:
274
- - Create them (using `plastic-creating-intent` conventions)
275
+ - Create them (using `plastic-intent-creating` conventions)
275
276
  - Update `chain` in the current intent's frontmatter
276
- 6. Move intent from `## Active` to `## Completed` in INDEX.md (with today's date). As the
277
- closing act of the transfer, stamp the terminal ledger bookend (intent 81) so the savepoint's
278
- last line records delivery:
277
+ 6. Run the mechanical close through `plastic-intent-ending`: it owns steps 1-6 of the Done
278
+ procedure (outcome/INDEX/savepoint/commit, disarm, and the QMD reindex last) as ONE
279
+ delegation, not five separate one-liners restated here. Run its backing script for the
280
+ outcome/INDEX/savepoint/commit core, passing `--index-note` with a rich Completed/
281
+ Abandoned entry description (mode/tier, what shipped or why abandoned, suite result):
279
282
  ```bash
280
- ruby -r ~/.plastic/scripts/lib/bridge -e 'Bridge.append_terminal_savepoint("<intent_dir>", "delivered")'
283
+ ruby ~/.plastic/scripts/end-intent --store <store_path> --id <ID> --disposition delivered \
284
+ --index-note "<mode, tier>; <what shipped>; <suite result>"
281
285
  ```
282
- (Use `"abandoned"` instead when the intent is being moved to `## Abandoned`.) Idempotent.
283
- 7. Auto-commit: `cd <store-root> && git add . && git commit -m "feat: deliver intent <ID> — <name>"`
284
- 8. Disarm the lifecycle gate (auto delivery is finished). Substitute the intent's own id for
285
- `<ID>` (a session can be delivering more than one intent at once, intent 131, so disarm must
286
- name which of the session's bridges to clear):
287
- ```bash
288
- ruby -r ~/.plastic/scripts/lib/bridge -e 'Bridge.disarm_auto(ENV["CLAUDE_CODE_SESSION_ID"], intent_id: "<ID>")'
289
- ```
290
- Disarm runs the ordered End tail (release worktrees, then clear the `delivery.lock`,
291
- then the bridge becomes purge-eligible) and performs the mandatory worktree cleanup
292
- (intent 73c3): both per-intent worktrees are removed and both repos pruned. This is
293
- the plain remove path (no merge); when the work ships through a release, the release
294
- path merges the branch BEFORE the worktree is removed instead of relying on this step.
295
- Never leave an orphaned worktree, and run `git worktree prune` if you hit a stale
296
- reference. For the full ordering rationale and the release-vs-plain-disarm
297
- distinction, read `references/end-tail.md`.
298
- 9. QMD reindex LAST (canonical End tail), run only after disarm has released the
299
- worktrees, cleared the `delivery.lock`, and purged the bridge. It runs in the
300
- background so it never blocks the turn:
301
- ```bash
302
- ruby ~/.plastic/scripts/qmd-sync reindex --store <store-root> --async
303
- ```
304
- `<store-root>` is the store that holds this intent (the global store or the project
305
- store); the command is a no-op when QMD is absent. For why the reindex must be last
306
- (so the index never references a bridge or lock about to disappear), read
307
- `references/end-tail.md`.
308
- 10. Notify user (Done briefing): brief per `references/human-report-contract.md`
286
+ (Use `--disposition abandoned` when the intent is being moved to `## Abandoned`.) Then
287
+ follow `plastic-intent-ending`'s Step 5 (disarm: `Bridge.disarm_auto` on this auto/curator
288
+ path, the plain-remove branch) and Step 6 (QMD reindex, async, last) exactly as that skill
289
+ states them. Never leave an orphaned worktree; run `git worktree prune` on a stale
290
+ reference. If any of this ever needs to change, change `plastic-intent-ending`, not this
291
+ skill.
292
+ 7. Notify user (Done briefing): brief per `references/human-report-contract.md`
309
293
  (State: the delivered impact; Risk: residual risk; Call: the decision left to you, merge,
310
294
  release, or accept). See `outcome.md` for details.
311
295
 
@@ -314,7 +298,7 @@ During initial project creation, all decisions are non-destructive by definition
314
298
  If the agent gets stuck (can't resolve a gap, dependency is missing, tests fail persistently):
315
299
  1. Log the blocker in `## Insights`
316
300
  2. Write `savepoint.md` with current state
317
- 3. Notify user: "Blocked on intent [ID] [name]: [description]. Savepoint written."
301
+ 3. Notify user: "Blocked on intent [ID] - [name]: [description]. Savepoint written."
318
302
  4. **STOP.** Do not attempt workarounds that could leave the project in a broken state.
319
303
 
320
304
  ## References
@@ -116,13 +116,13 @@
116
116
  "scope": "triggering",
117
117
  "set": "train",
118
118
  "prompt": "create a new intent for the dashboard idea",
119
- "expected_output": "Does NOT activate plastic-auto; activates plastic-creating-intent.",
119
+ "expected_output": "Does NOT activate plastic-auto; activates plastic-intent-creating.",
120
120
  "files": [],
121
121
  "assertions": [
122
122
  {
123
123
  "type": "code",
124
124
  "check": "router CHOICE != plastic-auto",
125
- "observed": "plastic-creating-intent",
125
+ "observed": "plastic-intent-creating",
126
126
  "result": "pass"
127
127
  }
128
128
  ]
@@ -132,13 +132,13 @@
132
132
  "scope": "triggering",
133
133
  "set": "validation",
134
134
  "prompt": "what's the status of my active intents?",
135
- "expected_output": "Does NOT activate plastic-auto; this is a read/continuing/managing-index query.",
135
+ "expected_output": "Does NOT activate plastic-auto; this is a read/intent-continuing/store-indexing query.",
136
136
  "files": [],
137
137
  "assertions": [
138
138
  {
139
139
  "type": "code",
140
140
  "check": "router CHOICE != plastic-auto",
141
- "observed": "plastic-managing-index",
141
+ "observed": "plastic-store-indexing",
142
142
  "result": "pass"
143
143
  }
144
144
  ]
@@ -101,7 +101,7 @@ verifies state itself.
101
101
  ### Delegation
102
102
 
103
103
  The roles are thin handoff contracts, not a spawning engine. Dispatch and review run
104
- by default through Plastic's own engine, `plastic-executing-plan` (implementer plus
104
+ by default through Plastic's own engine, `plastic-intent-executing` (implementer plus
105
105
  two-stage review, no external plugin). When `superpowers:subagent-driven-development`
106
106
  and `superpowers:dispatching-parallel-agents` are available, or the user asks for them,
107
107
  they delegate to those as an enhancement. The team model defines who hands what to whom
@@ -112,7 +112,7 @@ spawning.
112
112
 
113
113
  The default is always Plastic's native engine, so a user without superpowers still gets
114
114
  the full behavior. If the harness supports subagents but superpowers is absent, auto
115
- mode dispatches through `plastic-executing-plan`. If the harness has no subagent dispatch
115
+ mode dispatches through `plastic-intent-executing`. If the harness has no subagent dispatch
116
116
  at all, auto mode falls back to a single agent walking the full What, Why, How, Exec
117
117
  cycle itself. The enforcer's gate discipline still applies in every case.
118
118
 
@@ -47,6 +47,9 @@ Every role report, whatever the stage, carries these fields:
47
47
 
48
48
  ## Per-role payload
49
49
 
50
+ Multi-item payload fields (ordered actions, insights, checklist deltas) default to tables per
51
+ `PLASTIC.md` (## Tabular-First Reporting, intent 160); single fields stay prose.
52
+
50
53
  Each role appends a payload that fulfils its place in the What, Why, How, Exec cycle (decision
51
54
  D2). The payload is what makes the report useful to the orchestrator beyond the envelope.
52
55
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-dashboard
3
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.
4
+ user-invocable: false
4
5
  ---
5
6
 
6
7
  # Dashboard — Plastic Work Cockpit
@@ -18,7 +19,7 @@ state → byte-identical payload, regardless of model. Do NOT hand-summarize int
18
19
 
19
20
  - User invokes `/plastic-dashboard`
20
21
  - User asks "where are we", "what's next", "what should I work on", "show me the intents"
21
- - `plastic-continuing` lands on the board on resume
22
+ - `plastic-intent-continuing` lands on the board on resume
22
23
  - `plastic-auto` reads `--json` to choose the next dispatchable intent
23
24
 
24
25
  ## Procedure (the Markdown board — default human surface)
@@ -83,7 +84,7 @@ a no-op when QMD is absent, so fall back to the existing INDEX.md / file scan.
83
84
  The board lists everything; the user navigates by free prose (no capped picker):
84
85
  - On the **global** board, the user replies with an **intent id** (work it), a **project
85
86
  name** (re-run `project <slug> --data` and present that board), or **"new"** (start a new
86
- intent in global via `plastic-creating-intent`).
87
+ intent in global via `plastic-intent-creating`).
87
88
  - On a **project** board, the user replies with an **intent id**, or **"global"** to return.
88
89
 
89
90
  ## Auto-mode contract (`--json`)
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-doctor
3
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
4
5
  ---
5
6
 
6
7
  # Doctor: Plastic Health Check
@@ -12,7 +13,7 @@ Doctor has three scopes. Pick the right one for the situation:
12
13
  | Scope | Flag | When it runs | States |
13
14
  |-------|------|--------------|--------|
14
15
  | Core check | `--core` | SessionStart hook (automatic), also available on demand | Binary: pass or error |
15
- | Store check | `--store [global\|<slug>]` | Dashboard load, `plastic-continuing` | Three-state: pass / warn / fail |
16
+ | Store check | `--store [global\|<slug>]` | Dashboard load, `plastic-intent-continuing` | Three-state: pass / warn / fail |
16
17
  | Full check | (no flag) | After every update (automatic), or `/plastic-doctor` | Three-state: pass / warn / fail |
17
18
 
18
19
  ### `--core` (binary, manifest-backed)
@@ -117,9 +118,9 @@ Use the `fix_hint` value to determine the correct action:
117
118
  | "Add missing entries to INDEX.md" | Add orphaned intents to the appropriate INDEX.md section |
118
119
  | "Remove stale references from INDEX.md" | Edit INDEX.md to remove ghost references |
119
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 |
120
- | "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 |
121
122
  | "Re-run installer" | Run `npx -y @zalom/plastic@<channel> install --agent <agent>` (channel: -alpha->@alpha, -beta->@beta, else @latest) |
122
- | "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. |
123
124
 
124
125
  For fixes the agent cannot handle automatically, explain what the user needs
125
126
  to do manually. The `revisions.md` remedy is curator-applied (a move-and-record
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-humanizer
3
3
  description: Use to clean authored prose so it reads human and clutter-free. Removes AI tells and slop from a document, spec, outcome, README, report, or release note. Use when the user says "humanize", "de-slop", "remove the AI tells", or "clean up the wording". For documents, not for every chat reply, and not for code.
4
+ user-invocable: true
4
5
  ---
5
6
 
6
7
  # Humanizer
@@ -1,6 +1,7 @@
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 --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.'
4
+ user-invocable: true
4
5
  ---
5
6
 
6
7
  # Install Plastic