@zalom/plastic 1.14.0 → 2.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/PLASTIC.md +101 -294
  2. package/README.md +5 -6
  3. package/agents/plastic-advisor.md +18 -17
  4. package/agents/plastic-enforcer.md +57 -69
  5. package/agents/plastic-executor.md +34 -20
  6. package/agents/plastic-faux-advisor.md +18 -18
  7. package/config_asks.yml +38 -0
  8. package/hooks/capture +4 -0
  9. package/hooks/check-update +12 -3
  10. package/hooks/close +5 -0
  11. package/hooks/hooks.json +9 -49
  12. package/hooks/record +4 -0
  13. package/package.json +3 -2
  14. package/scripts/agent-report +8 -9
  15. package/scripts/append-ledger +195 -0
  16. package/scripts/codex-hook +101 -95
  17. package/scripts/dashboard.rb +4 -4
  18. package/scripts/doctor.rb +106 -43
  19. package/scripts/end-intent +77 -76
  20. package/scripts/exec-worktree +11 -20
  21. package/scripts/file-session-intent +61 -0
  22. package/scripts/hook-capture +242 -0
  23. package/scripts/hook-close +34 -0
  24. package/scripts/hook-record +149 -0
  25. package/scripts/hook-session-start +95 -12
  26. package/scripts/install.rb +8 -6
  27. package/scripts/lib/agent_models.rb +1 -7
  28. package/scripts/lib/arm.rb +283 -0
  29. package/scripts/lib/backfill_intent.rb +316 -0
  30. package/scripts/lib/bridge.rb +24 -1597
  31. package/scripts/lib/doctor_core.rb +17 -88
  32. package/scripts/lib/doctor_session_ledger.rb +106 -0
  33. package/scripts/lib/exec_worktree.rb +14 -60
  34. package/scripts/lib/harness_text.rb +5 -4
  35. package/scripts/lib/hook_registry.rb +44 -107
  36. package/scripts/lib/insights.rb +3 -4
  37. package/scripts/lib/installer_core.rb +19 -30
  38. package/scripts/lib/lock.rb +6 -26
  39. package/scripts/lib/outcome_guard.rb +7 -5
  40. package/scripts/lib/project_validator.rb +30 -1
  41. package/scripts/lib/roadmap_queue.rb +3 -3
  42. package/scripts/lib/roadmap_savepoint.rb +1 -1
  43. package/scripts/lib/rule_catalog.rb +6 -3
  44. package/scripts/lib/savepoint.rb +320 -0
  45. package/scripts/lib/scaffold_intent.rb +13 -179
  46. package/scripts/lib/session_backfill.rb +184 -0
  47. package/scripts/lib/session_close.rb +84 -0
  48. package/scripts/lib/session_git.rb +469 -0
  49. package/scripts/lib/session_ledger.rb +497 -0
  50. package/scripts/lib/store_discovery.rb +1 -1
  51. package/scripts/lib/store_provisioning.rb +1 -1
  52. package/scripts/maintenance-run +7 -7
  53. package/scripts/new-intent +63 -4
  54. package/scripts/plastic-lock +94 -41
  55. package/scripts/promote-session-item +150 -0
  56. package/scripts/rebuild-graph +1 -1
  57. package/scripts/roadmap-next +2 -2
  58. package/scripts/rollback.rb +42 -3
  59. package/scripts/scaffold-intent +37 -63
  60. package/scripts/session-commit +116 -0
  61. package/scripts/spawn-preamble +5 -5
  62. package/scripts/update.rb +7 -3
  63. package/skills/agent-advisor/SKILL.md +3 -3
  64. package/skills/agent-advisor/references/advisor-protocol.md +20 -20
  65. package/skills/auto/SKILL.md +218 -317
  66. package/skills/auto/evals/evals.json +10 -10
  67. package/skills/auto/references/agent-architecture.md +102 -90
  68. package/skills/auto/references/agent-report-contract.md +4 -21
  69. package/skills/auto/references/end-tail.md +47 -53
  70. package/skills/auto/references/human-report-contract.md +8 -8
  71. package/skills/conventions/SKILL.md +1 -3
  72. package/skills/conventions/references/lifecycle-and-savepoints.md +35 -1
  73. package/skills/conventions/references/locks-and-worktrees.md +47 -55
  74. package/skills/conventions/references/maintenance-and-revisions.md +12 -12
  75. package/skills/dashboard/SKILL.md +1 -1
  76. package/skills/direct/SKILL.md +66 -0
  77. package/skills/direct/references/request-signals.md +59 -0
  78. package/skills/doctor/SKILL.md +58 -11
  79. package/skills/doctor/report.md +3 -1
  80. package/skills/install/SKILL.md +11 -9
  81. package/skills/intent-continuing/SKILL.md +131 -89
  82. package/skills/intent-continuing/references/boarding-matrix.md +34 -0
  83. package/skills/intent-continuing/references/context-management.md +2 -2
  84. package/skills/intent-creating/SKILL.md +2 -2
  85. package/skills/intent-creating/references/lifecycle.md +1 -1
  86. package/skills/intent-ending/SKILL.md +28 -37
  87. package/skills/intent-ending/evals/evals.json +4 -4
  88. package/skills/intent-executing/SKILL.md +12 -49
  89. package/skills/intent-executing/plan-reviewer-prompt.md +39 -0
  90. package/skills/intent-speccing/SKILL.md +108 -51
  91. package/skills/intent-speccing/evals/evals.json +5 -5
  92. package/skills/intent-speccing/references/per-section-fill-rules.md +4 -4
  93. package/skills/intent-speccing/references/self-verify-checklist.md +1 -2
  94. package/skills/project-creating/SKILL.md +1 -1
  95. package/skills/releasing/SKILL.md +7 -8
  96. package/skills/tutorial/SKILL.md +2 -2
  97. package/skills/tutorial/references/track-1-guided.md +16 -18
  98. package/skills/tutorial/references/track-2-auto.md +12 -13
  99. package/skills/tutorial/references/track-3-projects-and-roadmaps.md +2 -2
  100. package/templates/agents.md +4 -7
  101. package/templates/project.yml +7 -0
  102. package/templates/roadmap.md +1 -1
  103. package/templates/savepoint.md +2 -2
  104. package/templates/session-intent.md +29 -0
  105. package/agents/plastic-brainstorming.md +0 -48
  106. package/agents/plastic-future-intent-researcher.md +0 -35
  107. package/agents/plastic-intent-curator.md +0 -47
  108. package/agents/plastic-intent-discovery.md +0 -43
  109. package/agents/plastic-planner.md +0 -56
  110. package/agents/plastic-spec-specialist.md +0 -53
  111. package/hooks/auto-arm +0 -5
  112. package/hooks/bash-gate +0 -3
  113. package/hooks/continue +0 -31
  114. package/hooks/edit-gates +0 -3
  115. package/hooks/future-intent-check +0 -25
  116. package/hooks/gate-check +0 -12
  117. package/hooks/power-tools +0 -8
  118. package/scripts/hook-auto-arm +0 -51
  119. package/scripts/hook-bash-gate +0 -78
  120. package/scripts/hook-code-gate +0 -38
  121. package/scripts/hook-continue +0 -48
  122. package/scripts/hook-create-gate +0 -51
  123. package/scripts/hook-edit-gates +0 -58
  124. package/scripts/hook-future-intent-check +0 -90
  125. package/scripts/hook-gate-check +0 -169
  126. package/scripts/hook-links-gate +0 -54
  127. package/scripts/hook-lock-gate +0 -47
  128. package/scripts/hook-power-tools +0 -38
  129. package/scripts/hook-savepoint-pre +0 -32
  130. package/scripts/lib/codex_edit_gates.rb +0 -138
  131. package/scripts/lib/edit_gates.rb +0 -398
  132. package/scripts/lib/links_gate.rb +0 -140
  133. package/scripts/lib/qmd_hook.rb +0 -41
  134. package/scripts/lib/spec_header.rb +0 -83
  135. package/scripts/lib/start_intent.rb +0 -296
  136. package/scripts/start-intent +0 -89
  137. package/skills/_active-intent-gate.md +0 -26
  138. package/skills/auto/references/tiers.md +0 -100
  139. package/skills/continuing/SKILL.md +0 -34
  140. package/skills/continuing/evals/evals.json +0 -91
  141. package/skills/conventions/references/gates-and-enforcement.md +0 -53
  142. package/skills/conventions/references/tiers-and-dispatch.md +0 -135
  143. package/skills/doctor/references/gates-stuck-detection.md +0 -43
  144. package/skills/intent-brainstorming/SKILL.md +0 -118
  145. package/skills/intent-brainstorming/evals/evals.json +0 -67
  146. package/skills/intent-continuing/evals/evals.json +0 -145
  147. package/skills/intent-discovering/SKILL.md +0 -56
  148. package/skills/intent-grilling/SKILL.md +0 -108
  149. package/skills/intent-linking/SKILL.md +0 -128
  150. package/skills/intent-linking/evals/evals.json +0 -22
  151. package/skills/intent-linking/references/zettelkasten.md +0 -45
  152. package/skills/intent-locking/SKILL.md +0 -64
  153. package/skills/intent-planning/SKILL.md +0 -145
  154. package/skills/intent-planning/evals/evals.json +0 -81
  155. package/skills/intent-planning/references/plan-format.md +0 -130
  156. package/skills/intent-researching/SKILL.md +0 -123
  157. package/skills/intent-researching/evals/evals.json +0 -22
  158. package/skills/intent-savepoint/SKILL.md +0 -83
  159. package/skills/intent-savepoint/references/context-management.md +0 -32
  160. package/skills/intent-starting/SKILL.md +0 -151
  161. package/skills/intent-starting/evals/evals.json +0 -117
  162. package/skills/intent-starting/references/boarding-matrix.md +0 -35
  163. package/skills/project-continuing/SKILL.md +0 -119
  164. package/skills/project-continuing/evals/evals.json +0 -100
  165. package/skills/roadmap-continuing/SKILL.md +0 -89
  166. package/skills/roadmap-continuing/evals/evals.json +0 -82
  167. package/skills/skill-creating/SKILL.md +0 -75
  168. package/skills/skill-creating/evals/evals.json +0 -108
  169. package/skills/skill-creating/references/agents.md +0 -168
  170. package/skills/skill-creating/references/defaults-first.md +0 -23
  171. package/skills/skill-creating/references/evals.md +0 -41
  172. package/skills/skill-creating/references/hooks.md +0 -251
  173. package/skills/skill-creating/references/progressive-disclosure.md +0 -176
  174. package/skills/skill-creating/references/scripts.md +0 -166
  175. package/skills/skill-creating/references/skills.md +0 -169
  176. package/skills/skill-creating/scripts/scaffold.rb +0 -313
  177. package/skills/skill-evaluating/SKILL.md +0 -141
  178. package/skills/skill-evaluating/assets/eval-template.json +0 -12
  179. package/skills/skill-evaluating/evals/evals.json +0 -75
  180. package/skills/skill-evaluating/references/convention-checks.md +0 -76
  181. package/skills/skill-evaluating/references/eval-methodology.md +0 -154
  182. package/skills/store-curating/SKILL.md +0 -64
  183. package/skills/store-curating/evals/evals.json +0 -38
  184. package/skills/store-indexing/SKILL.md +0 -93
  185. package/skills/store-indexing/evals/evals.json +0 -22
  186. package/skills/store-indexing/references/zettelkasten-linking.md +0 -32
  187. package/skills/store-provisioning/SKILL.md +0 -55
  188. /package/skills/{project-continuing → intent-continuing}/references/board-fill.md +0 -0
  189. /package/skills/{roadmap-continuing → intent-continuing}/references/liveness-ranking.md +0 -0
  190. /package/skills/{intent-brainstorming → intent-speccing}/references/design-principles.md +0 -0
