@zalom/plastic 1.14.1 → 2.0.0-alpha.10

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 (213) 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/bin/lib/context_budget.rb +453 -0
  8. package/bin/plastic-bench +78 -0
  9. package/config_asks.yml +38 -0
  10. package/hooks/capture +4 -0
  11. package/hooks/close +5 -0
  12. package/hooks/hooks.json +14 -42
  13. package/hooks/message-display +81 -0
  14. package/hooks/record +4 -0
  15. package/hooks/savepoint +5 -5
  16. package/package.json +3 -2
  17. package/scripts/agent-report +15 -10
  18. package/scripts/append-ledger +208 -0
  19. package/scripts/codex-hook +78 -90
  20. package/scripts/dashboard.rb +43 -14
  21. package/scripts/day-summary +53 -0
  22. package/scripts/doctor.rb +269 -43
  23. package/scripts/end-intent +170 -76
  24. package/scripts/exec-worktree +11 -20
  25. package/scripts/file-session-intent +61 -0
  26. package/scripts/hook-capture +255 -0
  27. package/scripts/hook-close +36 -0
  28. package/scripts/hook-message-display +74 -0
  29. package/scripts/hook-record +157 -0
  30. package/scripts/hook-savepoint +45 -0
  31. package/scripts/hook-session-start +128 -12
  32. package/scripts/install.rb +8 -6
  33. package/scripts/intent-screen +77 -0
  34. package/scripts/lib/agent_models.rb +1 -7
  35. package/scripts/lib/arm.rb +308 -0
  36. package/scripts/lib/backfill_intent.rb +316 -0
  37. package/scripts/lib/bridge.rb +24 -1597
  38. package/scripts/lib/compact_instructions.rb +56 -0
  39. package/scripts/lib/day_summary.rb +211 -0
  40. package/scripts/lib/doctor_core.rb +66 -88
  41. package/scripts/lib/doctor_session_ledger.rb +158 -0
  42. package/scripts/lib/exec_worktree.rb +14 -60
  43. package/scripts/lib/handoff.rb +184 -0
  44. package/scripts/lib/harness_text.rb +5 -4
  45. package/scripts/lib/hook_registry.rb +57 -106
  46. package/scripts/lib/insights.rb +3 -4
  47. package/scripts/lib/installer_core.rb +136 -41
  48. package/scripts/lib/intent_screen.rb +309 -0
  49. package/scripts/lib/intent_screen_ansi.rb +262 -0
  50. package/scripts/lib/lock.rb +6 -26
  51. package/scripts/lib/message_display.rb +290 -0
  52. package/scripts/lib/outcome_guard.rb +7 -5
  53. package/scripts/lib/project_validator.rb +30 -1
  54. package/scripts/lib/report_screen.rb +648 -0
  55. package/scripts/lib/roadmap_queue.rb +3 -3
  56. package/scripts/lib/roadmap_savepoint.rb +1 -1
  57. package/scripts/lib/rule_catalog.rb +6 -3
  58. package/scripts/lib/savepoint.rb +334 -0
  59. package/scripts/lib/scaffold_intent.rb +13 -179
  60. package/scripts/lib/screen_paint.rb +276 -0
  61. package/scripts/lib/session_backfill.rb +184 -0
  62. package/scripts/lib/session_close.rb +104 -0
  63. package/scripts/lib/session_git.rb +500 -0
  64. package/scripts/lib/session_ledger.rb +621 -0
  65. package/scripts/lib/store_discovery.rb +1 -1
  66. package/scripts/lib/store_provisioning.rb +1 -1
  67. package/scripts/maintenance-run +7 -7
  68. package/scripts/new-intent +63 -4
  69. package/scripts/plastic-lock +101 -41
  70. package/scripts/promote-session-item +150 -0
  71. package/scripts/read-config +3 -0
  72. package/scripts/rebuild-graph +1 -1
  73. package/scripts/report-screen +120 -0
  74. package/scripts/roadmap-next +2 -2
  75. package/scripts/rollback.rb +48 -3
  76. package/scripts/savepoint-note +67 -0
  77. package/scripts/scaffold-intent +37 -63
  78. package/scripts/session-commit +116 -0
  79. package/scripts/spawn-preamble +14 -7
  80. package/scripts/update.rb +7 -3
  81. package/scripts/write-handoff +60 -0
  82. package/skills/agent-advisor/SKILL.md +3 -3
  83. package/skills/agent-advisor/references/advisor-protocol.md +20 -20
  84. package/skills/auto/SKILL.md +223 -317
  85. package/skills/auto/evals/evals.json +10 -10
  86. package/skills/auto/references/agent-architecture.md +102 -90
  87. package/skills/auto/references/agent-report-contract.md +4 -21
  88. package/skills/auto/references/end-tail.md +47 -53
  89. package/skills/auto/references/human-report-contract.md +62 -56
  90. package/skills/conventions/SKILL.md +1 -3
  91. package/skills/conventions/references/lifecycle-and-savepoints.md +35 -1
  92. package/skills/conventions/references/locks-and-worktrees.md +62 -58
  93. package/skills/conventions/references/maintenance-and-revisions.md +12 -12
  94. package/skills/dashboard/SKILL.md +1 -1
  95. package/skills/direct/SKILL.md +66 -0
  96. package/skills/direct/references/request-signals.md +59 -0
  97. package/skills/doctor/SKILL.md +58 -11
  98. package/skills/doctor/report.md +3 -1
  99. package/skills/install/SKILL.md +11 -9
  100. package/skills/intent-continuing/SKILL.md +142 -91
  101. package/skills/intent-continuing/references/boarding-matrix.md +34 -0
  102. package/skills/intent-continuing/references/context-management.md +3 -3
  103. package/skills/intent-creating/SKILL.md +2 -2
  104. package/skills/intent-creating/references/lifecycle.md +1 -1
  105. package/skills/intent-ending/SKILL.md +34 -37
  106. package/skills/intent-ending/evals/evals.json +4 -4
  107. package/skills/intent-executing/SKILL.md +15 -46
  108. package/skills/intent-executing/plan-reviewer-prompt.md +39 -0
  109. package/skills/intent-speccing/SKILL.md +108 -51
  110. package/skills/intent-speccing/evals/evals.json +5 -5
  111. package/skills/intent-speccing/references/per-section-fill-rules.md +4 -4
  112. package/skills/intent-speccing/references/self-verify-checklist.md +1 -2
  113. package/skills/project-creating/SKILL.md +1 -1
  114. package/skills/releasing/SKILL.md +7 -8
  115. package/skills/tutorial/SKILL.md +2 -2
  116. package/skills/tutorial/references/track-1-guided.md +16 -18
  117. package/skills/tutorial/references/track-2-auto.md +12 -13
  118. package/skills/tutorial/references/track-3-projects-and-roadmaps.md +2 -2
  119. package/templates/agents.md +4 -7
  120. package/templates/config.yml +5 -0
  121. package/templates/intent-screen.md +17 -0
  122. package/templates/outcome.md +14 -1
  123. package/templates/project.yml +7 -0
  124. package/templates/report-state.md +11 -0
  125. package/templates/roadmap.md +1 -1
  126. package/templates/savepoint.md +2 -2
  127. package/templates/session-intent.md +29 -0
  128. package/agents/plastic-brainstorming.md +0 -48
  129. package/agents/plastic-future-intent-researcher.md +0 -35
  130. package/agents/plastic-intent-curator.md +0 -47
  131. package/agents/plastic-intent-discovery.md +0 -43
  132. package/agents/plastic-planner.md +0 -56
  133. package/agents/plastic-spec-specialist.md +0 -53
  134. package/hooks/auto-arm +0 -5
  135. package/hooks/bash-gate +0 -3
  136. package/hooks/continue +0 -31
  137. package/hooks/edit-gates +0 -3
  138. package/hooks/future-intent-check +0 -25
  139. package/hooks/gate-check +0 -12
  140. package/hooks/power-tools +0 -8
  141. package/scripts/hook-auto-arm +0 -51
  142. package/scripts/hook-bash-gate +0 -78
  143. package/scripts/hook-code-gate +0 -38
  144. package/scripts/hook-continue +0 -48
  145. package/scripts/hook-create-gate +0 -51
  146. package/scripts/hook-edit-gates +0 -58
  147. package/scripts/hook-future-intent-check +0 -90
  148. package/scripts/hook-gate-check +0 -169
  149. package/scripts/hook-links-gate +0 -54
  150. package/scripts/hook-lock-gate +0 -47
  151. package/scripts/hook-power-tools +0 -38
  152. package/scripts/hook-savepoint-pre +0 -32
  153. package/scripts/lib/codex_edit_gates.rb +0 -138
  154. package/scripts/lib/edit_gates.rb +0 -398
  155. package/scripts/lib/links_gate.rb +0 -140
  156. package/scripts/lib/qmd_hook.rb +0 -41
  157. package/scripts/lib/spec_header.rb +0 -83
  158. package/scripts/lib/start_intent.rb +0 -296
  159. package/scripts/start-intent +0 -89
  160. package/skills/_active-intent-gate.md +0 -26
  161. package/skills/auto/references/tiers.md +0 -100
  162. package/skills/continuing/SKILL.md +0 -34
  163. package/skills/continuing/evals/evals.json +0 -91
  164. package/skills/conventions/references/gates-and-enforcement.md +0 -53
  165. package/skills/conventions/references/tiers-and-dispatch.md +0 -135
  166. package/skills/doctor/references/gates-stuck-detection.md +0 -43
  167. package/skills/intent-brainstorming/SKILL.md +0 -118
  168. package/skills/intent-brainstorming/evals/evals.json +0 -67
  169. package/skills/intent-continuing/evals/evals.json +0 -145
  170. package/skills/intent-discovering/SKILL.md +0 -56
  171. package/skills/intent-grilling/SKILL.md +0 -108
  172. package/skills/intent-linking/SKILL.md +0 -128
  173. package/skills/intent-linking/evals/evals.json +0 -22
  174. package/skills/intent-linking/references/zettelkasten.md +0 -45
  175. package/skills/intent-locking/SKILL.md +0 -64
  176. package/skills/intent-planning/SKILL.md +0 -145
  177. package/skills/intent-planning/evals/evals.json +0 -81
  178. package/skills/intent-planning/references/plan-format.md +0 -130
  179. package/skills/intent-researching/SKILL.md +0 -123
  180. package/skills/intent-researching/evals/evals.json +0 -22
  181. package/skills/intent-savepoint/SKILL.md +0 -83
  182. package/skills/intent-savepoint/references/context-management.md +0 -32
  183. package/skills/intent-starting/SKILL.md +0 -151
  184. package/skills/intent-starting/evals/evals.json +0 -117
  185. package/skills/intent-starting/references/boarding-matrix.md +0 -35
  186. package/skills/project-continuing/SKILL.md +0 -119
  187. package/skills/project-continuing/evals/evals.json +0 -100
  188. package/skills/roadmap-continuing/SKILL.md +0 -89
  189. package/skills/roadmap-continuing/evals/evals.json +0 -82
  190. package/skills/skill-creating/SKILL.md +0 -75
  191. package/skills/skill-creating/evals/evals.json +0 -108
  192. package/skills/skill-creating/references/agents.md +0 -168
  193. package/skills/skill-creating/references/defaults-first.md +0 -23
  194. package/skills/skill-creating/references/evals.md +0 -41
  195. package/skills/skill-creating/references/hooks.md +0 -251
  196. package/skills/skill-creating/references/progressive-disclosure.md +0 -176
  197. package/skills/skill-creating/references/scripts.md +0 -166
  198. package/skills/skill-creating/references/skills.md +0 -169
  199. package/skills/skill-creating/scripts/scaffold.rb +0 -313
  200. package/skills/skill-evaluating/SKILL.md +0 -141
  201. package/skills/skill-evaluating/assets/eval-template.json +0 -12
  202. package/skills/skill-evaluating/evals/evals.json +0 -75
  203. package/skills/skill-evaluating/references/convention-checks.md +0 -76
  204. package/skills/skill-evaluating/references/eval-methodology.md +0 -154
  205. package/skills/store-curating/SKILL.md +0 -64
  206. package/skills/store-curating/evals/evals.json +0 -38
  207. package/skills/store-indexing/SKILL.md +0 -93
  208. package/skills/store-indexing/evals/evals.json +0 -22
  209. package/skills/store-indexing/references/zettelkasten-linking.md +0 -32
  210. package/skills/store-provisioning/SKILL.md +0 -55
  211. /package/skills/{project-continuing → intent-continuing}/references/board-fill.md +0 -0
  212. /package/skills/{roadmap-continuing → intent-continuing}/references/liveness-ranking.md +0 -0
  213. /package/skills/{intent-brainstorming → intent-speccing}/references/design-principles.md +0 -0
