@zalom/plastic 2.0.0-alpha.9 → 2.0.2

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 (326) hide show
  1. package/PLASTIC.md +13 -136
  2. package/README.md +357 -133
  3. package/agents/plastic-enforcer.md +21 -16
  4. package/agents/plastic-executor.md +15 -4
  5. package/agents/plastic-node-research.md +30 -0
  6. package/agents/plastic-node-verify.md +28 -0
  7. package/agents/plastic-node-work.md +33 -0
  8. package/agents/{plastic-advisor.md → plastic-primary-advisor.md} +7 -9
  9. package/agents/{plastic-faux-advisor.md → plastic-secondary-advisor.md} +9 -12
  10. package/assets/plastic-logo.svg +1 -0
  11. package/bin/crap +4 -0
  12. package/bin/lib/context_budget.rb +43 -6
  13. package/bin/lib/skill_census.rb +839 -0
  14. package/bin/plastic +8 -0
  15. package/bin/plastic-skill-census +114 -0
  16. package/bin/test +24 -4
  17. package/bin/verify-change +345 -0
  18. package/config_asks.yml +4 -4
  19. package/deprecations.yml +1 -1
  20. package/{skills/agent-advisor/references → docs/help}/advisor-protocol.md +19 -24
  21. package/{skills/auto/references → docs/help}/agent-architecture.md +16 -14
  22. package/docs/help/completion-and-done.md +53 -0
  23. package/docs/help/human-report-contract.md +152 -0
  24. package/{skills/conventions/references → docs/help}/knowledge-graph.md +9 -0
  25. package/{skills/conventions/references → docs/help}/locks-and-worktrees.md +11 -13
  26. package/{skills/conventions/references → docs/help}/maintenance-and-revisions.md +1 -1
  27. package/{skills/conventions/references → docs/help}/roadmaps.md +5 -4
  28. package/{skills/tutorial/references → docs/help}/track-1-guided.md +28 -47
  29. package/{skills/tutorial/references → docs/help}/track-2-auto.md +8 -8
  30. package/{skills/tutorial/references → docs/help}/track-3-projects-and-roadmaps.md +24 -17
  31. package/hooks/call-budget +4 -0
  32. package/hooks/hooks.json +24 -0
  33. package/hooks/message-display +55 -2
  34. package/hooks/session-start +5 -1
  35. package/hooks/statusline +32 -27
  36. package/hooks/stop +5 -0
  37. package/package.json +5 -3
  38. package/scripts/append-ledger +2 -1
  39. package/scripts/dashboard.rb +267 -16
  40. package/scripts/day-summary +2 -1
  41. package/scripts/doctor.rb +680 -39
  42. package/scripts/end-intent +378 -56
  43. package/scripts/exec-worktree +5 -5
  44. package/scripts/file-session-intent +2 -1
  45. package/scripts/graph-measure +249 -0
  46. package/scripts/hook-call-budget +222 -0
  47. package/scripts/hook-capture +24 -123
  48. package/scripts/hook-close +2 -1
  49. package/scripts/hook-message-display +7 -0
  50. package/scripts/hook-record +24 -16
  51. package/scripts/hook-savepoint +27 -3
  52. package/scripts/hook-session-start +359 -321
  53. package/scripts/hook-stop +58 -0
  54. package/scripts/index-projection +74 -0
  55. package/scripts/insight-append +17 -4
  56. package/scripts/install.rb +9 -7
  57. package/scripts/lib/action_graph_shim.rb +279 -0
  58. package/scripts/lib/active_delivery.rb +105 -0
  59. package/scripts/lib/agent_models.rb +63 -25
  60. package/scripts/lib/arm.rb +74 -91
  61. package/scripts/lib/atomic_write.rb +31 -0
  62. package/scripts/lib/backup.rb +65 -0
  63. package/scripts/lib/cli/command.rb +92 -0
  64. package/scripts/lib/cli/commands/auto.rb +18 -0
  65. package/scripts/lib/cli/commands/auto_brief.rb +44 -0
  66. package/scripts/lib/cli/commands/auto_lock.rb +111 -0
  67. package/scripts/lib/cli/commands/auto_report.rb +50 -0
  68. package/scripts/lib/cli/commands/auto_take.rb +68 -0
  69. package/scripts/lib/cli/commands/backup.rb +43 -0
  70. package/scripts/lib/cli/commands/checkout.rb +25 -0
  71. package/scripts/lib/cli/commands/continue.rb +66 -0
  72. package/scripts/lib/cli/commands/doctor.rb +81 -0
  73. package/scripts/lib/cli/commands/feedback.rb +40 -0
  74. package/scripts/lib/cli/commands/help.rb +69 -0
  75. package/scripts/lib/cli/commands/hook.rb +32 -0
  76. package/scripts/lib/cli/commands/index.rb +23 -0
  77. package/scripts/lib/cli/commands/install.rb +21 -0
  78. package/scripts/lib/cli/commands/installer_verb.rb +37 -0
  79. package/scripts/lib/cli/commands/intent.rb +19 -0
  80. package/scripts/lib/cli/commands/intent_answer.rb +37 -0
  81. package/scripts/lib/cli/commands/intent_command.rb +58 -0
  82. package/scripts/lib/cli/commands/intent_end.rb +75 -0
  83. package/scripts/lib/cli/commands/intent_new.rb +62 -0
  84. package/scripts/lib/cli/commands/intent_note.rb +43 -0
  85. package/scripts/lib/cli/commands/intent_rule.rb +36 -0
  86. package/scripts/lib/cli/commands/intent_show.rb +32 -0
  87. package/scripts/lib/cli/commands/intent_spec.rb +44 -0
  88. package/scripts/lib/cli/commands/intent_step.rb +79 -0
  89. package/scripts/lib/cli/commands/intent_verify.rb +26 -0
  90. package/scripts/lib/cli/commands/migrate.rb +16 -0
  91. package/scripts/lib/cli/commands/migrate_stores.rb +31 -0
  92. package/scripts/lib/cli/commands/next.rb +54 -0
  93. package/scripts/lib/cli/commands/project.rb +19 -0
  94. package/scripts/lib/cli/commands/project_links.rb +46 -0
  95. package/scripts/lib/cli/commands/project_list.rb +20 -0
  96. package/scripts/lib/cli/commands/project_new.rb +95 -0
  97. package/scripts/lib/cli/commands/query.rb +31 -0
  98. package/scripts/lib/cli/commands/render.rb +35 -0
  99. package/scripts/lib/cli/commands/roadmap.rb +19 -0
  100. package/scripts/lib/cli/commands/roadmap_check.rb +54 -0
  101. package/scripts/lib/cli/commands/roadmap_log.rb +54 -0
  102. package/scripts/lib/cli/commands/roadmap_migrate.rb +53 -0
  103. package/scripts/lib/cli/commands/roadmap_next.rb +77 -0
  104. package/scripts/lib/cli/commands/roadmap_show.rb +65 -0
  105. package/scripts/lib/cli/commands/rollback.rb +20 -0
  106. package/scripts/lib/cli/commands/search.rb +60 -0
  107. package/scripts/lib/cli/commands/session.rb +18 -0
  108. package/scripts/lib/cli/commands/session_commit.rb +42 -0
  109. package/scripts/lib/cli/commands/session_handoff.rb +34 -0
  110. package/scripts/lib/cli/commands/session_summary.rb +35 -0
  111. package/scripts/lib/cli/commands/status.rb +68 -0
  112. package/scripts/lib/cli/commands/subcommand_list.rb +36 -0
  113. package/scripts/lib/cli/commands/sync.rb +55 -0
  114. package/scripts/lib/cli/commands/uninstall.rb +20 -0
  115. package/scripts/lib/cli/commands/update.rb +20 -0
  116. package/scripts/lib/cli/commands/version.rb +53 -0
  117. package/scripts/lib/cli/frontier.rb +86 -0
  118. package/scripts/lib/cli/intent_progress.rb +36 -0
  119. package/scripts/lib/cli/legacy.rb +80 -0
  120. package/scripts/lib/cli/output.rb +137 -0
  121. package/scripts/lib/cli/scope.rb +134 -0
  122. package/scripts/lib/cli/table.rb +65 -0
  123. package/scripts/lib/cli.rb +94 -0
  124. package/scripts/lib/codex_adapter.rb +198 -0
  125. package/scripts/lib/compact_instructions.rb +13 -5
  126. package/scripts/lib/core_integrity.rb +71 -0
  127. package/scripts/lib/dashboard_screen.rb +40 -0
  128. package/scripts/lib/data_boundary.rb +132 -0
  129. package/scripts/lib/day_summary.rb +23 -14
  130. package/scripts/lib/doctor_core.rb +114 -38
  131. package/scripts/lib/doctor_session_ledger.rb +5 -53
  132. package/scripts/lib/engine_permissions.rb +88 -0
  133. package/scripts/lib/exec_worktree.rb +24 -21
  134. package/scripts/lib/feedback_report.rb +1 -1
  135. package/scripts/lib/graph_edges.rb +137 -0
  136. package/scripts/lib/graph_file.rb +246 -0
  137. package/scripts/lib/graph_measure.rb +645 -0
  138. package/scripts/lib/graph_measure_budget.rb +409 -0
  139. package/scripts/lib/graph_measure_cohorts.rb +487 -0
  140. package/scripts/lib/graph_measure_models.rb +413 -0
  141. package/scripts/lib/graph_measure_report.rb +532 -0
  142. package/scripts/lib/graph_tree.rb +98 -0
  143. package/scripts/lib/guarded_append.rb +155 -0
  144. package/scripts/lib/handoff.rb +40 -13
  145. package/scripts/lib/harness_adapter.rb +184 -0
  146. package/scripts/lib/hook_registry.rb +27 -3
  147. package/scripts/lib/hook_replay.rb +235 -0
  148. package/scripts/lib/index_entry.rb +62 -0
  149. package/scripts/lib/index_projection.rb +201 -0
  150. package/scripts/lib/insights.rb +1 -1
  151. package/scripts/lib/installer_core.rb +543 -71
  152. package/scripts/lib/intent_screen.rb +4 -4
  153. package/scripts/lib/intent_screen_ansi.rb +73 -12
  154. package/scripts/lib/intent_validator.rb +2 -2
  155. package/scripts/lib/lock.rb +10 -11
  156. package/scripts/lib/message_display.rb +350 -54
  157. package/scripts/lib/meter_watch.rb +185 -0
  158. package/scripts/lib/node_file.rb +234 -0
  159. package/scripts/lib/node_ids.rb +99 -0
  160. package/scripts/lib/node_input.rb +921 -0
  161. package/scripts/lib/node_input_compatibility.rb +62 -0
  162. package/scripts/lib/node_ledger.rb +386 -0
  163. package/scripts/lib/node_progress.rb +153 -0
  164. package/scripts/lib/node_return.rb +204 -0
  165. package/scripts/lib/node_worktree.rb +337 -0
  166. package/scripts/lib/outcome_report.rb +440 -0
  167. package/scripts/lib/preflight.rb +4 -6
  168. package/scripts/lib/project_config.rb +46 -0
  169. package/scripts/lib/project_validator.rb +3 -2
  170. package/scripts/lib/qmd_sync.rb +8 -7
  171. package/scripts/lib/ready_set.rb +462 -0
  172. package/scripts/lib/reference_archive.rb +45 -0
  173. package/scripts/lib/release_guard.rb +18 -0
  174. package/scripts/lib/report_screen.rb +1371 -47
  175. package/scripts/lib/rlm/corpus.rb +13 -0
  176. package/scripts/lib/rlm/probe.rb +29 -0
  177. package/scripts/lib/rlm/query.rb +22 -0
  178. package/scripts/lib/roadmap_graph.rb +210 -0
  179. package/scripts/lib/roadmap_migration.rb +95 -0
  180. package/scripts/lib/roadmap_queue.rb +170 -12
  181. package/scripts/lib/roadmap_render.rb +150 -0
  182. package/scripts/lib/roadmap_savepoint.rb +64 -14
  183. package/scripts/lib/runner_absorb.rb +703 -0
  184. package/scripts/lib/runner_answer.rb +206 -0
  185. package/scripts/lib/runner_core.rb +194 -0
  186. package/scripts/lib/runner_dispatch.rb +526 -0
  187. package/scripts/lib/runner_policy.rb +191 -0
  188. package/scripts/lib/runner_proposals.rb +275 -0
  189. package/scripts/lib/runner_rewind.rb +201 -0
  190. package/scripts/lib/runner_sweep.rb +231 -0
  191. package/scripts/lib/runner_until_empty.rb +252 -0
  192. package/scripts/lib/runner_watch.rb +389 -0
  193. package/scripts/lib/savepoint.rb +141 -19
  194. package/scripts/lib/scaffold_intent.rb +6 -3
  195. package/scripts/lib/screen_paint.rb +365 -28
  196. package/scripts/lib/screens/dashboard.rb +20 -0
  197. package/scripts/lib/screens/plan.rb +18 -0
  198. package/scripts/lib/screens/roadmap.rb +15 -0
  199. package/scripts/lib/search_index.rb +55 -0
  200. package/scripts/lib/session_close.rb +30 -28
  201. package/scripts/lib/session_git.rb +67 -19
  202. package/scripts/lib/session_ledger.rb +48 -4
  203. package/scripts/lib/session_usage.rb +190 -0
  204. package/scripts/lib/sqlite.rb +22 -0
  205. package/scripts/lib/stop_gate.rb +95 -0
  206. package/scripts/lib/store_discovery.rb +7 -6
  207. package/scripts/lib/store_layout.rb +54 -0
  208. package/scripts/lib/store_provisioning.rb +2 -1
  209. package/scripts/lib/store_sync.rb +85 -0
  210. package/scripts/lib/stores_move.rb +93 -0
  211. package/scripts/lib/untouched_scaffold.rb +51 -0
  212. package/scripts/lib/verify_intent.rb +36 -8
  213. package/scripts/lib/version_number.rb +48 -0
  214. package/scripts/lib/work_graph.rb +59 -0
  215. package/scripts/lib/work_graph_validator.rb +201 -0
  216. package/scripts/lib/worktree.rb +27 -32
  217. package/scripts/lib/worktree_sweep.rb +6 -5
  218. package/scripts/link-suggest +2 -1
  219. package/scripts/meter-watch +57 -0
  220. package/scripts/migrate-to-global +1 -1
  221. package/scripts/new-intent +4 -13
  222. package/scripts/node-input +92 -0
  223. package/scripts/node-run +225 -0
  224. package/scripts/node-transition +291 -0
  225. package/scripts/outcome-report +74 -0
  226. package/scripts/plastic-lock +65 -60
  227. package/scripts/project-links +6 -21
  228. package/scripts/promote-session-item +3 -2
  229. package/scripts/read-config +53 -9
  230. package/scripts/ready-set +126 -0
  231. package/scripts/release-check +123 -0
  232. package/scripts/report-screen +177 -16
  233. package/scripts/roadmap-graph +125 -0
  234. package/scripts/roadmap-savepoint +7 -0
  235. package/scripts/rollback.rb +5 -1
  236. package/scripts/runner +581 -0
  237. package/scripts/savepoint-note +11 -9
  238. package/scripts/session-commit +2 -1
  239. package/scripts/session-usage +56 -0
  240. package/scripts/skill-lint +115 -6
  241. package/scripts/spawn-preamble +2 -2
  242. package/scripts/update.rb +31 -4
  243. package/scripts/validate-work-graph +39 -0
  244. package/scripts/verify-intent +3 -2
  245. package/scripts/write-handoff +2 -1
  246. package/templates/agents.md +7 -7
  247. package/templates/config.yml +16 -9
  248. package/templates/dashboard-screen.md +22 -0
  249. package/templates/display-fixture.md +21 -0
  250. package/templates/graph.md +16 -0
  251. package/templates/index.md +1 -1
  252. package/templates/intent-screen.md +1 -1
  253. package/templates/node-decision.md +11 -0
  254. package/templates/node-research.md +13 -0
  255. package/templates/node-verify.md +13 -0
  256. package/templates/node-work.md +22 -0
  257. package/templates/outcome.md +8 -3
  258. package/templates/project.yml +1 -1
  259. package/templates/render.css +10 -0
  260. package/templates/report-plan.md +15 -0
  261. package/templates/report-roadmap-delivered.md +10 -0
  262. package/templates/report-roadmap-plan.md +9 -0
  263. package/templates/report-roadmap-state.md +9 -0
  264. package/templates/report-state.md +1 -1
  265. package/templates/roadmap.md +13 -0
  266. package/bin/plastic.js +0 -70
  267. package/scripts/lib/bridge.rb +0 -116
  268. package/skills/agent-advisor/SKILL.md +0 -92
  269. package/skills/auto/SKILL.md +0 -296
  270. package/skills/auto/evals/evals.json +0 -255
  271. package/skills/auto/references/end-tail.md +0 -66
  272. package/skills/auto/references/human-report-contract.md +0 -78
  273. package/skills/conventions/SKILL.md +0 -29
  274. package/skills/conventions/references/completion-and-done.md +0 -43
  275. package/skills/dashboard/SKILL.md +0 -169
  276. package/skills/dashboard/evals/evals.json +0 -38
  277. package/skills/dashboard/references/classification.md +0 -22
  278. package/skills/dashboard/templates/dashboard-global.md +0 -20
  279. package/skills/dashboard/templates/dashboard-project.md +0 -19
  280. package/skills/direct/SKILL.md +0 -66
  281. package/skills/direct/references/request-signals.md +0 -59
  282. package/skills/doctor/SKILL.md +0 -299
  283. package/skills/doctor/report.md +0 -102
  284. package/skills/feedback/SKILL.md +0 -98
  285. package/skills/feedback/references/transport-and-privacy.md +0 -65
  286. package/skills/feedback/report.md +0 -36
  287. package/skills/install/SKILL.md +0 -217
  288. package/skills/intent-continuing/SKILL.md +0 -154
  289. package/skills/intent-continuing/references/board-fill.md +0 -43
  290. package/skills/intent-continuing/references/boarding-matrix.md +0 -34
  291. package/skills/intent-continuing/references/context-management.md +0 -28
  292. package/skills/intent-continuing/references/liveness-ranking.md +0 -57
  293. package/skills/intent-creating/SKILL.md +0 -164
  294. package/skills/intent-creating/evals/evals.json +0 -72
  295. package/skills/intent-creating/references/lifecycle.md +0 -81
  296. package/skills/intent-creating/references/wikilinks.md +0 -8
  297. package/skills/intent-ending/SKILL.md +0 -176
  298. package/skills/intent-ending/evals/evals.json +0 -74
  299. package/skills/intent-executing/SKILL.md +0 -170
  300. package/skills/intent-executing/evals/evals.json +0 -66
  301. package/skills/intent-executing/implementer-prompt.md +0 -42
  302. package/skills/intent-executing/spec-reviewer-prompt.md +0 -27
  303. package/skills/intent-speccing/SKILL.md +0 -130
  304. package/skills/intent-speccing/evals/evals.json +0 -126
  305. package/skills/intent-speccing/references/design-principles.md +0 -44
  306. package/skills/intent-speccing/references/per-section-fill-rules.md +0 -92
  307. package/skills/intent-speccing/references/self-verify-checklist.md +0 -37
  308. package/skills/project-creating/SKILL.md +0 -162
  309. package/skills/project-creating/references/hubs-projects.md +0 -55
  310. package/skills/project-creating/references/project-scaffolding.md +0 -97
  311. package/skills/releasing/SKILL.md +0 -337
  312. package/skills/releasing/references/deprecations.md +0 -60
  313. package/skills/releasing/references/promotion-and-tagging.md +0 -66
  314. package/skills/releasing/references/release-lines.md +0 -105
  315. package/skills/roadmap/SKILL.md +0 -64
  316. package/skills/roadmap/references/file-format.md +0 -124
  317. package/skills/roadmap/references/operations.md +0 -112
  318. package/skills/rollback/SKILL.md +0 -91
  319. package/skills/tutorial/SKILL.md +0 -65
  320. package/skills/tutorial/evals/evals.json +0 -186
  321. package/skills/uninstall/SKILL.md +0 -75
  322. package/skills/update/SKILL.md +0 -126
  323. /package/{skills/auto/references → docs/help}/agent-report-contract.md +0 -0
  324. /package/{skills/intent-executing → docs/help}/code-quality-reviewer-prompt.md +0 -0
  325. /package/{skills/conventions/references → docs/help}/lifecycle-and-savepoints.md +0 -0
  326. /package/{skills/intent-executing → docs/help}/plan-reviewer-prompt.md +0 -0
