@zalom/plastic 1.14.0 → 2.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/config_asks.yml +38 -0
- package/hooks/capture +4 -0
- package/hooks/check-update +12 -3
- package/hooks/close +5 -0
- package/hooks/hooks.json +9 -49
- package/hooks/record +4 -0
- package/package.json +3 -2
- package/scripts/agent-report +8 -9
- package/scripts/append-ledger +195 -0
- package/scripts/codex-hook +101 -95
- package/scripts/dashboard.rb +4 -4
- package/scripts/doctor.rb +106 -43
- package/scripts/end-intent +77 -76
- package/scripts/exec-worktree +11 -20
- package/scripts/file-session-intent +61 -0
- package/scripts/hook-capture +242 -0
- package/scripts/hook-close +34 -0
- package/scripts/hook-record +149 -0
- package/scripts/hook-session-start +95 -12
- package/scripts/install.rb +8 -6
- package/scripts/lib/agent_models.rb +1 -7
- package/scripts/lib/arm.rb +283 -0
- package/scripts/lib/backfill_intent.rb +316 -0
- package/scripts/lib/bridge.rb +24 -1597
- package/scripts/lib/doctor_core.rb +17 -88
- package/scripts/lib/doctor_session_ledger.rb +106 -0
- package/scripts/lib/exec_worktree.rb +14 -60
- package/scripts/lib/harness_text.rb +5 -4
- package/scripts/lib/hook_registry.rb +44 -107
- package/scripts/lib/insights.rb +3 -4
- package/scripts/lib/installer_core.rb +19 -30
- package/scripts/lib/lock.rb +6 -26
- package/scripts/lib/outcome_guard.rb +7 -5
- package/scripts/lib/project_validator.rb +30 -1
- 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 +320 -0
- package/scripts/lib/scaffold_intent.rb +13 -179
- package/scripts/lib/session_backfill.rb +184 -0
- package/scripts/lib/session_close.rb +84 -0
- package/scripts/lib/session_git.rb +469 -0
- package/scripts/lib/session_ledger.rb +497 -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 +94 -41
- package/scripts/promote-session-item +150 -0
- package/scripts/rebuild-graph +1 -1
- package/scripts/roadmap-next +2 -2
- package/scripts/rollback.rb +42 -3
- package/scripts/scaffold-intent +37 -63
- package/scripts/session-commit +116 -0
- package/scripts/spawn-preamble +5 -5
- package/scripts/update.rb +7 -3
- package/skills/agent-advisor/SKILL.md +3 -3
- package/skills/agent-advisor/references/advisor-protocol.md +20 -20
- package/skills/auto/SKILL.md +218 -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 +8 -8
- 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 +47 -55
- 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 +131 -89
- package/skills/intent-continuing/references/boarding-matrix.md +34 -0
- package/skills/intent-continuing/references/context-management.md +2 -2
- package/skills/intent-creating/SKILL.md +2 -2
- package/skills/intent-creating/references/lifecycle.md +1 -1
- package/skills/intent-ending/SKILL.md +28 -37
- package/skills/intent-ending/evals/evals.json +4 -4
- package/skills/intent-executing/SKILL.md +12 -49
- 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/project.yml +7 -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,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
|
-
mandatory, not a convention.
|
|
35
|
-
|
|
36
|
-
Solo-mode gate defaults (intent 128): on a confirmed positive solo determination
|
|
37
|
-
(`Bridge.solo_delivery?`, a single owner working alone with no sign of parallel or team
|
|
38
|
-
delivery), the lock and worktree arbitration gates relax from enforced to advisory. The moment
|
|
39
|
-
any parallel or team activity appears they return to strictly enforced. This is a real behavior
|
|
40
|
-
difference, not just a message change: a solo session is not hard-blocked by these gates, a
|
|
41
|
-
shared one still is.
|
|
33
|
+
writer for one artifact. Disarm clears the lock; the End tail is ordered: verify, merge and
|
|
34
|
+
remove worktrees, clear the lock, and only then is the session pointer purge-eligible. Repair
|
|
35
|
+
is one idempotent function with two entry points: the `plastic-lock` command (`who`, status,
|
|
36
|
+
fix, release, reclaim, delegate) and the `plastic-doctor` skill's lock section, so repair
|
|
37
|
+
self-heals. `who` is read-only and reports the controller, mtime heartbeat, delegates, and
|
|
38
|
+
claims from durable files. This is mandatory for auto teams, not a convention.
|
|
42
39
|
|
|
43
|
-
The
|
|
44
|
-
the `CLAUDE_CODE_SESSION_ID` environment variable, then a derived key when neither
|
|
45
|
-
|
|
46
|
-
|
|
40
|
+
The record hook resolves the current session in a fixed precedence: the stdin `session_id`
|
|
41
|
+
first, then the `CLAUDE_CODE_SESSION_ID` environment variable, then a derived key when neither
|
|
42
|
+
is present. A session's `.tmp/` directory is purge-eligible by terminal state, not by age: it
|
|
43
|
+
holds nothing durable, and losing it costs nothing. See [`docs/internals.md`](https://github.com/zalom/plastic/blob/main/docs/internals.md) for depth.
|
|
47
44
|
|
|
48
|
-
The delivery lock arbitrates at the whole-intent grain: it decides who may work
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
work is unaffected; it engages, and denies, only when a second writer tries to
|
|
58
|
-
take a fresh claim someone else already holds. A stale or corrupt claim fails
|
|
59
|
-
open (the write proceeds, the claim yields) and the condition is surfaced in
|
|
60
|
-
`plastic-lock status`, which lists any live claims alongside the delivery
|
|
61
|
-
lock. See `plastic-lock claim`/`release-claim` and [`docs/internals.md`](https://github.com/zalom/plastic/blob/main/docs/internals.md) for the
|
|
62
|
-
full mechanism.
|
|
45
|
+
The delivery lock arbitrates at the whole-intent grain: it decides who may work an intent at
|
|
46
|
+
all. Underneath it, a per-artifact claim token (intent 111) is a coordination record at the
|
|
47
|
+
file grain: it names who, among those already holding the delivery lock, is the one writer for
|
|
48
|
+
one lifecycle file right now. Claims live in `.claims/<artifact>.claim` inside the intent
|
|
49
|
+
directory, one small JSON file per artifact, scoped strictly per-intent-per-artifact, never
|
|
50
|
+
session-global. Since 2.0 nothing enforces a claim at write time; a team lead takes and
|
|
51
|
+
releases claims through `plastic-lock claim` and `release-claim` to coordinate its executors,
|
|
52
|
+
and `plastic-lock status` lists any live claims alongside the delivery lock. A stale or corrupt
|
|
53
|
+
claim is reported there, never acted on. See [`docs/internals.md`](https://github.com/zalom/plastic/blob/main/docs/internals.md) for the full mechanism.
|
|
63
54
|
|
|
64
55
|
There is exactly one lock in Plastic: `delivery.lock` (exclusive, one owner plus delegates),
|
|
65
56
|
shipped by intent 108. An earlier two-lock doctrine proposed a second `maintenance.lock`
|
|
@@ -72,8 +63,8 @@ for an active delivery. Maintenance instead DETECTS `delivery.lock`'s freshness
|
|
|
72
63
|
behind. See "WORK vs MAINTENANCE" in `references/maintenance-and-revisions.md` for the full
|
|
73
64
|
doctrine.
|
|
74
65
|
|
|
75
|
-
Every code-touching intent gets its own git worktree named `{id}--{slug}`, and all code
|
|
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,16 @@ an orphaned worktree behind, and clear a stale worktree reference with `git work
|
|
|
99
90
|
|
|
100
91
|
#### Intent delivery, station by station
|
|
101
92
|
|
|
102
|
-
How one intent travels from boarding to Done, and what the lock,
|
|
103
|
-
each station.
|
|
93
|
+
How one auto-team intent travels from boarding to Done, and what the lock, the pointer, and
|
|
94
|
+
the record hook do at each station. Nothing in the third column blocks; the fourth column is
|
|
95
|
+
what gets written down.
|
|
104
96
|
|
|
105
|
-
| Station | Delivered artifact | Lock and
|
|
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
|
|
108
|
-
| What (create) | `<id>--<slug>.md`, born complete | no lock yet;
|
|
109
|
-
| Why | `spec.md` | owner writes refresh the lease (lock file mtime heartbeat) |
|
|
110
|
-
| How | `plan.md`, `actions/ACTION_N.md` (at least one), `checklist.md` | heartbeat on writes
|
|
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
|
|
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
|
|
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 |
|
|
97
|
+
| Station | Delivered artifact | Lock and pointer steps | Record |
|
|
98
|
+
|---|---|---|---|
|
|
99
|
+
| Start (board) | none (a procedure, not a stage) | `plastic-lock fix` self-heals stale, corrupt, or legacy state; arm acquires `delivery.lock` (O_EXCL, session-keyed), provisions the code worktree, writes the session pointer | savepoint confirms the boarding station |
|
|
100
|
+
| What (create) | `<id>--<slug>.md`, born complete | no lock yet; `new-intent` validates the file it writes (`scripts/validate-intent`) | savepoint `What` line; intent listed in INDEX `## Active` |
|
|
101
|
+
| Why | `spec.md` | owner writes refresh the lease (lock file mtime heartbeat) | savepoint `Why started`, `Why spec.md created` |
|
|
102
|
+
| How | `plan.md`, `actions/ACTION_N.md` (at least one), `checklist.md` | heartbeat on writes | savepoint `How started`, `How plan.md created`, `How checklist.md created`, `Exec started` |
|
|
103
|
+
| Exec | code on the intent branch, checklist checked off | heartbeat; code edits confined to the provisioned worktree; delegates write under the owner's lock | checklist boxes; savepoint milestones; the day-ledger line promotes when a project file lands |
|
|
104
|
+
| End (done) | mandatory `outcome.md` (`disposition: delivered\|abandoned`), INDEX moves to Completed or Abandoned | ordered End tail: verify, merge and remove worktrees, disarm clears `delivery.lock`, then the pointer is purge-eligible, and the QMD reindex runs LAST (after purge); `end-intent` backfills a placeholder `outcome.md` from the record and its structure check reports (never refuses) | savepoint `Done delivered` (or `abandoned`); takeover audits, if any, remain in savepoint.md |
|
|
105
|
+
| Maintenance (Future, Terminal, or Active-with-a-stale-or-no-lock) | `revisions.md` move-and-record entries | detects (never acquires) `delivery.lock`; defers and reports while the target's lock is FRESH (`Lock.fresh?`); a stale or absent lock is not-active, maintenance proceeds | append-only, rule-tagged `revisions.md` entry written in the same operation as the change, or the change is refused; lands via a fresh branch off store main merged back as one closed op, never `git add -A` |
|
|
@@ -55,9 +55,9 @@ meaning an active agent is delivering that intent. Maintenance DETECTS this lock
|
|
|
55
55
|
ACQUIRES it, even transiently, because a maintenance-held lock could be mistaken by a resuming
|
|
56
56
|
or continuation session for an active delivery. Maintenance leaves no lock behind: there is
|
|
57
57
|
nothing to clean up afterward, and no ambiguity about who, if anyone, holds the one lock.
|
|
58
|
-
|
|
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`.
|
package/skills/doctor/SKILL.md
CHANGED
|
@@ -13,7 +13,7 @@ Doctor has three scopes. Pick the right one for the situation:
|
|
|
13
13
|
| Scope | Flag | When it runs | States |
|
|
14
14
|
|-------|------|--------------|--------|
|
|
15
15
|
| Core check | `--core` | SessionStart hook (automatic), also available on demand | Binary: pass or error |
|
|
16
|
-
| Store check | `--store [global\|<slug>]` | Dashboard load, `plastic-
|
|
16
|
+
| Store check | `--store [global\|<slug>]` | Dashboard load, the project route of `plastic-intent-continuing` | Three-state: pass / warn / fail |
|
|
17
17
|
| Full check | (no flag) | After every update (automatic), or `/plastic-doctor` | Three-state: pass / warn / fail |
|
|
18
18
|
|
|
19
19
|
### `--core` (binary, operational-readiness only)
|
|
@@ -51,8 +51,12 @@ Each manifest maps a file path to its SHA256.
|
|
|
51
51
|
|
|
52
52
|
Checks the operations Plastic itself depends on in one store: QMD search reachability (scoped
|
|
53
53
|
to that store's own collection; global uses `plastic-global`, a project slug uses
|
|
54
|
-
`plastic-<slug>`), sources/chain resolution, cross-store resolution, INDEX parsing,
|
|
55
|
-
projection
|
|
54
|
+
`plastic-<slug>`), sources/chain resolution, cross-store resolution, INDEX parsing, links
|
|
55
|
+
projection, done signals (including `backfilled_complete`: a terminal intent still missing a
|
|
56
|
+
real spec.md, plan.md, or action file), and, for the global store only, the session ledger
|
|
57
|
+
(`orphaned_session_tmp`: a `.tmp/<session>/` directory whose heartbeat is older than 24
|
|
58
|
+
hours; `day_ledger_shape`: a `.sessions/` entry that is not a `YYYYMMDD` day directory with
|
|
59
|
+
its `<day>.md`). A project slug also checks tool readiness (Serena, Enola): each is a pass whether
|
|
56
60
|
present or absent, present naming it available, absent noting it as an optional integration
|
|
57
61
|
never installed by doctor. Scope options:
|
|
58
62
|
|
|
@@ -86,10 +90,6 @@ per-project finding**; that is `--store <slug>`'s job (see above). This is what
|
|
|
86
90
|
- When hooks aren't firing, skills aren't loading, or something seems broken
|
|
87
91
|
- When the user says "check plastic", "diagnose", "what's wrong with plastic"
|
|
88
92
|
|
|
89
|
-
Read `../plastic-conventions/references/gates-and-enforcement.md` for the transition-gate
|
|
90
|
-
mechanics, the audited escape, and gate logging before diagnosing a stuck or misbehaving gate.
|
|
91
|
-
This path resolves relative to this skill's own installed directory.
|
|
92
|
-
|
|
93
93
|
## Procedure
|
|
94
94
|
|
|
95
95
|
### Step 1: Run the diagnostic script
|
|
@@ -159,10 +159,13 @@ Use the `fix_hint` value to determine the correct action:
|
|
|
159
159
|
| "Add missing entries to INDEX.md" | Add orphaned intents to the appropriate INDEX.md section |
|
|
160
160
|
| "Remove stale references from INDEX.md" | Edit INDEX.md to remove ghost references |
|
|
161
161
|
| "Inject the missing required frontmatter field(s)" | Edit the intent's `{ID}--{slug}.md` frontmatter to add the missing key (e.g. `chain: []`) without touching other keys |
|
|
162
|
-
| "Run: provision-project-store {slug}" | Run `provision-project-store <slug>` (
|
|
162
|
+
| "Run: provision-project-store {slug}" | Run `provision-project-store <slug>` (see Provisioning a project store below) to create the missing store |
|
|
163
163
|
| "Re-run installer" | Run `npx -y @zalom/plastic@<channel> install --claude` (or `--codex`/`--hermes`/`--all` for that agent; channel: -alpha->@alpha, -beta->@beta, else @latest) |
|
|
164
164
|
| "Run the Plastic installer to bootstrap the store" | Run `npx -y @zalom/plastic@<channel> install --claude` (or `--codex`/`--hermes`/`--all`; channel: -alpha->@alpha, -beta->@beta, else @latest) to restore the global store's plastic_home directory or INDEX.md |
|
|
165
|
-
| "
|
|
165
|
+
| "Relocate ... revisions.md ..." | Relocate the flagged section or ref into the intent's `revisions.md` via move-and-record (one dated, `[rule: <tag>]`-tagged entry per item), per plastic-conventions > references/maintenance-and-revisions.md. For a missing required section, restore or reproject it instead. |
|
|
166
|
+
| "Write the missing documents from the record via `scaffold-intent backfill ...`" | Run `ruby ~/.plastic/scripts/scaffold-intent backfill --store <store> --id <id> --disposition <delivered\|abandoned>` for each listed intent; it fills only missing or placeholder files and never touches real content |
|
|
167
|
+
| "Remove each listed .tmp/<session>/ directory after confirming that session is gone" | For each listed directory, confirm no live session uses it (a live session rewrites its heartbeat on every prompt and edit), then remove that directory by hand; never remove an unlisted one |
|
|
168
|
+
| "For a day directory missing its <day>.md, run `file-session-intent --day <day> ...`" | Run `ruby ~/.plastic/scripts/file-session-intent --day <day> --carry-to <today> --store <store>` for the named day; rename or remove an entry that is not a `YYYYMMDD` day directory |
|
|
166
169
|
| "Run scripts/project-links ... PRESERVES ... --drop-unbacked-links" | Run `ruby ~/.plastic/scripts/maintenance-run --tool project-links --intent <id> --apply` for the one flagged id (never run bare `project-links` against a real store outside the rare owner-approved batch exception, D2) |
|
|
167
170
|
|
|
168
171
|
For fixes the agent cannot handle automatically, explain what the user needs
|
|
@@ -247,6 +250,50 @@ removes exactly the dead rows through the same writer and commit, but holds back
|
|
|
247
250
|
intent dir carries a fresh lock or has not gone terminal yet (nothing to suppress there yet),
|
|
248
251
|
naming both as kept.
|
|
249
252
|
|
|
250
|
-
##
|
|
253
|
+
## Locks (auto teams only)
|
|
254
|
+
|
|
255
|
+
Locks exist for auto teams: a `delivery.lock` file in the intent directory names the owning
|
|
256
|
+
session, and the `record` hook refreshes its mtime on every edit (the lease heartbeat; stale
|
|
257
|
+
means older than the TTL). Direct work takes no lock. When a lock reads held by a session
|
|
258
|
+
that is gone, when work resumes after a crash, reboot, or `/tmp` wipe, or when the user says
|
|
259
|
+
"fix the lock", "who holds the lock", or "reclaim the lock", use the CLI (intent 304 folded
|
|
260
|
+
the former locking skill here):
|
|
261
|
+
|
|
262
|
+
| Verb | What it does | When |
|
|
263
|
+
|---|---|---|
|
|
264
|
+
| `who` | Owner, heartbeat, claims, delegates, from durable files only | Safe inspection; needs `--intent-dir` |
|
|
265
|
+
| `status` | Lock file, freshness, the derived worktree, whether this session's pointer names the intent, claims | Always safe; run first |
|
|
266
|
+
| `fix` | Idempotent repair from disk truth for this session; never touches a fresh foreign lock | Interrupted work, corrupt state, `/tmp` wiped |
|
|
267
|
+
| `release` | The owner clears the lock | Ending or abandoning an auto delivery |
|
|
268
|
+
| `reclaim` | Explicit takeover of a stale lock; appends an audit line to `savepoint.md` | The owner is gone and the lease expired |
|
|
269
|
+
| `delegate` | The owner registers a subagent session, or marks it `finished` or `failed` | Auto-team orchestration |
|
|
270
|
+
|
|
271
|
+
```
|
|
272
|
+
ruby ~/.plastic/scripts/plastic-lock status --intent-dir <store>/<id>--<slug>
|
|
273
|
+
ruby ~/.plastic/scripts/plastic-lock who --intent-dir <store>/<id>--<slug>
|
|
274
|
+
ruby ~/.plastic/scripts/plastic-lock fix --intent-dir <store>/<id>--<slug>
|
|
275
|
+
ruby ~/.plastic/scripts/plastic-lock reclaim --intent-dir <store>/<id>--<slug>
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
`fix` exits non-zero when another session holds a fresh lock: back off, `status` shows the
|
|
279
|
+
owner. `reclaim` refuses a fresh lock; every takeover is audited. The lock file's mtime is the
|
|
280
|
+
sole freshness truth. Never delete a lock file by hand. Read
|
|
281
|
+
`../plastic-conventions/references/locks-and-worktrees.md` when a lock question goes beyond
|
|
282
|
+
these verbs (claims, worktrees, the station ledger).
|
|
283
|
+
|
|
284
|
+
## Provisioning a project store
|
|
285
|
+
|
|
286
|
+
When a project is registered in `~/.plastic/projects.yml` but has no store on disk (doctor
|
|
287
|
+
reports `project_store_dir`), provision it (intent 304 folded the former provisioning skill
|
|
288
|
+
here). The slug is the project's key under `projects`; an unregistered slug exits non-zero and
|
|
289
|
+
creates nothing, and this procedure never edits `projects.yml`.
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
ruby ~/.plastic/scripts/provision-project-store <slug>
|
|
293
|
+
ruby ~/.plastic/scripts/qmd-sync register --store ~/.plastic/projects/<slug>/store
|
|
294
|
+
```
|
|
251
295
|
|
|
252
|
-
|
|
296
|
+
The provisioner is pure filesystem and idempotent: it creates
|
|
297
|
+
`~/.plastic/projects/<slug>/store/` with `.gitkeep`, writes `INDEX.md` and `project.yml` only
|
|
298
|
+
when missing, and never clobbers. The QMD registration is a separate, optional step that
|
|
299
|
+
no-ops when QMD is absent. New projects are provisioned by `plastic-project-creating`, not here.
|
package/skills/doctor/report.md
CHANGED
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
core_files -> "Core Files"
|
|
19
19
|
project_stores -> "Project Stores"
|
|
20
20
|
deprecations -> "Deprecations"
|
|
21
|
+
done_signals -> "Done Signals"
|
|
22
|
+
session_ledger -> "Session Ledger" (global store only)
|
|
21
23
|
4. For each check within a category, emit one line with the status icon
|
|
22
24
|
and the check message. If the check has non-empty details, list them
|
|
23
25
|
as indented sub-items.
|
|
@@ -59,7 +61,7 @@ Checked at: {{timestamp}}
|
|
|
59
61
|
- [PASS] Claude Code adapter registered
|
|
60
62
|
- [FAIL] 2 hook scripts not executable
|
|
61
63
|
- ~/.claude/hooks/plastic-session-start
|
|
62
|
-
- ~/.claude/hooks/plastic-
|
|
64
|
+
- ~/.claude/hooks/plastic-record
|
|
63
65
|
|
|
64
66
|
<!-- =====================================================================
|
|
65
67
|
Repeat the above pattern for each category found in the checks array.
|
package/skills/install/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: plastic-install
|
|
3
|
-
description: 'Use when initializing Plastic globally (~/.plastic/) or locally in a project, or to re-install/repair a broken installation.
|
|
3
|
+
description: 'Use when initializing Plastic globally (~/.plastic/) or locally in a project, or to re-install/repair a broken installation. The package pin selects the channel (@latest, @beta, @alpha; the channel flags were removed in 2.0). First install defaults to @latest (stable); reinstalls match the already-installed channel. Global install is recommended: it creates the global intent store as a git-backed repository. Local install creates .plastic/ in the current project for testing.'
|
|
4
4
|
user-invocable: true
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -16,8 +16,10 @@ user-invocable: true
|
|
|
16
16
|
|
|
17
17
|
If Plastic is installed, derive `<channel>` from `~/.plastic/VERSION`: a version containing
|
|
18
18
|
`-alpha` means `@alpha`, `-beta` means `@beta`, otherwise `@latest`. If not installed
|
|
19
|
-
(first install), default to `@latest`.
|
|
20
|
-
|
|
19
|
+
(first install), default to `@latest`. To change channel, pin the package instead of
|
|
20
|
+
passing a flag: `npx -y @zalom/plastic@alpha install --claude` (or a version such as
|
|
21
|
+
`@2.0.0-alpha.1`); the `--alpha`, `--beta`, and `--latest` flags were removed in 2.0
|
|
22
|
+
(intent 310) because they never selected a package.
|
|
21
23
|
|
|
22
24
|
## Re-install / repair
|
|
23
25
|
|
|
@@ -31,13 +33,13 @@ npx -y @zalom/plastic@<channel> install --reinstall --claude
|
|
|
31
33
|
|
|
32
34
|
Then **run `/plastic-doctor`** and report what it found.
|
|
33
35
|
|
|
34
|
-
##
|
|
36
|
+
## Channels
|
|
35
37
|
|
|
36
|
-
|
|
|
37
|
-
|
|
38
|
-
|
|
|
39
|
-
|
|
|
40
|
-
|
|
|
38
|
+
| Package | Channel |
|
|
39
|
+
|---------|---------|
|
|
40
|
+
| `@zalom/plastic@latest` | stable (default on a first install) |
|
|
41
|
+
| `@zalom/plastic@beta` | beta |
|
|
42
|
+
| `@zalom/plastic@alpha` | alpha; `npx -y @zalom/plastic@alpha install --claude` is the 2.0 alpha path |
|
|
41
43
|
|
|
42
44
|
When invoked from within Claude Code (re-install or channel switch), the skill
|
|
43
45
|
runs the appropriate npx command:
|