@@ -1,72 +1,78 @@
1
- # Human Report Contract (per-stage EM-to-CTO briefing)
2
-
3
- This doc defines how the orchestrator briefs the human at each of the five stage boundaries
4
- (What, Why, How, Exec, Done) in auto mode, at M and L; at S only the How boundary fires (see
5
- `## Depth at Tier S`). It is the outward, human-facing counterpart to the
6
- internal report contract in `references/agent-report-contract.md`. Voice: an engineering
7
- manager briefing a CTO. Lead with impact, name the risk, leave the decision.
8
-
9
- ## The skeleton
10
-
11
- One fixed 3-line shape, reused at every stage:
12
-
13
- 1. **State**: what happened and what it means, impact first, one line.
14
- 2. **Risk**: the one thing that could bite, or "nothing flagged."
15
- 3. **Call**: the decision left to you, or the go-ahead I am taking.
16
-
17
- This is a shape, not a rigid template. Keep the order (State, then Risk, then Call) and keep it
18
- short. The words can flex to fit the stage.
19
-
20
- ## Per-stage content
21
-
22
- - **What**: State = the work I picked up and why it matters now. Risk = scope uncertainty.
23
- Call = confirm this is worth doing, or I proceed.
24
- - **Why**: State = the approach I chose, one line. Risk = the main trade-off. Call = the one
25
- decision I need (approve, or pick an option).
26
- - **How**: State = the plan shape (task count and what it builds). Risk = the riskiest task or
27
- dependency. Call = approve the plan to build.
28
- - **Exec**: State = what got built and the test result. Risk = residual failures or deviations.
29
- Call = go to review, or done.
30
- - **Done**: State = the delivered impact. Risk = residual risk. Call = the decision left to you
31
- (merge, release, accept).
32
-
33
- ## Depth at Tier S
34
-
35
- At Tier S in auto mode the mid-flight briefings collapse to one. Only the How briefing fires, and
36
- it folds in what the What and Why briefings would have said: the work picked up and the approach
37
- chosen go into its State line. The Exec briefing folds into the final owner report at End. M and L
38
- send all four. The shape does not change: still State, then Risk, then Call, and the per-stage
39
- content above still says what each line covers. This is a depth cut, not a new report. A delivery
40
- still ends with `outcome.md` plus one owner report.
1
+ # Human Report Contract (the three report screens, intent 317)
2
+
3
+ D15: the prose EM-to-CTO briefing this doc used to define is retired. The orchestrator now
4
+ prints one of three report screens, filled from the record by `scripts/report-screen`, never
5
+ written by eye:
6
+
7
+ - **`report-screen state <intent_dir> [--changed "<text>"]`** - the mid-delivery report. One
8
+ intent's field table (Store, Status, Stage, Savepoint, Progress, Next, Insight) plus a
9
+ `Changed` row naming what caused the print, and its Steps table.
10
+ - **`report-screen state --all <store_root>`** - the roster across every in-delivery intent,
11
+ most recently changed first, then one collapsed block (Stage, Next, Changed, first three
12
+ open steps) per intent.
13
+ - **`report-screen delivered <intent_dir>`** - the post-delivery report, printed once at close:
14
+ Asked, Delivered (with a Proven-by column), Evidence, Needs you.
15
+ - **`report-screen delay <intent_dir>`** - printed only on request ("why did X take so long"):
16
+ the delivery as a timeline plus the derived `Where the time went` line.
17
+
18
+ ## The five triggers for `state`
19
+
20
+ Print `state` (one intent, or `--all` for the roster) on any of these; a checklist tick alone,
21
+ an executor's intermediate commit, or an agent going idle is NOT one of them:
22
+
23
+ | Trigger | Scope |
24
+ |---|---|
25
+ | A savepoint line lands (a stage boundary: Why, How, Exec started, outcome written, Done) | that intent |
26
+ | A review verdict returns (plan review or post-execution review), naming what it changed | that intent |
27
+ | A blocker or needs-input is logged | that intent |
28
+ | A merge or a release lands | that intent |
29
+ | The owner asks ("where are we", "state of X", "continue X") | all in delivery, or the one named |
30
+
31
+ `delivered` prints exactly once, at Completion. `delay` prints only when the owner asks why a
32
+ delivery took long.
33
+
34
+ Every verb prints the same plain Markdown on every harness (owner ruling 2026-08-31); where a
35
+ harness can paint it (Claude Code, through 316a's message-display hook), it substitutes a
36
+ painted rendering of that same output, never a different one, and no skill or script branches
37
+ on harness name to decide.
38
+
39
+ ## Depth for small work
40
+
41
+ For small work in auto mode, only the How-boundary `state` screen prints mid-flight (its
42
+ `Changed` row names what the What and Why steps did, since there is no separate briefing per
43
+ stage any more). Larger work prints `state` at every trigger in the table above. This is a
44
+ depth cut, not a different report: the screen's shape never changes, only how often it fires.
45
+ A delivery still ends with `outcome.md` plus one `delivered` screen.
41
46
 
42
47
  ## One report per audience
43
48
 
44
49
  A delivery produces exactly two artifacts: `outcome.md` (authored by `plastic-intent-ending`)
45
- and one EM-to-CTO owner report at the End stage. No stage or skill restates a delivery
46
- already written to `outcome.md`; point at it instead. Skills do not open with a banner that
47
- names the skill or restates the intent id and name the owner just typed. Announce only what
48
- the reader cannot already know: an error, a result, a choice with its reason, or a handoff.
50
+ and one `delivered` screen at the End stage. No stage or skill restates a delivery already
51
+ written to `outcome.md`; point at it instead. Skills do not open with a banner that names the
52
+ skill or restates the intent id and name the owner just typed. Announce only what the reader
53
+ cannot already know: an error, a result, a choice with its reason, or a handoff.
49
54
 
50
55
  ## Boundary vs intent 74
51
56
 
52
57
  Intent 74's report contract (`references/agent-report-contract.md`) is the INTERNAL,
53
58
  machine-checked handoff from a dispatched specialist back to the orchestrator: a structured
54
- envelope plus a per-role payload. This contract is the OUTWARD human briefing, orchestrator to
55
- user, in prose. Different direction, different audience, different form. The orchestrator
56
- CONSUMES the intent 74 report to WRITE the human briefing defined here. The two never merge.
59
+ envelope plus a per-role payload. This contract is the OUTWARD screen shown to the owner.
60
+ Different direction, different audience, different form. The orchestrator reads the intent 74
61
+ report and reflects it into the record (savepoint, outcome.md) that `report-screen` then
62
+ renders. The two never merge.
57
63
 
58
64
  ## Brevity: point, don't repeat
59
65
 
60
- Surface rules are owned by the `writing-style` skill. This contract does not restate them, in full
61
- or in summary. It defines the report's shape only: what to say, in what order, and when to stop.
62
- Apply the `writing-style` skill for the wording.
66
+ Surface rules are owned by the `writing-style` skill. This contract does not restate them. Its
67
+ job is naming which screen prints when, not the wording inside it - `report-screen` derives
68
+ every cell from the record (D14), so there is no prose left to style here.
63
69
 
64
70
  ## Emission: guided vs auto
65
71
 
66
- In guided mode, the briefing lands at each stage boundary and the human acts on the Call line
67
- before the next stage starts.
72
+ In guided mode, `state` prints at each stage boundary and the human decides before the next
73
+ stage starts.
68
74
 
69
- In auto mode, at M and L the orchestrator still emits the briefing at each boundary, as a running
70
- EM-to-CTO account. At S only the How briefing fires; see `## Depth at Tier S` above for what it
71
- folds in. The Call line becomes the go-ahead the orchestrator takes itself and moves on, except at
72
- the existing hard stops (destructive action without a safe alternative, project-path confirm).
75
+ In auto mode, `state` prints at every trigger for larger work; for small work only the How
76
+ boundary prints (see `## Depth for small work` above). The orchestrator takes the go-ahead
77
+ itself and moves on, except at the existing hard stops (destructive action without a safe
78
+ alternative, project-path confirm).
@@ -2,7 +2,7 @@
2
2
  name: plastic-conventions
3
3
  description: >
4
4
  Chapters of Plastic doctrine used by more than one skill: the knowledge graph,
5
- lifecycle and savepoints, tiers and dispatch, gates and enforcement, locks and
5
+ lifecycle and savepoints, locks and
6
6
  worktrees, completion, maintenance, and roadmaps. Read a chapter when its trigger
7
7
  applies to the work in front of you.
8
8
  user-invocable: false
@@ -18,8 +18,6 @@ when the trigger in the second column applies to the work in front of you.
18
18
  |---|---|
19
19
  | `references/knowledge-graph.md` | when creating, linking, curating, or indexing intents and you need the sources-vs-chain doctrine, the tiers of influence, the `## Links` projection, or branch-vs-root directory semantics |
20
20
  | `references/lifecycle-and-savepoints.md` | when running a lifecycle stage or a savepoint and you need the subagent report-home contract for how an insight reaches the intent |
21
- | `references/tiers-and-dispatch.md` | when sizing an intent, choosing agent models, routing to the advisor, or writing an auto-mode human report |
22
- | `references/gates-and-enforcement.md` | when a transition gate blocks you, or before using an audited escape, for the gate mechanics and the logging contract, or when naming, registering, or retiring a hook or skill |
23
21
  | `references/locks-and-worktrees.md` | before taking or releasing a delivery lock, and when working with claims, worktrees, solo mode, or the station ledger |
24
22
  | `references/completion-and-done.md` | when ending an intent, for what "intent done" means and the End-stage tail |
25
23
  | `references/maintenance-and-revisions.md` | before any structural maintenance edit, for WORK vs MAINTENANCE, the `revisions.md` move-and-record contract, the violation-tag catalog, and the context-economy measurement buckets |
@@ -1,6 +1,40 @@
1
1
  # Lifecycle and Savepoints
2
2
 
3
- This chapter holds the subagent report-home depth for how an insight reaches the intent when the writer cannot write the file itself.
3
+ This chapter holds two things: what an intent records while the work runs versus what is
4
+ backfilled when it ends, and how an insight reaches the intent when the writer cannot
5
+ write the file itself.
6
+
7
+ ## The live record and the backfilled documents
8
+
9
+ While working, an intent records four things, and only these are its truth of what
10
+ happened:
11
+
12
+ - the intent file: `## Context` and `### Decisions` (written in Why) and `## Insights`
13
+ (one line per ruling, appended as it happens);
14
+ - checklist.md: the items, ticked as they are actually performed;
15
+ - savepoint.md: the append-only stage ledger, written by the hooks and the scripts;
16
+ - the commits on the intent's branch.
17
+
18
+ The four judgment documents (spec.md, plan.md, actions/, outcome.md) are written when
19
+ there is something to say. In thinking mode an agent writes them during Why and How. In
20
+ direct mode they usually stay as the scaffold placeholder until the close, and
21
+ `scripts/end-intent` then backfills each one still missing or still a placeholder from
22
+ the live record (intent 308): `## Problem` from `## Intent`, `## Decisions` from
23
+ `### Decisions`, `## Acceptance Criteria`, `## Steps`, `## Items`, `## Delivered`, and
24
+ `## Follow-ups` from the checklist, `## Notes` from `## Insights`, `## Verification` from
25
+ the diff on the intent's own worktree, and outcome.md's `disposition:` from the close.
26
+ Every other section keeps the template's stub text; nothing is invented. A backfilled
27
+ file carries a marker comment on the line after its title, and the savepoint gains one
28
+ `Exec backfilled <list>` line. A file with hand-written content, even under a leftover
29
+ sentinel line, is never touched. The same writer is exposed as `scaffold-intent backfill`
30
+ for the doctor fix hint `backfilled_complete`.
31
+
32
+ The close never refuses for a document it can write itself. Doctor's per-intent structure
33
+ check runs after the backfill as a report: an unchecked box, a malformed intent file, or
34
+ a wrong-disposition outcome.md is named on stderr, the close proceeds, and
35
+ `/plastic-doctor --intent <id>` keeps reporting it until fixed.
36
+
37
+ ## Insights from a writer that cannot write the file
4
38
 
5
39
  Background sessions and dispatched sub-agents do not write the insight themselves. They carry
6
40
  each nugget home in the completion report's `insights:` field, and the orchestrator (or any
@@ -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.
42
-
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.
47
-
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.
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.
39
+
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.
44
+
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,28 @@ 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.
104
-
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` |
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.
96
+
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` |
106
+
107
+ ## The write guard is not residue
108
+
109
+ `<type>.write.lock` (usually `delivery.write.lock`) is a deliberate sibling
110
+ inode used only for `flock`: no owner, no timestamp, no content, and it is
111
+ NEVER unlinked - deleting it while a writer holds the flock hands the next
112
+ writer a fresh inode at the same path, so two writers hold "the" guard at
113
+ once (see `scripts/lib/lock.rb`, the write-guard comment). A zero-byte
114
+ `*.write.lock` in a completed intent directory is by design; no cleaner may
115
+ sweep it, and it is already inside the store's `*.lock` gitignore rule.
116
+ (Intent 317a, A2: a review misread it as stale residue and nearly shipped
117
+ the sweep.)
@@ -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`.