@@ -1,337 +0,0 @@
1
- ---
2
- name: plastic-releasing
3
- description: Use when merging a feature branch to main and tagging a release, bumping the version, or when the user says "release", "tag", or "ship it"
4
- user-invocable: true
5
- ---
6
-
7
- # Releasing
8
-
9
- Merge, bump, tag, push. Annotated tags with changelogs. Semantic versioning.
10
- Project configuration drives the workflow - no hardcoded assumptions.
11
-
12
- ## Checklist
13
-
14
- - [ ] Read project config
15
- - [ ] All tests pass (or verification skipped per config)
16
- - [ ] Merge feature branch to main
17
- - [ ] Bump version in configured version files
18
- - [ ] Stable-cut guard passes (version files agree, no pre-release suffix; stable/latest cuts only)
19
- - [ ] Commit version bump
20
- - [ ] Create annotated tag
21
- - [ ] Push to remote with tags
22
- - [ ] Run post-push actions (GitHub release, npm publish, etc.)
23
- - [ ] Verify release sync (npm dist-tag, GitHub "Latest", git tag all show the new version)
24
- - [ ] Clean up the intent's worktrees (merge-then-remove)
25
- - [ ] Complete active intent
26
-
27
- ## Workflow
28
-
29
- ### 0. Read Project Config
30
-
31
- Before anything else, determine which project we are releasing and load its config.
32
-
33
- 1. Read `~/.plastic/projects.yml` - find the project whose `path` matches the current working directory.
34
- 2. Extract the project slug (the key under `projects:`).
35
- 3. Read `~/.plastic/projects/{slug}/project.yml` - this contains the `release:` section.
36
-
37
- Expected `release:` keys in project.yml:
38
-
39
- ```yaml
40
- release:
41
- verify: "bin/rails test" # command to run before release
42
- version_file: package.json # single file containing the version
43
- version_files: # multiple files (overrides version_file)
44
- - package.json # list EVERY file carrying the version;
45
- - .claude-plugin/plugin.json # they must all be bumped together or they drift
46
- - .claude-plugin/marketplace.json
47
- tag_format: "v{{version}}" # tag naming pattern ({{version}} is replaced)
48
- on_green: # actions to run after push succeeds
49
- - github_release
50
- - npm_publish
51
- on_complete: commit_and_push # what to do with the version bump commit
52
- on_red: stop # what to do if verification fails
53
- ```
54
-
55
- **Fallback:** If no project.yml exists or it has no `release:` section, fall back to asking the user for each step - verify command, version files, tag format, and post-push actions.
56
-
57
- ### 1. Verify Tests Pass
58
-
59
- Run the verification command from `release.verify` in project.yml:
60
-
61
- ```bash
62
- # Example: release.verify = "ruby -Itest test/*_test.rb"
63
- <verify-command-from-config>
64
- ```
65
-
66
- - If `release.verify` is present: run it. All checks must pass before proceeding.
67
- - If `release.verify` is absent or empty: skip verification. Log that no verify command is configured.
68
- - If `release.on_red` is `stop`: abort the release on failure.
69
- - If `release.on_red` is `fix_and_retry`: ask the user to fix and re-run.
70
-
71
- ### 2. Determine Version Bump
72
-
73
- | Change type | Bump | Example |
74
- |-------------|------|---------|
75
- | Breaking changes | Major | 0.x.0 → 1.0.0 |
76
- | New features | Minor | 0.3.0 → 0.4.0 |
77
- | Bug fixes only | Patch | 0.4.0 → 0.4.1 |
78
-
79
- Pre-1.0: minor bumps for features, patch for fixes. No major until stable.
80
-
81
- ### 3. Merge Feature Branch
82
-
83
- ```bash
84
- git checkout main
85
- git merge <branch-name> --no-ff -m "feat: merge intent [ID] - [description]"
86
- ```
87
-
88
- Always `--no-ff` to preserve branch history in the merge commit.
89
-
90
- **Worktree-isolated intents (intent 73c3).** A worktree-delivered intent's code lives on
91
- `plastic/{id}--{slug}`, merged together with cleanup in step 9, not on a hand-made feature
92
- branch. Do not delete the worktree before its branch is merged, or the work is lost. For
93
- the full rationale and the already-merged-by-hand no-op case, read
94
- `references/promotion-and-tagging.md`.
95
-
96
- ### 4. Bump Version
97
-
98
- **Stable-cut guard.** Before touching any version file for a stable (no pre-release suffix,
99
- `latest`) cut, run the guard in `scripts/lib/release_guard.rb`:
100
-
101
- ```ruby
102
- require "./scripts/lib/release_guard"
103
- result = ReleaseGuard.check(
104
- package_json: "package.json",
105
- plugin_json: ".claude-plugin/plugin.json",
106
- marketplace_json: ".claude-plugin/marketplace.json",
107
- stable: true
108
- )
109
- raise "release guard failed: #{result.mismatches} #{result.prerelease_suffix}" unless result.ok?
110
- ```
111
-
112
- If it reports a mismatch or a pre-release-suffix violation, stop and resolve it before bumping
113
- any file. For a beta or alpha cut, pass `stable: false`; only version-file agreement is checked,
114
- a pre-release suffix is expected. Read `references/release-lines.md` for the stable-line
115
- guarantees this guard protects.
116
-
117
- Determine which files to update from project.yml:
118
-
119
- - If `release.version_files` is set: update ALL listed files (they must stay in sync).
120
- - Else if `release.version_file` is set: update that single file.
121
- - Else: ask the user which files contain the version.
122
-
123
- Update the version string in each file, then commit:
124
-
125
- **Cut the CHANGELOG entry.** Before committing, edit `CHANGELOG.md` at the repo root so
126
- the changelog change rides this same version-bump commit and reaches the tag. Write one
127
- line in the existing shape:
128
-
129
- `` `<version>` - shipped <date>; collected <intent-id> (<one-line summary>) ``
130
-
131
- Prepend it as the first bullet under `## Released` (newest-first). If this version was
132
- sitting under `## Unreleased`, move it out of that section and into `## Released`. Keep
133
- the line intent-centric narrative (which intents the cut collected and why), NOT commit
134
- detail: step 5's tag-message changelog and step 7's `gh release create --generate-notes`
135
- already own the commit-level detail, so do not duplicate it here.
136
-
137
- ```bash
138
- git add <version-files> CHANGELOG.md
139
- git commit -m "chore: bump version to X.Y.Z - [one-line summary]"
140
- ```
141
-
142
- ### 5. Create Annotated Tag
143
-
144
- Read `release.tag_format` from project.yml to determine the tag name:
145
-
146
- - If set (e.g. `"v{{version}}"`): replace `{{version}}` with the new version string.
147
- - If not set: default to `vX.Y.Z`.
148
-
149
- Generate the changelog from commits since the last tag:
150
-
151
- ```bash
152
- git log $(git describe --tags --abbrev=0)..HEAD --oneline --no-merges | grep -E "^[a-f0-9]+ (feat|fix|refactor):"
153
- ```
154
-
155
- Create the tag with a multi-line message:
156
-
157
- ```bash
158
- git tag -a <tag-name> -m "<tag-name> - [release name]
159
-
160
- - [changelog bullet points from feat/fix/refactor commits]"
161
- ```
162
-
163
- ### 6. Push
164
-
165
- ```bash
166
- git push origin main --tags
167
- ```
168
-
169
- ### 7. Post-Push Actions
170
-
171
- Read `release.on_green` from project.yml. This is a list of actions to run after a successful push. Execute each in order:
172
-
173
- #### `github_release`
174
-
175
- Create a GitHub release from the tag:
176
-
177
- ```bash
178
- gh release create <tag-name> --title "<tag-name> - [release name]" --latest --generate-notes --notes-start-tag <previous-tag>
179
- ```
180
-
181
- `--latest` is REQUIRED. Pre-release (alpha/beta) tags are NOT auto-promoted to the "Latest"
182
- badge by GitHub, so without it the Releases page keeps showing an older version as Latest while
183
- the newest tag sits below it (a real sync drift we hit on the alpha line). Pass `--latest` on
184
- every release so the newest one always carries the badge. Do NOT pass `--prerelease` unless you
185
- specifically want the release hidden from Latest.
186
-
187
- For the first release (no previous tag), write notes manually with `--notes "..."` instead.
188
-
189
- #### `npm_publish`
190
-
191
- Publish the package to npm with the appropriate dist-tag:
192
-
193
- ```bash
194
- # Alpha pre-release (version contains -alpha):
195
- npm publish --access public --tag alpha
196
-
197
- # Beta pre-release (version contains -beta):
198
- npm publish --access public --tag beta
199
-
200
- # Stable release (no pre-release suffix, >= 1.0.0):
201
- npm publish --access public
202
- ```
203
-
204
- The dist-tag is derived from the version string in `package.json`:
205
- - Contains `-alpha` → `--tag alpha`
206
- - Contains `-beta` → `--tag beta`
207
- - No pre-release suffix → no `--tag` flag (publishes to `latest`)
208
-
209
- #### Other values
210
-
211
- If `on_green` contains an action not listed above, log it:
212
-
213
- ```
214
- [releasing] Action "<action>" is configured but not yet implemented. Skipping.
215
- ```
216
-
217
- If `on_green` is empty or absent: skip post-push actions entirely.
218
-
219
- #### Verify sync (always, after the post-push actions)
220
-
221
- A release is not done until all three surfaces show the SAME newest version. Confirm:
222
-
223
- ```bash
224
- npm view <package> dist-tags # channel tag (alpha/beta/latest) -> new version
225
- gh release list --limit 1 # newest release is the new tag AND marked "Latest"
226
- git ls-remote --tags origin | grep <tag-name> # the tag reached the remote
227
- ```
228
-
229
- If the GitHub "Latest" badge is on an older tag (the common drift), fix it without re-releasing:
230
-
231
- ```bash
232
- gh release edit <tag-name> --latest
233
- ```
234
-
235
- ### 8. Clean Up the Intent's Worktrees (merge-then-remove)
236
-
237
- This step now runs BEFORE step 9's `end-intent` call (intent 188, D7): `scripts/end-intent`
238
- gained its own step 5 that disarms (releases the worktree, clears `delivery.lock`) as part
239
- of every close. Its plain-remove shape does not merge, so if `end-intent` ran first on a
240
- release, its step 5 would remove the worktree WITHOUT merging the code branch first,
241
- stranding the integrated work (`Worktree.finish` returns early once the worktree block it
242
- needs is gone, per `worktree.rb`'s own "no-op if nothing was provisioned" contract).
243
- Running this merge-then-remove step first means the worktree is already gone by the time
244
- step 9 runs, so `end-intent`'s own disarm becomes a harmless no-op for the worktree
245
- (nothing left to remove), while for the FIRST time on this path it also clears the delivery
246
- lock correctly (G5): before intent 188 this path left the lock stranded, exactly the class
247
- of bug closed by the End-tail enforcement work.
248
-
249
- This is the release branch of `plastic-intent-ending`'s Step 5 disarm (`merge: true`), not a
250
- separate concern: a release is the merge-then-remove path for the intent's worktree (intent
251
- 73c3), so the intent's code branch is merged back into the default branch BEFORE the worktree
252
- is removed. Drive it through `Worktree.finish` with `merge: true`, which merges the code
253
- branch, then removes the worktree, and prunes the repo:
254
-
255
- ```bash
256
- ruby -r ~/.plastic/scripts/lib/worktree -r ~/.plastic/scripts/lib/arm -e \
257
- 'Worktree.finish(Arm.bridge_hash(intent_dir: "<STORE>/<dir>"), merge: true)'
258
- ```
259
-
260
- (The worktree block is derived from `projects.yml` and the intent id, so the one-liner needs
261
- only the intent directory; the `/tmp` bridge it once discovered was removed in 2.0, intent 307.)
262
-
263
- Honor the worktree-cleanup rule: never leave an orphaned worktree, and run `git worktree
264
- prune` in the affected repo if you hit a stale reference. For why this is the one place the
265
- merge-vs-remove policy lands on merge, and the fail-open/idempotent guarantees of `finish`,
266
- read `references/promotion-and-tagging.md`.
267
-
268
- ### 9. Complete Active Intent
269
-
270
- A release IS a delivery. The active intent that drove this work must be completed as part of the release process. This is NOT optional. The mechanical close (outcome/INDEX/savepoint/commit, AND disarm since intent 188) is `plastic-intent-ending`'s job, not this skill's: run its backing script rather than restating that prose here.
271
-
272
- 1. Read `~/.plastic/INDEX.md` (or the project's INDEX.md) - find active intent(s) related to this release.
273
- 2. For each active intent being delivered:
274
- a. Write a real `outcome.md` (never leave the scaffold placeholder), `disposition: delivered`, referencing the release tag.
275
- b. Update `## Insights` with final observations.
276
- c. Run the mechanical close (`scripts/end-intent`'s steps 1-5): this stamps the intent file's `## Outcome` summary, moves the INDEX.md line to `## Completed` (dated today, with a rich entry description via `--index-note`), appends the savepoint `Done` bookend, commits the store, and disarms (releases the worktree - already gone from step 8 above - and clears `delivery.lock`), all in one call:
277
- ```bash
278
- ruby ~/.plastic/scripts/end-intent --store <store_path> --id <ID> --disposition delivered \
279
- --session "$CLAUDE_CODE_SESSION_ID" \
280
- --outcome-summary "delivered in <tag-name>: <one-line summary>" \
281
- --index-note "<tag-name>, <mode>; <what shipped>; <suite result>"
282
- ```
283
- A non-zero exit needs attention: 4 means a live foreign session holds the lock (back
284
- off), 5 means the code worktree is still dirty (should not happen here, since step 8
285
- already removed it; investigate before overriding with `--discard-worktree-changes`),
286
- 3 means disarm ran but the lock is still present (run `/plastic-doctor check the lock
287
- status`).
288
- d. Update clusters to show `_(completed)_`.
289
-
290
- **If no active intent exists for this release**, that itself is a problem - work happened outside the intent system. Log it and move on, but flag it.
291
-
292
- ## Release lines and channels
293
-
294
- Two lanes get code to a release, on top of the workflow above.
295
-
296
- - **Default lane.** Branch, merge to main, cut stable, publish to npm `latest`. This is the
297
- workflow in the steps above, unchanged. Use it for additive, suite-verifiable,
298
- low-blast-radius work.
299
- - **Beta-verified lane.** Branch, merge to `beta`, publish to the npm `beta` channel, verify in
300
- real use, then merge to main and cut stable. Use it for work that changes operational
301
- substrate, or carries data, migration, lock, or state-format risk, or that a hermetic suite
302
- cannot fully validate on its own.
303
-
304
- **Stable-line guarantees.** An external `latest` user can rely on:
305
-
306
- - `main` is always green and releasable; no pending revert awaiting re-land sits on `main`.
307
- - A stable release carries no pre-release suffix, publishes to `latest`, and the newest release
308
- always carries the GitHub "Latest" badge.
309
- - The three version files always agree, checked by `scripts/lib/release_guard.rb` (see Bump
310
- Version above).
311
- - A stable cut collects only intents that cleared their lane's verification bar.
312
- - Channel semantics are fixed: `latest` is stable, `beta` is the verification line, `alpha` is
313
- experimental.
314
-
315
- Read `references/release-lines.md` for the full lane-routing detail, the version-line map, and
316
- the intent-41 re-land playbook.
317
-
318
- ## Conventions
319
-
320
- - **Annotated tags only** - `git tag -a`, never lightweight tags
321
- - **Tag format** - driven by `release.tag_format` in project.yml (default: `vX.Y.Z`)
322
- - **Tag message** - first line: `<tag> - [short name]`, then blank line, then bullet changelog
323
- - **Commit prefixes** - `feat:`, `fix:`, `refactor:`, `chore:`, `docs:` (conventional commits)
324
- - **Hyphens, never em-dashes** - in tag names, release titles, and commit messages, use a hyphen (`-`). Never an em-dash.
325
- - **Latest badge** - always `gh release create --latest`; the newest release must carry GitHub's "Latest" badge.
326
- - **Version files** - driven by project.yml; list and bump EVERY file carrying the version (they drift otherwise)
327
- - **Verify sync** - after pushing, confirm npm dist-tag, GitHub "Latest", and the git tag all show the new version
328
- - **Branch cleanup** - delete merged feature branches: `git branch -d <branch>`
329
-
330
- ## References
331
-
332
- - Read `references/release-lines.md` for the two release lanes, the stable-line guarantees,
333
- the version-line map, and the intent-41 re-land playbook before starting any release
334
- - When promoting a pre-release across channels (alpha to beta, beta to stable) or
335
- tagging a historical release retroactively, read `references/promotion-and-tagging.md`
336
- for the exact commands and rules first
337
- - Read `references/deprecations.md` for the full deprecation process, severity levels, deprecations.yml schema, and dismissal rules when adding or managing deprecations
@@ -1,60 +0,0 @@
1
- # Deprecation Process
2
-
3
- When removing a feature, changing a convention, or making a breaking change:
4
-
5
- 1. Add entry to `deprecations.yml` in the Plastic source root
6
- 2. Set severity: `info` (awareness), `warning` (action needed), `critical` (urgent)
7
- 3. Provide clear migration steps
8
- 4. Set `removal` version at least 2 minor versions ahead
9
- 5. SessionStart hook displays active deprecations automatically
10
- 6. Remove the feature AND the deprecation entry together
11
-
12
- ## Pre-1.0 removal policy
13
-
14
- The numbered process above is the steady-state rule: a deprecation rides until its `removal`
15
- version, which step 4 sets at least two minors ahead. While Plastic is still pre-1.0 (any
16
- version below `1.0.0`), one exception applies:
17
-
18
- - **Pre-1.0 exception.** Before `1.0.0`, a *satisfied* deprecation (the migration it
19
- announced is complete on installed machines) may be removed immediately, rather than waiting
20
- for its declared `removal` major. Delete the entry from `deprecations.yml` (leaving
21
- `deprecations: []` if it was the last one) the moment the migration is done.
22
-
23
- This exception only holds below `1.0.0`. From `1.0.0` onward, the steady-state grace rule
24
- (step 4, removal at least two minors ahead) governs again, unchanged. The exception narrows
25
- *when* a satisfied entry may be pulled early during the pre-release line; it does not loosen
26
- the grace window for the released-product contract.
27
-
28
- ## Severity Levels
29
-
30
- | Severity | When to use | Dismissable? |
31
- |----------|-------------|--------------|
32
- | `info` | Upcoming change | Yes |
33
- | `warning` | Action needed | Yes (re-shown at removal) |
34
- | `critical` | Urgent/security | Never |
35
-
36
- ## deprecations.yml Schema
37
-
38
- ```yaml
39
- deprecations:
40
- - id: unique-slug
41
- severity: info | warning | critical
42
- summary: "One-line description"
43
- migration_steps:
44
- - "Step 1"
45
- - "Step 2"
46
- introduced: "0.9.0"
47
- removal: "1.0.0"
48
- link: "optional URL"
49
- ```
50
-
51
- ## Dismissal
52
-
53
- Users dismiss by adding the id to `deprecations_dismissed` in `config.yml`:
54
-
55
- ```yaml
56
- deprecations_dismissed:
57
- - some-deprecated-feature
58
- ```
59
-
60
- Critical deprecations and final-version warnings ignore dismissal.
@@ -1,66 +0,0 @@
1
- # Promotion, Retroactive Tagging, and Worktree Merge Rationale
2
-
3
- Occasional variant paths off the main release workflow: promoting a pre-release
4
- across channels, tagging historical releases retroactively, and the deep rationale
5
- for why the intent's worktree is merged before removal.
6
-
7
- ## Table of Contents
8
-
9
- - [Worktree merge-then-remove rationale](#worktree-merge-then-remove-rationale)
10
- - [Promotion](#promotion)
11
- - [Retroactive Tagging](#retroactive-tagging)
12
-
13
- ## Worktree merge-then-remove rationale
14
-
15
- **Worktree-isolated intents (intent 73c3).** When the intent was delivered in a Plastic
16
- worktree (the bridge has a provisioned `worktree` block), its code lives on the branch
17
- `plastic/{id}--{slug}` inside `<repo>/.claude/worktrees/{id}--{slug}`, not on a hand-made
18
- feature branch. The merge-then-remove of that worktree is handled together with cleanup in
19
- Workflow step 9, which merges `plastic/{id}--{slug}` into the default branch BEFORE removing the
20
- worktree. If you already merged here by hand, step 9 is a clean no-op merge ("Already up to
21
- date") and proceeds straight to removal. Do not delete the worktree before its branch is
22
- merged, or the work is lost.
23
-
24
- A release is the merge-then-remove path for the intent's worktrees. This is the one place
25
- the merge-vs-remove policy lands on "merge": the intent's code branch (`plastic/{id}--{slug}`)
26
- is merged back into the repo's default branch BEFORE the worktree is removed, so the
27
- integrated work is never lost. (The disarm path in `plastic-auto`, by contrast, is a plain
28
- remove because no release is merging the branch.)
29
-
30
- `Worktree.finish` is fail-open and idempotent: a conflicting merge is aborted and logged (the
31
- worktree is still removed rather than stranded), and a second call with the block already
32
- cleared is a no-op.
33
-
34
- ## Promotion
35
-
36
- Promotion is not a CLI flag; there is no `--promote` command. It is a set of steps the
37
- agent performs during the releasing workflow, reusing the normal release mechanics
38
- (version bump, tag, `npm publish` with the channel's dist-tag, GitHub release):
39
-
40
- ```bash
41
- # Promote alpha → beta: set version files from -alpha.N to -beta.1, commit, tag, then
42
- npm publish --access public --tag beta
43
-
44
- # Promote beta → stable: strip the pre-release suffix (e.g., 1.0.0-beta.3 → 1.0.0),
45
- # commit, tag, then
46
- npm publish --access public # no --tag flag publishes to latest
47
- ```
48
-
49
- **Promotion rules:**
50
- - Linear only: alpha → beta → stable. Cannot skip channels.
51
- - Version files are bumped and committed as in a normal release.
52
- - An annotated tag is created for the promoted version, and the GitHub release is cut
53
- as in the normal workflow (`gh release create ... --latest` for stable).
54
- - To point a channel at an already-published version without republishing, move the
55
- dist-tag directly: `npm dist-tag add @zalom/plastic@<version> <channel>`. To move the
56
- GitHub "Latest" badge: `gh release edit <tag> --latest`.
57
-
58
- ## Retroactive Tagging
59
-
60
- For repos without prior tags, tag historical releases:
61
-
62
- ```bash
63
- git tag -a v0.1.0 <commit-sha> -m "v0.1.0 - [description]"
64
- ```
65
-
66
- Use `git log --oneline` to find the right commits (look for version bump commits or major feature merges).
@@ -1,105 +0,0 @@
1
- # Release Lines and Channels
2
-
3
- The two release lanes, the version-line map, and the intent-41 re-land playbook: the deep
4
- material behind SKILL.md's "Release lines and channels" section.
5
-
6
- ## Table of Contents
7
-
8
- - [The two lanes](#the-two-lanes)
9
- - [Routing rule](#routing-rule)
10
- - [Stable-line guarantees](#stable-line-guarantees)
11
- - [Version-line map](#version-line-map)
12
- - [Intent 41 re-land playbook](#intent-41-re-land-playbook)
13
-
14
- ## The two lanes
15
-
16
- **Default lane.** Branch, merge to `main` with `--no-ff`, cut stable, publish to npm `latest`.
17
- This is the workflow SKILL.md documents step by step. It is the path for additive,
18
- suite-verifiable, low-blast-radius work: new skills, prose, deterministic scripts, anything a
19
- green Minitest run can fully vouch for.
20
-
21
- **Beta-verified lane.** Branch, merge to the `beta` branch, publish to the npm `beta` dist-tag,
22
- verify in real use, then merge `beta` into `main` and cut stable. It sits on top of the existing
23
- promotion mechanics (agent-performed channel promotion, linear only, see
24
- `promotion-and-tagging.md`); it names when to use them, not new machinery.
25
-
26
- ## Routing rule
27
-
28
- Work rides the beta-verified lane when it changes operational substrate, carries data,
29
- migration, lock, or state-format risk, or cannot be fully validated by a hermetic suite alone.
30
- Everything else merges straight to main.
31
-
32
- Intent 41's DB layer is the archetypal beta-lane case: it replaces the bridge, lock, and session
33
- file formats with a new persistent SQLite substrate. A green suite proves the code correct; it
34
- cannot prove the new substrate survives real, uncontrolled usage, so real-use verification on
35
- beta comes first.
36
-
37
- The manual-first roadmap's eight 1.1.0 intents (158a, 163, 161, 164, 165, 168, 166, 159) are all
38
- default-lane: skill directory renames, prose rewrites, deterministic step scripts. Additive, and
39
- fully suite-verified.
40
-
41
- ## Stable-line guarantees
42
-
43
- What an external `latest` user can rely on:
44
-
45
- 1. `main` is always green and releasable. No pending revert awaiting re-land sits on `main`.
46
- When something needs beta verification, it comes out of `main` the same day that need is
47
- found (the 226023f precedent), never left half-landed.
48
- 2. A stable release carries no pre-release suffix, publishes to npm `latest`, and the newest
49
- stable release always carries the GitHub "Latest" badge (`gh release create --latest` on
50
- every cut).
51
- 3. The three repo version files (`package.json`, `.claude-plugin/plugin.json`,
52
- `.claude-plugin/marketplace.json`) always agree. Checked mechanically by
53
- `scripts/lib/release_guard.rb`.
54
- 4. A stable cut collects only intents that cleared their lane's bar: default-lane intents by a
55
- green suite, beta-lane intents by suite green plus their lane's own verification (real-use
56
- signal, owner sign-off).
57
- 5. Channel semantics are fixed: `latest` is stable and what an external user should run; `beta`
58
- is the verification line, published but expected to move; `alpha` is experimental,
59
- pre-verification.
60
-
61
- ## Version-line map
62
-
63
- | Line | State | What lands here |
64
- |---|---|---|
65
- | `1.1.x` | Current stable line (main) | Additive or low-risk work merged straight to main; interim stable cuts, including 171's wave-6 cut, stay in this line |
66
- | `1.2.0-beta.1` | On beta (`9ec194b`, unpublished) | Intent 41's DB layer, restored over 1.1.0 by revert-of-revert (`c48601a` then `9ec194b`) |
67
- | `1.2.0` | Reserved | The stable graduation of the DB layer, once beta verification passes; not claimed by any interim `1.1.x` cut |
68
-
69
- A beta-graduated substrate change claims its reserved minor at the moment it actually merges to
70
- main, not before. Nothing else on the `1.1.x` line is blocked waiting for `1.2.0`.
71
-
72
- ## Intent 41 re-land playbook
73
-
74
- Written for the wave-6 cut intent (171) and any future reader to pick a version without
75
- re-deriving this decision.
76
-
77
- **Current state.** The revert-of-revert already sits on the `beta` branch at `9ec194b`, on top
78
- of 1.1.0, versioned `1.2.0-beta.1` (`c48601a`). There is nothing left to execute on the git side;
79
- this playbook describes what happens next, not a pending action.
80
-
81
- **Preconditions**, both required before any npm publish of `1.2.0-beta.1`:
82
-
83
- - (a) One documentation pass over beta-line skills and docs for the hybrid savepoint contract:
84
- on beta, only the terminal Done bookend still writes a live `savepoint.md`; every other
85
- milestone lives in `savepoint_events` plus a committed JSONL export. Beta-line prose that
86
- still assumes an always-live ledger needs updating first, so a beta-line reader does not
87
- mistake an empty ledger for a broken one.
88
- - (b) The owner's manual verification of the DB layer in real use. This is a dogfood signal,
89
- distinct from the independently-reviewed green suite that already exists on beta.
90
-
91
- **Trigger**, owner-gated: the owner publishes `1.2.0-beta.1` to the npm `beta` dist-tag. This is
92
- explicitly not this intent's, nor any agent's, call to make.
93
-
94
- **Verification.** An external tester plus the owner verify the DB layer on the beta channel.
95
-
96
- **Completion.** Once verified, `beta` merges into `main`, `1.2.0` is cut stable, and it publishes
97
- to npm `latest`.
98
-
99
- **Version mechanics.** `1.2.0` is reserved for this graduation. The `1.1.x` line stays the
100
- stable line until `1.2.0` actually lands. `1.2.0-beta.1` graduates to `1.2.0` stable by dropping
101
- the pre-release suffix; nothing else about the version number changes.
102
-
103
- **Consumed by 171.** The wave-6 consistency-dividend cut stays in the `1.1.x` line. It does not
104
- ride intent 41 and needs no further derivation: intent 41 keeps its own `1.2.0` line on beta,
105
- independent of whatever `1.1.x` number 171 lands on.
@@ -1,64 +0,0 @@
1
- ---
2
- name: plastic-roadmap
3
- description: Use when the user wants to plan a delivery batch, order waves of intents, ship a batch of intents in one go, track a named collection of intents toward a goal, or asks for a "roadmap". Creates and maintains a roadmap file, a delivery-side collection of intents (the counterpart to a release), separate from INDEX.md status tracking.
4
- user-invocable: true
5
- ---
6
-
7
- # Roadmap
8
-
9
- A roadmap is a named, ordered, delivery-side collection of intents: the delivery-side counterpart
10
- to a release (completion-side, `CHANGELOG.md`). It lives at `roadmaps/{slug}.md`, a sibling of
11
- `INDEX.md` wherever `INDEX.md` lives: the global tier's `~/.plastic/roadmaps/` (beside
12
- `~/.plastic/INDEX.md`), or a project's root, `~/.plastic/projects/{slug}/roadmaps/` (beside that
13
- project's `INDEX.md` and `project.yml`). It never sits inside `store/`, which holds intent
14
- directories, not project artifacts.
15
-
16
- A roadmap file has four parts: a title/meta header, `## Goal` (prose), `## Batches` (ordered;
17
- entries inside a batch are parallel-safe, batches run sequentially), and an append-only dated
18
- `## Log`. A roadmap written before owner ruling 145 may instead use the legacy `## Waves` heading;
19
- reading accepts both, but every new roadmap is scaffolded with `## Batches`, and an existing
20
- roadmap file's heading is never renamed to migrate it. Each batch entry mirrors that intent's
21
- status in `INDEX.md` (`queued`/`delivering`/`delivered`/`abandoned`/`blocked`).
22
-
23
- **`INDEX.md` is the single writer of intent status; on any conflict INDEX wins and the roadmap
24
- entry is corrected to match.**
25
-
26
- The skill operates on the roadmap file directly via Read/Edit. The one deterministic helper it
27
- uses is the savepoint ledger writer (`scripts/roadmap-savepoint`, `append`/`rebuild`); every verb's
28
- closing step calls `append` after its Read/Edit, and the roadmap `.md` file itself stays
29
- Read/Edit-only.
30
-
31
- ## Verbs
32
-
33
- | Verb | When | Mechanics |
34
- |------|------|-----------|
35
- | Create | user wants to start a new roadmap / plan a delivery batch | `references/operations.md#create` |
36
- | Add / reorder entries | user wants to add intents to a batch or resequence batches | `references/operations.md#add--reorder-entries` |
37
- | Sync status mirror | an entry's status may be stale against INDEX | `references/operations.md#sync-status-mirror` |
38
- | Append log line | a roadmap event just happened (created, batch done, closed) | `references/operations.md#append-a-log-line` |
39
- | Read / consume | a human or a coordinator needs the roadmap's current state | `references/operations.md#read--consume` |
40
- | Close / archive | the roadmap's `## Goal` is reached | `references/operations.md#close--archive` |
41
-
42
- See `references/file-format.md` for the exact entry-line shape, status vocabulary, checkbox/log
43
- format, and a worked example. See `references/operations.md` for step-by-step mechanics of each
44
- verb above.
45
-
46
- Read `../plastic-conventions/references/roadmaps.md` for the roadmap file format, batch
47
- semantics, and the status-mirror rule that this skill's own file-format reference builds on. This
48
- path resolves relative to this skill's own installed directory.
49
-
50
- ## Notes
51
-
52
- - File location and the four-section shape are identical across tiers; do not invent a different
53
- layout per project. The general rule: `roadmaps/` is a sibling of `INDEX.md`, wherever `INDEX.md`
54
- lives.
55
- - `## Goal` is a checkable prose condition read by a human or agent, not an executable checker.
56
- - Batch entries render as checkboxes (`- [x] ... — delivered` / `- [ ] ... — <status>`); a human
57
- reading cold should see shipped/running/next within a minute. `## Log` lines are one-sentence,
58
- EM-to-CTO-voice, dated, and link each entry-intent's `outcome.md` (lossless-by-reference).
59
- - Additive: this skill introduces no gate, lock, or hook, and does not change `INDEX.md`'s section
60
- list or the intent frontmatter schema.
61
- - Closing a roadmap moves it to `roadmaps/archived/{slug}.md` so `roadmaps/` lists only live ones.
62
- - Every verb also appends a machine ledger line to the roadmap's name-paired
63
- `roadmaps/{slug}.savepoint.md`, the derived counterpart to the human `## Log`; see
64
- `references/file-format.md` for its shape and location.