@zalom/plastic 2.0.0-alpha.27 → 2.0.0-alpha.29

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 (207) hide show
  1. package/PLASTIC.md +13 -139
  2. package/README.md +345 -133
  3. package/agents/plastic-enforcer.md +9 -10
  4. package/agents/plastic-executor.md +1 -1
  5. package/bin/crap +4 -0
  6. package/bin/lib/context_budget.rb +35 -1
  7. package/bin/lib/skill_census.rb +839 -0
  8. package/bin/plastic +6 -0
  9. package/bin/plastic-skill-census +114 -0
  10. package/bin/verify-change +345 -0
  11. package/deprecations.yml +1 -1
  12. package/{skills/agent-advisor/references → docs/help}/advisor-protocol.md +4 -7
  13. package/{skills/auto/references → docs/help}/agent-architecture.md +7 -7
  14. package/{skills/conventions/references → docs/help}/completion-and-done.md +1 -1
  15. package/{skills/auto/references → docs/help}/human-report-contract.md +17 -19
  16. package/{skills/conventions/references → docs/help}/roadmaps.md +2 -2
  17. package/{skills/tutorial/references → docs/help}/track-1-guided.md +8 -8
  18. package/{skills/tutorial/references → docs/help}/track-2-auto.md +5 -5
  19. package/{skills/tutorial/references → docs/help}/track-3-projects-and-roadmaps.md +24 -17
  20. package/package.json +3 -2
  21. package/scripts/append-ledger +2 -1
  22. package/scripts/dashboard.rb +10 -9
  23. package/scripts/day-summary +2 -1
  24. package/scripts/doctor.rb +48 -42
  25. package/scripts/end-intent +2 -8
  26. package/scripts/file-session-intent +2 -1
  27. package/scripts/hook-capture +4 -3
  28. package/scripts/hook-close +2 -1
  29. package/scripts/hook-record +3 -2
  30. package/scripts/hook-savepoint +3 -2
  31. package/scripts/hook-session-start +5 -4
  32. package/scripts/hook-stop +2 -1
  33. package/scripts/insight-append +1 -2
  34. package/scripts/install.rb +3 -1
  35. package/scripts/lib/active_delivery.rb +1 -1
  36. package/scripts/lib/arm.rb +2 -1
  37. package/scripts/lib/backup.rb +65 -0
  38. package/scripts/lib/cli/command.rb +85 -0
  39. package/scripts/lib/cli/commands/auto.rb +18 -0
  40. package/scripts/lib/cli/commands/auto_brief.rb +44 -0
  41. package/scripts/lib/cli/commands/auto_lock.rb +60 -0
  42. package/scripts/lib/cli/commands/auto_report.rb +50 -0
  43. package/scripts/lib/cli/commands/auto_take.rb +25 -0
  44. package/scripts/lib/cli/commands/backup.rb +43 -0
  45. package/scripts/lib/cli/commands/checkout.rb +25 -0
  46. package/scripts/lib/cli/commands/continue.rb +66 -0
  47. package/scripts/lib/cli/commands/doctor.rb +20 -0
  48. package/scripts/lib/cli/commands/feedback.rb +40 -0
  49. package/scripts/lib/cli/commands/help.rb +69 -0
  50. package/scripts/lib/cli/commands/hook.rb +32 -0
  51. package/scripts/lib/cli/commands/index.rb +23 -0
  52. package/scripts/lib/cli/commands/install.rb +21 -0
  53. package/scripts/lib/cli/commands/installer_verb.rb +37 -0
  54. package/scripts/lib/cli/commands/intent.rb +19 -0
  55. package/scripts/lib/cli/commands/intent_answer.rb +37 -0
  56. package/scripts/lib/cli/commands/intent_command.rb +53 -0
  57. package/scripts/lib/cli/commands/intent_end.rb +61 -0
  58. package/scripts/lib/cli/commands/intent_new.rb +62 -0
  59. package/scripts/lib/cli/commands/intent_note.rb +43 -0
  60. package/scripts/lib/cli/commands/intent_rule.rb +36 -0
  61. package/scripts/lib/cli/commands/intent_show.rb +25 -0
  62. package/scripts/lib/cli/commands/intent_spec.rb +44 -0
  63. package/scripts/lib/cli/commands/intent_step.rb +43 -0
  64. package/scripts/lib/cli/commands/intent_verify.rb +26 -0
  65. package/scripts/lib/cli/commands/migrate.rb +16 -0
  66. package/scripts/lib/cli/commands/migrate_stores.rb +31 -0
  67. package/scripts/lib/cli/commands/next.rb +49 -0
  68. package/scripts/lib/cli/commands/project.rb +19 -0
  69. package/scripts/lib/cli/commands/project_links.rb +42 -0
  70. package/scripts/lib/cli/commands/project_list.rb +20 -0
  71. package/scripts/lib/cli/commands/project_new.rb +72 -0
  72. package/scripts/lib/cli/commands/query.rb +31 -0
  73. package/scripts/lib/cli/commands/render.rb +25 -0
  74. package/scripts/lib/cli/commands/roadmap.rb +19 -0
  75. package/scripts/lib/cli/commands/roadmap_check.rb +44 -0
  76. package/scripts/lib/cli/commands/roadmap_log.rb +54 -0
  77. package/scripts/lib/cli/commands/roadmap_next.rb +34 -0
  78. package/scripts/lib/cli/commands/roadmap_show.rb +45 -0
  79. package/scripts/lib/cli/commands/rollback.rb +20 -0
  80. package/scripts/lib/cli/commands/search.rb +60 -0
  81. package/scripts/lib/cli/commands/session.rb +18 -0
  82. package/scripts/lib/cli/commands/session_commit.rb +42 -0
  83. package/scripts/lib/cli/commands/session_handoff.rb +34 -0
  84. package/scripts/lib/cli/commands/session_summary.rb +35 -0
  85. package/scripts/lib/cli/commands/status.rb +68 -0
  86. package/scripts/lib/cli/commands/subcommand_list.rb +36 -0
  87. package/scripts/lib/cli/commands/sync.rb +46 -0
  88. package/scripts/lib/cli/commands/uninstall.rb +20 -0
  89. package/scripts/lib/cli/commands/update.rb +20 -0
  90. package/scripts/lib/cli/commands/version.rb +53 -0
  91. package/scripts/lib/cli/frontier.rb +84 -0
  92. package/scripts/lib/cli/legacy.rb +50 -0
  93. package/scripts/lib/cli/output.rb +102 -0
  94. package/scripts/lib/cli/scope.rb +127 -0
  95. package/scripts/lib/cli/table.rb +64 -0
  96. package/scripts/lib/cli.rb +94 -0
  97. package/scripts/lib/compact_instructions.rb +8 -0
  98. package/scripts/lib/day_summary.rb +4 -3
  99. package/scripts/lib/doctor_core.rb +7 -32
  100. package/scripts/lib/doctor_session_ledger.rb +2 -1
  101. package/scripts/lib/feedback_report.rb +1 -1
  102. package/scripts/lib/graph_measure_models.rb +3 -1
  103. package/scripts/lib/index_entry.rb +9 -0
  104. package/scripts/lib/installer_core.rb +73 -19
  105. package/scripts/lib/intent_screen.rb +3 -3
  106. package/scripts/lib/lock.rb +2 -2
  107. package/scripts/lib/node_input.rb +3 -2
  108. package/scripts/lib/preflight.rb +4 -6
  109. package/scripts/lib/project_config.rb +2 -1
  110. package/scripts/lib/project_validator.rb +3 -2
  111. package/scripts/lib/qmd_sync.rb +8 -7
  112. package/scripts/lib/reference_archive.rb +45 -0
  113. package/scripts/lib/release_guard.rb +2 -0
  114. package/scripts/lib/report_screen.rb +4 -3
  115. package/scripts/lib/rlm/corpus.rb +13 -0
  116. package/scripts/lib/rlm/probe.rb +29 -0
  117. package/scripts/lib/rlm/query.rb +22 -0
  118. package/scripts/lib/roadmap_queue.rb +2 -2
  119. package/scripts/lib/roadmap_savepoint.rb +1 -1
  120. package/scripts/lib/runner_absorb.rb +3 -2
  121. package/scripts/lib/search_index.rb +55 -0
  122. package/scripts/lib/session_git.rb +4 -3
  123. package/scripts/lib/sqlite.rb +22 -0
  124. package/scripts/lib/store_discovery.rb +7 -6
  125. package/scripts/lib/store_layout.rb +54 -0
  126. package/scripts/lib/store_provisioning.rb +2 -1
  127. package/scripts/lib/store_sync.rb +85 -0
  128. package/scripts/lib/stores_move.rb +93 -0
  129. package/scripts/lib/verify_intent.rb +2 -7
  130. package/scripts/lib/version_number.rb +48 -0
  131. package/scripts/lib/work_graph.rb +59 -0
  132. package/scripts/lib/worktree.rb +3 -8
  133. package/scripts/lib/worktree_sweep.rb +3 -2
  134. package/scripts/link-suggest +2 -1
  135. package/scripts/migrate-to-global +1 -1
  136. package/scripts/new-intent +3 -12
  137. package/scripts/plastic-lock +3 -2
  138. package/scripts/promote-session-item +3 -2
  139. package/scripts/release-check +10 -5
  140. package/scripts/report-screen +1 -1
  141. package/scripts/session-commit +2 -1
  142. package/scripts/spawn-preamble +2 -2
  143. package/scripts/update.rb +25 -4
  144. package/scripts/write-handoff +2 -1
  145. package/templates/agents.md +6 -6
  146. package/templates/render.css +10 -0
  147. package/bin/plastic.js +0 -70
  148. package/skills/agent-advisor/SKILL.md +0 -84
  149. package/skills/auto/SKILL.md +0 -297
  150. package/skills/auto/evals/evals.json +0 -255
  151. package/skills/auto/references/end-tail.md +0 -64
  152. package/skills/conventions/SKILL.md +0 -29
  153. package/skills/dashboard/SKILL.md +0 -180
  154. package/skills/dashboard/evals/evals.json +0 -38
  155. package/skills/dashboard/references/classification.md +0 -22
  156. package/skills/dashboard/templates/dashboard-global.md +0 -20
  157. package/skills/dashboard/templates/dashboard-project.md +0 -19
  158. package/skills/direct/SKILL.md +0 -66
  159. package/skills/direct/references/request-signals.md +0 -59
  160. package/skills/doctor/SKILL.md +0 -305
  161. package/skills/doctor/report.md +0 -102
  162. package/skills/feedback/SKILL.md +0 -98
  163. package/skills/feedback/references/transport-and-privacy.md +0 -65
  164. package/skills/feedback/report.md +0 -36
  165. package/skills/install/SKILL.md +0 -215
  166. package/skills/intent-continuing/SKILL.md +0 -156
  167. package/skills/intent-continuing/references/board-fill.md +0 -52
  168. package/skills/intent-continuing/references/boarding-matrix.md +0 -35
  169. package/skills/intent-continuing/references/context-management.md +0 -28
  170. package/skills/intent-continuing/references/liveness-ranking.md +0 -57
  171. package/skills/intent-creating/SKILL.md +0 -89
  172. package/skills/intent-creating/evals/evals.json +0 -72
  173. package/skills/intent-creating/references/lifecycle.md +0 -81
  174. package/skills/intent-creating/references/wikilinks.md +0 -8
  175. package/skills/intent-ending/SKILL.md +0 -182
  176. package/skills/intent-ending/evals/evals.json +0 -74
  177. package/skills/intent-executing/SKILL.md +0 -87
  178. package/skills/intent-executing/evals/evals.json +0 -66
  179. package/skills/intent-executing/implementer-prompt.md +0 -47
  180. package/skills/intent-executing/spec-reviewer-prompt.md +0 -27
  181. package/skills/intent-speccing/SKILL.md +0 -136
  182. package/skills/intent-speccing/evals/evals.json +0 -126
  183. package/skills/intent-speccing/references/design-principles.md +0 -44
  184. package/skills/intent-speccing/references/per-section-fill-rules.md +0 -92
  185. package/skills/intent-speccing/references/self-verify-checklist.md +0 -37
  186. package/skills/project-creating/SKILL.md +0 -162
  187. package/skills/project-creating/references/hubs-projects.md +0 -55
  188. package/skills/project-creating/references/project-scaffolding.md +0 -97
  189. package/skills/releasing/SKILL.md +0 -376
  190. package/skills/releasing/references/deprecations.md +0 -60
  191. package/skills/releasing/references/promotion-and-tagging.md +0 -70
  192. package/skills/releasing/references/release-lines.md +0 -105
  193. package/skills/roadmap/SKILL.md +0 -90
  194. package/skills/roadmap/references/file-format.md +0 -134
  195. package/skills/roadmap/references/operations.md +0 -112
  196. package/skills/rollback/SKILL.md +0 -91
  197. package/skills/tutorial/SKILL.md +0 -66
  198. package/skills/tutorial/evals/evals.json +0 -186
  199. package/skills/uninstall/SKILL.md +0 -75
  200. package/skills/update/SKILL.md +0 -126
  201. /package/{skills/auto/references → docs/help}/agent-report-contract.md +0 -0
  202. /package/{skills/intent-executing → docs/help}/code-quality-reviewer-prompt.md +0 -0
  203. /package/{skills/conventions/references → docs/help}/knowledge-graph.md +0 -0
  204. /package/{skills/conventions/references → docs/help}/lifecycle-and-savepoints.md +0 -0
  205. /package/{skills/conventions/references → docs/help}/locks-and-worktrees.md +0 -0
  206. /package/{skills/conventions/references → docs/help}/maintenance-and-revisions.md +0 -0
  207. /package/{skills/intent-executing → docs/help}/plan-reviewer-prompt.md +0 -0