@@ -1,21 +1,26 @@
1
1
  # Locks and Worktrees
2
2
 
3
- This chapter holds the delivery lock, claims, worktrees, solo mode, fail-safe doctrine, and the station-by-station delivery table.
3
+ This chapter holds the delivery lock, claims, worktrees, the fail-safe doctrine, and the station-by-station delivery table. Since 2.0 (intent 302) nothing here blocks a write: the lock and the worktree are how an auto team keeps one delivery in one place, recorded by the record hook, not enforced by a hook.
4
4
 
5
5
  ### Delivery Isolation and the Single-Owner Lock
6
6
 
7
- Exactly one session or agent develops an intent's delivery at a time. Ownership is
7
+ Locks and worktrees exist only for auto teams. An interactive session working direct or
8
+ thinking takes no lock: it records into the day ledger, or into the intent its per-session
9
+ pointer names (`~/.plastic/store/.tmp/<session>/current`, where `<session>` is the first eight
10
+ characters of the session id; the file holds today's day id or an intent id).
11
+
12
+ For an auto team, exactly one team develops an intent's delivery at a time. Ownership is
8
13
  session-keyed and durable: arming acquires `delivery.lock` inside the intent directory
9
14
  (atomically, O_EXCL). The session id is the authorization identity. Descriptive provenance
10
15
  records the controller's explicit `harness`, `agent`, `model`, `thread`, and `mode` values,
11
16
  but never grants access and is never inferred from transcripts or filesystem paths. Missing
12
- fields on legacy locks display as `Unknown`. Liveness is a lease: the owner's hooks refresh
13
- the lock file's mtime on tool activity, and that mtime is the sole heartbeat truth. The lock
14
- counts as stale only when the mtime is older than the TTL. No process id is consulted anywhere.
15
- The /tmp session bridge is a cache
16
- of this state; on any disagreement, or when the bridge is missing, the lock file wins.
17
- Another session that finds a fresh lock backs off; a stale lock is reclaimed only by
18
- explicit takeover, which replaces the lock and appends an audit line to the intent's
17
+ fields on legacy locks display as `Unknown`. Liveness is a lease: the record hook refreshes
18
+ the lock file's mtime on every write the owning session makes, and that mtime is the sole
19
+ heartbeat truth. The lock counts as stale only when the mtime is older than the TTL. No
20
+ process id is consulted anywhere. The pointer file is a cache of which intent a session
21
+ records into; the lock file is the truth of who owns a delivery, and wins on any
22
+ disagreement. Another team that finds a fresh lock backs off; a stale lock is reclaimed only
23
+ by explicit takeover, which replaces the lock and appends an audit line to the intent's
19
24
  savepoint.md. Rearming the same session preserves its acquired identity and refreshes known
20
25
  provenance; an explicit takeover replaces the controller and starts new provenance.
21
26
  Subagents spawned by the owner write under the owner's lock once registered as delegates.
@@ -25,41 +30,27 @@ separate authorization-removal mechanism exists. Finished and failed delegate ac
25
30
  retained as descriptive history, bounded to the 20 most recent terminal entries. A controller,
26
31
  a delegate, and an artifact claim are distinct evidence: controller ownership authorizes the
27
32
  delivery, delegate registration authorizes a child session, and a claim selects one current
28
- writer for one artifact. Disarm clears the lock; the End tail is ordered: verify, merge and remove
29
- worktrees, clear the lock, and only then is the bridge purge-eligible. Repair is one
30
- idempotent function with two entry points: the `plastic-lock` command (`who`, status, fix,
31
- release, reclaim, delegate) and `/plastic-intent-starting`, so boarding self-heals. `who` is
32
- read-only and reports the controller, mtime heartbeat, delegates, and claims from durable files.
33
- This is
34
- mandatory, not a convention.
35
-
36
- Solo-mode gate defaults (intent 128): on a confirmed positive solo determination
37
- (`Bridge.solo_delivery?`, a single owner working alone with no sign of parallel or team
38
- delivery), the lock and worktree arbitration gates relax from enforced to advisory. The moment
39
- any parallel or team activity appears they return to strictly enforced. This is a real behavior
40
- difference, not just a message change: a solo session is not hard-blocked by these gates, a
41
- shared one still is.
33
+ writer for one artifact. Disarm clears the lock; the End tail is ordered: verify, merge and
34
+ remove worktrees, clear the lock, and only then is the session pointer purge-eligible. Repair
35
+ is one idempotent function with two entry points: the `plastic-lock` command (`who`, status,
36
+ fix, release, reclaim, delegate) and the `plastic-doctor` skill's lock section, so repair
37
+ self-heals. `who` is read-only and reports the controller, mtime heartbeat, delegates, and
38
+ claims from durable files. This is mandatory for auto teams, not a convention.
42
39
 
43
- The bridge resolves the current session in a fixed precedence: the stdin `session_id` first, then
44
- the `CLAUDE_CODE_SESSION_ID` environment variable, then a derived key when neither is present. A
45
- bridge is purge-eligible by terminal state, not by age: it is removed only once its intent is no
46
- longer active, never on a timer. See [`docs/internals.md`](https://github.com/zalom/plastic/blob/main/docs/internals.md) for depth.
40
+ The record hook resolves the current session in a fixed precedence: the stdin `session_id`
41
+ first, then the `CLAUDE_CODE_SESSION_ID` environment variable, then a derived key when neither
42
+ is present. A session's `.tmp/` directory is purge-eligible by terminal state, not by age: it
43
+ holds nothing durable, and losing it costs nothing. See [`docs/internals.md`](https://github.com/zalom/plastic/blob/main/docs/internals.md) for depth.
47
44
 
48
- The delivery lock arbitrates at the whole-intent grain: it decides who may work
49
- an intent at all. Underneath it, a per-artifact claim token (intent 111)
50
- arbitrates at the file grain: it decides who, among those already holding the
51
- delivery lock, is the one writer for one lifecycle file right now. A write to
52
- `spec.md`, `plan.md`, `checklist.md`, or the intent file must hold both the
53
- delivery lock and that file's claim. Claims live in `.claims/<artifact>.claim`
54
- inside the intent directory, one small JSON file per artifact, scoped strictly
55
- per-intent-per-artifact, never session-global. The claim gate is dormant
56
- (allows) when no claim file exists for an artifact, so ordinary single-owner
57
- work is unaffected; it engages, and denies, only when a second writer tries to
58
- take a fresh claim someone else already holds. A stale or corrupt claim fails
59
- open (the write proceeds, the claim yields) and the condition is surfaced in
60
- `plastic-lock status`, which lists any live claims alongside the delivery
61
- lock. See `plastic-lock claim`/`release-claim` and [`docs/internals.md`](https://github.com/zalom/plastic/blob/main/docs/internals.md) for the
62
- full mechanism.
45
+ The delivery lock arbitrates at the whole-intent grain: it decides who may work an intent at
46
+ all. Underneath it, a per-artifact claim token (intent 111) is a coordination record at the
47
+ file grain: it names who, among those already holding the delivery lock, is the one writer for
48
+ one lifecycle file right now. Claims live in `.claims/<artifact>.claim` inside the intent
49
+ directory, one small JSON file per artifact, scoped strictly per-intent-per-artifact, never
50
+ session-global. Since 2.0 nothing enforces a claim at write time; a team lead takes and
51
+ releases claims through `plastic-lock claim` and `release-claim` to coordinate its executors,
52
+ and `plastic-lock status` lists any live claims alongside the delivery lock. A stale or corrupt
53
+ claim is reported there, never acted on. See [`docs/internals.md`](https://github.com/zalom/plastic/blob/main/docs/internals.md) for the full mechanism.
63
54
 
64
55
  There is exactly one lock in Plastic: `delivery.lock` (exclusive, one owner plus delegates),
65
56
  shipped by intent 108. An earlier two-lock doctrine proposed a second `maintenance.lock`
@@ -72,8 +63,8 @@ for an active delivery. Maintenance instead DETECTS `delivery.lock`'s freshness
72
63
  behind. See "WORK vs MAINTENANCE" in `references/maintenance-and-revisions.md` for the full
73
64
  doctrine.
74
65
 
75
- Every code-touching intent gets its own git worktree named `{id}--{slug}`, and all code edits
76
- for that intent happen only inside it. Plastic provisions the worktree deterministically: it
66
+ Every code-touching auto intent gets its own git worktree named `{id}--{slug}`, and all code
67
+ edits for that intent happen inside it. Plastic provisions the worktree deterministically: it
77
68
  resolves the project repo from `projects.yml` and runs `git -C <repo> worktree add`, so
78
69
  isolation never depends on the current working directory. There is one worktree per project
79
70
  intent, the code worktree at `<repo>/.claude/worktrees/{id}--{slug}` (branch
@@ -99,15 +90,16 @@ an orphaned worktree behind, and clear a stale worktree reference with `git work
99
90
 
100
91
  #### Intent delivery, station by station
101
92
 
102
- How one intent travels from boarding to Done, and what the lock, bridge, and gates do at
103
- each station.
93
+ How one auto-team intent travels from boarding to Done, and what the lock, the pointer, and
94
+ the record hook do at each station. Nothing in the third column blocks; the fourth column is
95
+ what gets written down.
104
96
 
105
- | Station | Delivered artifact | Lock and bridge steps | Pre-stage gate | Post-stage record |
106
- |---|---|---|---|---|
107
- | Start (board) | none (a procedure, not a stage) | `plastic-lock fix` self-heals stale, corrupt, or legacy state; arm acquires `delivery.lock` (O_EXCL, session-keyed), provisions the code worktree, writes the bridge cache | lock-gate denies any write into an active intent dir without this intent's lock; every deny names the resolving command | savepoint confirms the boarding station |
108
- | What (create) | `<id>--<slug>.md`, born complete | no lock yet; no bridge | create-gate validates the proposed intent content (Write, Edit, and MCP edits) | savepoint `What` line; intent listed in INDEX `## Active` |
109
- | Why | `spec.md` | owner writes refresh the lease (lock file mtime heartbeat) | gate-check requires the intent file with `## Intent` before spec.md; lock-gate admits only the owner or a delegate | savepoint `Why started`, `Why spec.md created` |
110
- | How | `plan.md`, `actions/ACTION_N.md` (at least one), `checklist.md` | heartbeat on writes; the code gate stays closed until plan.md, checklist.md, and a real action file all exist | gate-check requires spec.md before plan.md, and plan.md plus a real actions/ACTION_N.md before checklist.md | savepoint `How started`, `How plan.md created`, `How checklist.md created`, `Exec started` |
111
- | Exec | code on the intent branch, checklist checked off | heartbeat; code edits confined to the provisioned worktree; delegates write under the owner's lock; bash, interpreter, and MCP writes gated the same way | the five edit-path gates (savepoint-pre, lock-gate, code-gate with its stage and worktree rules, links-gate, create-gate) plus bash-gate for shell writes | checklist boxes; savepoint milestones |
112
- | End (done) | mandatory `outcome.md` (`disposition: delivered\|abandoned`), INDEX moves to Completed or Abandoned | ordered End tail: verify, merge and remove worktrees, disarm clears `delivery.lock`, then the bridge is purge-eligible, and the QMD reindex runs LAST (after purge) | gate-check blocks outcome.md while checklist items are unchecked | savepoint `Done delivered` (or `abandoned`); takeover audits, if any, remain in savepoint.md |
113
- | Maintenance (Future, Terminal, or Active-with-a-stale-or-no-lock) | `revisions.md` move-and-record entries | detects (never acquires) `delivery.lock`; defers and reports while the target's lock is FRESH (`Lock.fresh?`); a stale or absent lock is not-active, maintenance proceeds | none enforced by any gate; the maintenance tool or skill itself checks `Lock.fresh?` (see WORK vs MAINTENANCE in `references/maintenance-and-revisions.md`) | append-only, rule-tagged `revisions.md` entry written in the same operation as the change, or the change is refused; lands via a fresh branch off store main merged back as one closed op, never `git add -A` |
97
+ | Station | Delivered artifact | Lock and pointer steps | Record |
98
+ |---|---|---|---|
99
+ | Start (board) | none (a procedure, not a stage) | `plastic-lock fix` self-heals stale, corrupt, or legacy state; arm acquires `delivery.lock` (O_EXCL, session-keyed), provisions the code worktree, writes the session pointer | savepoint confirms the boarding station |
100
+ | What (create) | `<id>--<slug>.md`, born complete | no lock yet; `new-intent` validates the file it writes (`scripts/validate-intent`) | savepoint `What` line; intent listed in INDEX `## Active` |
101
+ | Why | `spec.md` | owner writes refresh the lease (lock file mtime heartbeat) | savepoint `Why started`, `Why spec.md created` |
102
+ | How | `plan.md`, `actions/ACTION_N.md` (at least one), `checklist.md` | heartbeat on writes | savepoint `How started`, `How plan.md created`, `How checklist.md created`, `Exec started` |
103
+ | Exec | code on the intent branch, checklist checked off | heartbeat; code edits confined to the provisioned worktree; delegates write under the owner's lock | checklist boxes; savepoint milestones; the day-ledger line promotes when a project file lands |
104
+ | End (done) | mandatory `outcome.md` (`disposition: delivered\|abandoned`), INDEX moves to Completed or Abandoned | ordered End tail: verify, merge and remove worktrees, disarm clears `delivery.lock`, then the pointer is purge-eligible, and the QMD reindex runs LAST (after purge); `end-intent` backfills a placeholder `outcome.md` from the record and its structure check reports (never refuses) | savepoint `Done delivered` (or `abandoned`); takeover audits, if any, remain in savepoint.md |
105
+ | Maintenance (Future, Terminal, or Active-with-a-stale-or-no-lock) | `revisions.md` move-and-record entries | detects (never acquires) `delivery.lock`; defers and reports while the target's lock is FRESH (`Lock.fresh?`); a stale or absent lock is not-active, maintenance proceeds | append-only, rule-tagged `revisions.md` entry written in the same operation as the change, or the change is refused; lands via a fresh branch off store main merged back as one closed op, never `git add -A` |
@@ -55,9 +55,9 @@ meaning an active agent is delivering that intent. Maintenance DETECTS this lock
55
55
  ACQUIRES it, even transiently, because a maintenance-held lock could be mistaken by a resuming
56
56
  or continuation session for an active delivery. Maintenance leaves no lock behind: there is
57
57
  nothing to clean up afterward, and no ambiguity about who, if anyone, holds the one lock.
58
- `bridge.rb:1195`'s `lock_gate_decision` already allows any write once an intent is not in
59
- INDEX `## Active` - there is no enforced freeze gate in the codebase today, and there never
60
- was one that shipped (see the corrected history below).
58
+ No code freezes a terminal intent: since 2.0 (intent 302) nothing blocks a write anywhere,
59
+ and before that the lock check already allowed any write once an intent left INDEX
60
+ `## Active`. There never was a shipped freeze (see the corrected history below).
61
61
 
62
62
  Stranding and clobbering are avoided by construction, not by a second lock: a maintenance
63
63
  action creates a fresh branch from the CURRENT state of store main, applies only its own
@@ -82,8 +82,8 @@ already exists, a new run appends
82
82
  corrects v2 by appending a correction entry and explicitly leaving v2 in place). This is
83
83
  tool-enforced, not prose alone: `scripts/project-links`, `scripts/rebuild-graph`, and
84
84
  `scripts/restore-intent-v1` each write this receipt in the SAME write as the structural
85
- change, or refuse to proceed without one (`scripts/lib/revisions_writer.rb`); the intent
86
- curator (`agents/plastic-intent-curator.md`) holds itself to the identical rule by hand.
85
+ change, or refuse to proceed without one (`scripts/lib/revisions_writer.rb`); a hand-applied
86
+ relocation holds itself to the identical rule.
87
87
 
88
88
  Doctor stays a detector: core and full checks, every installed agent, both global and project
89
89
  stores. It gains no write path of its own. The "Fix all" prompt
@@ -94,9 +94,9 @@ those tools perform the mutation and write the `revisions.md` receipt - never do
94
94
 
95
95
  Corrected history (D18): an earlier version of this section described a terminal-immutability
96
96
  gate "intent 112 enforces" and a two-lock model. Intent 112 built that gate in full and was
97
- then ABANDONED before merge on a design pivot; nothing from it ever shipped. `bridge.rb:1195`
98
- confirms no such gate runs today: a write to a terminal intent is allowed unconditionally once
99
- the intent leaves INDEX `## Active`. The deadlock that stopped intents 189, 192, and 195 from
97
+ then ABANDONED before merge on a design pivot; nothing from it ever shipped. No such check
98
+ runs today: a write to a terminal intent is allowed unconditionally, as is every other write
99
+ since 2.0 (intent 302). The deadlock that stopped intents 189, 192, and 195 from
100
100
  repairing three live `graph_links_projection` violations was self-imposed discipline (agents
101
101
  and the owner both treating undocumented doctrine as a real gate), not a technical one. This
102
102
  section is the corrected doctrine; intent 112's own history stays in INDEX as an abandoned,
@@ -115,8 +115,8 @@ legitimately accrued chain edge was destroyed by a hand-run restore and went und
115
115
  week).
116
116
 
117
117
  Fail-safe lock doctrine (the contract intent 111 implements): the lock system never traps a
118
- session or burns credits. When a gate cannot verify lock integrity it fails open, degrading
119
- to advisory (warn) rather than hard-blocking. Repair is orchestrator-driven: on a lock-issue
118
+ session or burns credits. When a check cannot verify lock integrity it fails open, degrading
119
+ to advisory (warn) rather than refusing. Repair is orchestrator-driven: on a lock-issue
120
120
  signal the orchestrator inspects and repairs the lock automatically, and the human
121
121
  `plastic-lock` command is a fallback path, not the trigger. Intent 93 states this doctrine;
122
122
  intent 111 builds the fail-open behavior, the lock-liveness surface, the lock-issue message,
@@ -144,7 +144,7 @@ not a revision.
144
144
  #### Structural maintenance and revisions.md
145
145
 
146
146
  When a delivered intent accumulates structural junk (an unsanctioned section, a stray file, a
147
- frontmatter edge to an intent that no longer exists), the intent-curator relocates it into
147
+ frontmatter edge to an intent that no longer exists), a relocation moves it into
148
148
  `revisions.md` instead of reopening the work. Each entry is a versioned, dated header
149
149
  (`## Revision vN - YYYY-MM-DD-HH:MM`) plus `Why` (one sentence naming the broken rule, ending
150
150
  with `[rule: <tag>]`), `Prior location`, and either `Content held` (the verbatim removed
@@ -212,7 +212,7 @@ dropped, and skips (never aborts on) any intent dir holding a fresh delivery loc
212
212
 
213
213
  Intent 84 defines three buckets for sibling 84a to audit against; 84 does not run the audit.
214
214
 
215
- - (a) gate-hook prose tokens: the per-transition narration emitted by the gate hook.
215
+ - (a) hook prose tokens: the narration the lifecycle hooks emit into context.
216
216
  - (b) main-loop store-read tokens: tokens the main agent spends reading or grepping the store
217
217
  in the transcript.
218
218
  - (c) authored-section sizes: sizes of authored artifacts (INDEX entries and the like).
@@ -19,7 +19,7 @@ state → byte-identical payload, regardless of model. Do NOT hand-summarize int
19
19
 
20
20
  - User invokes `/plastic-dashboard`
21
21
  - User asks "where are we", "what's next", "what should I work on", "show me the intents"
22
- - `plastic-project-continuing` lands on the board on resume
22
+ - `plastic-intent-continuing` lands on the board on a bare resume
23
23
  - `plastic-auto` reads `--json` to choose the next dispatchable intent
24
24
 
25
25
  ## Procedure (the Markdown board — default human surface)
@@ -0,0 +1,66 @@
1
+ ---
2
+ name: plastic-direct
3
+ description: Use when a prompt asks for a change, a fix, an edit, a file, or an answer, and no thinking conversation is open on an intent. Judges whether the work is small enough to run right now, asks one clarifying question when one answer would settle it, or offers a thinking intent when it would not. Do not use for a prompt that says "auto" or "continue", a prompt asking to start a new intent, or a prompt inside an open thinking conversation, which belong to plastic-auto, plastic-intent-continuing, plastic-intent-creating, and plastic-intent-speccing.
4
+ user-invocable: false
5
+ ---
6
+
7
+ # Direct mode
8
+
9
+ Route the prompt in one read, then act. Direct work runs inline in this session, never through a
10
+ dispatched agent, unless the user asks for agents.
11
+
12
+ ## 1. Estimate before you start
13
+
14
+ Judge the prompt alone, before doing any of the work:
15
+
16
+ 1. Count the targets the prompt names, or that one grep finds.
17
+ 2. Require each change to be a named operation on a known target (rename this, add a check there,
18
+ delete that line), not an outcome ("clean it up", "make it faster").
19
+ 3. Budget about one minute per target and sum.
20
+ 4. At or under five minutes, run it now. Five minutes is an owner ruling, not a measured
21
+ threshold.
22
+ 5. A bounded sum above five minutes, offer a dedicated intent.
23
+ 6. An unknown target, or a change described only by its outcome, cannot be bounded. Ask one
24
+ question when one answer would supply the missing operation or target. Otherwise offer a
25
+ thinking intent. A target that only investigation can find is never settled by one
26
+ question.
27
+
28
+ Tests or a build the prompt implies do not count against the budget. Verification is part of
29
+ direct work, not a reason to leave direct mode.
30
+
31
+ ## 2. One question, then run
32
+
33
+ A clarifying question is allowed in direct mode and does not by itself turn the request into a
34
+ thinking intent. Ask one, then run. If the answer is still vague, offer a thinking intent rather
35
+ than asking a second question or guessing.
36
+
37
+ ## 3. The routes
38
+
39
+ | What the prompt looks like | Where it goes |
40
+ |---|---|
41
+ | Clear, and bounded at or under five minutes | Run it now, inline |
42
+ | Clear, but the bounded estimate is above five minutes | Offer a dedicated intent, `plastic-intent-creating` |
43
+ | Vague, and one answer would resolve it | Ask one clarifying question, then run |
44
+ | Still vague after that one answer | Offer a thinking intent, `plastic-intent-speccing` |
45
+ | Phrased as needing help rather than as an instruction | Offer grill plus a thinking conversation, `plastic-intent-speccing` |
46
+ | Says "auto" explicitly | Hand off to `plastic-auto` |
47
+
48
+ Read `references/request-signals.md` when a prompt sits on the boundary between two routes, for
49
+ the 15 observable signals and the response each one selects.
50
+
51
+ ## 4. Record and verify
52
+
53
+ - Verification in direct mode is the UI, the tests, or the user. There is no reviewer agent per
54
+ item.
55
+ - Only a prompt that changes something on disk or produces an artifact becomes a checklist item.
56
+ A pure question is answered inline and recorded nowhere.
57
+ - Direct work records into the day ledger that the per-session pointer names. Assume the pointer
58
+ exists. Never write it.
59
+
60
+ ## 5. What direct does not take
61
+
62
+ The capture hook detects `auto` and `continue` before you read the prompt, so defer rather than
63
+ keyword-match them yourself. `auto` goes to `plastic-auto`, and `continue` goes to
64
+ `plastic-intent-continuing`. On `auto` with no registered intent, route through
65
+ `plastic-intent-creating` first, because auto requires a registered intent. A prompt that arrives
66
+ inside an open thinking conversation belongs to that conversation, not here.
@@ -0,0 +1,59 @@
1
+ # Request signals
2
+
3
+ The table below is reproduced from
4
+ `296--make-plastic-faster-small-work/resources/research--request-analysis.md`, the
5
+ request-analysis research deposit of intent 296, with its source column renumbered against the
6
+ eight-source list below. Read it when a prompt sits on the boundary between two routes. That
7
+ deposit also carries seven worked examples, one per boundary, for a reader who wants them.
8
+
9
+ ## The signal table
10
+
11
+ | Signal | What it looks like in a real prompt | Response it selects | Source or ruling |
12
+ |---|---|---|---|
13
+ | A concrete file and a concrete operation are named | "Rename `foo` to `bar` in `app/models/user.rb` and update its three callers." | execute now | D13, D14 |
14
+ | The target is a single, already-known location | "Fix the typo in README.md line 12." | execute now | D14 |
15
+ | The change is described only by its outcome, with no operation named | "Clean up the user model, it's gotten messy." | ask one clarifying question | Kamsties, "Understanding Ambiguity in Requirements Engineering" (source 5); D13 |
16
+ | The prompt uses weak, hedging modal language ("might", "could", "maybe", "somewhere") | "This might need better error handling somewhere in the payment flow." | ask one clarifying question | "Automatic Detection of Ambiguous Terminology for Software Requirements" (weakness ambiguity, source 6); D13 |
17
+ | The prompt admits several equally plausible readings with no cue that favors one | "Make the form better." (styling, validation, and accessibility are all live readings) | ask one clarifying question | "Knowing but Not Showing" (source 3); "Ask or Assume?" (source 1) |
18
+ | One answer to the clarifying question fully resolves scope | User answers: "Just the null check on line 42, nothing else." | execute now | D10 |
19
+ | The answer to the clarifying question is itself vague or open-ended | User answers: "I don't know, whatever seems right." | offer a thinking intent | D13; "Ask or Assume?" (source 1) |
20
+ | The prompt is phrased as a request for help rather than an instruction | "I need help figuring out how to structure the billing refactor, not sure where to start." | offer a thinking intent | D13 |
21
+ | The number of named or discoverable targets is small (roughly one to three) and each change is additive | "Update the copyright year in these three footer partials." | execute now | D14 |
22
+ | The number of targets is large, or the work is described as spanning many files | "Migrate all 40 view partials to the new component library." | offer a thinking intent | D14 |
23
+ | The target is not yet known and must be found by investigation before any edit is possible | "Something is causing the checkout page to be slow, find it and fix it." | offer a thinking intent | D14; sources 7 and 8 |
24
+ | The action is destructive or hard to reverse and its scope is ambiguous | "Delete the old migrations directory." | ask one clarifying question | "Structured Uncertainty guided Clarification for LLM Agents" (source 4) |
25
+ | The action is destructive but small, self-contained, and obviously scoped | "Delete the unused `tmp_debug.rb` file I just created." | execute now | D14 |
26
+ | The request implies running tests or a build step the agent can run itself as part of verification | "Fix the failing test in user_test.rb." | execute now | D15 |
27
+ | The prompt changes nothing on disk and produces no artifact | "What does the PaymentProcessor class do?" | execute now (answered inline; never admitted as a checklist item) | D17 |
28
+
29
+ Row 8 uses the deposit's wording. Ruling D13 makes the help-needed route grill plus a
30
+ thinking conversation, as `SKILL.md` section 3 states.
31
+
32
+ ## Rulings, not findings
33
+
34
+ Four things in the table above are owner rulings with no literature behind them. Apply
35
+ them, and know they are policy knobs the owner can turn, not measured results.
36
+
37
+ - The five-minute total and the one-minute-per-target budget. Task-complexity research (sources 7
38
+ and 8) correlates target count and search depth with lower agent success, which supports
39
+ counting targets, but no source sets these numbers.
40
+ - The one-question cap. The clarification research (sources 1, 2, and 4) treats question count as
41
+ a calibrated, cost-weighted choice that can be zero, one, or more. A hard cap of one is the
42
+ owner's choice.
43
+ - "Auto" meaning auto mode. It is an interface convention, a keyword that names the mode instead
44
+ of asking for a judgement.
45
+ - "Help needed" phrasing meaning grill plus a thinking conversation. It is a register cue
46
+ specific to how this owner phrases requests, not a general finding.
47
+
48
+ ## Sources
49
+
50
+ 1. "Ask or Assume? Uncertainty-Aware Clarification-Seeking in Coding Agents." https://arxiv.org/abs/2603.26233
51
+ 2. "Learning to Ask: When LLM Agents Meet Unclear Instruction." EMNLP 2025. https://aclanthology.org/2025.emnlp-main.1104.pdf
52
+ 3. "Knowing but Not Showing: LLMs Recognize Ambiguity but Rarely Ask Clarifying Questions." https://arxiv.org/pdf/2605.25284
53
+ 4. "Structured Uncertainty guided Clarification for LLM Agents." https://openreview.net/forum?id=dc8ebScygC
54
+ 5. Kamsties, Erik. "Understanding Ambiguity in Requirements Engineering." https://link.springer.com/chapter/10.1007/3-540-28244-0_11
55
+ 6. "Automatic Detection of Ambiguous Terminology for Software Requirements." https://www.eecis.udel.edu/~yuewang/paper/nldb2013.pdf
56
+ 7. "An Approach for Systematic Decomposition of Complex LLM Tasks." https://arxiv.org/html/2510.07772v1
57
+ 8. "On the Importance of Task Complexity in Evaluating LLM-Based Multi-Agent Systems." https://arxiv.org/html/2510.04311
58
+
59
+ All eight were accessed 2026-08-29. The D-numbers in the table are decisions in `296/spec.md`.
@@ -13,7 +13,7 @@ Doctor has three scopes. Pick the right one for the situation:
13
13
  | Scope | Flag | When it runs | States |
14
14
  |-------|------|--------------|--------|
15
15
  | Core check | `--core` | SessionStart hook (automatic), also available on demand | Binary: pass or error |
16
- | Store check | `--store [global\|<slug>]` | Dashboard load, `plastic-project-continuing` | Three-state: pass / warn / fail |
16
+ | Store check | `--store [global\|<slug>]` | Dashboard load, the project route of `plastic-intent-continuing` | Three-state: pass / warn / fail |
17
17
  | Full check | (no flag) | After every update (automatic), or `/plastic-doctor` | Three-state: pass / warn / fail |
18
18
 
19
19
  ### `--core` (binary, operational-readiness only)
@@ -51,8 +51,12 @@ Each manifest maps a file path to its SHA256.
51
51
 
52
52
  Checks the operations Plastic itself depends on in one store: QMD search reachability (scoped
53
53
  to that store's own collection; global uses `plastic-global`, a project slug uses
54
- `plastic-<slug>`), sources/chain resolution, cross-store resolution, INDEX parsing, and links
55
- projection. A project slug also checks tool readiness (Serena, Enola): each is a pass whether
54
+ `plastic-<slug>`), sources/chain resolution, cross-store resolution, INDEX parsing, links
55
+ projection, done signals (including `backfilled_complete`: a terminal intent still missing a
56
+ real spec.md, plan.md, or action file), and, for the global store only, the session ledger
57
+ (`orphaned_session_tmp`: a `.tmp/<session>/` directory whose heartbeat is older than 24
58
+ hours; `day_ledger_shape`: a `.sessions/` entry that is not a `YYYYMMDD` day directory with
59
+ its `<day>.md`). A project slug also checks tool readiness (Serena, Enola): each is a pass whether
56
60
  present or absent, present naming it available, absent noting it as an optional integration
57
61
  never installed by doctor. Scope options:
58
62
 
@@ -86,10 +90,6 @@ per-project finding**; that is `--store <slug>`'s job (see above). This is what
86
90
  - When hooks aren't firing, skills aren't loading, or something seems broken
87
91
  - When the user says "check plastic", "diagnose", "what's wrong with plastic"
88
92
 
89
- Read `../plastic-conventions/references/gates-and-enforcement.md` for the transition-gate
90
- mechanics, the audited escape, and gate logging before diagnosing a stuck or misbehaving gate.
91
- This path resolves relative to this skill's own installed directory.
92
-
93
93
  ## Procedure
94
94
 
95
95
  ### Step 1: Run the diagnostic script
@@ -159,10 +159,13 @@ Use the `fix_hint` value to determine the correct action:
159
159
  | "Add missing entries to INDEX.md" | Add orphaned intents to the appropriate INDEX.md section |
160
160
  | "Remove stale references from INDEX.md" | Edit INDEX.md to remove ghost references |
161
161
  | "Inject the missing required frontmatter field(s)" | Edit the intent's `{ID}--{slug}.md` frontmatter to add the missing key (e.g. `chain: []`) without touching other keys |
162
- | "Run: provision-project-store {slug}" | Run `provision-project-store <slug>` (or invoke the `plastic-store-provisioning` skill) to create the missing store |
162
+ | "Run: provision-project-store {slug}" | Run `provision-project-store <slug>` (see Provisioning a project store below) to create the missing store |
163
163
  | "Re-run installer" | Run `npx -y @zalom/plastic@<channel> install --claude` (or `--codex`/`--hermes`/`--all` for that agent; channel: -alpha->@alpha, -beta->@beta, else @latest) |
164
164
  | "Run the Plastic installer to bootstrap the store" | Run `npx -y @zalom/plastic@<channel> install --claude` (or `--codex`/`--hermes`/`--all`; channel: -alpha->@alpha, -beta->@beta, else @latest) to restore the global store's plastic_home directory or INDEX.md |
165
- | "Dispatch plastic-store-curating ... revisions.md ..." | Invoke the `plastic-store-curating` (or the agent) to relocate the flagged section or ref into the intent's `revisions.md` via move-and-record (one dated, `[rule: <tag>]`-tagged entry per item), per plastic-conventions > references/maintenance-and-revisions.md. For a missing required section, restore or reproject it instead. |
165
+ | "Relocate ... revisions.md ..." | Relocate the flagged section or ref into the intent's `revisions.md` via move-and-record (one dated, `[rule: <tag>]`-tagged entry per item), per plastic-conventions > references/maintenance-and-revisions.md. For a missing required section, restore or reproject it instead. |
166
+ | "Write the missing documents from the record via `scaffold-intent backfill ...`" | Run `ruby ~/.plastic/scripts/scaffold-intent backfill --store <store> --id <id> --disposition <delivered\|abandoned>` for each listed intent; it fills only missing or placeholder files and never touches real content |
167
+ | "Remove each listed .tmp/<session>/ directory after confirming that session is gone" | For each listed directory, confirm no live session uses it (a live session rewrites its heartbeat on every prompt and edit), then remove that directory by hand; never remove an unlisted one |
168
+ | "For a day directory missing its <day>.md, run `file-session-intent --day <day> ...`" | Run `ruby ~/.plastic/scripts/file-session-intent --day <day> --carry-to <today> --store <store>` for the named day; rename or remove an entry that is not a `YYYYMMDD` day directory |
166
169
  | "Run scripts/project-links ... PRESERVES ... --drop-unbacked-links" | Run `ruby ~/.plastic/scripts/maintenance-run --tool project-links --intent <id> --apply` for the one flagged id (never run bare `project-links` against a real store outside the rare owner-approved batch exception, D2) |
167
170
 
168
171
  For fixes the agent cannot handle automatically, explain what the user needs
@@ -247,6 +250,50 @@ removes exactly the dead rows through the same writer and commit, but holds back
247
250
  intent dir carries a fresh lock or has not gone terminal yet (nothing to suppress there yet),
248
251
  naming both as kept.
249
252
 
250
- ## References
253
+ ## Locks (auto teams only)
254
+
255
+ Locks exist for auto teams: a `delivery.lock` file in the intent directory names the owning
256
+ session, and the `record` hook refreshes its mtime on every edit (the lease heartbeat; stale
257
+ means older than the TTL). Direct work takes no lock. When a lock reads held by a session
258
+ that is gone, when work resumes after a crash, reboot, or `/tmp` wipe, or when the user says
259
+ "fix the lock", "who holds the lock", or "reclaim the lock", use the CLI (intent 304 folded
260
+ the former locking skill here):
261
+
262
+ | Verb | What it does | When |
263
+ |---|---|---|
264
+ | `who` | Owner, heartbeat, claims, delegates, from durable files only | Safe inspection; needs `--intent-dir` |
265
+ | `status` | Lock file, freshness, the derived worktree, whether this session's pointer names the intent, claims | Always safe; run first |
266
+ | `fix` | Idempotent repair from disk truth for this session; never touches a fresh foreign lock | Interrupted work, corrupt state, `/tmp` wiped |
267
+ | `release` | The owner clears the lock | Ending or abandoning an auto delivery |
268
+ | `reclaim` | Explicit takeover of a stale lock; appends an audit line to `savepoint.md` | The owner is gone and the lease expired |
269
+ | `delegate` | The owner registers a subagent session, or marks it `finished` or `failed` | Auto-team orchestration |
270
+
271
+ ```
272
+ ruby ~/.plastic/scripts/plastic-lock status --intent-dir <store>/<id>--<slug>
273
+ ruby ~/.plastic/scripts/plastic-lock who --intent-dir <store>/<id>--<slug>
274
+ ruby ~/.plastic/scripts/plastic-lock fix --intent-dir <store>/<id>--<slug>
275
+ ruby ~/.plastic/scripts/plastic-lock reclaim --intent-dir <store>/<id>--<slug>
276
+ ```
277
+
278
+ `fix` exits non-zero when another session holds a fresh lock: back off, `status` shows the
279
+ owner. `reclaim` refuses a fresh lock; every takeover is audited. The lock file's mtime is the
280
+ sole freshness truth. Never delete a lock file by hand. Read
281
+ `../plastic-conventions/references/locks-and-worktrees.md` when a lock question goes beyond
282
+ these verbs (claims, worktrees, the station ledger).
283
+
284
+ ## Provisioning a project store
285
+
286
+ When a project is registered in `~/.plastic/projects.yml` but has no store on disk (doctor
287
+ reports `project_store_dir`), provision it (intent 304 folded the former provisioning skill
288
+ here). The slug is the project's key under `projects`; an unregistered slug exits non-zero and
289
+ creates nothing, and this procedure never edits `projects.yml`.
290
+
291
+ ```bash
292
+ ruby ~/.plastic/scripts/provision-project-store <slug>
293
+ ruby ~/.plastic/scripts/qmd-sync register --store ~/.plastic/projects/<slug>/store
294
+ ```
251
295
 
252
- - Read `references/gates-stuck-detection.md` for the full gate enforcement table, bridge file pattern, and the recorded stuck-detection signals when diagnosing gate failures or stuck agents
296
+ The provisioner is pure filesystem and idempotent: it creates
297
+ `~/.plastic/projects/<slug>/store/` with `.gitkeep`, writes `INDEX.md` and `project.yml` only
298
+ when missing, and never clobbers. The QMD registration is a separate, optional step that
299
+ no-ops when QMD is absent. New projects are provisioned by `plastic-project-creating`, not here.
@@ -18,6 +18,8 @@
18
18
  core_files -> "Core Files"
19
19
  project_stores -> "Project Stores"
20
20
  deprecations -> "Deprecations"
21
+ done_signals -> "Done Signals"
22
+ session_ledger -> "Session Ledger" (global store only)
21
23
  4. For each check within a category, emit one line with the status icon
22
24
  and the check message. If the check has non-empty details, list them
23
25
  as indented sub-items.
@@ -59,7 +61,7 @@ Checked at: {{timestamp}}
59
61
  - [PASS] Claude Code adapter registered
60
62
  - [FAIL] 2 hook scripts not executable
61
63
  - ~/.claude/hooks/plastic-session-start
62
- - ~/.claude/hooks/plastic-gate-check
64
+ - ~/.claude/hooks/plastic-record
63
65
 
64
66
  <!-- =====================================================================
65
67
  Repeat the above pattern for each category found in the checks array.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: plastic-install
3
- description: 'Use when initializing Plastic globally (~/.plastic/) or locally in a project, or to re-install/repair a broken installation. Accepts channel flags (--alpha, --beta, --latest) to select release channel. First install defaults to --latest (stable); reinstalls match the already-installed channel. Global install is recommended: it creates the global intent store as a git-backed repository. Local install creates .plastic/ in the current project for testing.'
3
+ description: 'Use when initializing Plastic globally (~/.plastic/) or locally in a project, or to re-install/repair a broken installation. The package pin selects the channel (@latest, @beta, @alpha; the channel flags were removed in 2.0). First install defaults to @latest (stable); reinstalls match the already-installed channel. Global install is recommended: it creates the global intent store as a git-backed repository. Local install creates .plastic/ in the current project for testing.'
4
4
  user-invocable: true
5
5
  ---
6
6
 
@@ -16,8 +16,10 @@ user-invocable: true
16
16
 
17
17
  If Plastic is installed, derive `<channel>` from `~/.plastic/VERSION`: a version containing
18
18
  `-alpha` means `@alpha`, `-beta` means `@beta`, otherwise `@latest`. If not installed
19
- (first install), default to `@latest`. The user can always override with
20
- `--alpha` / `--beta` / `--latest`.
19
+ (first install), default to `@latest`. To change channel, pin the package instead of
20
+ passing a flag: `npx -y @zalom/plastic@alpha install --claude` (or a version such as
21
+ `@2.0.0-alpha.1`); the `--alpha`, `--beta`, and `--latest` flags were removed in 2.0
22
+ (intent 310) because they never selected a package.
21
23
 
22
24
  ## Re-install / repair
23
25
 
@@ -31,13 +33,13 @@ npx -y @zalom/plastic@<channel> install --reinstall --claude
31
33
 
32
34
  Then **run `/plastic-doctor`** and report what it found.
33
35
 
34
- ## Channel Flags
36
+ ## Channels
35
37
 
36
- | Flag | Behavior |
37
- |------|----------|
38
- | `--latest` | Install from the stable channel (default on a first install) |
39
- | `--beta` | Install from the beta channel |
40
- | `--alpha` | Install from the alpha channel |
38
+ | Package | Channel |
39
+ |---------|---------|
40
+ | `@zalom/plastic@latest` | stable (default on a first install) |
41
+ | `@zalom/plastic@beta` | beta |
42
+ | `@zalom/plastic@alpha` | alpha; `npx -y @zalom/plastic@alpha install --claude` is the 2.0 alpha path |
41
43
 
42
44
  When invoked from within Claude Code (re-install or channel switch), the skill
43
45
  runs the appropriate npx command: