@zalom/plastic 1.8.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/PLASTIC.md +94 -556
  2. package/README.md +18 -6
  3. package/agents/plastic-enforcer.md +3 -2
  4. package/agents/plastic-intent-curator.md +2 -2
  5. package/agents/plastic-intent-discovery.md +7 -0
  6. package/bin/plastic.js +17 -8
  7. package/deprecations.yml +10 -2
  8. package/hooks/auto-arm +2 -2
  9. package/hooks/bash-gate +1 -1
  10. package/hooks/check-update +1 -1
  11. package/hooks/continue +2 -2
  12. package/hooks/edit-gates +3 -0
  13. package/hooks/future-intent-check +2 -2
  14. package/hooks/gate-check +3 -3
  15. package/hooks/hooks.json +4 -44
  16. package/hooks/power-tools +8 -0
  17. package/hooks/session-start +1 -1
  18. package/package.json +1 -2
  19. package/scripts/codex-hook +57 -118
  20. package/scripts/doctor.rb +146 -1012
  21. package/scripts/exec-worktree +103 -0
  22. package/scripts/hash-intent +1 -1
  23. package/scripts/hook-bash-gate +19 -0
  24. package/scripts/hook-code-gate +16 -28
  25. package/scripts/hook-continue +2 -2
  26. package/scripts/hook-create-gate +13 -57
  27. package/scripts/hook-edit-gates +58 -0
  28. package/scripts/hook-gate-check +17 -0
  29. package/scripts/hook-links-gate +11 -31
  30. package/scripts/hook-lock-gate +19 -60
  31. package/scripts/hook-power-tools +38 -0
  32. package/scripts/hook-savepoint-pre +11 -11
  33. package/scripts/hook-session-start +21 -15
  34. package/scripts/lib/apply_patch_envelope.rb +46 -13
  35. package/scripts/lib/bridge.rb +85 -17
  36. package/scripts/lib/codex_edit_gates.rb +138 -0
  37. package/scripts/lib/doctor_core.rb +1087 -0
  38. package/scripts/lib/edit_gates.rb +398 -0
  39. package/scripts/lib/exec_worktree.rb +325 -0
  40. package/scripts/lib/harness_text.rb +57 -0
  41. package/scripts/lib/hook_registry.rb +64 -28
  42. package/scripts/lib/installer_core.rb +166 -24
  43. package/scripts/lib/lock.rb +196 -47
  44. package/scripts/lib/qmd_hook.rb +21 -41
  45. package/scripts/lib/qmd_sync.rb +0 -15
  46. package/scripts/lib/revisions_writer.rb +1 -1
  47. package/scripts/lib/ruby_probe.rb +60 -0
  48. package/scripts/lib/scaffold_intent.rb +392 -0
  49. package/scripts/lib/spec_header.rb +83 -0
  50. package/scripts/lib/start_intent.rb +296 -0
  51. package/scripts/lib/verify_intent.rb +262 -0
  52. package/scripts/lib/worktree.rb +15 -1
  53. package/scripts/link-suggest +1 -1
  54. package/scripts/maintenance-run +5 -5
  55. package/scripts/migrate-to-global +2 -2
  56. package/scripts/restore-intent-v1 +17 -12
  57. package/scripts/scaffold-intent +120 -0
  58. package/scripts/start-intent +89 -0
  59. package/scripts/verify-intent +73 -0
  60. package/skills/agent-advisor/SKILL.md +5 -5
  61. package/skills/auto/SKILL.md +52 -32
  62. package/skills/auto/evals/evals.json +2 -2
  63. package/skills/auto/references/agent-architecture.md +1 -1
  64. package/skills/auto/references/agent-report-contract.md +1 -1
  65. package/skills/auto/references/human-report-contract.md +22 -3
  66. package/skills/auto/references/tiers.md +24 -2
  67. package/skills/conventions/SKILL.md +31 -0
  68. package/skills/conventions/references/completion-and-done.md +43 -0
  69. package/skills/conventions/references/gates-and-enforcement.md +39 -0
  70. package/skills/conventions/references/knowledge-graph.md +47 -0
  71. package/skills/conventions/references/lifecycle-and-savepoints.md +11 -0
  72. package/skills/conventions/references/locks-and-worktrees.md +113 -0
  73. package/skills/conventions/references/maintenance-and-revisions.md +170 -0
  74. package/skills/conventions/references/roadmaps.md +44 -0
  75. package/skills/conventions/references/tiers-and-dispatch.md +135 -0
  76. package/skills/dashboard/SKILL.md +1 -1
  77. package/skills/doctor/SKILL.md +15 -6
  78. package/skills/doctor/references/gates-stuck-detection.md +13 -8
  79. package/skills/doctor/report.md +1 -1
  80. package/skills/install/SKILL.md +1 -1
  81. package/skills/intent-brainstorming/SKILL.md +4 -2
  82. package/skills/intent-continuing/SKILL.md +4 -0
  83. package/skills/intent-creating/SKILL.md +13 -8
  84. package/skills/intent-creating/references/lifecycle.md +1 -1
  85. package/skills/intent-discovering/SKILL.md +10 -3
  86. package/skills/intent-ending/SKILL.md +12 -7
  87. package/skills/intent-executing/SKILL.md +37 -19
  88. package/skills/intent-grilling/SKILL.md +5 -3
  89. package/skills/intent-linking/SKILL.md +4 -0
  90. package/skills/intent-locking/SKILL.md +4 -0
  91. package/skills/intent-planning/SKILL.md +14 -3
  92. package/skills/intent-researching/SKILL.md +0 -2
  93. package/skills/intent-savepoint/SKILL.md +4 -0
  94. package/skills/intent-speccing/SKILL.md +4 -0
  95. package/skills/intent-starting/SKILL.md +20 -2
  96. package/skills/project-creating/SKILL.md +0 -2
  97. package/skills/project-creating/references/project-scaffolding.md +3 -3
  98. package/skills/releasing/SKILL.md +1 -1
  99. package/skills/releasing/references/promotion-and-tagging.md +14 -8
  100. package/skills/releasing/references/release-lines.md +1 -1
  101. package/skills/roadmap/SKILL.md +4 -0
  102. package/skills/roadmap-continuing/SKILL.md +4 -0
  103. package/skills/skill-creating/SKILL.md +8 -2
  104. package/skills/skill-creating/references/defaults-first.md +23 -0
  105. package/skills/skill-creating/references/hooks.md +4 -1
  106. package/skills/store-curating/SKILL.md +8 -0
  107. package/skills/store-indexing/SKILL.md +16 -5
  108. package/skills/store-indexing/references/zettelkasten-linking.md +1 -1
  109. package/skills/tutorial/references/track-1-guided.md +2 -2
  110. package/skills/tutorial/references/track-2-auto.md +10 -8
  111. package/skills/tutorial/references/track-3-projects-and-roadmaps.md +1 -1
  112. package/skills/uninstall/SKILL.md +6 -9
  113. package/templates/agents.md +12 -12
  114. package/templates/config.yml +6 -7
  115. package/templates/index.md +6 -3
  116. package/templates/spec.md +1 -1
  117. package/PLASTIC-reference.md +0 -138
  118. package/hooks/code-gate +0 -27
  119. package/hooks/create-gate +0 -3
  120. package/hooks/links-gate +0 -3
  121. package/hooks/lock-gate +0 -21
  122. package/hooks/qmd-search +0 -8
  123. package/hooks/retrieval-gate +0 -10
  124. package/hooks/savepoint-pre +0 -10
  125. package/scripts/hook-qmd-search +0 -44
  126. package/scripts/hook-retrieval-gate +0 -148
  127. package/scripts/lib/retrieval_gate.rb +0 -211