@@ -1,72 +0,0 @@
1
- {
2
- "skill_name": "plastic-intent-creating",
3
- "notes": "Intent 68. Scope: output-quality for the sources-vs-chain construction rules (D1/D2). Asserts the related-but-not-spawned case produces NO sources plus a predecessor chain link and a ## Links mirror, contrasted with the created-from case (true ascendant -> --sources set, reciprocal chain). The machine-checkable half lives in test/new_intent_test.rb (test_sources_path_gets_child_in_chain_frontmatter); this file documents the agent-facing scenario for skill evaluation and is NOT run by bin/test.",
4
- "evals": [
5
- {
6
- "id": 1,
7
- "scope": "behavior",
8
- "set": "train",
9
- "prompt": "Create an intent for adding a retry policy to the uploader. It's related to intent 41 (the upload pipeline work) but it's independent: it did not come out of intent 41's lifecycle.",
10
- "expected_output": "A new root intent is created with EMPTY sources (it was not created from 41). The relation is recorded on the PREDECESSOR: intent 41 gains the new intent's id in its frontmatter chain, and a [[<new-id>]] wikilink is added to intent 41's ## Links. The new intent is NOT given 41 in --sources (the related-but-not-spawned rule). No false symmetry: 41 keeps the new id on chain with no reciprocal sources.",
11
- "files": [],
12
- "assertions": [
13
- {
14
- "type": "code",
15
- "check": "new intent sources is empty",
16
- "observed": "sources: []",
17
- "result": "pass"
18
- },
19
- {
20
- "type": "code",
21
- "check": "predecessor 41 chain includes new id",
22
- "observed": "41.chain includes <new-id>",
23
- "result": "pass"
24
- },
25
- {
26
- "type": "code",
27
- "check": "predecessor 41 ## Links has [[<new-id>]] mirror",
28
- "observed": "[[<new-id>]] present in 41 ## Links",
29
- "result": "pass"
30
- }
31
- ]
32
- },
33
- {
34
- "id": 2,
35
- "scope": "behavior",
36
- "set": "validation",
37
- "prompt": "Create an intent that is the direct continuation of intent 41: it emerged from intent 41's lifecycle and could not exist without it.",
38
- "expected_output": "Because the new intent was genuinely CREATED FROM 41 (D1), it carries 41 in --sources (or branches from 41, which merges 41 into sources via the redundant-explicit rule). The reciprocal I1 backlink lands: intent 41's frontmatter chain gains the new intent's id. This is the created-from case, contrasted with the related-but-not-spawned case in eval 1.",
39
- "files": [],
40
- "assertions": [
41
- {
42
- "type": "code",
43
- "check": "new intent sources includes 41",
44
- "observed": "sources includes 41",
45
- "result": "pass"
46
- },
47
- {
48
- "type": "code",
49
- "check": "predecessor 41 chain includes new id (I1 reciprocity)",
50
- "observed": "41.chain includes <new-id>",
51
- "result": "pass"
52
- }
53
- ]
54
- },
55
- {
56
- "id": 3,
57
- "scope": "behavior",
58
- "set": "validation",
59
- "prompt": "QMD is present. The user says: create an intent to add retry to the uploader.",
60
- "expected_output": "Before allocating the id / scaffolding, runs `ruby ~/.plastic/scripts/qmd-sync search \"add retry to the uploader\"` to surface a near-duplicate or true predecessor, then opens the authoritative intent file for any hit (reusing a near-duplicate or setting a real predecessor in --sources). No-op fallback to INDEX.md / file scan when QMD is absent.",
61
- "files": [],
62
- "assertions": [
63
- {
64
- "type": "human",
65
- "check": "qmd-sync search is run before id allocation; authoritative file opened for any hit; informs reuse / --sources",
66
- "observed": "SKILL.md (or agent file) carries the QMD-first step: run qmd-sync search before grep/Read, then open the authoritative file; no-op fallback when QMD is absent",
67
- "result": "pass"
68
- }
69
- ]
70
- }
71
- ]
72
- }
@@ -1,81 +0,0 @@
1
- # Building an Intent — Full Lifecycle Detail
2
-
3
- ## What → `## Intent` section
4
-
5
- The desire. One paragraph. What the human or agent wants.
6
- This exists from the moment the intent is created.
7
-
8
- **Deliverable:** `{ID}--{slug}.md`
9
-
10
- ## Why → `## Context` + `### Decisions` sections
11
-
12
- Why this intent exists. Grows over time through brainstorming and exploration.
13
-
14
- - **Context** — what we knew going in + what we decided along the way
15
- - **Decisions** — main premises derived from Context plus decisions from brainstorming/grilling
16
- - Decisions are Why-level: "status belongs on actions because multiple workstreams", not How-level: "use ACTION_N.md files"
17
-
18
- **Deliverable:** `spec.md` (consolidated specification from Context + Decisions + brainstorming)
19
-
20
- ## How → Planning and preparation
21
-
22
- Research decisions, create the implementation plan, define actions.
23
-
24
- **Deliverable:** `plan.md` + `actions/` + `checklist.md` (execution registry with checkboxes covering all actions)
25
-
26
- ## Exec → Execute actions
27
-
28
- Execute actions from the plan, track progress via checklist.
29
-
30
- **Deliverable:** `outcome.md` (detailed result). `## Outcome` in intent.md = short summary written as last step.
31
-
32
- ## `## Insights` — Append-only work log
33
-
34
- Captured throughout ALL stages. One-liner bullet points.
35
- Never modified, only appended.
36
-
37
- Tracks: stage transitions, decisions, shifts, blocks, cancellations, material for future intents.
38
- This is how execution is tracked. When this intent completes, Insights
39
- is where to look for what comes next. New intents spawned from this one,
40
- plus related-but-not-spawned successors it leads to, appear in the `chain`
41
- field.
42
-
43
- ## `## Links`
44
-
45
- The human-readable projection of the local knowledge graph, mirroring the
46
- frontmatter exactly. Each entry is `- [[id--slug|<target's full intent: text>]]`,
47
- a clickable `id--slug` wikilink target with the target intent's full `intent:`
48
- text as the label (cross-store targets render
49
- `- [[store:id--slug|<target's full intent: text>]]`). Ordering is mandatory: all
50
- `sources` first (top), then all `chain`, frontmatter order preserved within each
51
- group. Sources never appear at the end. No source/chain tags, no sub-grouping. An
52
- intent with empty `sources` and `chain` carries the empty-state comment. Counterpart
53
- to the frontmatter `sources` / `chain` edges, for Obsidian graph navigation.
54
-
55
- ## Conventions — Filesystem as Schema
56
-
57
- State is derived from what exists, not from what's declared.
58
-
59
- | Convention | Signal |
60
- |---|---|
61
- | No `## Context` | Intent is fleeting (quick capture, non-actionable) |
62
- | `## Context` has content | Intent is permanent (developed, actionable) |
63
- | `## Outcome` has content | Intent is done |
64
- | `## Insights` has `(autonomous)` entries | Intent is/was being delivered autonomously |
65
-
66
- ### Transitions
67
-
68
- - Fleeting → permanent: add `## Context` (one-way, also makes it actionable)
69
- - There is no separate "non-actionable → actionable" transition — permanence implies actionability
70
- - Even research intents are actionable: the research itself is the action, the conclusion is the outcome
71
-
72
- ## Creating an Intent — Full Steps
73
-
74
- 1. Determine the target store: `~/.plastic/store/` for global intents (default), `~/.plastic/projects/{slug}/store/` for project intents
75
- 2. Decide branch vs root (this sets whether you pass `--parent`)
76
- 3. Scaffold with one call: `ruby ~/.plastic/scripts/new-intent --store <store> --intent "<one-line>" --slug <slug> [--parent <id>] [--sources id,id] [--tags ...]`. This allocates the id, creates the directory plus `actions/` and `resources/`, renders the born-complete intent file (frontmatter plus `## Intent`, `## Context`, `## Outcome`, `## Insights`, `## Links`), writes the sentinel placeholder lifecycle files, wires the reciprocal links, and self-validates.
77
- 4. Update the appropriate `INDEX.md` — add to Active section and appropriate cluster
78
-
79
- The intent file is born complete with all five sanctioned `##` sections; the lifecycle files (`spec.md`/`plan.md`/`checklist.md`/`outcome.md`) are sentinel placeholders that read as "stage not reached" until an agent fills them and deletes the `<!-- plastic:placeholder -->` first line.
80
-
81
- Always scaffold through `new-intent` (or this skill). Never hand-author intent files: `new-intent` validates the file it writes (`scripts/validate-intent`) and `end-intent` checks it again at close, and hand-authoring is the bypass this contract is designed to remove.
@@ -1,8 +0,0 @@
1
- # Wikilink Conventions
2
-
3
- | Syntax | Meaning |
4
- |--------|---------|
5
- | `[[ID]]` | Link to intent in same store (e.g., `[[1a1]]`) |
6
- | `[[ID\|display text]]` | Link with human-readable label |
7
- | `[[global:ID]]` | Link to intent in `~/.plastic/store/` |
8
- | `[[project-slug:ID]]` | Link to intent in `~/.plastic/projects/{slug}/store/` |
@@ -1,182 +0,0 @@
1
- ---
2
- name: plastic-intent-ending
3
- description: >
4
- Wrap, finish, or close an intent as delivered or abandoned. Use
5
- when completing or abandoning an intent, when a graph's last node
6
- reaches a terminal status (or, for a legacy intent, a checklist
7
- reaches 100 percent) and Exec is finished, or when asked to "wrap
8
- this up".
9
- user-invocable: true
10
- ---
11
-
12
- # Intent Ending
13
-
14
- The one procedure every terminal transition routes through. Auto mode, the
15
- curator path, and releasing all call this skill (or its backing script,
16
- `scripts/end-intent`) for the mechanical close instead of restating the same
17
- prose three times. `abandoned` is the SAME procedure as `delivered`, not a
18
- failure branch: only outcome.md content and the INDEX section differ.
19
-
20
- Read `../plastic-conventions/references/completion-and-done.md` for what "intent done" means and
21
- the End-stage tail behind the steps below. This path resolves relative to this skill's own
22
- installed directory.
23
-
24
- ## The 8 steps (0-7)
25
-
26
- | # | Step | Who does it |
27
- |---|---|---|
28
- | 0 | Precondition check | You, before touching outcome.md |
29
- | 1 | backfill spec/plan/action/outcome from the record, self-check, intent-file `## Outcome` summary | `scripts/end-intent` |
30
- | 2 | INDEX.md terminal move (Active -> Completed/Abandoned) | `scripts/end-intent` |
31
- | 3 | the terminal savepoint line | `scripts/end-intent` |
32
- | 4 | store auto-commit | `scripts/end-intent` |
33
- | 5 | disarm (worktree + lock) | `scripts/end-intent` (intent 188) |
34
- | 6 | QMD reindex, async, LAST | You |
35
- | 7 | EM-to-CTO report | You |
36
-
37
- Steps 1-5 are ONE callable script call, not several separate one-liners: this
38
- is exactly what the failure mode this intent fixes looked like (releasing hand
39
- authored the close in prose and dropped the savepoint bookend for two real
40
- deliveries; separately, one session delivered four intents back to back and
41
- never ran the old step-5 one-liner at all, intent 188). Never restate
42
- outcome/INDEX/savepoint/disarm prose inline again; call `scripts/end-intent`.
43
-
44
- ### Step 0. Precondition (the record is what gets backfilled)
45
-
46
- Nothing refuses the close any more (the 1.x write-time gate and `end-intent`'s
47
- exit-6 structure gate were retired in 2.0, intents 302 and 308). What you leave
48
- on disk is what the record becomes, so before the call:
49
-
50
- 1. For an intent with a `graph.md`: confirm every node's Status in `graph.md` is
51
- terminal (`done` or `failed_verification`, nothing left `running`, `blocked`, or
52
- waiting `needs_decision`), and that the last verify node's gates were
53
- accepted. A node still open is not a refusal, it is a reported gap that lands
54
- verbatim in the backfilled `## Follow-ups`.
55
- For an intent with no `graph.md` (legacy): read checklist.md, tick every item as
56
- it is actually performed, including an item that describes the close itself:
57
- running this very procedure IS what that item describes; an unchecked box is not
58
- a refusal, it is a reported gap. Also confirm every acceptance criterion in
59
- spec.md is verifiable (tests pass, or the manual check described in its HOW line
60
- was actually run).
61
- 2. Decide what you have to say. For an intent with a `graph.md`, never hand-write
62
- `outcome.md`: `scripts/end-intent` GENERATES it, through
63
- `scripts/lib/outcome_report.rb` (`scripts/outcome-report` is its standalone
64
- CLI, useful for checking the generated text before the close). `## Delivered`,
65
- `## Verification`, `## Graph diff`, and `## Findings` are read straight from
66
- `graph.md`, `nodes/`, and the ledger every time, in plain wording a reader
67
- recognizes, never hand-typed; when the generated wording is wrong, fix
68
- `graph.md` or `nodes/`, the source it reads from, not the report. `## Summary`,
69
- `## Needs you`, and `## Follow-ups`, and every frontmatter key but
70
- `disposition`, are preserved byte for byte when you author them and
71
- generated as plain facts otherwise. For an intent with no `graph.md`, a
72
- spec.md, plan.md, action file, or outcome.md left as the scaffold placeholder
73
- is written from the record by `scripts/end-intent` (the intent file's
74
- `## Intent`, `### Decisions`, and `## Insights`, the checklist, the worktree
75
- diff). A file you wrote, even under a still-present sentinel, is never touched.
76
-
77
- ### Step 1-5. Run `scripts/end-intent`
78
-
79
- For an intent with a `graph.md`, do not author `outcome.md` by hand: run
80
- `ruby ~/.plastic/scripts/outcome-report <intent_dir> --write --disposition delivered|abandoned`
81
- if you want to see the generated text before the close, or let the single call below write it.
82
- `## Summary`, `## Needs you`, and `## Follow-ups` are the sections worth your own words; edit
83
- those into the file before the call when the generator's plain facts say too little (they are
84
- preserved byte for byte). `## Needs you` is the literal None or a `| N | What | Why |` table.
85
- On abandon, `## Summary` states the abandonment reason and the trail (see Pivot below). An
86
- intent with no `graph.md` gets a placeholder outcome.md backfilled from the record instead,
87
- with the close's disposition and the `--outcome-summary` line as its summary. Also author the
88
- rich INDEX entry note now (a short line in the store's existing Completed/Abandoned
89
- convention: mode, what shipped or why it was abandoned, suite result, merge/spawn notes);
90
- content authoring stays with you, `--index-note` only appends what you write.
91
-
92
- Then call the script once:
93
-
94
- ```bash
95
- ruby ~/.plastic/scripts/end-intent \
96
- --store <store_path> --id <intent_id> --disposition delivered|abandoned \
97
- --session "$CLAUDE_CODE_SESSION_ID" \
98
- --outcome-summary "<one-line ## Outcome summary for the intent file>" \
99
- --index-note "<rich Completed/Abandoned entry description>"
100
- ```
101
-
102
- This does all of steps 1-5 in order: backfills every missing or placeholder
103
- spec.md, plan.md, action file, and outcome.md from the record (never a file
104
- you wrote), runs doctor's per-intent structure check and the outcome guard as
105
- a self-check that reports on stderr and proceeds (an unchecked box, a
106
- malformed intent file, a wrong-disposition outcome.md you wrote), stamps the
107
- intent file's `## Outcome` section, moves the INDEX.md
108
- line from `## Active` to `## Completed` or `## Abandoned` (dated today,
109
- idempotent, accepting either a real em dash or a plain hyphen as the id/
110
- title separator on read while always emitting the real em dash on write)
111
- with the `--index-note` text appended after the date so the entry stays
112
- rich, appends the terminal savepoint line, commits the store repo, and
113
- disarms (releases the code worktree and clears `delivery.lock`, verified
114
- against the durable lock file on disk, never merely trusted). Omit
115
- `--index-note` for a thin id+date entry, add `--no-commit` when a separate
116
- commit step already covers the store (this never skips disarm), and
117
- `--dry-run` to preview steps 1-5 with no writes.
118
-
119
- Read `../plastic-conventions/references/completion-and-done.md` for the pre-flight lock guard
120
- and the dirty-worktree refusal this call runs before writing anything (exit 4 and exit 5
121
- below); this procedure only calls `end-intent`, it never re-implements them.
122
-
123
- On the auto mode / curator path (no release), this single call performs the
124
- FULL disarm (plain worktree remove, since the branch survives for later
125
- reclaim). On a release-shipped path, `skills/releasing/SKILL.md` merges and
126
- removes the worktree FIRST (its own step 8, merge-then-remove) before ever
127
- calling this script, so by the time this call's step 5 runs, the worktree is
128
- already gone (a harmless no-op) and only the lock is left to clear,
129
- correctly, for the first time on that path (D7).
130
-
131
- Exit codes: 0 success (the intent is closed AND its delivery lock is gone);
132
- 1 a usage or resolution failure, OR an INDEX id that resolves to neither
133
- `## Active` nor the terminal section; 3 steps 1-4 already committed
134
- but disarm could not verify the lock is gone afterward (run `/plastic-doctor
135
- check the lock status`); 4 a live foreign session holds the lock (back off);
136
- 5 the code worktree is dirty (commit/stash first, or pass
137
- `--discard-worktree-changes` deliberately).
138
-
139
- ### Step 6. QMD reindex, LAST
140
-
141
- Only after step 5 has released the worktrees and cleared the lock, so the
142
- index never references state about to disappear:
143
-
144
- ```bash
145
- ruby ~/.plastic/scripts/qmd-sync reindex --store <store-root> --async
146
- ```
147
-
148
- No-op when QMD is absent. Runs in the background so it never blocks the
149
- turn.
150
-
151
- ### Step 7. Print `delivered`
152
-
153
- Print `ruby ~/.plastic/scripts/report-screen delivered <intent_dir>` as the first characters
154
- of the reply: nothing before it, no fence, or the hook cannot paint it. Asked, Delivered (with
155
- its Proven-by column), Evidence, and Needs you come straight from the record - the EM-to-CTO
156
- report, impact and risk first, in plain language, with the decision left to the human (merge,
157
- release, or accept). See `outcome.md` for the details; do not restate it verbatim.
158
-
159
- ## Abandoned is the same procedure
160
-
161
- `disposition: abandoned` runs the identical steps 0-7. The only differences
162
- are outcome.md content (Summary states why this was abandoned, not what was
163
- delivered) and the INDEX target section (`## Abandoned` instead of
164
- `## Completed`). Never branch the mechanical steps by disposition; the
165
- script already does that internally.
166
-
167
- ## Mid-flight pivot
168
-
169
- When the work that shipped differs from what spec.md or plan.md originally
170
- called for, do not retcon those documents. Record the decision once in
171
- `## Insights`, then let outcome.md carry the truth of what actually
172
- happened, including the abandoned trail when part of the work was dropped
173
- mid-flight. outcome.md is truth of delivery; spec and plan stay the
174
- historical record of what was planned.
175
-
176
- ## Routing
177
-
178
- `plastic-releasing`, `plastic-auto`, and `plastic-intent-executing` all delegate their mechanical
179
- close to this skill (or call `scripts/end-intent` directly for steps 1-5).
180
- None of them restate the outcome/INDEX/savepoint/disarm prose inline any
181
- more; if you find one that does, that surface has drifted and should route
182
- here instead.
@@ -1,74 +0,0 @@
1
- {
2
- "skill_name": "plastic-intent-ending",
3
- "notes": "Intent 161. Scopes: description triggering (3-6) and behavior (1-2: the two mandatory D6 cases). Case B graduates into test/end_intent_test.rb (test_done_bookend_lands_once_and_is_idempotent) per evaluating-skills conventions.",
4
- "evals": [
5
- {
6
- "id": 1,
7
- "scope": "behavior",
8
- "set": "train",
9
- "prompt": "checklist.md has one unchecked non-completion item. Try to complete the intent.",
10
- "expected_output": "Ticks or finishes the item before calling scripts/end-intent, because an unchecked box is reported by the structure self-check and lands verbatim in the backfilled Follow-ups; never a refusal (the write-time gate was removed in 2.0, intents 302 and 308).",
11
- "files": [],
12
- "assertions": [
13
- { "type": "human", "check": "SKILL.md Step 0 states that nothing refuses the close, that an unchecked box is a reported gap landing in Follow-ups, and instructs finishing the checklist before the call", "result": "expect-pass" },
14
- { "type": "code", "check": "scripts/end-intent exits 0 on an unchecked '- [ ]' item and prints 'structure check: intent_checklist_complete' (test/end_intent_test.rb)", "result": "pass" }
15
- ]
16
- },
17
- {
18
- "id": 2,
19
- "scope": "behavior",
20
- "set": "train",
21
- "prompt": "Run the mechanical close (scripts/end-intent) for a delivered intent with a real outcome.md.",
22
- "expected_output": "The terminal savepoint line lands exactly once in savepoint.md, and a second run of the same command does not duplicate it (this is the regression the intent fixes: releasing used to skip this line entirely).",
23
- "files": [],
24
- "assertions": [
25
- { "type": "human", "check": "SKILL.md Step 1-4 calls scripts/end-intent as one script instead of restating the outcome/INDEX/savepoint one-liners in prose", "result": "expect-pass" },
26
- { "type": "code", "check": "test/end_intent_test.rb#test_done_bookend_lands_once_and_is_idempotent is green", "result": "pass" }
27
- ]
28
- },
29
- {
30
- "id": 3,
31
- "scope": "triggering",
32
- "set": "train",
33
- "prompt": "Mark intent 87 done, it shipped.",
34
- "expected_output": "Activates plastic-intent-ending to run the mechanical close (outcome.md, INDEX move, savepoint bookend, commit, disarm, reindex, report).",
35
- "files": [],
36
- "assertions": [
37
- { "type": "code", "check": "router CHOICE == plastic-intent-ending", "result": "expect-pass" }
38
- ]
39
- },
40
- {
41
- "id": 4,
42
- "scope": "triggering",
43
- "set": "train",
44
- "prompt": "This one's not worth finishing, abandon it and wrap this up.",
45
- "expected_output": "Activates plastic-intent-ending (indirect trigger: 'wrap this up' names no lifecycle vocabulary directly). Abandoned runs the identical procedure, only outcome.md content and the INDEX section differ.",
46
- "files": [],
47
- "assertions": [
48
- { "type": "code", "check": "router CHOICE == plastic-intent-ending", "result": "expect-pass" }
49
- ]
50
- },
51
- {
52
- "id": 5,
53
- "scope": "triggering",
54
- "set": "validation",
55
- "prompt": "Start work on intent 87.",
56
- "expected_output": "Does NOT activate plastic-intent-ending; this is a resume request (plastic-intent-continuing), the opposite end of the lifecycle from a close.",
57
- "files": [],
58
- "assertions": [
59
- { "type": "code", "check": "router CHOICE != plastic-intent-ending", "result": "expect-pass" }
60
- ]
61
- },
62
- {
63
- "id": 6,
64
- "scope": "triggering",
65
- "set": "validation",
66
- "prompt": "Cut a release and tag it v1.2.0.",
67
- "expected_output": "Does NOT activate plastic-intent-ending directly; activates plastic-releasing, which internally calls scripts/end-intent for the mechanical close as one of its own steps.",
68
- "files": [],
69
- "assertions": [
70
- { "type": "code", "check": "router CHOICE == plastic-releasing", "result": "expect-pass" }
71
- ]
72
- }
73
- ]
74
- }
@@ -1,87 +0,0 @@
1
- ---
2
- name: plastic-intent-executing
3
- description: Use when you have a graph or a plan to execute. A graph delivery runs on
4
- `scripts/runner`'s three verbs, `step`, `status`, and `answer`; older, non-graph work
5
- dispatches the `plastic-executor` agent for one consolidated action.
6
- user-invocable: true
7
- ---
8
-
9
- # Executing a Plan
10
-
11
- ## Step 0: Sync Worktree First
12
-
13
- Before touching any file the graph or the plan names, sync the code worktree with main so no
14
- edit lands on a path a merged rename or delete already removed:
15
-
16
- ```
17
- git -C <worktree> fetch origin && git -C <worktree> merge --ff-only origin/main
18
- ```
19
-
20
- If a named file or directory is missing (renamed or removed upstream), stop and report it
21
- rather than editing a stale path. Read
22
- `../plastic-conventions/references/locks-and-worktrees.md` for delivery isolation before
23
- touching the worktree above.
24
-
25
- ## step
26
-
27
- `ruby scripts/runner step <intent_dir>` computes which nodes in `graph.md`/`nodes/*.md` are
28
- ready, applies dispatch policy (model, call cap), and prints a spawn block per dispatched node
29
- - agent, model, node input path, the one test command, the call cap - fenced in its own stdout.
30
- The runner itself never spawns an agent (327 D42). Call `step` again after each dispatched
31
- node returns.
32
-
33
- ### Graph dispatch: the paste
34
-
35
- The dispatch step is the paste, not a lead's hand-typed brief: copy each spawn block into the
36
- Agent tool as its own dispatch, verbatim.
37
-
38
- On Claude Code, the session spawns each dispatched node as a background subagent of its
39
- per-kind agent (`plastic-node-work`, `plastic-node-verify`, `plastic-node-research`) named in
40
- the spawn block. On Codex, one node runs over `codex exec` in a sandbox scoped to its kind and
41
- writes only a return file, which the next `step` absorbs the same way it absorbs a Claude Code
42
- return.
43
-
44
- ## status
45
-
46
- `ruby scripts/runner status <intent_dir>` renders the graph's ledger state: which nodes are
47
- running, done, blocked, or waiting on a decision. Safe to poll constantly; read node status
48
- through `NodeLedger.status` before dispatching anything, never re-derive it by eye.
49
-
50
- ## answer
51
-
52
- `ruby scripts/runner answer <intent_dir> --node <id> --decision "<text>"` closes a
53
- `needs_decision` node with the owner's ruling, recorded to the ledger, so `step` can resume
54
- the graph past it.
55
-
56
- ## Non-graph work
57
-
58
- When the intent has no `graph.md`, dispatch ONE `plastic-executor` subagent with the whole
59
- consolidated action pasted in (never a file reference): every task's full text, every action
60
- file with its failure-mode matrix, the checklist items it must tick, the project context, and
61
- the worktree path. It writes the matrix's tests and commits them red, implements the
62
- consolidated action in order, ticks each item as it lands (see `## Tick-as-you-land`), and
63
- drives the test suite green. Read its response by code: DONE or DONE_WITH_CONCERNS proceeds;
64
- NEEDS_CONTEXT provides the missing context and re-dispatches; BLOCKED stops and reports.
65
-
66
- ## Tick-as-you-land
67
-
68
- A tick is two edits, made together: mark the item's box `[x]`, and move its
69
- checklist item from `## In Progress` to `## Completed` in `checklist.md`;
70
- then add one `## Session Log` row (Date, Items Completed, Notes). The box is
71
- the half the state screen's Progress bar reads: `IntentScreen::ITEM_RE` and
72
- `progress_fields` count `[x]`, not which section the line sits in, so a line
73
- moved to `## Completed` with its box left unmarked still reads as zero
74
- progress. Do not batch several tasks' worth of checklist updates into one
75
- later edit; tick the moment the task is verified, before moving to the next
76
- task.
77
-
78
- ## Position in the cycle
79
-
80
- - **Before:** the graph (`graph.md`, `nodes/*.md`), or `plan.md`/`checklist.md`, exists; the
81
- worktree is armed.
82
- - **Produces:** code changes and a ticked checklist.
83
- - **Next:** `plastic-intent-ending` owns `outcome.md`, generated through
84
- `scripts/outcome-report`, and the rest of the mechanical close.
85
-
86
- Read `../plastic-conventions/references/lifecycle-and-savepoints.md` for the subagent
87
- report-home contract this handoff relies on.
@@ -1,66 +0,0 @@
1
- {
2
- "skill_name": "plastic-intent-executing",
3
- "notes": "Intent 164. New evals.json for the executing-plan skill: refuse-to-present-unverified, sync-worktree-first, and the reroute-vs-dispatch distinction. All assertions are pending a real observed run per the plastic-evaluating-skills convention.",
4
- "evals": [
5
- {
6
- "id": 1,
7
- "scope": "behavior",
8
- "set": "train",
9
- "prompt": "A task just landed: a new method was added and its test file was written. The agent is about to tell the owner the task is done and move to the next one.",
10
- "expected_output": "Before presenting the completed task to the owner, the agent independently verifies it: greps the changed file or runs the specific test, rather than restating what it intended to do. It does not present the claim until the grep or test run has actually been observed.",
11
- "files": [],
12
- "assertions": [
13
- {
14
- "type": "human",
15
- "check": "a grep or test run against the actual artifact is shown before the owner-facing claim; no claim is presented as done without that observed check",
16
- "result": "expect-pass"
17
- }
18
- ]
19
- },
20
- {
21
- "id": 2,
22
- "scope": "behavior",
23
- "set": "validation",
24
- "prompt": "The agent finished implementing a task and, without running anything, tells the owner \"Task 3 is complete and the tests pass.\"",
25
- "expected_output": "This is a refusal case: the skill does not allow presenting a pass claim without first grepping or running the artifact. The correct behavior is to run the verification first and only then report the observed result.",
26
- "files": [],
27
- "assertions": [
28
- {
29
- "type": "human",
30
- "check": "the skill's stated hard rule blocks an unverified claim like this; expected behavior is verify-then-report, not report-then-hope",
31
- "result": "expect-pass"
32
- }
33
- ]
34
- },
35
- {
36
- "id": 3,
37
- "scope": "behavior",
38
- "set": "train",
39
- "prompt": "Execution is starting for an intent whose plan.md was written two days ago; the code worktree has not been touched since.",
40
- "expected_output": "Before Step 1 (Load Plan), the agent syncs the code worktree with main: `git -C <worktree> fetch origin && git -C <worktree> merge --ff-only origin/main`, then verifies the plan's target files exist at the paths plan.md names before editing any of them.",
41
- "files": [],
42
- "assertions": [
43
- {
44
- "type": "code",
45
- "check": "the fetch-and-merge --ff-only sync command runs before Load Plan; target file existence is checked before the first edit",
46
- "result": "expect-pass"
47
- }
48
- ]
49
- },
50
- {
51
- "id": 4,
52
- "scope": "behavior",
53
- "set": "validation",
54
- "prompt": "The plan's next step reads \"run /plastic-intent-speccing\" as a human-facing instruction to consolidate the spec once Exec finishes an audit task.",
55
- "expected_output": "The agent tells the user to type the /plastic-intent-speccing command themselves; it does not dispatch a subagent with that slash-command text as a prompt, and it does not paste an agent-facing dispatch prompt at the user instead.",
56
- "files": [],
57
- "assertions": [
58
- {
59
- "type": "human",
60
- "check": "the slash-command instruction is directed at the user, not handed to the Agent tool as a subagent prompt; no dispatch-prompt text leaks into the user-facing message",
61
- "result": "expect-pass"
62
- }
63
- ]
64
- }
65
- ]
66
- }
@@ -1,47 +0,0 @@
1
- # Implementer Subagent Prompt
2
-
3
- You are implementing a specific task from a plan. You have been given the full task text below.
4
-
5
- ## Your Task
6
-
7
- {{TASK_TEXT}}
8
-
9
- ## Project Context
10
-
11
- {{PROJECT_CONTEXT}}
12
-
13
- ## Active Intent
14
-
15
- {{INTENT_CONTEXT}}
16
-
17
- ## Instructions
18
-
19
- 1. Read the task carefully. If anything is unclear, report NEEDS_CONTEXT with what you need.
20
- 2. Implement exactly what the task specifies — nothing more, nothing less.
21
- 3. Write tests first when the task includes test steps (TDD).
22
- 4. Follow the file paths specified in the task exactly.
23
- 5. Commit after each logical unit of work, and in the same step tick the checklist item that
24
- unit lands: mark its box `[x]` and move the line to `## Completed`, then append the
25
- savepoint `Commit` line
26
- (`scripts/savepoint-note <intent_dir> --kind Commit --text "<sha> <what it proves>"`). A
27
- commit without its tick is incomplete.
28
- 6. When done, self-review against this checklist:
29
- - [ ] All steps in the task are completed
30
- - [ ] Tests pass
31
- - [ ] Code is clean and follows project conventions
32
- - [ ] No unrelated changes
33
- - [ ] Every landed unit's checklist item is ticked
34
-
35
- ## Report Format
36
-
37
- End your work with one of these status lines:
38
-
39
- **DONE** — All steps completed, tests pass, code committed.
40
-
41
- **DONE_WITH_CONCERNS** — Completed but I noticed: [describe concerns].
42
-
43
- **NEEDS_CONTEXT** — I need clarification on: [specific questions].
44
-
45
- **BLOCKED** — Cannot proceed because: [describe blocker].
46
-
47
- It is always OK to report BLOCKED or NEEDS_CONTEXT. Do not guess or improvise when uncertain.
@@ -1,27 +0,0 @@
1
- # Spec Compliance Reviewer Prompt
2
-
3
- The implementer says they finished this task. Verify independently — their report may be incomplete or optimistic.
4
-
5
- ## Task Requirements
6
-
7
- {{TASK_TEXT}}
8
-
9
- ## Instructions
10
-
11
- 1. Read the actual code that was written (not the implementer's report)
12
- 2. Compare line by line against the task requirements
13
- 3. Check for:
14
- - Missing requirements — anything in the task that wasn't implemented
15
- - Extra work — anything added that the task didn't ask for
16
- - Misunderstandings — code that doesn't match what the task intended
17
- - Test coverage — are all specified behaviors tested?
18
-
19
- ## Report Format
20
-
21
- **PASS** — All task requirements are correctly implemented. No gaps, no extras.
22
-
23
- **FAIL** — Issues found:
24
- - [file:line] Description of what's wrong and what was expected
25
- - [file:line] Description of what's missing
26
-
27
- Be specific. Reference exact file paths and line numbers.