@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.
- package/PLASTIC-reference.md +11 -11
- package/PLASTIC.md +11 -9
- package/README.md +48 -1
- package/agents/plastic-enforcer.md +8 -5
- package/agents/plastic-future-intent-researcher.md +1 -1
- package/agents/plastic-intent-curator.md +9 -10
- package/agents/plastic-spec-specialist.md +9 -6
- package/bin/plastic.js +2 -2
- package/hooks/check-update +1 -1
- package/hooks/continue +1 -1
- package/package.json +1 -1
- package/scripts/dashboard.rb +29 -24
- package/scripts/doctor.rb +188 -9
- package/scripts/end-intent +330 -0
- package/scripts/hook-code-gate +1 -1
- package/scripts/hook-continue +2 -2
- package/scripts/hook-create-gate +2 -2
- package/scripts/hook-session-start +1 -1
- package/scripts/install.rb +2 -1
- package/scripts/lib/bridge.rb +116 -3
- package/scripts/lib/dashboard_banner.rb +8 -9
- package/scripts/lib/installer_core.rb +17 -8
- package/scripts/lib/legacy_bookend_amnesty.rb +35 -0
- package/scripts/lib/release_guard.rb +62 -0
- package/scripts/lib/roadmap_queue.rb +285 -0
- package/scripts/lib/roadmap_savepoint.rb +213 -0
- package/scripts/lib/store_provisioning.rb +1 -1
- package/scripts/lib/worktree.rb +21 -0
- package/scripts/new-intent +2 -1
- package/scripts/read-config +3 -3
- package/scripts/roadmap-next +44 -0
- package/scripts/roadmap-savepoint +64 -0
- package/scripts/{versions.rb → rollback.rb} +33 -41
- package/scripts/update.rb +1 -1
- package/skills/_active-intent-gate.md +1 -1
- package/skills/_decision-tables.md +50 -0
- package/skills/auto/SKILL.md +69 -68
- package/skills/auto/evals/evals.json +4 -4
- package/skills/auto/references/agent-architecture.md +2 -2
- package/skills/continuing/SKILL.md +23 -130
- package/skills/continuing/evals/evals.json +26 -80
- package/skills/dashboard/SKILL.md +18 -15
- package/skills/dashboard/references/classification.md +3 -3
- package/skills/dashboard/templates/dashboard-global.md +8 -23
- package/skills/dashboard/templates/dashboard-project.md +7 -26
- package/skills/doctor/SKILL.md +3 -3
- package/skills/install/SKILL.md +10 -10
- package/skills/{brainstorming → intent-brainstorming}/SKILL.md +43 -45
- package/skills/intent-brainstorming/evals/evals.json +67 -0
- package/skills/{brainstorming → intent-brainstorming}/references/design-principles.md +12 -17
- package/skills/intent-continuing/SKILL.md +99 -0
- package/skills/intent-continuing/evals/evals.json +145 -0
- package/skills/intent-continuing/references/context-management.md +28 -0
- package/skills/{creating-intent → intent-creating}/SKILL.md +3 -3
- package/skills/{creating-intent → intent-creating}/evals/evals.json +1 -1
- package/skills/{intent-discovery → intent-discovering}/SKILL.md +1 -1
- package/skills/intent-ending/SKILL.md +151 -0
- package/skills/intent-ending/evals/evals.json +74 -0
- package/skills/{executing-plan → intent-executing}/SKILL.md +75 -15
- package/skills/intent-executing/evals/evals.json +66 -0
- package/skills/{brainstorming-grill-me → intent-grilling}/SKILL.md +4 -4
- package/skills/{linking-intents → intent-linking}/SKILL.md +1 -1
- package/skills/{linking-intents → intent-linking}/evals/evals.json +1 -1
- package/skills/{lock → intent-locking}/SKILL.md +1 -1
- package/skills/{writing-plans → intent-planning}/SKILL.md +48 -20
- package/skills/intent-planning/evals/evals.json +66 -0
- package/skills/{writing-plans → intent-planning}/references/plan-format.md +31 -7
- package/skills/{research → intent-researching}/SKILL.md +2 -2
- package/skills/{research → intent-researching}/evals/evals.json +1 -1
- package/skills/{savepoint → intent-savepoint}/SKILL.md +13 -1
- package/skills/intent-speccing/SKILL.md +69 -0
- package/skills/intent-speccing/evals/evals.json +126 -0
- package/skills/intent-speccing/references/per-section-fill-rules.md +92 -0
- package/skills/intent-speccing/references/self-verify-checklist.md +38 -0
- package/skills/intent-starting/SKILL.md +2 -2
- package/skills/intent-starting/evals/evals.json +2 -2
- package/skills/project-continuing/SKILL.md +104 -0
- package/skills/project-continuing/evals/evals.json +100 -0
- package/skills/project-continuing/references/board-fill.md +33 -0
- package/skills/{creating-project → project-creating}/SKILL.md +2 -2
- package/skills/releasing/SKILL.md +66 -14
- package/skills/releasing/references/release-lines.md +105 -0
- package/skills/roadmap/SKILL.md +7 -1
- package/skills/roadmap/references/file-format.md +30 -1
- package/skills/roadmap/references/operations.md +26 -6
- package/skills/roadmap-continuing/SKILL.md +85 -0
- package/skills/roadmap-continuing/evals/evals.json +82 -0
- package/skills/roadmap-continuing/references/liveness-ranking.md +56 -0
- package/skills/{versions → rollback}/SKILL.md +30 -20
- package/skills/{creating-skills → skill-creating}/SKILL.md +2 -2
- package/skills/{creating-skills → skill-creating}/evals/evals.json +5 -5
- package/skills/{creating-skills → skill-creating}/references/progressive-disclosure.md +2 -2
- package/skills/{evaluating-skills → skill-evaluating}/SKILL.md +1 -1
- package/skills/{evaluating-skills → skill-evaluating}/evals/evals.json +3 -3
- package/skills/{intent-curator → store-curating}/SKILL.md +6 -7
- package/skills/{intent-curator → store-curating}/evals/evals.json +1 -1
- package/skills/{managing-index → store-indexing}/SKILL.md +6 -7
- package/skills/{managing-index → store-indexing}/evals/evals.json +1 -1
- package/skills/{add-project-store → store-provisioning}/SKILL.md +2 -2
- package/skills/tutorial/SKILL.md +65 -0
- package/skills/tutorial/evals/evals.json +186 -0
- package/skills/tutorial/references/track-1-guided.md +123 -0
- package/skills/tutorial/references/track-2-auto.md +95 -0
- package/skills/tutorial/references/track-3-projects-and-roadmaps.md +110 -0
- package/skills/uninstall/SKILL.md +2 -2
- package/skills/update/SKILL.md +3 -3
- package/templates/agents.md +7 -7
- package/templates/config.yml +2 -1
- package/templates/index.md +4 -1
- package/skills/brainstorming/evals/evals.json +0 -22
- package/skills/savepoint/references/context-management.md +0 -32
- /package/skills/{creating-intent → intent-creating}/references/lifecycle.md +0 -0
- /package/skills/{creating-intent → intent-creating}/references/wikilinks.md +0 -0
- /package/skills/{executing-plan → intent-executing}/code-quality-reviewer-prompt.md +0 -0
- /package/skills/{executing-plan → intent-executing}/implementer-prompt.md +0 -0
- /package/skills/{executing-plan → intent-executing}/spec-reviewer-prompt.md +0 -0
- /package/skills/{linking-intents → intent-linking}/references/zettelkasten.md +0 -0
- /package/skills/{continuing → intent-savepoint}/references/context-management.md +0 -0
- /package/skills/{creating-project → project-creating}/references/hubs-projects.md +0 -0
- /package/skills/{creating-project → project-creating}/references/project-scaffolding.md +0 -0
- /package/skills/{creating-skills → skill-creating}/references/agents.md +0 -0
- /package/skills/{creating-skills → skill-creating}/references/evals.md +0 -0
- /package/skills/{creating-skills → skill-creating}/references/hooks.md +0 -0
- /package/skills/{creating-skills → skill-creating}/references/scripts.md +0 -0
- /package/skills/{creating-skills → skill-creating}/references/skills.md +0 -0
- /package/skills/{creating-skills → skill-creating}/scripts/scaffold.rb +0 -0
- /package/skills/{evaluating-skills → skill-evaluating}/assets/eval-template.json +0 -0
- /package/skills/{evaluating-skills → skill-evaluating}/references/convention-checks.md +0 -0
- /package/skills/{evaluating-skills → skill-evaluating}/references/eval-methodology.md +0 -0
- /package/skills/{managing-index → store-indexing}/references/zettelkasten-linking.md +0 -0
package/skills/auto/SKILL.md
CHANGED
|
@@ -1,38 +1,54 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: plastic-auto
|
|
3
3
|
description: >-
|
|
4
|
-
Autonomous intent delivery
|
|
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
7
|
user-invocable: true
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
# Auto
|
|
10
|
+
# Auto - Autonomous Intent Delivery
|
|
11
11
|
|
|
12
|
-
Announce: "Taking over intent [ID]
|
|
12
|
+
Announce: "Taking over intent [ID] - [name] for autonomous delivery."
|
|
13
13
|
|
|
14
14
|
**Advisory (not a gate).** At auto-mode start, recommend once that the user run this
|
|
15
15
|
orchestrating main session on the best available thinking model (Fable, Opus, or whatever
|
|
16
16
|
supersedes them) for the sharpest gating and synthesis. This is advice only: it changes no
|
|
17
17
|
behavior and blocks nothing if ignored. It concerns the human's MAIN session; dispatched
|
|
18
|
-
subagents keep their pinned tier and never resolve to Fable
|
|
18
|
+
subagents keep their pinned tier and never resolve to Fable, unless an explicit
|
|
19
|
+
`agents.models.<name>` config override names Fable for that role, in which case the override
|
|
20
|
+
is honored as written.
|
|
19
21
|
|
|
20
22
|
## Precondition
|
|
21
23
|
|
|
22
|
-
An active intent MUST exist in INDEX.md. If none exists, refuse: "No active intent found. Create one first with /plastic-creating
|
|
24
|
+
An active intent MUST exist in INDEX.md. If none exists, refuse: "No active intent found. Create one first with /plastic-intent-creating."
|
|
23
25
|
|
|
24
26
|
If multiple active intents exist, ask the user which one to deliver (this is the only question auto asks).
|
|
25
27
|
|
|
26
28
|
**Picking work when no intent is specified.** If the user says "auto" without naming an
|
|
27
|
-
intent and none is active, consult the
|
|
28
|
-
|
|
29
|
+
intent and none is active, consult the roadmap first (the primary planning surface), then
|
|
30
|
+
fall back to the dashboard queue. Read the tier's mid-flight roadmap:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
ruby ~/.plastic/scripts/roadmap-next --roadmaps-dir <tier>/roadmaps
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Branch on `state`:
|
|
37
|
+
- `dispatchable`: work its `dispatchable_queue` in `rank` order (the head is the next batch
|
|
38
|
+
entry). These are the current batch's `queued` intents, parallel-safe within the wave.
|
|
39
|
+
- `in_flight`: the frontier batch is still delivering. Report it and wait. Do NOT dispatch a
|
|
40
|
+
later batch and do NOT fall through to the dashboard, the roadmap is live.
|
|
41
|
+
- `none` or `exhausted`: no roadmap, or nothing left to dispatch. Fall back to the dashboard
|
|
42
|
+
queue below. (The global store has no roadmap, so it always reports `none` and falls back.)
|
|
43
|
+
|
|
44
|
+
Dashboard fallback:
|
|
29
45
|
|
|
30
46
|
```bash
|
|
31
47
|
ruby ~/.plastic/scripts/dashboard.rb all --json
|
|
32
48
|
```
|
|
33
49
|
|
|
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
|
|
50
|
+
Work `dispatchable_queue` in `rank` order (these are `defer`/`research` dispositions -
|
|
51
|
+
safe to deliver autonomously). Leave `human_only` and `next_big_thing` for the user - those
|
|
36
52
|
are `drive`/`triage` items the human should lead. See the `plastic-dashboard` skill.
|
|
37
53
|
|
|
38
54
|
QMD-first (when available): when the user describes the work to deliver rather than naming an
|
|
@@ -65,7 +81,7 @@ and artifact depth to that size. Extended walkthrough: `references/tiers.md`.
|
|
|
65
81
|
|
|
66
82
|
## Arm the Lifecycle Gate (do this FIRST)
|
|
67
83
|
|
|
68
|
-
Immediately after selecting the intent
|
|
84
|
+
Immediately after selecting the intent - before any other work - arm auto mode. This
|
|
69
85
|
writes the session bridge that makes the code-edit gate live, so project code cannot be
|
|
70
86
|
edited before the plan exists (the gate applies to YOU, the orchestrator):
|
|
71
87
|
|
|
@@ -88,7 +104,7 @@ Honor the cycle: What → Why (spec.md) → How (plan.md + actions/ + checklist.
|
|
|
88
104
|
|
|
89
105
|
## Flags
|
|
90
106
|
|
|
91
|
-
- `--skip-permissions`
|
|
107
|
+
- `--skip-permissions` - bypass hard stops on destructive actions on existing projects. Full trust mode. Default: off.
|
|
92
108
|
|
|
93
109
|
## Team Spin-Up
|
|
94
110
|
|
|
@@ -104,11 +120,13 @@ Roster (one role per cycle stage):
|
|
|
104
120
|
- **plastic-executor** (code + checklist + `## Insights`)
|
|
105
121
|
- **plastic-enforcer** (orchestrates + gates; that is YOU)
|
|
106
122
|
|
|
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-executing
|
|
123
|
+
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.
|
|
108
124
|
|
|
109
125
|
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`).
|
|
110
126
|
|
|
111
|
-
Dispatch-time model contract (belt-and-braces): alongside the preamble, resolve each specialist's model through the config chain (`read-config agents.models.<basename> --project <repo>`: project override, then global, then the shipped tier default) and pass it explicitly at dispatch. Never rely on the dispatched role's frontmatter alone; a resolved subagent model is never Fable
|
|
127
|
+
Dispatch-time model contract (belt-and-braces): alongside the preamble, resolve each specialist's model through the config chain (`read-config agents.models.<basename> --project <repo>`: project override, then global, then the shipped tier default) and pass it explicitly at dispatch. Never rely on the dispatched role's frontmatter alone; a resolved subagent model is never Fable,
|
|
128
|
+
unless an explicit `agents.models.<name>` config override names Fable for that role, in which
|
|
129
|
+
case the override is honored as written.
|
|
112
130
|
|
|
113
131
|
Completion report (require-then-synthesize): every dispatched specialist MUST end with a structured completion report as its final message. The preamble's `REPORT_CONTRACT` injects this and the role prompts carry the per-role format (see `references/agent-report-contract.md`). Because child-agent honor is best-effort across harnesses, this is decision-shaping, not a hard block. When a specialist returns no usable report (it went idle, emitted only a bare ping, or its message was lost to a mid-run interjection), run `scripts/agent-report <intent_dir> --role <role>` to synthesize a deterministic filesystem-derived report so the handoff account always exists. Use the agent-authored report when present, the synthesized one otherwise.
|
|
114
132
|
|
|
@@ -168,15 +186,15 @@ this is worth doing, or proceed).
|
|
|
168
186
|
When entering at Why stage:
|
|
169
187
|
|
|
170
188
|
1. Read existing `## Context` and `### Decisions` from the intent file
|
|
171
|
-
2. Assess gaps
|
|
172
|
-
3. Self-directed research
|
|
173
|
-
4. Adaptive budget
|
|
189
|
+
2. Assess gaps - what decisions are missing? What context is incomplete?
|
|
190
|
+
3. Self-directed research - read code, search docs, explore related intents (via wikilinks in `## Links`), web search if needed. NO questions to human.
|
|
191
|
+
4. Adaptive budget - assess complexity and set your own research budget:
|
|
174
192
|
- Simple (config change, small feature): 2-3 research steps
|
|
175
193
|
- Medium (new feature, integration): 5-8 research steps
|
|
176
194
|
- Complex (new project, architecture): 10-15 research steps
|
|
177
|
-
5. Make decisions
|
|
195
|
+
5. Make decisions - pick best option, document in `## Context > ### Decisions` with rationale
|
|
178
196
|
6. Log all autonomous decisions in `## Insights` with `(autonomous)` marker: "Decision: chose X because Y (autonomous)"
|
|
179
|
-
7. Write `spec.md`
|
|
197
|
+
7. Write `spec.md` - consolidated specification
|
|
180
198
|
8. Notify user (Why briefing): brief per `references/human-report-contract.md`
|
|
181
199
|
(State: the approach chosen, one line; Risk: the main trade-off; Call: the one decision
|
|
182
200
|
needed, approve or pick an option).
|
|
@@ -191,9 +209,9 @@ intent birth and persists at every tier; only writing `ACTION_N.md` files into i
|
|
|
191
209
|
only (S/M leave the directory empty).
|
|
192
210
|
|
|
193
211
|
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/`).
|
|
194
|
-
2. Otherwise, write `plan.md` directly
|
|
195
|
-
3. Write `ACTION_N.md` files into the existing `actions/` directory (one per task, self-contained)
|
|
196
|
-
4. Write `checklist.md`
|
|
212
|
+
2. Otherwise, write `plan.md` directly - implementation plan with numbered tasks
|
|
213
|
+
3. Write `ACTION_N.md` files into the existing `actions/` directory (one per task, self-contained) - L only
|
|
214
|
+
4. Write `checklist.md` - execution registry with checkboxes covering all actions
|
|
197
215
|
5. Notify user (How briefing): brief per `references/human-report-contract.md`
|
|
198
216
|
(State: the plan shape, task count and what it builds; Risk: the riskiest task or
|
|
199
217
|
dependency; Call: approve the plan to build).
|
|
@@ -205,9 +223,9 @@ Then proceed to Exec.
|
|
|
205
223
|
If the plan calls for creating a new project (the intent is an implementation intent that needs a new codebase):
|
|
206
224
|
|
|
207
225
|
1. Determine project path from `~/.plastic/config.yml` `project_roots` or from intent context
|
|
208
|
-
2. **Confirm path with user**
|
|
226
|
+
2. **Confirm path with user** - this is the ONE human interaction during auto delivery:
|
|
209
227
|
> "Creating project `<slug>` at `<path>`. Confirm path, or provide alternative."
|
|
210
|
-
3. Invoke `plastic-creating
|
|
228
|
+
3. Invoke `plastic-project-creating` skill
|
|
211
229
|
4. The global intent is now Completed (creating-project handles this)
|
|
212
230
|
5. The tactical mirror in the project store becomes the active intent
|
|
213
231
|
6. Continue execution from the project directory using the tactical intent
|
|
@@ -215,7 +233,7 @@ If the plan calls for creating a new project (the intent is an implementation in
|
|
|
215
233
|
## Exec Phase
|
|
216
234
|
|
|
217
235
|
1. If `superpowers:subagent-driven-development` or `superpowers:executing-plans` is available, delegate execution to it
|
|
218
|
-
2. Otherwise invoke `plastic-executing
|
|
236
|
+
2. Otherwise invoke `plastic-intent-executing`
|
|
219
237
|
3. Execute actions from checklist sequentially
|
|
220
238
|
4. Check off items in `checklist.md` as completed
|
|
221
239
|
5. Append observations to `## Insights` with `(autonomous)` marker
|
|
@@ -224,7 +242,7 @@ If the plan calls for creating a new project (the intent is an implementation in
|
|
|
224
242
|
(State: what got built and the test result; Risk: residual failures or deviations;
|
|
225
243
|
Call: go to review, or done).
|
|
226
244
|
|
|
227
|
-
## Permission Model
|
|
245
|
+
## Permission Model - Safe-by-Default
|
|
228
246
|
|
|
229
247
|
The agent MUST prefer non-destructive routes:
|
|
230
248
|
|
|
@@ -232,7 +250,7 @@ The agent MUST prefer non-destructive routes:
|
|
|
232
250
|
|---|---|
|
|
233
251
|
| Drop table | Rename to `_deprecated_<table>`, flag for cleanup |
|
|
234
252
|
| Delete files | Move to `.archive/` or backup branch |
|
|
235
|
-
| Alter column | Additive migration
|
|
253
|
+
| Alter column | Additive migration - new column + backfill |
|
|
236
254
|
| Remove feature | Feature flag off, code stays until human confirms |
|
|
237
255
|
| Database migration | Backup before migration, keep rollback path |
|
|
238
256
|
|
|
@@ -247,7 +265,7 @@ With `--skip-permissions`, the agent logs the action in Insights but proceeds wi
|
|
|
247
265
|
|
|
248
266
|
### Greenfield Exception
|
|
249
267
|
|
|
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
|
|
268
|
+
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.
|
|
251
269
|
|
|
252
270
|
## Completion
|
|
253
271
|
|
|
@@ -258,55 +276,38 @@ During initial project creation, all decisions are non-destructive by definition
|
|
|
258
276
|
and End tail in PLASTIC.md `## Delivery Isolation and the Single-Owner Lock`).
|
|
259
277
|
3. Write `## Outcome` summary in the intent file (1-2 sentences)
|
|
260
278
|
4. **Release (if configured)**
|
|
261
|
-
1. Detect project
|
|
279
|
+
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).
|
|
262
280
|
2. Read `~/.plastic/projects/{slug}/project.yml`. If the file doesn't exist or has no `release` key, skip to step 5.
|
|
263
281
|
3. Based on `release.on_complete`:
|
|
264
|
-
- `commit`
|
|
265
|
-
- `commit_and_push`
|
|
266
|
-
- `manual`
|
|
282
|
+
- `commit` - git add + commit (same as default, proceed to step 5)
|
|
283
|
+
- `commit_and_push` - git add + commit + push
|
|
284
|
+
- `manual` - skip auto-commit, notify user: "Release configured as manual - commit when ready."
|
|
267
285
|
4. If `release.verify` is set, run the verify command (e.g. `bundle exec rake test`):
|
|
268
286
|
- **Exit 0 (green):** proceed to sub-step 5
|
|
269
287
|
- **Non-zero (red):** check `release.on_red`:
|
|
270
|
-
- `fix_and_retry`
|
|
271
|
-
- `stop`
|
|
272
|
-
- `manual`
|
|
273
|
-
5. If `release.on_green` has items, invoke `plastic-releasing` to handle them (tag, changelog, publish, etc.). Do NOT duplicate release logic
|
|
288
|
+
- `fix_and_retry` - attempt to fix the failure, re-run verify (max 2 retries)
|
|
289
|
+
- `stop` - write `savepoint.md` with current state, notify user: "Verify failed - savepoint written.", **STOP**
|
|
290
|
+
- `manual` - notify user: "Verify failed: [summary]. Resolve manually."
|
|
291
|
+
5. If `release.on_green` has items, invoke `plastic-releasing` to handle them (tag, changelog, publish, etc.). Do NOT duplicate release logic - delegate entirely.
|
|
274
292
|
5. Review `## Insights` for observations that should spawn future intents. If any:
|
|
275
|
-
- Create them (using `plastic-creating
|
|
293
|
+
- Create them (using `plastic-intent-creating` conventions)
|
|
276
294
|
- Update `chain` in the current intent's frontmatter
|
|
277
|
-
6.
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
```
|
|
283
|
-
(Use `"abandoned"` instead when the intent is being moved to `## Abandoned`.) Idempotent.
|
|
284
|
-
7. Auto-commit: `cd <store-root> && git add . && git commit -m "feat: deliver intent <ID> — <name>"`
|
|
285
|
-
8. Disarm the lifecycle gate (auto delivery is finished). Substitute the intent's own id for
|
|
286
|
-
`<ID>` (a session can be delivering more than one intent at once, intent 131, so disarm must
|
|
287
|
-
name which of the session's bridges to clear):
|
|
288
|
-
```bash
|
|
289
|
-
ruby -r ~/.plastic/scripts/lib/bridge -e 'Bridge.disarm_auto(ENV["CLAUDE_CODE_SESSION_ID"], intent_id: "<ID>")'
|
|
290
|
-
```
|
|
291
|
-
Disarm runs the ordered End tail (release worktrees, then clear the `delivery.lock`,
|
|
292
|
-
then the bridge becomes purge-eligible) and performs the mandatory worktree cleanup
|
|
293
|
-
(intent 73c3): both per-intent worktrees are removed and both repos pruned. This is
|
|
294
|
-
the plain remove path (no merge); when the work ships through a release, the release
|
|
295
|
-
path merges the branch BEFORE the worktree is removed instead of relying on this step.
|
|
296
|
-
Never leave an orphaned worktree, and run `git worktree prune` if you hit a stale
|
|
297
|
-
reference. For the full ordering rationale and the release-vs-plain-disarm
|
|
298
|
-
distinction, read `references/end-tail.md`.
|
|
299
|
-
9. QMD reindex LAST (canonical End tail), run only after disarm has released the
|
|
300
|
-
worktrees, cleared the `delivery.lock`, and purged the bridge. It runs in the
|
|
301
|
-
background so it never blocks the turn:
|
|
295
|
+
6. Run the mechanical close through `plastic-intent-ending`: it owns steps 1-6 of the Done
|
|
296
|
+
procedure (outcome/INDEX/savepoint/commit, disarm, and the QMD reindex last) as ONE
|
|
297
|
+
delegation, not five separate one-liners restated here. Run its backing script for the
|
|
298
|
+
outcome/INDEX/savepoint/commit core, passing `--index-note` with a rich Completed/
|
|
299
|
+
Abandoned entry description (mode/tier, what shipped or why abandoned, suite result):
|
|
302
300
|
```bash
|
|
303
|
-
ruby ~/.plastic/scripts/
|
|
301
|
+
ruby ~/.plastic/scripts/end-intent --store <store_path> --id <ID> --disposition delivered \
|
|
302
|
+
--index-note "<mode, tier>; <what shipped>; <suite result>"
|
|
304
303
|
```
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
`
|
|
309
|
-
|
|
304
|
+
(Use `--disposition abandoned` when the intent is being moved to `## Abandoned`.) Then
|
|
305
|
+
follow `plastic-intent-ending`'s Step 5 (disarm: `Bridge.disarm_auto` on this auto/curator
|
|
306
|
+
path, the plain-remove branch) and Step 6 (QMD reindex, async, last) exactly as that skill
|
|
307
|
+
states them. Never leave an orphaned worktree; run `git worktree prune` on a stale
|
|
308
|
+
reference. If any of this ever needs to change, change `plastic-intent-ending`, not this
|
|
309
|
+
skill.
|
|
310
|
+
7. Notify user (Done briefing): brief per `references/human-report-contract.md`
|
|
310
311
|
(State: the delivered impact; Risk: residual risk; Call: the decision left to you, merge,
|
|
311
312
|
release, or accept). See `outcome.md` for details.
|
|
312
313
|
|
|
@@ -315,7 +316,7 @@ During initial project creation, all decisions are non-destructive by definition
|
|
|
315
316
|
If the agent gets stuck (can't resolve a gap, dependency is missing, tests fail persistently):
|
|
316
317
|
1. Log the blocker in `## Insights`
|
|
317
318
|
2. Write `savepoint.md` with current state
|
|
318
|
-
3. Notify user: "Blocked on intent [ID]
|
|
319
|
+
3. Notify user: "Blocked on intent [ID] - [name]: [description]. Savepoint written."
|
|
319
320
|
4. **STOP.** Do not attempt workarounds that could leave the project in a broken state.
|
|
320
321
|
|
|
321
322
|
## 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
|
|
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
|
|
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/
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
|
@@ -1,141 +1,34 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: plastic-continuing
|
|
3
|
-
description:
|
|
3
|
+
description: >-
|
|
4
|
+
Use when the user says "continue", "resume", or "pick up where we left off", starts a new
|
|
5
|
+
session and wants to keep going, asks "what should I work on", or asks a where-was-I question
|
|
6
|
+
that never says "continue" (for example "where was I"). This is the front door for resuming
|
|
7
|
+
work: it dispatches to plastic-intent-continuing (a specific intent named to resume),
|
|
8
|
+
plastic-project-continuing (the default, general board landing), or
|
|
9
|
+
plastic-roadmap-continuing (a roadmap or delivery batch named to resume).
|
|
4
10
|
user-invocable: true
|
|
5
11
|
---
|
|
6
12
|
|
|
7
|
-
# Continuing
|
|
13
|
+
# Continuing - the front door
|
|
8
14
|
|
|
9
|
-
`plastic-continuing`
|
|
10
|
-
|
|
11
|
-
|
|
15
|
+
`plastic-continuing` is the front door for resuming work (ruling 96: continuing routes,
|
|
16
|
+
starting does the lock plus resume plus work). It routes to exactly one of three skills and
|
|
17
|
+
does nothing else: no ledger-resume, no dashboard render, no roadmap read happens here.
|
|
12
18
|
|
|
13
|
-
|
|
14
|
-
every session start: it runs the core health check (`doctor --core`), primes `PLASTIC.md` +
|
|
15
|
-
store/project state, and prints the `Plastic Core loaded — v{version}` banner. The
|
|
16
|
-
`plastic-statusline` hook sets the statusline. So by the time this skill runs, core is loaded
|
|
17
|
-
and healthy (or the banner already warned otherwise). This skill picks up from there and
|
|
18
|
-
continues work. This is the seam future continue-flags build on (see [[39]]).
|
|
19
|
+
## Route
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
| Args / context | Route to |
|
|
22
|
+
|---|---|
|
|
23
|
+
| `--intent {id}`, or the user names one specific intent (by id or description) to resume | `plastic-intent-continuing` (intent route) |
|
|
24
|
+
| `--roadmap {slug}`, or the user asks to continue/resume a roadmap or delivery batch | `plastic-roadmap-continuing` (roadmap route) |
|
|
25
|
+
| bare "continue" / "resume" / no further target (default) | `plastic-project-continuing` (project route) |
|
|
24
26
|
|
|
25
|
-
##
|
|
27
|
+
## Announce, then hand off
|
|
26
28
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
The SessionStart hook already detects this; here you only need the slug to scope the
|
|
31
|
-
dashboard.
|
|
32
|
-
3. If neither exists → announce "No Plastic store found. Run /plastic-install."
|
|
29
|
+
State the chosen route in one line before delegating (this is the router's own "present state
|
|
30
|
+
before any ask" - the router asks nothing itself). Example: "Routing to the project board (no
|
|
31
|
+
specific intent or roadmap named)."
|
|
33
32
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
Land on the Markdown board via the `plastic-dashboard` skill. Rendering belongs there, not
|
|
37
|
-
here — run the data payload and fill + present the matching template:
|
|
38
|
-
- Project loaded → `ruby ~/.plastic/scripts/dashboard.rb project <slug> --data`
|
|
39
|
-
- Otherwise → `ruby ~/.plastic/scripts/dashboard.rb continue --data`
|
|
40
|
-
|
|
41
|
-
Fill the matching template from this skill's `templates/` and **present the filled Markdown
|
|
42
|
-
in your reply** (every time, non-optional). If the reply does not contain the filled Markdown,
|
|
43
|
-
the user sees nothing — tool-call stdout and hook `additionalContext` are both invisible to
|
|
44
|
-
them. `hook-continue` also emits a one-line `systemMessage` summary as a hook-owned fallback;
|
|
45
|
-
treat it as a floor only, never as a substitute for presenting the full board here. See
|
|
46
|
-
`plastic-dashboard` for the fill rules and entry flow.
|
|
47
|
-
|
|
48
|
-
The board load runs the scoped store check on every load (`doctor --store <scope>`): the
|
|
49
|
-
global board runs `--store global` and a project board runs `--store <slug>`. The result
|
|
50
|
-
arrives in the payload as `store_health`; surface it as a one-line store-health note. It is
|
|
51
|
-
non-fatal (a warn or fail is shown as data, it does not block continuing).
|
|
52
|
-
|
|
53
|
-
### Then stop
|
|
54
|
-
Present "here is the state, what next?" and wait. Offer active intents first, then future
|
|
55
|
-
intents. Do not start executing work. The branches below are the only follow-ups:
|
|
56
|
-
- User/agent names a specific intent to continue → **Conditional ledger-resume** (below).
|
|
57
|
-
- User says "auto" / an agent is instructed to deliver → hand to `plastic-auto`.
|
|
58
|
-
|
|
59
|
-
## Conditional Ledger-Resume
|
|
60
|
-
|
|
61
|
-
Fires ONLY when the user explicitly asks to continue a SPECIFIC intent, or an agent is
|
|
62
|
-
instructed to continue one. It is not part of every boot.
|
|
63
|
-
|
|
64
|
-
QMD-first (when available): when the user names the intent by description rather than id, before
|
|
65
|
-
scanning the store with grep/Read run `ruby ~/.plastic/scripts/qmd-sync search "<terms>"` to
|
|
66
|
-
surface the candidate intent, then open the authoritative intent file for the hit you resume. The
|
|
67
|
-
command is a no-op when QMD is absent, so fall back to the existing INDEX.md / file scan.
|
|
68
|
-
|
|
69
|
-
For that intent's directory:
|
|
70
|
-
|
|
71
|
-
1. **Read `savepoint.md` FIRST (intent 81).** It is a deterministic, append-only ledger
|
|
72
|
-
(one line per event, newest at the bottom): `{utc-iso8601} {Stage} {milestone}`. Classify
|
|
73
|
-
the state from the **last line** alone, then verify ONLY that line's artifact. The bookends
|
|
74
|
-
are fixed: first line `What created`, last line either a cycle position or
|
|
75
|
-
`Done delivered|abandoned`.
|
|
76
|
-
|
|
77
|
-
| Last line | State | Verify only |
|
|
78
|
-
|---|---|---|
|
|
79
|
-
| `What {id}--{slug}.md` | born / parked | intent file exists |
|
|
80
|
-
| `Why started` | Why entered, no spec yet | spec.md not yet real; continue Why |
|
|
81
|
-
| `Why spec.md created` | Why done | spec.md present; continue to How |
|
|
82
|
-
| `How started` / `How plan.md created` | How in progress | plan.md; continue How |
|
|
83
|
-
| `How checklist.md created` / `Exec started` | ready for / in Exec | plan.md + checklist.md present; continue Exec |
|
|
84
|
-
| `Exec outcome.md created` | Exec done | outcome.md present; ready to complete |
|
|
85
|
-
| `Done delivered` / `Done abandoned` | terminal | do NOT cycle-resume; INDEX is authoritative |
|
|
86
|
-
|
|
87
|
-
2. **Verify the stage file.** Confirm only the last line's artifact exists and is non-empty
|
|
88
|
-
(ledger `How plan.md created` → `plan.md` must be present and non-empty). Do not re-probe
|
|
89
|
-
every lifecycle file.
|
|
90
|
-
3. **Drift handling.** If the ledger's last line disagrees with files-on-disk, rebuild the
|
|
91
|
-
ledger from filesystem state and note the correction. A rebuilt ledger is the file-landing
|
|
92
|
-
skeleton (no `started`/`Done` lines), which still pins cycle position:
|
|
93
|
-
```bash
|
|
94
|
-
ruby -r ~/.plastic/scripts/lib/bridge -e 'Bridge.rebuild_savepoint("<intent_dir>")'
|
|
95
|
-
```
|
|
96
|
-
4. **Derive the next step:**
|
|
97
|
-
- First unchecked item in `checklist.md` if it exists, else
|
|
98
|
-
- "advance to the next lifecycle stage" (e.g. ledger shows Why/spec.md → next is How).
|
|
99
|
-
- The newest `## Insights` entry supplies human-readable context (Insights are
|
|
100
|
-
append-only, newest at the bottom).
|
|
101
|
-
5. **Announce and stop:**
|
|
102
|
-
```
|
|
103
|
-
Resuming intent [ID] — [name]
|
|
104
|
-
Store: [global | project:<slug> | local]
|
|
105
|
-
Stage: [from ledger last line]
|
|
106
|
-
Next step: [first unchecked checklist item | advance to <stage>]
|
|
107
|
-
Context: [newest ## Insights entry]
|
|
108
|
-
Drift: [none | ledger rebuilt from filesystem]
|
|
109
|
-
```
|
|
110
|
-
Then proceed with the next step. Autonomy is `plastic-auto`'s job — if the intent's
|
|
111
|
-
`## Insights` contains `(autonomous)` entries, it was being delivered autonomously; hand
|
|
112
|
-
to `plastic-auto` to continue from the current stage.
|
|
113
|
-
|
|
114
|
-
## Priority Order
|
|
115
|
-
|
|
116
|
-
1. **Active intents first** — surface work in progress.
|
|
117
|
-
2. **Project context** — if in a registered project, show governing + tactical intents.
|
|
118
|
-
3. **Stale future intents** — surface for triage (see below).
|
|
119
|
-
4. **Fresh future intents** — offer as next work.
|
|
120
|
-
|
|
121
|
-
## Stale Future Intents
|
|
122
|
-
|
|
123
|
-
If a future intent's `created` date is older than the configured `stale_threshold_days`
|
|
124
|
-
(default 3), surface it for triage without taking action:
|
|
125
|
-
|
|
126
|
-
```
|
|
127
|
-
Stale future intents (no action taken):
|
|
128
|
-
|
|
129
|
-
- [ID — name] (X days old)
|
|
130
|
-
a) Activate — start working on it now
|
|
131
|
-
b) Abandon — mark as abandoned
|
|
132
|
-
c) Defer to agent: implement | research | ideate
|
|
133
|
-
d) Auto — go fully autonomous (invokes plastic-auto)
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
When the user activates a future intent, move it to `## Active` in INDEX.md and auto-commit.
|
|
137
|
-
|
|
138
|
-
## References
|
|
139
|
-
|
|
140
|
-
- Read `references/context-management.md` for the full save/continue protocol and for
|
|
141
|
-
debugging the resume flow.
|
|
33
|
+
Then hand off to the chosen skill. Do not inline any of the routed skill's own work here -
|
|
34
|
+
that belongs to the routes.
|