@@ -0,0 +1,135 @@
1
+ # Tiers and Dispatch
2
+
3
+ This chapter holds tier depth beyond the S/M/L definition, the agent-model and dispatch mechanics, and the auto-mode human reporting contract.
4
+
5
+ Speed comes from two levers only: artifact content depth and agent topology. The
6
+ same-structure invariant holds: same file set, stage order, gates, and savepoint ledger at
7
+ every tier and in both modes.
8
+
9
+ S/M collapse the topology (one thinker agent writes spec.md then plan.md plus
10
+ checklist.md plus at least one real action file in one context, consolidated into a single
11
+ actions/ACTION_1.md at S/M and one file per task at L; a sonnet executor implements). L
12
+ keeps the full team.
13
+
14
+ Never cut at any tier: the independent reviewer, outcome.md as truth of delivery, the
15
+ delivery lock, worktree isolation, intent creation via skill, INDEX as status truth, the
16
+ QMD reindex at End.
17
+
18
+ Guided mode is unchanged: full-depth artifacts, the human at every gate.
19
+
20
+ Every lifecycle stage has exactly one dispatchable background agent, plus the enforcer that
21
+ orchestrates them: see PLASTIC.md's Agent Models and Dispatch table for the stage-to-agent
22
+ mapping (What, Why, How, Exec, Done).
23
+
24
+ Final-gate code review stays an ad-hoc subagent the enforcer dispatches at the final gate, not
25
+ a standing role.
26
+
27
+ **The advisor: two consultation agents, never injected (intent 185).** Neither is a stage
28
+ role: never in PLASTIC.md's Agent Models and Dispatch table, never dispatched by the auto
29
+ pipeline, and neither ever touches a user's own session. `plastic-advisor` is the real advisor, ships `model: fable`,
30
+ expensive, billed through usage credits. `plastic-faux-advisor` is the imitation advisor, ships
31
+ `model: opus`, an ordinary model carrying the Operating Manual's reasoning discipline inlined
32
+ in its own body (not injected into anything), so it reasons the same disciplined way at a
33
+ fraction of the cost. The `plastic-agent-advisor` skill is the one front door: it teaches when
34
+ consulting is worth the money (from the Advisor Protocol: buy one-way doors, plans, adversarial
35
+ review, deadlocks, ranking; never buy what a tool can answer, code volume, or confirmation of a
36
+ decision already made), routes to the configured agent, and can set the config on request. The
37
+ user or the main session states a TIER (S, M, or L) and an EFFORT line in the brief; shipped
38
+ effort is `xhigh` for `plastic-advisor` and `max` for `plastic-faux-advisor`.
39
+
40
+ Config is harness-scoped, keys matching `InstallerCore::DEFAULT_AGENTS` exactly (`claude`,
41
+ `codex`, `hermes`, never `claude_code`): `advisor.enabled` (false skips installing both agents and the
42
+ skill), `advisor.claude.default` (which agent the skill routes to; an agent NAME never a model
43
+ name, so it can point at a locally registered agent, and the only advisor routing key the
44
+ installer writes). Each agent's actual model is a plain `agents.models.claude.<name>`
45
+ override, the SAME harness-scoped mechanism every other agent uses, resolved through
46
+ `InstallerCore#agent_model_overrides(harness:)`; there is no separate advisor-model key.
47
+ `agents.models` is harness-scoped from this release (`agents.models.claude.*`,
48
+ `agents.models.codex.*`), with the pre-existing flat form (`agents.models.<name>: value`)
49
+ still honored as the claude harness and nested winning over flat. This closes a real latent
50
+ bug: previously the same override map fed both the Claude frontmatter rewrite and the Codex
51
+ TOML generator, so a literal Claude model id could leak into a Codex config; a model named
52
+ under `claude` is now never emitted to `codex`. Install asks which advisor is the default
53
+ (Claude Code only), with a plain description of each: Faux Fable (recommended, cheaper,
54
+ available on any plan) or Fable 5 (the frontier model, billed through credits). Update asks
55
+ the same question once when the key is unset, then never again. Claude-only for this release:
56
+ the owner has not evaluated the Codex reasoning-model ecosystem long enough to judge it, so
57
+ `generate_codex_agents` skips both agents by name, tracked at intent 186, not a permanent
58
+ exclusion.
59
+
60
+ **Auto-mode entry.** `plastic-auto` is the entry skill for autonomous delivery: it takes over How
61
+ and Exec, spins up the stage-agent team named in PLASTIC.md's Agent Models and Dispatch table,
62
+ and works the dashboard's dispatchable queue. The dashboard's
63
+ `--data` output splits intents into a `dispatchable_queue` (work an agent can pick up) and
64
+ `human_only` (intents that need a person); auto mode consumes the former.
65
+
66
+ **Model contract.** Every agent in `agents/*.md` pins an explicit Claude Code model alias in
67
+ its own frontmatter: `opus`, `sonnet`, or `haiku`. Never `inherit`, never Fable by default,
68
+ unless an explicit `agents.models.<name>` config override names Fable for that role, in which
69
+ case the override is honored as written. The two advisors, `plastic-advisor` and
70
+ `plastic-faux-advisor`, are not lifecycle stage roles: the never-Fable rule governs stage
71
+ agents only. Neither is ever dispatched by the auto pipeline; they are consultation roles
72
+ summoned deliberately by the user or the main session, and their models are user configuration
73
+ (fable and opus by default on Claude Code). Aliases track "latest
74
+ per tier" so no Plastic release is required to advance a tier. The tier by role:
75
+ `plastic-enforcer`, `plastic-brainstorming`, `plastic-planner` are `opus`;
76
+ `plastic-spec-specialist`, `plastic-executor`, `plastic-intent-curator`,
77
+ `plastic-future-intent-researcher`, `plastic-intent-discovery` are `sonnet`.
78
+
79
+ **Config and installer mechanism.** `agents.models.<basename>` in a project's
80
+ `<dir>/.plastic_store/config.yml` or the global `~/.plastic/config.yml` overrides one agent's
81
+ tier. Precedence is project, then global, then the shipped default, matching every other
82
+ `read-config` key. The installer applies the resolved override to each agent file's `model:`
83
+ line at copy time (install, update, and repair, across every harness target). With no override
84
+ configured, the shipped frontmatter passes through unchanged.
85
+
86
+ **Dispatch-time contract.** Frontmatter is primary, and Claude Code reads it at dispatch, but
87
+ because that read is a harness implementation detail rather than a contract Plastic controls,
88
+ every dispatch site also resolves the target agent's model through the config chain
89
+ (`read-config agents.models.<basename> --project <repo>`) and passes it explicitly at dispatch,
90
+ belt-and-braces on top of the frontmatter pin.
91
+
92
+ **Cross-harness portability.** The dispatch and model-tier contract above is harness-facing. The
93
+ adapter layer that maps Plastic's hooks and model aliases onto each supported agent runtime
94
+ (Claude, Codex, Hermes) is the cross-harness portability layer; see
95
+ [`harness-adapters.md`](https://github.com/zalom/plastic/blob/main/docs/reference/harness-adapters.md) for the adapter contract.
96
+
97
+ **Spawn preamble (intent 152).** `scripts/spawn-preamble` emits a live-state block purely from
98
+ filesystem state: the active intent, stage, role/cycle-step, the honor instruction, and the
99
+ report contract. When the intent's code worktree is resolvable and exists on disk, it also
100
+ appends the worktree's absolute path plus a verbatim instruction to `cd` there directly, for
101
+ harnesses whose `EnterWorktree` cannot discover a nested repo from a non-repo launch directory.
102
+ Output is byte-identical when no worktree resolves.
103
+
104
+ **Orchestrator advisory.** At auto-mode start, the orchestrator recommends once that the user
105
+ run the main session on the best available thinking model (Fable, Opus, or whatever supersedes
106
+ them). This is advisory only: it changes no behavior and blocks nothing if ignored, and it
107
+ concerns the human's main session, never a dispatched subagent. The two advisors,
108
+ `plastic-advisor` and `plastic-faux-advisor`, are not lifecycle stage roles: the never-Fable
109
+ rule governs stage agents only. Neither is ever dispatched by the auto pipeline; they are
110
+ consultation roles summoned deliberately by the user or the main session, and their models are
111
+ user configuration (fable and opus by default on Claude Code).
112
+
113
+ **`plastic-intent-discovery`.** The What-stage agent. It fires at intent activation, after the
114
+ delivery lock is armed and before Why begins, running under that lock as the owner session (it
115
+ does not acquire the lock itself and is not blocked by it): it reads the intent's
116
+ `chain`/`sources` frontmatter, runs QMD-first discovery over completed predecessor work and
117
+ related parked or future intents, and deposits findings to `resources/discovery--<slug>.md` in
118
+ the intent directory ONLY. It never writes the intent file, `spec.md`, or any other lifecycle
119
+ deliverable; the Why-stage `plastic-brainstorming` agent reads its deposit and enriches
120
+ `## Context`.
121
+
122
+ `savepoint.md`: a deterministic, append-only ledger of cycle-step milestones (one line per
123
+ lifecycle boundary, newest at the bottom), written automatically by the gate hook. It is
124
+ sugar on top of the conventions, not a source of truth: state is always derivable from
125
+ files-on-disk, and the ledger is rebuildable. It exists so a resuming agent reads the cycle's
126
+ succession at a glance (last line = where we are).
127
+
128
+ ### Auto-Mode Human Reporting (intent 92)
129
+
130
+ In auto mode the orchestrator briefs the human at every lifecycle stage boundary in a fixed,
131
+ impact-first shape (the EM-to-CTO report contract): State, then Risk, then Call. This is the
132
+ depth at M and L; at S the briefing fires once, at How. It leads with
133
+ what changed and why it matters, names one risk, and leaves the decision to the human. Separately,
134
+ the `plastic-humanizer` skill cleans authored prose (specs, outcomes, READMEs, release notes) of
135
+ AI tells and slop; it is for documents, not for every reply.
@@ -157,7 +157,7 @@ To explain or debug a ranking or disposition, read `references/classification.md
157
157
 
158
158
  The eval is the payload + golden snapshots: run the engine against the fixture store and
159
159
  assert the `--data` payload shape/sorting/classification and the byte-identical `--json` +
160
- text goldens in `test/fixtures/dashboard/`. See `test/dashboard_test.rb`. Drift without an
160
+ text goldens in [`test/fixtures/dashboard/`](https://github.com/zalom/plastic/tree/main/test/fixtures/dashboard). See [`dashboard_test.rb`](https://github.com/zalom/plastic/blob/main/test/dashboard_test.rb). Drift without an
161
161
  intentional change means the skill is broken.
162
162
 
163
163
  ## Notes
@@ -36,8 +36,9 @@ Each manifest maps a file path to its SHA256.
36
36
 
37
37
  **On failure**, the report states this guided route, in order:
38
38
 
39
- 1. Run `plastic doctor --fix` (the Fix all / Select individually / Skip router from
40
- Step 4-5 below).
39
+ 1. Offer fixes in the `/plastic-doctor` conversation (the Fix all / Select individually /
40
+ Skip router from Steps 4-5 below); doctor itself only reports, and each chosen repair
41
+ is dispatched to the maintenance tool or skill that owns it.
41
42
  2. If that does not resolve it, roll back to the last known-good version via
42
43
  `plastic-rollback` (restores from the local, append-only `versions.json` ledger of
43
44
  versions actually run).
@@ -85,6 +86,10 @@ per-project finding**; that is `--store <slug>`'s job (see above). This is what
85
86
  - When hooks aren't firing, skills aren't loading, or something seems broken
86
87
  - When the user says "check plastic", "diagnose", "what's wrong with plastic"
87
88
 
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
+
88
93
  ## Procedure
89
94
 
90
95
  ### Step 1: Run the diagnostic script
@@ -155,9 +160,9 @@ Use the `fix_hint` value to determine the correct action:
155
160
  | "Remove stale references from INDEX.md" | Edit INDEX.md to remove ghost references |
156
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 |
157
162
  | "Run: provision-project-store {slug}" | Run `provision-project-store <slug>` (or invoke the `plastic-store-provisioning` skill) to create the missing store |
158
- | "Re-run installer" | Run `npx -y @zalom/plastic@<channel> install --agent <agent>` (channel: -alpha->@alpha, -beta->@beta, else @latest) |
159
- | "Run the Plastic installer to bootstrap the store" | Run `npx -y @zalom/plastic@<channel> install --agent <agent>` (channel: -alpha->@alpha, -beta->@beta, else @latest) to restore the global store's plastic_home directory or INDEX.md |
160
- | "Dispatch plastic-store-curating ... revisions.md ..." | Invoke the `plastic-store-curating` (or the agent) to relocate the flagged section or ref into the intent's `revisions.md` via move-and-record (one dated, `[rule: <tag>]`-tagged entry per item), per PLASTIC.md > Structural maintenance and revisions.md. For a missing required section, restore or reproject it instead. |
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
+ | "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. |
161
166
  | "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) |
162
167
 
163
168
  For fixes the agent cannot handle automatically, explain what the user needs
@@ -165,6 +170,10 @@ to do manually. The `revisions.md` remedy is curator-applied (a move-and-record
165
170
  relocation, not a mechanical edit) and stays human-gated by the Step 4
166
171
  Fix / Select / Skip prompt.
167
172
 
173
+ Read `../plastic-conventions/references/maintenance-and-revisions.md` for WORK versus
174
+ MAINTENANCE, the `revisions.md` move-and-record contract, and the violation-tag catalog behind
175
+ the `revisions.md` remedy above.
176
+
168
177
  ### Step 6: Verify
169
178
 
170
179
  After applying fixes, re-run the diagnostic script:
@@ -198,4 +207,4 @@ This keeps the update flow clean when nothing is wrong.
198
207
 
199
208
  ## References
200
209
 
201
- - Read `references/gates-stuck-detection.md` for the full gate enforcement table, bridge file pattern, and stuck detection thresholds when diagnosing gate failures or stuck agents
210
+ - 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
@@ -28,11 +28,16 @@ Hard blocking — hooks exit with code 2 when gates fail.
28
28
 
29
29
  ## Stuck Detection
30
30
 
31
- | Condition | Threshold | Action |
32
- |---|---|---|
33
- | Consecutive gate failures | 3+ | Warning |
34
- | Consecutive gate failures | 5+ | Force savepoint + escalate |
35
- | No activity | 5+ min | Warning |
36
- | No activity | 10+ min | Force savepoint + escalate |
37
- | Context pressure | 80% | Warning |
38
- | Context pressure | 90% | Force savepoint |
31
+ No automatic stuck detector ships today: no threshold fires, and nothing forces a savepoint
32
+ or escalates on its own. What exists is recorded data, and reading it is the diagnosing
33
+ agent's judgment:
34
+
35
+ - `build.gate_failures` in the bridge file: `scripts/hook-gate-check` increments it on every
36
+ blocked write and resets it to 0 on a passing one. Nothing reads the counter back; a high
37
+ value is a signal for you, not a trigger for the system.
38
+ - `build.last_activity` in the bridge file: updated on passing writes. There are no
39
+ inactivity timers, and context pressure is not tracked anywhere.
40
+
41
+ When diagnosing, treat repeated denies of the same gate with no station progress (compare
42
+ the savepoint ledger) as stuck: stop, read the deny reason, and route through the resolving
43
+ command it names.
@@ -97,4 +97,4 @@ Checked at: {{timestamp}}
97
97
  FOOTER -- always include this line exactly as written.
98
98
  ===================================================================== -->
99
99
 
100
- Run `plastic doctor --fix` to auto-fix all fixable issues, or ask me to fix them now.
100
+ Doctor only reports; it never fixes anything itself. Ask me to fix these issues and I will offer Fix all / Select individually / Skip, then route each chosen repair through the tool that owns it.
@@ -187,7 +187,7 @@ Version: none -> <installed>
187
187
  Doctor: <summary or "all clear">
188
188
  ```
189
189
 
190
- Then: "Read `docs/guides/your-first-intent-in-10-minutes.md` for your first intent, start to finish."
190
+ Then: "Read [`your-first-intent-in-10-minutes.md`](https://github.com/zalom/plastic/blob/main/docs/guides/your-first-intent-in-10-minutes.md) for your first intent, start to finish."
191
191
 
192
192
  ### Local Install (testing/legacy)
193
193
 
@@ -8,8 +8,6 @@ user-invocable: true
8
8
 
9
9
  Help turn ideas into fully formed designs through natural collaborative dialogue.
10
10
 
11
- Announce: "I'm using the brainstorming skill to explore the design for intent {id}: {name}."
12
-
13
11
  Start by understanding the current project context, then ask questions one at a time, in prose, to refine the idea. Once you understand what you're building, present the design and collect the owner's rulings on it. This skill's product is the enriched Why, not spec.md.
14
12
 
15
13
  <HARD-GATE>
@@ -106,6 +104,10 @@ Do not author spec.md here.
106
104
  - **Produces:** the enriched Why (`## Context`, `### Decisions`, one `## Insights` entry per ruling).
107
105
  - **Next:** /plastic-intent-speccing consolidates the enriched Why into spec.md.
108
106
 
107
+ Read `../plastic-conventions/references/lifecycle-and-savepoints.md` for the subagent
108
+ report-home contract this handoff relies on. This path resolves relative to this skill's own
109
+ installed directory.
110
+
109
111
  ## Key Principles
110
112
 
111
113
  - **One question at a time** - Don't overwhelm with multiple questions
@@ -47,6 +47,10 @@ scanning the store with grep/Read run `ruby ~/.plastic/scripts/qmd-sync search "
47
47
  surface the candidate intent, then open the authoritative intent file for the hit you resume. The
48
48
  command is a no-op when QMD is absent, so fall back to the existing INDEX.md / file scan.
49
49
 
50
+ Read `../plastic-conventions/references/lifecycle-and-savepoints.md` for the subagent
51
+ report-home contract behind the resume below. This path resolves relative to this skill's own
52
+ installed directory.
53
+
50
54
  For that intent's directory:
51
55
 
52
56
  1. **Read `savepoint.md` FIRST (intent 81).** It is a deterministic, append-only ledger
@@ -42,7 +42,7 @@ When creating a tactical intent in a project store:
42
42
  - **Global:** `~/.plastic/store/`
43
43
  - **Project:** `~/.plastic/projects/{slug}/store/`
44
44
 
45
- ### 1b. Check for a Duplicate or Predecessor (QMD-first)
45
+ ### 2. Check for a Duplicate or Predecessor (QMD-first)
46
46
 
47
47
  QMD-first (when available): before scanning the store with grep/Read, run
48
48
  `ruby ~/.plastic/scripts/qmd-sync search "<terms>"` to surface candidate, prior, or duplicate
@@ -50,7 +50,7 @@ intents, then open the authoritative intent file for any hit you act on. The com
50
50
  when QMD is absent, so fall back to the existing INDEX.md / file scan. Do this before allocating
51
51
  the id so a near-duplicate can be reused and a true predecessor can be set in `--sources`.
52
52
 
53
- ### 2. Decide Branch vs Root
53
+ ### 3. Decide Branch vs Root
54
54
 
55
55
  Decide this BEFORE scaffolding, because it sets whether you pass `--parent`.
56
56
  Having a "parent" in mind does NOT automatically mean branch. Choose by meaning:
@@ -71,8 +71,9 @@ Having a "parent" in mind does NOT automatically mean branch. Choose by meaning:
71
71
 
72
72
  When a branch intent exists because a late ruling arrived AFTER its parent was already
73
73
  completed (the owner's late-ruling rule), the parent is restored to v1 via
74
- `scripts/restore-intent-v1`, never by a hand-run `git checkout`/revert. See `PLASTIC.md` >
75
- Terminal immutability for the rule and the tool.
74
+ `scripts/restore-intent-v1`, never by a hand-run `git checkout`/revert. See
75
+ `plastic-conventions > references/maintenance-and-revisions.md`, WORK vs MAINTENANCE, for the
76
+ rule and the tool.
76
77
 
77
78
  `## Links` is a DERIVED view of `sources`/`chain`. Never hand-write a `## Links` line; add the
78
79
  frontmatter edge and reproject. Links are decided by context influence (a `chain` edge has a high
@@ -80,7 +81,11 @@ bar: the candidate's context must materially help deliver this intent), not by s
80
81
  similarity score. To gather candidates with their context and record an edge, use the
81
82
  `plastic-intent-linking` skill and `scripts/link-suggest`.
82
83
 
83
- ### 3. Determine Intent Properties
84
+ Read `../plastic-conventions/references/knowledge-graph.md` for the full linking doctrine: the
85
+ tiers of influence, sources versus chain, and how the `## Links` projection is derived. This path
86
+ resolves relative to this skill's own installed directory.
87
+
88
+ ### 4. Determine Intent Properties
84
89
 
85
90
  Ask or infer from context:
86
91
  - **intent**: one-line description
@@ -95,11 +100,11 @@ Ask or infer from context:
95
100
 
96
101
  `chain` carries what this intent spawns AND related-but-not-spawned successors it leads to;
97
102
  it starts empty and is populated later. See
98
- `docs/concepts/how-plastic-sources-and-chains-intents.md` for the full model.
103
+ [`how-plastic-sources-and-chains-intents.md`](https://github.com/zalom/plastic/blob/main/docs/concepts/how-plastic-sources-and-chains-intents.md) for the full model.
99
104
  Place the intent in `## Active` or `## Future` in INDEX.md (status is
100
105
  convention-derived, not a frontmatter field).
101
106
 
102
- ### 4. Scaffold via new-intent (single call)
107
+ ### 5. Scaffold via new-intent (single call)
103
108
 
104
109
  Delegate id allocation, directory and file creation, the born-complete intent
105
110
  file, the sentinel placeholder lifecycle files, the reciprocal file links, and
@@ -107,7 +112,7 @@ self-validation to one `new-intent` invocation. Do NOT hand-author any of these
107
112
  files.
108
113
 
109
114
  ```bash
110
- "${CLAUDE_PLUGIN_ROOT}/scripts/new-intent" \
115
+ ruby ~/.plastic/scripts/new-intent \
111
116
  --store "<STORE>" --intent "<one-line>" --slug "<slug>" \
112
117
  [--parent "<parent_id>"] [--author "<author>"] \
113
118
  [--sources "id,id"] [--tags "project-<slug>,tag"]
@@ -73,7 +73,7 @@ State is derived from what exists, not from what's declared.
73
73
 
74
74
  1. Determine the target store: `~/.plastic/store/` for global intents (default), `~/.plastic/projects/{slug}/store/` for project intents
75
75
  2. Decide branch vs root (this sets whether you pass `--parent`)
76
- 3. Scaffold with one call: `"${CLAUDE_PLUGIN_ROOT}/scripts/new-intent" --store <store> --intent "<one-line>" --slug <slug> [--parent <id>] [--sources id,id] [--tags ...]`. This allocates the id, creates the directory plus `actions/` and `resources/`, renders the born-complete intent file (frontmatter plus `## Intent`, `## Context`, `## Outcome`, `## Insights`, `## Links`), writes the sentinel placeholder lifecycle files, wires the reciprocal links, and self-validates.
76
+ 3. Scaffold with one call: `ruby ~/.plastic/scripts/new-intent --store <store> --intent "<one-line>" --slug <slug> [--parent <id>] [--sources id,id] [--tags ...]`. This allocates the id, creates the directory plus `actions/` and `resources/`, renders the born-complete intent file (frontmatter plus `## Intent`, `## Context`, `## Outcome`, `## Insights`, `## Links`), writes the sentinel placeholder lifecycle files, wires the reciprocal links, and self-validates.
77
77
  4. Update the appropriate `INDEX.md` — add to Active section and appropriate cluster
78
78
 
79
79
  The intent file is born complete with all five sanctioned `##` sections; the lifecycle files (`spec.md`/`plan.md`/`checklist.md`/`outcome.md`) are sentinel placeholders that read as "stage not reached" until an agent fills them and deletes the `<!-- plastic:placeholder -->` first line.
@@ -11,8 +11,6 @@ user-invocable: false
11
11
 
12
12
  # Intent Discovery — What-stage context deposit
13
13
 
14
- Announce: "Discovering context for intent [ID] — [name]."
15
-
16
14
  Runs once, at intent activation, after the lock is armed and before Why. It gathers what is
17
15
  already known so Why does not start cold, and deposits it as a resource the
18
16
  Why-stage brainstorming agent reads.
@@ -21,9 +19,18 @@ Why-stage brainstorming agent reads.
21
19
  Inside `plastic-intent-starting`, right after the bridge is armed, under the
22
20
  lock. Dispatched as the `plastic-intent-discovery` background agent.
23
21
 
22
+ **Precondition for skipping: a size of S already on record, and no graph edges.** Read the
23
+ activating intent's `chain` and `sources` frontmatter fields first. When a `Tier: S` line is
24
+ already stamped at the top of `spec.md` AND both fields are empty, the pass does not run:
25
+ write the single line `no chain/sources, discovery skipped` to
26
+ `resources/discovery--<slug>.md` and stop there. Sizing happens at Why, which is after this
27
+ stage, so a first activation usually has no size yet and the full pass runs. Never guess a
28
+ size to unlock the skip. At M or L, or when either field is filled, run the full pass below.
29
+
24
30
  ## What it does
25
31
  1. **Read the intent's links.** Load the activating intent file's `chain` and
26
- `sources` frontmatter fields.
32
+ `sources` frontmatter fields. If both are empty and a size of S is already on record, apply
33
+ the skip above and stop.
27
34
  2. **QMD-first discovery.** Search the Plastic stores with
28
35
  `scripts/qmd-sync search "<terms>"` (or the `qmd` skill), scoped to the
29
36
  relevant `plastic-*` collections, across completed predecessor work named in
@@ -15,6 +15,10 @@ curator path, and releasing all call this skill (or its backing script,
15
15
  prose three times. `abandoned` is the SAME procedure as `delivered`, not a
16
16
  failure branch: only outcome.md content and the INDEX section differ.
17
17
 
18
+ Read `../plastic-conventions/references/completion-and-done.md` for what "intent done" means and
19
+ the End-stage tail behind the steps below. This path resolves relative to this skill's own
20
+ installed directory.
21
+
18
22
  ## The 8 steps (0-7)
19
23
 
20
24
  | # | Step | Who does it |
@@ -58,8 +62,8 @@ for orchestrator-owned or completion-tracking items.
58
62
  `## Links` projection). On a refusal, fix via the OWNING tool, never a
59
63
  hand edit of the check's own output:
60
64
  - checklist/outcome content - finish it yourself, the same as before.
61
- - links projection - `scripts/project-links --intent <id> --apply` via
62
- `maintenance-run`.
65
+ - links projection - run
66
+ `ruby ~/.plastic/scripts/maintenance-run --tool project-links --intent <id> --apply`.
63
67
  - a savepoint issue - advisory only (WARN, never blocks): run
64
68
  `plastic-intent-savepoint` to rebuild via `Bridge.rebuild_savepoint` if
65
69
  you want it clean, but it never refuses the close on its own.
@@ -167,8 +171,9 @@ historical record of what was planned.
167
171
 
168
172
  ## Routing
169
173
 
170
- `plastic-releasing`, `plastic-auto`, the curator agent, `store-curating`, and
171
- `store-indexing` all delegate their mechanical close to this skill (or call
172
- `scripts/end-intent` directly for steps 1-5). None of them restate the
173
- outcome/INDEX/savepoint/disarm prose inline any more; if you find one that
174
- does, that surface has drifted and should route here instead.
174
+ `plastic-releasing`, `plastic-auto`, `plastic-intent-executing`, the curator
175
+ agent, `store-curating`, and `store-indexing` all delegate their mechanical
176
+ close to this skill (or call `scripts/end-intent` directly for steps 1-5).
177
+ None of them restate the outcome/INDEX/savepoint/disarm prose inline any
178
+ more; if you find one that does, that surface has drifted and should route
179
+ here instead.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: plastic-intent-executing
3
- description: Use when you have a written implementation plan to execute. Default mode is subagent-driven (dispatches fresh subagent per task with two-stage review). Fallback mode is inline execution for environments without subagent support. If superpowers:subagent-driven-development or superpowers:executing-plans are available, delegates to them.
3
+ description: Use when you have a written implementation plan to execute. Default mode is subagent-driven (at L a fresh subagent per task with two-stage review, at S and M one executor dispatch for the whole consolidated action). Fallback mode is inline execution for environments without subagent support. If superpowers:subagent-driven-development or superpowers:executing-plans are available, delegates to them.
4
4
  user-invocable: true
5
5
  ---
6
6
 
@@ -8,9 +8,7 @@ user-invocable: true
8
8
 
9
9
  ## Overview
10
10
 
11
- Load plan from the active intent's `plan.md`, execute all tasks, review between tasks, report when complete.
12
-
13
- **Announce at start:** "I'm using the executing-plan skill to implement this plan."
11
+ Load plan from the active intent's `plan.md`, execute all tasks, review per the tier gate below, report when complete.
14
12
 
15
13
  ## Step 0: Sync Worktree First
16
14
 
@@ -25,6 +23,10 @@ After syncing, verify the plan's target files exist at the paths plan.md names.
25
23
  If a named file or directory is missing (renamed or removed upstream), stop and
26
24
  report it rather than editing a stale path.
27
25
 
26
+ Read `../plastic-conventions/references/locks-and-worktrees.md` for delivery isolation: the
27
+ single-owner lock, claims, worktrees, solo mode, and the station ledger, before touching the
28
+ worktree above. This path resolves relative to this skill's own installed directory.
29
+
28
30
  ## Mode Selection
29
31
 
30
32
  ### Check for superpowers first
@@ -38,7 +40,12 @@ If `superpowers:subagent-driven-development` is available as a skill, delegate t
38
40
  - Superpowers skills respect "user preferences for plan/spec location"; Plastic IS that preference
39
41
 
40
42
  ### Subagent-Driven (Default)
41
- Dispatches a fresh subagent per task. Controller never implements, only dispatches, reviews, and tracks progress. Two-stage review after each task: spec compliance first, then code quality.
43
+ Dispatches subagents to do the work. The controller never implements. It dispatches, reviews, and tracks progress. How many dispatches it makes depends on the tier stamped at the top of `spec.md` (the `Tier:` line, the single authoritative record). `plan.md` carries a bold `**Tier:**` field copied from it, a convenience only:
44
+
45
+ - **S or M:** one executor dispatch implements the whole consolidated action from `plan.md` plus `checklist.md` in one pass. There is no per-task implementer-then-two-reviewers loop.
46
+ - **L:** a fresh subagent per task, and a two-stage review after each task: spec compliance first, then code quality.
47
+
48
+ The final independent review in Step 3 runs at every tier. It is a separate agent with fresh context, and it is never the maker.
42
49
 
43
50
  ### Inline (Fallback)
44
51
  Executes tasks sequentially in the current session. Use when subagents aren't available or user explicitly requests inline mode.
@@ -55,6 +62,19 @@ Run Step 0 (Sync Worktree First) before this step.
55
62
 
56
63
  ### Step 2: Execute Each Task
57
64
 
65
+ Read the `Tier:` line stamped at the top of `spec.md` first (the authority), then follow the matching branch. `plan.md`'s bold `**Tier:**` field is a convenience copy of the same value, useful when `spec.md` is not already open.
66
+
67
+ #### At S or M: one executor dispatch
68
+
69
+ Dispatch ONE executor subagent and give it the whole delivery: every task's full text from `plan.md` (pasted in, never a file reference), the checklist items it must tick, the project context from CLAUDE.md, and the active intent context from `{ID}--{slug}.md`. In auto mode this is the `plastic-executor` agent; elsewhere use the `implementer-prompt.md` template. The executor implements the consolidated action in order, ticks each item as it lands (see `## Tick-as-you-land`), and drives the test suite green.
70
+
71
+ Read its response by code:
72
+ - DONE or DONE_WITH_CONCERNS → proceed to Step 3. Run no per-task spec review and no per-task quality review at these tiers; Step 3's final review covers the work.
73
+ - NEEDS_CONTEXT → provide the missing context, re-dispatch the executor.
74
+ - BLOCKED → stop, report to the user, wait for resolution.
75
+
76
+ #### At L: one subagent per task
77
+
58
78
  For each task sequentially (never parallel: conflict risk):
59
79
 
60
80
  **a. Dispatch implementer subagent**
@@ -81,17 +101,13 @@ Only after spec compliance passes. Reviews clean code, testing, architecture. Pa
81
101
  Follow `## Tick-as-you-land` below: move the task's checklist item to `## Completed` and add a `## Session Log` row in the same edit.
82
102
 
83
103
  ### Step 3: Final Review
84
- After all tasks complete, dispatch a final reviewer for the entire implementation.
104
+ After all tasks complete, dispatch a final reviewer for the entire implementation. This runs at every tier, S, M, and L. The reviewer is a separate agent with fresh context and is never the maker. At S and M this is the only review the work gets, so if it returns changes, re-dispatch the executor to fix them, then re-review.
85
105
 
86
106
  ### Step 4: Update Intent and Complete
87
107
  Capture observations in `## Insights`. When ALL checklist items are checked:
88
108
 
89
- 1. Write `outcome.md` with detailed results in the intent directory, using the `${CLAUDE_PLUGIN_ROOT}/templates/outcome.md` form. Set the frontmatter `disposition: delivered` (the delivered terminal). `outcome.md` is mandatory at every terminal and self-declares its disposition (canonical done-marker in PLASTIC.md).
90
- 2. Write `## Outcome` summary in the intent file (1-2 sentences)
91
- 3. Move intent from `## Active` to `## Completed` in INDEX.md (with today's date)
92
- 4. Update cluster entries to show `_(completed)_`
93
- 5. Auto-commit: `cd <store-root> && git add . && git commit -m "feat: complete intent <ID>: <name>"`
94
- 6. QMD reindex LAST (canonical End tail). As the final End-tail step, after the terminal move and any disarm, ALWAYS refresh the QMD search index for this store (no-op when QMD is absent), running in the background so it never blocks the turn: `ruby ~/.plastic/scripts/qmd-sync reindex --store <store-root> --async`. Completion is the lifecycle event that keeps the search index fresh, and the reindex runs last so the index never references a bridge or lock that is about to disappear (see PLASTIC.md `## Delivery Isolation and the Single-Owner Lock`).
109
+ 1. Update the intent's cluster entries in `INDEX.md` to show `_(completed)_`. Do this first, so the store auto-commit in the next step picks it up. `plastic-intent-ending` does not cover cluster maintenance (`store-indexing` and `store-curating` own it), so doing it here keeps the step from being lost.
110
+ 2. Hand the mechanical close to `plastic-intent-ending`. It owns `outcome.md`, the intent file's `## Outcome` stamp, the INDEX terminal move, the savepoint `Done` line, the store auto-commit, disarm, the QMD reindex, and the EM-to-CTO owner report, as ONE delegation. Author the outcome.md content when that skill asks for it; do not restate the mechanical steps here.
95
111
 
96
112
  **This is NOT optional.** An intent with all checklist items done but no Outcome is a broken state. Complete the intent immediately, do not leave it for later.
97
113
 
@@ -113,12 +129,8 @@ For each task:
113
129
  ### Step 3: Update Intent and Complete
114
130
  Capture observations in `## Insights`. When ALL checklist items are checked:
115
131
 
116
- 1. Write `outcome.md` with detailed results in the intent directory, using the `${CLAUDE_PLUGIN_ROOT}/templates/outcome.md` form. Set the frontmatter `disposition: delivered` (the delivered terminal). `outcome.md` is mandatory at every terminal and self-declares its disposition (canonical done-marker in PLASTIC.md).
117
- 2. Write `## Outcome` summary in the intent file (1-2 sentences)
118
- 3. Move intent from `## Active` to `## Completed` in INDEX.md (with today's date)
119
- 4. Update cluster entries to show `_(completed)_`
120
- 5. Auto-commit: `cd <store-root> && git add . && git commit -m "feat: complete intent <ID>: <name>"`
121
- 6. QMD reindex LAST (canonical End tail). As the final End-tail step, after the terminal move and any disarm, ALWAYS refresh the QMD search index for this store (no-op when QMD is absent), running in the background so it never blocks the turn: `ruby ~/.plastic/scripts/qmd-sync reindex --store <store-root> --async`. Completion is the lifecycle event that keeps the search index fresh, and the reindex runs last so the index never references a bridge or lock that is about to disappear (see PLASTIC.md `## Delivery Isolation and the Single-Owner Lock`).
132
+ 1. Update the intent's cluster entries in `INDEX.md` to show `_(completed)_`. Do this first, so the store auto-commit in the next step picks it up. `plastic-intent-ending` does not cover cluster maintenance (`store-indexing` and `store-curating` own it), so doing it here keeps the step from being lost.
133
+ 2. Hand the mechanical close to `plastic-intent-ending`. It owns `outcome.md`, the intent file's `## Outcome` stamp, the INDEX terminal move, the savepoint `Done` line, the store auto-commit, disarm, the QMD reindex, and the EM-to-CTO owner report, as ONE delegation. Author the outcome.md content when that skill asks for it; do not restate the mechanical steps here.
122
134
 
123
135
  **This is NOT optional.** Complete the intent immediately when work is done.
124
136
 
@@ -138,6 +150,9 @@ the changed file, the installed output) rather than restating the intended
138
150
  change. Never present an unverified claim to the owner. If verification
139
151
  fails, fix it before the gate, not after.
140
152
 
153
+ Read `../plastic-conventions/references/gates-and-enforcement.md` for the transition-gate
154
+ mechanics, the audited escape, and gate logging behind every owner gate named here.
155
+
141
156
  ## Methods report (audits and sweeps)
142
157
 
143
158
  When the work is an audit or a sweep (checking many files or many instances of
@@ -164,7 +179,10 @@ persisting each ruling with `--stage Exec`.
164
179
 
165
180
  - **Before:** `plan.md` and `checklist.md` exist; the worktree is armed.
166
181
  - **Produces:** code changes, a ticked checklist, and (for audits or sweeps) a methods report in `resources/`.
167
- - **Next:** intent-ending owns `outcome.md` (see intent 161). This skill's own Update-Intent-and-Complete step above is unchanged by this note.
182
+ - **Next:** `plastic-intent-ending` owns `outcome.md` and the rest of the mechanical close (see intent 161). The Update-Intent-and-Complete step above hands off to it.
183
+
184
+ Read `../plastic-conventions/references/lifecycle-and-savepoints.md` for the subagent
185
+ report-home contract this handoff relies on.
168
186
 
169
187
  ## Model Selection for Subagents
170
188
 
@@ -53,20 +53,22 @@ This process is thorough. It typically takes 20-45 minutes for a complex design.
53
53
 
54
54
  > "We've covered [areas]. Still to explore: [areas]. Continue, or pause and capture what we have?"
55
55
 
56
- If the user wants to pause, capture all decisions made so far into the active intent's spec.md.
56
+ If the user wants to pause, capture all decisions made so far into the active intent's `## Context` / `### Decisions`, ready for /plastic-intent-speccing to consolidate later.
57
57
 
58
58
  ### 5. Close Out
59
59
 
60
60
  When all branches are resolved:
61
61
 
62
- 1. Write the complete spec to the active intent directory (`spec.md`)
62
+ 1. Record every ruling in the active intent's `## Context` / `### Decisions`, then hand off
63
+ to /plastic-intent-speccing to consolidate them into `spec.md` (that skill owns
64
+ `spec.md` exclusively)
63
65
  2. List all decisions made
64
66
  3. List any deferred items (things the user explicitly chose to decide later)
65
67
  4. Proceed to Autonomous Handoff Offer (step 6)
66
68
 
67
69
  ### 6. Autonomous Handoff Offer
68
70
 
69
- After closing out (spec written, decisions listed), assess whether the agent has enough context to deliver the intent autonomously.
71
+ After closing out (decisions listed, spec consolidated by /plastic-intent-speccing), assess whether the agent has enough context to deliver the intent autonomously.
70
72
 
71
73
  **Self-assessment checklist:**
72
74
  - All key decisions resolved (no open "it depends" or "TBD")
@@ -26,6 +26,10 @@ Two distinct steps, do not conflate them:
26
26
 
27
27
  ## The three tiers (by context influence)
28
28
 
29
+ Read `../plastic-conventions/references/knowledge-graph.md` for the full linking doctrine behind
30
+ these tiers, the sources-versus-chain distinction, and the `## Links` projection. This path
31
+ resolves relative to this skill's own installed directory.
32
+
29
33
  - **sources:** the foundational context that shaped this intent's CREATION (a split, an idea born
30
34
  during development, a merge). Earns an edge. Decided by origin, never inferred.
31
35
  - **chain:** the context that materially helps DELIVER this intent. HIGH bar: only the genuinely
@@ -12,6 +12,10 @@ session-keyed, liveness is a lease (the owner's hooks refresh the file mtime;
12
12
  stale means the heartbeat is older than the TTL). The /tmp bridge is only a
13
13
  cache; the lock file wins every disagreement.
14
14
 
15
+ Read `../plastic-conventions/references/locks-and-worktrees.md` for delivery isolation in full:
16
+ the single-owner lock, claims, worktrees, solo mode, and the station ledger behind every verb
17
+ below. This path resolves relative to this skill's own installed directory.
18
+
15
19
  ## Verbs
16
20
 
17
21
  Run from the project (the intent resolves from this session's bridge), or pass