@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.
- package/PLASTIC.md +101 -294
- package/README.md +5 -6
- package/agents/plastic-advisor.md +18 -17
- package/agents/plastic-enforcer.md +57 -69
- package/agents/plastic-executor.md +34 -20
- package/agents/plastic-faux-advisor.md +18 -18
- package/bin/lib/context_budget.rb +453 -0
- package/bin/plastic-bench +78 -0
- package/config_asks.yml +38 -0
- package/hooks/capture +4 -0
- package/hooks/close +5 -0
- package/hooks/hooks.json +14 -42
- package/hooks/message-display +81 -0
- package/hooks/record +4 -0
- package/hooks/savepoint +5 -5
- package/package.json +3 -2
- package/scripts/agent-report +15 -10
- package/scripts/append-ledger +208 -0
- package/scripts/codex-hook +78 -90
- package/scripts/dashboard.rb +43 -14
- package/scripts/day-summary +53 -0
- package/scripts/doctor.rb +269 -43
- package/scripts/end-intent +170 -76
- package/scripts/exec-worktree +11 -20
- package/scripts/file-session-intent +61 -0
- package/scripts/hook-capture +255 -0
- package/scripts/hook-close +36 -0
- package/scripts/hook-message-display +74 -0
- package/scripts/hook-record +157 -0
- package/scripts/hook-savepoint +45 -0
- package/scripts/hook-session-start +128 -12
- package/scripts/install.rb +8 -6
- package/scripts/intent-screen +77 -0
- package/scripts/lib/agent_models.rb +1 -7
- package/scripts/lib/arm.rb +308 -0
- package/scripts/lib/backfill_intent.rb +316 -0
- package/scripts/lib/bridge.rb +24 -1597
- package/scripts/lib/compact_instructions.rb +56 -0
- package/scripts/lib/day_summary.rb +211 -0
- package/scripts/lib/doctor_core.rb +66 -88
- package/scripts/lib/doctor_session_ledger.rb +158 -0
- package/scripts/lib/exec_worktree.rb +14 -60
- package/scripts/lib/handoff.rb +184 -0
- package/scripts/lib/harness_text.rb +5 -4
- package/scripts/lib/hook_registry.rb +57 -106
- package/scripts/lib/insights.rb +3 -4
- package/scripts/lib/installer_core.rb +136 -41
- package/scripts/lib/intent_screen.rb +309 -0
- package/scripts/lib/intent_screen_ansi.rb +262 -0
- package/scripts/lib/lock.rb +6 -26
- package/scripts/lib/message_display.rb +290 -0
- package/scripts/lib/outcome_guard.rb +7 -5
- package/scripts/lib/project_validator.rb +30 -1
- package/scripts/lib/report_screen.rb +648 -0
- package/scripts/lib/roadmap_queue.rb +3 -3
- package/scripts/lib/roadmap_savepoint.rb +1 -1
- package/scripts/lib/rule_catalog.rb +6 -3
- package/scripts/lib/savepoint.rb +334 -0
- package/scripts/lib/scaffold_intent.rb +13 -179
- package/scripts/lib/screen_paint.rb +276 -0
- package/scripts/lib/session_backfill.rb +184 -0
- package/scripts/lib/session_close.rb +104 -0
- package/scripts/lib/session_git.rb +500 -0
- package/scripts/lib/session_ledger.rb +621 -0
- package/scripts/lib/store_discovery.rb +1 -1
- package/scripts/lib/store_provisioning.rb +1 -1
- package/scripts/maintenance-run +7 -7
- package/scripts/new-intent +63 -4
- package/scripts/plastic-lock +101 -41
- package/scripts/promote-session-item +150 -0
- package/scripts/read-config +3 -0
- package/scripts/rebuild-graph +1 -1
- package/scripts/report-screen +120 -0
- package/scripts/roadmap-next +2 -2
- package/scripts/rollback.rb +48 -3
- package/scripts/savepoint-note +67 -0
- package/scripts/scaffold-intent +37 -63
- package/scripts/session-commit +116 -0
- package/scripts/spawn-preamble +14 -7
- package/scripts/update.rb +7 -3
- package/scripts/write-handoff +60 -0
- package/skills/agent-advisor/SKILL.md +3 -3
- package/skills/agent-advisor/references/advisor-protocol.md +20 -20
- package/skills/auto/SKILL.md +223 -317
- package/skills/auto/evals/evals.json +10 -10
- package/skills/auto/references/agent-architecture.md +102 -90
- package/skills/auto/references/agent-report-contract.md +4 -21
- package/skills/auto/references/end-tail.md +47 -53
- package/skills/auto/references/human-report-contract.md +62 -56
- package/skills/conventions/SKILL.md +1 -3
- package/skills/conventions/references/lifecycle-and-savepoints.md +35 -1
- package/skills/conventions/references/locks-and-worktrees.md +62 -58
- package/skills/conventions/references/maintenance-and-revisions.md +12 -12
- package/skills/dashboard/SKILL.md +1 -1
- package/skills/direct/SKILL.md +66 -0
- package/skills/direct/references/request-signals.md +59 -0
- package/skills/doctor/SKILL.md +58 -11
- package/skills/doctor/report.md +3 -1
- package/skills/install/SKILL.md +11 -9
- package/skills/intent-continuing/SKILL.md +142 -91
- package/skills/intent-continuing/references/boarding-matrix.md +34 -0
- package/skills/intent-continuing/references/context-management.md +3 -3
- package/skills/intent-creating/SKILL.md +2 -2
- package/skills/intent-creating/references/lifecycle.md +1 -1
- package/skills/intent-ending/SKILL.md +34 -37
- package/skills/intent-ending/evals/evals.json +4 -4
- package/skills/intent-executing/SKILL.md +15 -46
- package/skills/intent-executing/plan-reviewer-prompt.md +39 -0
- package/skills/intent-speccing/SKILL.md +108 -51
- package/skills/intent-speccing/evals/evals.json +5 -5
- package/skills/intent-speccing/references/per-section-fill-rules.md +4 -4
- package/skills/intent-speccing/references/self-verify-checklist.md +1 -2
- package/skills/project-creating/SKILL.md +1 -1
- package/skills/releasing/SKILL.md +7 -8
- package/skills/tutorial/SKILL.md +2 -2
- package/skills/tutorial/references/track-1-guided.md +16 -18
- package/skills/tutorial/references/track-2-auto.md +12 -13
- package/skills/tutorial/references/track-3-projects-and-roadmaps.md +2 -2
- package/templates/agents.md +4 -7
- package/templates/config.yml +5 -0
- package/templates/intent-screen.md +17 -0
- package/templates/outcome.md +14 -1
- package/templates/project.yml +7 -0
- package/templates/report-state.md +11 -0
- package/templates/roadmap.md +1 -1
- package/templates/savepoint.md +2 -2
- package/templates/session-intent.md +29 -0
- package/agents/plastic-brainstorming.md +0 -48
- package/agents/plastic-future-intent-researcher.md +0 -35
- package/agents/plastic-intent-curator.md +0 -47
- package/agents/plastic-intent-discovery.md +0 -43
- package/agents/plastic-planner.md +0 -56
- package/agents/plastic-spec-specialist.md +0 -53
- package/hooks/auto-arm +0 -5
- package/hooks/bash-gate +0 -3
- package/hooks/continue +0 -31
- package/hooks/edit-gates +0 -3
- package/hooks/future-intent-check +0 -25
- package/hooks/gate-check +0 -12
- package/hooks/power-tools +0 -8
- package/scripts/hook-auto-arm +0 -51
- package/scripts/hook-bash-gate +0 -78
- package/scripts/hook-code-gate +0 -38
- package/scripts/hook-continue +0 -48
- package/scripts/hook-create-gate +0 -51
- package/scripts/hook-edit-gates +0 -58
- package/scripts/hook-future-intent-check +0 -90
- package/scripts/hook-gate-check +0 -169
- package/scripts/hook-links-gate +0 -54
- package/scripts/hook-lock-gate +0 -47
- package/scripts/hook-power-tools +0 -38
- package/scripts/hook-savepoint-pre +0 -32
- package/scripts/lib/codex_edit_gates.rb +0 -138
- package/scripts/lib/edit_gates.rb +0 -398
- package/scripts/lib/links_gate.rb +0 -140
- package/scripts/lib/qmd_hook.rb +0 -41
- package/scripts/lib/spec_header.rb +0 -83
- package/scripts/lib/start_intent.rb +0 -296
- package/scripts/start-intent +0 -89
- package/skills/_active-intent-gate.md +0 -26
- package/skills/auto/references/tiers.md +0 -100
- package/skills/continuing/SKILL.md +0 -34
- package/skills/continuing/evals/evals.json +0 -91
- package/skills/conventions/references/gates-and-enforcement.md +0 -53
- package/skills/conventions/references/tiers-and-dispatch.md +0 -135
- package/skills/doctor/references/gates-stuck-detection.md +0 -43
- package/skills/intent-brainstorming/SKILL.md +0 -118
- package/skills/intent-brainstorming/evals/evals.json +0 -67
- package/skills/intent-continuing/evals/evals.json +0 -145
- package/skills/intent-discovering/SKILL.md +0 -56
- package/skills/intent-grilling/SKILL.md +0 -108
- package/skills/intent-linking/SKILL.md +0 -128
- package/skills/intent-linking/evals/evals.json +0 -22
- package/skills/intent-linking/references/zettelkasten.md +0 -45
- package/skills/intent-locking/SKILL.md +0 -64
- package/skills/intent-planning/SKILL.md +0 -145
- package/skills/intent-planning/evals/evals.json +0 -81
- package/skills/intent-planning/references/plan-format.md +0 -130
- package/skills/intent-researching/SKILL.md +0 -123
- package/skills/intent-researching/evals/evals.json +0 -22
- package/skills/intent-savepoint/SKILL.md +0 -83
- package/skills/intent-savepoint/references/context-management.md +0 -32
- package/skills/intent-starting/SKILL.md +0 -151
- package/skills/intent-starting/evals/evals.json +0 -117
- package/skills/intent-starting/references/boarding-matrix.md +0 -35
- package/skills/project-continuing/SKILL.md +0 -119
- package/skills/project-continuing/evals/evals.json +0 -100
- package/skills/roadmap-continuing/SKILL.md +0 -89
- package/skills/roadmap-continuing/evals/evals.json +0 -82
- package/skills/skill-creating/SKILL.md +0 -75
- package/skills/skill-creating/evals/evals.json +0 -108
- package/skills/skill-creating/references/agents.md +0 -168
- package/skills/skill-creating/references/defaults-first.md +0 -23
- package/skills/skill-creating/references/evals.md +0 -41
- package/skills/skill-creating/references/hooks.md +0 -251
- package/skills/skill-creating/references/progressive-disclosure.md +0 -176
- package/skills/skill-creating/references/scripts.md +0 -166
- package/skills/skill-creating/references/skills.md +0 -169
- package/skills/skill-creating/scripts/scaffold.rb +0 -313
- package/skills/skill-evaluating/SKILL.md +0 -141
- package/skills/skill-evaluating/assets/eval-template.json +0 -12
- package/skills/skill-evaluating/evals/evals.json +0 -75
- package/skills/skill-evaluating/references/convention-checks.md +0 -76
- package/skills/skill-evaluating/references/eval-methodology.md +0 -154
- package/skills/store-curating/SKILL.md +0 -64
- package/skills/store-curating/evals/evals.json +0 -38
- package/skills/store-indexing/SKILL.md +0 -93
- package/skills/store-indexing/evals/evals.json +0 -22
- package/skills/store-indexing/references/zettelkasten-linking.md +0 -32
- package/skills/store-provisioning/SKILL.md +0 -55
- /package/skills/{project-continuing → intent-continuing}/references/board-fill.md +0 -0
- /package/skills/{roadmap-continuing → intent-continuing}/references/liveness-ranking.md +0 -0
- /package/skills/{intent-brainstorming → intent-speccing}/references/design-principles.md +0 -0
|
@@ -1,72 +1,78 @@
|
|
|
1
|
-
# Human Report Contract (
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
|
55
|
-
|
|
56
|
-
|
|
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
|
|
61
|
-
|
|
62
|
-
|
|
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,
|
|
67
|
-
|
|
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,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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,
|
|
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
|
|
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,
|
|
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
|
-
|
|
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
|
|
13
|
-
the lock file's mtime on
|
|
14
|
-
counts as stale only when the mtime is older than the TTL. No
|
|
15
|
-
The
|
|
16
|
-
|
|
17
|
-
Another
|
|
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
|
|
29
|
-
worktrees, clear the lock, and only then is the
|
|
30
|
-
idempotent function with two entry points: the `plastic-lock` command (`who`, status,
|
|
31
|
-
release, reclaim, delegate) and
|
|
32
|
-
read-only and reports the controller, mtime heartbeat, delegates, and
|
|
33
|
-
This is
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
|
76
|
-
for that intent happen
|
|
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,
|
|
103
|
-
each station.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
|
109
|
-
|
|
|
110
|
-
|
|
|
111
|
-
|
|
|
112
|
-
|
|
|
113
|
-
|
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
was
|
|
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`);
|
|
86
|
-
|
|
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.
|
|
98
|
-
|
|
99
|
-
|
|
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
|
|
119
|
-
to advisory (warn) rather than
|
|
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),
|
|
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)
|
|
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-
|
|
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`.
|