@zalom/plastic 2.0.0-alpha.9 → 2.0.2
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 +13 -136
- package/README.md +357 -133
- package/agents/plastic-enforcer.md +21 -16
- package/agents/plastic-executor.md +15 -4
- package/agents/plastic-node-research.md +30 -0
- package/agents/plastic-node-verify.md +28 -0
- package/agents/plastic-node-work.md +33 -0
- package/agents/{plastic-advisor.md → plastic-primary-advisor.md} +7 -9
- package/agents/{plastic-faux-advisor.md → plastic-secondary-advisor.md} +9 -12
- package/assets/plastic-logo.svg +1 -0
- package/bin/crap +4 -0
- package/bin/lib/context_budget.rb +43 -6
- package/bin/lib/skill_census.rb +839 -0
- package/bin/plastic +8 -0
- package/bin/plastic-skill-census +114 -0
- package/bin/test +24 -4
- package/bin/verify-change +345 -0
- package/config_asks.yml +4 -4
- package/deprecations.yml +1 -1
- package/{skills/agent-advisor/references → docs/help}/advisor-protocol.md +19 -24
- package/{skills/auto/references → docs/help}/agent-architecture.md +16 -14
- package/docs/help/completion-and-done.md +53 -0
- package/docs/help/human-report-contract.md +152 -0
- package/{skills/conventions/references → docs/help}/knowledge-graph.md +9 -0
- package/{skills/conventions/references → docs/help}/locks-and-worktrees.md +11 -13
- package/{skills/conventions/references → docs/help}/maintenance-and-revisions.md +1 -1
- package/{skills/conventions/references → docs/help}/roadmaps.md +5 -4
- package/{skills/tutorial/references → docs/help}/track-1-guided.md +28 -47
- package/{skills/tutorial/references → docs/help}/track-2-auto.md +8 -8
- package/{skills/tutorial/references → docs/help}/track-3-projects-and-roadmaps.md +24 -17
- package/hooks/call-budget +4 -0
- package/hooks/hooks.json +24 -0
- package/hooks/message-display +55 -2
- package/hooks/session-start +5 -1
- package/hooks/statusline +32 -27
- package/hooks/stop +5 -0
- package/package.json +5 -3
- package/scripts/append-ledger +2 -1
- package/scripts/dashboard.rb +267 -16
- package/scripts/day-summary +2 -1
- package/scripts/doctor.rb +680 -39
- package/scripts/end-intent +378 -56
- package/scripts/exec-worktree +5 -5
- package/scripts/file-session-intent +2 -1
- package/scripts/graph-measure +249 -0
- package/scripts/hook-call-budget +222 -0
- package/scripts/hook-capture +24 -123
- package/scripts/hook-close +2 -1
- package/scripts/hook-message-display +7 -0
- package/scripts/hook-record +24 -16
- package/scripts/hook-savepoint +27 -3
- package/scripts/hook-session-start +359 -321
- package/scripts/hook-stop +58 -0
- package/scripts/index-projection +74 -0
- package/scripts/insight-append +17 -4
- package/scripts/install.rb +9 -7
- package/scripts/lib/action_graph_shim.rb +279 -0
- package/scripts/lib/active_delivery.rb +105 -0
- package/scripts/lib/agent_models.rb +63 -25
- package/scripts/lib/arm.rb +74 -91
- package/scripts/lib/atomic_write.rb +31 -0
- package/scripts/lib/backup.rb +65 -0
- package/scripts/lib/cli/command.rb +92 -0
- package/scripts/lib/cli/commands/auto.rb +18 -0
- package/scripts/lib/cli/commands/auto_brief.rb +44 -0
- package/scripts/lib/cli/commands/auto_lock.rb +111 -0
- package/scripts/lib/cli/commands/auto_report.rb +50 -0
- package/scripts/lib/cli/commands/auto_take.rb +68 -0
- package/scripts/lib/cli/commands/backup.rb +43 -0
- package/scripts/lib/cli/commands/checkout.rb +25 -0
- package/scripts/lib/cli/commands/continue.rb +66 -0
- package/scripts/lib/cli/commands/doctor.rb +81 -0
- package/scripts/lib/cli/commands/feedback.rb +40 -0
- package/scripts/lib/cli/commands/help.rb +69 -0
- package/scripts/lib/cli/commands/hook.rb +32 -0
- package/scripts/lib/cli/commands/index.rb +23 -0
- package/scripts/lib/cli/commands/install.rb +21 -0
- package/scripts/lib/cli/commands/installer_verb.rb +37 -0
- package/scripts/lib/cli/commands/intent.rb +19 -0
- package/scripts/lib/cli/commands/intent_answer.rb +37 -0
- package/scripts/lib/cli/commands/intent_command.rb +58 -0
- package/scripts/lib/cli/commands/intent_end.rb +75 -0
- package/scripts/lib/cli/commands/intent_new.rb +62 -0
- package/scripts/lib/cli/commands/intent_note.rb +43 -0
- package/scripts/lib/cli/commands/intent_rule.rb +36 -0
- package/scripts/lib/cli/commands/intent_show.rb +32 -0
- package/scripts/lib/cli/commands/intent_spec.rb +44 -0
- package/scripts/lib/cli/commands/intent_step.rb +79 -0
- package/scripts/lib/cli/commands/intent_verify.rb +26 -0
- package/scripts/lib/cli/commands/migrate.rb +16 -0
- package/scripts/lib/cli/commands/migrate_stores.rb +31 -0
- package/scripts/lib/cli/commands/next.rb +54 -0
- package/scripts/lib/cli/commands/project.rb +19 -0
- package/scripts/lib/cli/commands/project_links.rb +46 -0
- package/scripts/lib/cli/commands/project_list.rb +20 -0
- package/scripts/lib/cli/commands/project_new.rb +95 -0
- package/scripts/lib/cli/commands/query.rb +31 -0
- package/scripts/lib/cli/commands/render.rb +35 -0
- package/scripts/lib/cli/commands/roadmap.rb +19 -0
- package/scripts/lib/cli/commands/roadmap_check.rb +54 -0
- package/scripts/lib/cli/commands/roadmap_log.rb +54 -0
- package/scripts/lib/cli/commands/roadmap_migrate.rb +53 -0
- package/scripts/lib/cli/commands/roadmap_next.rb +77 -0
- package/scripts/lib/cli/commands/roadmap_show.rb +65 -0
- package/scripts/lib/cli/commands/rollback.rb +20 -0
- package/scripts/lib/cli/commands/search.rb +60 -0
- package/scripts/lib/cli/commands/session.rb +18 -0
- package/scripts/lib/cli/commands/session_commit.rb +42 -0
- package/scripts/lib/cli/commands/session_handoff.rb +34 -0
- package/scripts/lib/cli/commands/session_summary.rb +35 -0
- package/scripts/lib/cli/commands/status.rb +68 -0
- package/scripts/lib/cli/commands/subcommand_list.rb +36 -0
- package/scripts/lib/cli/commands/sync.rb +55 -0
- package/scripts/lib/cli/commands/uninstall.rb +20 -0
- package/scripts/lib/cli/commands/update.rb +20 -0
- package/scripts/lib/cli/commands/version.rb +53 -0
- package/scripts/lib/cli/frontier.rb +86 -0
- package/scripts/lib/cli/intent_progress.rb +36 -0
- package/scripts/lib/cli/legacy.rb +80 -0
- package/scripts/lib/cli/output.rb +137 -0
- package/scripts/lib/cli/scope.rb +134 -0
- package/scripts/lib/cli/table.rb +65 -0
- package/scripts/lib/cli.rb +94 -0
- package/scripts/lib/codex_adapter.rb +198 -0
- package/scripts/lib/compact_instructions.rb +13 -5
- package/scripts/lib/core_integrity.rb +71 -0
- package/scripts/lib/dashboard_screen.rb +40 -0
- package/scripts/lib/data_boundary.rb +132 -0
- package/scripts/lib/day_summary.rb +23 -14
- package/scripts/lib/doctor_core.rb +114 -38
- package/scripts/lib/doctor_session_ledger.rb +5 -53
- package/scripts/lib/engine_permissions.rb +88 -0
- package/scripts/lib/exec_worktree.rb +24 -21
- package/scripts/lib/feedback_report.rb +1 -1
- package/scripts/lib/graph_edges.rb +137 -0
- package/scripts/lib/graph_file.rb +246 -0
- package/scripts/lib/graph_measure.rb +645 -0
- package/scripts/lib/graph_measure_budget.rb +409 -0
- package/scripts/lib/graph_measure_cohorts.rb +487 -0
- package/scripts/lib/graph_measure_models.rb +413 -0
- package/scripts/lib/graph_measure_report.rb +532 -0
- package/scripts/lib/graph_tree.rb +98 -0
- package/scripts/lib/guarded_append.rb +155 -0
- package/scripts/lib/handoff.rb +40 -13
- package/scripts/lib/harness_adapter.rb +184 -0
- package/scripts/lib/hook_registry.rb +27 -3
- package/scripts/lib/hook_replay.rb +235 -0
- package/scripts/lib/index_entry.rb +62 -0
- package/scripts/lib/index_projection.rb +201 -0
- package/scripts/lib/insights.rb +1 -1
- package/scripts/lib/installer_core.rb +543 -71
- package/scripts/lib/intent_screen.rb +4 -4
- package/scripts/lib/intent_screen_ansi.rb +73 -12
- package/scripts/lib/intent_validator.rb +2 -2
- package/scripts/lib/lock.rb +10 -11
- package/scripts/lib/message_display.rb +350 -54
- package/scripts/lib/meter_watch.rb +185 -0
- package/scripts/lib/node_file.rb +234 -0
- package/scripts/lib/node_ids.rb +99 -0
- package/scripts/lib/node_input.rb +921 -0
- package/scripts/lib/node_input_compatibility.rb +62 -0
- package/scripts/lib/node_ledger.rb +386 -0
- package/scripts/lib/node_progress.rb +153 -0
- package/scripts/lib/node_return.rb +204 -0
- package/scripts/lib/node_worktree.rb +337 -0
- package/scripts/lib/outcome_report.rb +440 -0
- package/scripts/lib/preflight.rb +4 -6
- package/scripts/lib/project_config.rb +46 -0
- package/scripts/lib/project_validator.rb +3 -2
- package/scripts/lib/qmd_sync.rb +8 -7
- package/scripts/lib/ready_set.rb +462 -0
- package/scripts/lib/reference_archive.rb +45 -0
- package/scripts/lib/release_guard.rb +18 -0
- package/scripts/lib/report_screen.rb +1371 -47
- package/scripts/lib/rlm/corpus.rb +13 -0
- package/scripts/lib/rlm/probe.rb +29 -0
- package/scripts/lib/rlm/query.rb +22 -0
- package/scripts/lib/roadmap_graph.rb +210 -0
- package/scripts/lib/roadmap_migration.rb +95 -0
- package/scripts/lib/roadmap_queue.rb +170 -12
- package/scripts/lib/roadmap_render.rb +150 -0
- package/scripts/lib/roadmap_savepoint.rb +64 -14
- package/scripts/lib/runner_absorb.rb +703 -0
- package/scripts/lib/runner_answer.rb +206 -0
- package/scripts/lib/runner_core.rb +194 -0
- package/scripts/lib/runner_dispatch.rb +526 -0
- package/scripts/lib/runner_policy.rb +191 -0
- package/scripts/lib/runner_proposals.rb +275 -0
- package/scripts/lib/runner_rewind.rb +201 -0
- package/scripts/lib/runner_sweep.rb +231 -0
- package/scripts/lib/runner_until_empty.rb +252 -0
- package/scripts/lib/runner_watch.rb +389 -0
- package/scripts/lib/savepoint.rb +141 -19
- package/scripts/lib/scaffold_intent.rb +6 -3
- package/scripts/lib/screen_paint.rb +365 -28
- package/scripts/lib/screens/dashboard.rb +20 -0
- package/scripts/lib/screens/plan.rb +18 -0
- package/scripts/lib/screens/roadmap.rb +15 -0
- package/scripts/lib/search_index.rb +55 -0
- package/scripts/lib/session_close.rb +30 -28
- package/scripts/lib/session_git.rb +67 -19
- package/scripts/lib/session_ledger.rb +48 -4
- package/scripts/lib/session_usage.rb +190 -0
- package/scripts/lib/sqlite.rb +22 -0
- package/scripts/lib/stop_gate.rb +95 -0
- package/scripts/lib/store_discovery.rb +7 -6
- package/scripts/lib/store_layout.rb +54 -0
- package/scripts/lib/store_provisioning.rb +2 -1
- package/scripts/lib/store_sync.rb +85 -0
- package/scripts/lib/stores_move.rb +93 -0
- package/scripts/lib/untouched_scaffold.rb +51 -0
- package/scripts/lib/verify_intent.rb +36 -8
- package/scripts/lib/version_number.rb +48 -0
- package/scripts/lib/work_graph.rb +59 -0
- package/scripts/lib/work_graph_validator.rb +201 -0
- package/scripts/lib/worktree.rb +27 -32
- package/scripts/lib/worktree_sweep.rb +6 -5
- package/scripts/link-suggest +2 -1
- package/scripts/meter-watch +57 -0
- package/scripts/migrate-to-global +1 -1
- package/scripts/new-intent +4 -13
- package/scripts/node-input +92 -0
- package/scripts/node-run +225 -0
- package/scripts/node-transition +291 -0
- package/scripts/outcome-report +74 -0
- package/scripts/plastic-lock +65 -60
- package/scripts/project-links +6 -21
- package/scripts/promote-session-item +3 -2
- package/scripts/read-config +53 -9
- package/scripts/ready-set +126 -0
- package/scripts/release-check +123 -0
- package/scripts/report-screen +177 -16
- package/scripts/roadmap-graph +125 -0
- package/scripts/roadmap-savepoint +7 -0
- package/scripts/rollback.rb +5 -1
- package/scripts/runner +581 -0
- package/scripts/savepoint-note +11 -9
- package/scripts/session-commit +2 -1
- package/scripts/session-usage +56 -0
- package/scripts/skill-lint +115 -6
- package/scripts/spawn-preamble +2 -2
- package/scripts/update.rb +31 -4
- package/scripts/validate-work-graph +39 -0
- package/scripts/verify-intent +3 -2
- package/scripts/write-handoff +2 -1
- package/templates/agents.md +7 -7
- package/templates/config.yml +16 -9
- package/templates/dashboard-screen.md +22 -0
- package/templates/display-fixture.md +21 -0
- package/templates/graph.md +16 -0
- package/templates/index.md +1 -1
- package/templates/intent-screen.md +1 -1
- package/templates/node-decision.md +11 -0
- package/templates/node-research.md +13 -0
- package/templates/node-verify.md +13 -0
- package/templates/node-work.md +22 -0
- package/templates/outcome.md +8 -3
- package/templates/project.yml +1 -1
- package/templates/render.css +10 -0
- package/templates/report-plan.md +15 -0
- package/templates/report-roadmap-delivered.md +10 -0
- package/templates/report-roadmap-plan.md +9 -0
- package/templates/report-roadmap-state.md +9 -0
- package/templates/report-state.md +1 -1
- package/templates/roadmap.md +13 -0
- package/bin/plastic.js +0 -70
- package/scripts/lib/bridge.rb +0 -116
- package/skills/agent-advisor/SKILL.md +0 -92
- package/skills/auto/SKILL.md +0 -296
- package/skills/auto/evals/evals.json +0 -255
- package/skills/auto/references/end-tail.md +0 -66
- package/skills/auto/references/human-report-contract.md +0 -78
- package/skills/conventions/SKILL.md +0 -29
- package/skills/conventions/references/completion-and-done.md +0 -43
- package/skills/dashboard/SKILL.md +0 -169
- package/skills/dashboard/evals/evals.json +0 -38
- package/skills/dashboard/references/classification.md +0 -22
- package/skills/dashboard/templates/dashboard-global.md +0 -20
- package/skills/dashboard/templates/dashboard-project.md +0 -19
- package/skills/direct/SKILL.md +0 -66
- package/skills/direct/references/request-signals.md +0 -59
- package/skills/doctor/SKILL.md +0 -299
- package/skills/doctor/report.md +0 -102
- package/skills/feedback/SKILL.md +0 -98
- package/skills/feedback/references/transport-and-privacy.md +0 -65
- package/skills/feedback/report.md +0 -36
- package/skills/install/SKILL.md +0 -217
- package/skills/intent-continuing/SKILL.md +0 -154
- package/skills/intent-continuing/references/board-fill.md +0 -43
- package/skills/intent-continuing/references/boarding-matrix.md +0 -34
- package/skills/intent-continuing/references/context-management.md +0 -28
- package/skills/intent-continuing/references/liveness-ranking.md +0 -57
- package/skills/intent-creating/SKILL.md +0 -164
- package/skills/intent-creating/evals/evals.json +0 -72
- package/skills/intent-creating/references/lifecycle.md +0 -81
- package/skills/intent-creating/references/wikilinks.md +0 -8
- package/skills/intent-ending/SKILL.md +0 -176
- package/skills/intent-ending/evals/evals.json +0 -74
- package/skills/intent-executing/SKILL.md +0 -170
- package/skills/intent-executing/evals/evals.json +0 -66
- package/skills/intent-executing/implementer-prompt.md +0 -42
- package/skills/intent-executing/spec-reviewer-prompt.md +0 -27
- package/skills/intent-speccing/SKILL.md +0 -130
- package/skills/intent-speccing/evals/evals.json +0 -126
- package/skills/intent-speccing/references/design-principles.md +0 -44
- package/skills/intent-speccing/references/per-section-fill-rules.md +0 -92
- package/skills/intent-speccing/references/self-verify-checklist.md +0 -37
- package/skills/project-creating/SKILL.md +0 -162
- package/skills/project-creating/references/hubs-projects.md +0 -55
- package/skills/project-creating/references/project-scaffolding.md +0 -97
- package/skills/releasing/SKILL.md +0 -337
- package/skills/releasing/references/deprecations.md +0 -60
- package/skills/releasing/references/promotion-and-tagging.md +0 -66
- package/skills/releasing/references/release-lines.md +0 -105
- package/skills/roadmap/SKILL.md +0 -64
- package/skills/roadmap/references/file-format.md +0 -124
- package/skills/roadmap/references/operations.md +0 -112
- package/skills/rollback/SKILL.md +0 -91
- package/skills/tutorial/SKILL.md +0 -65
- package/skills/tutorial/evals/evals.json +0 -186
- package/skills/uninstall/SKILL.md +0 -75
- package/skills/update/SKILL.md +0 -126
- /package/{skills/auto/references → docs/help}/agent-report-contract.md +0 -0
- /package/{skills/intent-executing → docs/help}/code-quality-reviewer-prompt.md +0 -0
- /package/{skills/conventions/references → docs/help}/lifecycle-and-savepoints.md +0 -0
- /package/{skills/intent-executing → docs/help}/plan-reviewer-prompt.md +0 -0
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"skill_name": "plastic-dashboard",
|
|
3
|
-
"notes": "Intent 66a. Spec for the QMD-first step in the entry flow (resolve a free-prose intent reference before grep/Read). Runner is intent 76; spec only.",
|
|
4
|
-
"evals": [
|
|
5
|
-
{
|
|
6
|
-
"id": 1,
|
|
7
|
-
"scope": "behavior",
|
|
8
|
-
"set": "validation",
|
|
9
|
-
"prompt": "QMD is present. On the board, the user navigates by describing an intent (the search verb work) instead of giving its id.",
|
|
10
|
-
"expected_output": "Before scanning the store with grep/Read to resolve the free-prose reference, runs `ruby ~/.plastic/scripts/qmd-sync search \"search verb\"` to surface the candidate intent, then opens the authoritative intent file for the hit. No-op fallback to INDEX.md / file scan when QMD is absent.",
|
|
11
|
-
"files": [],
|
|
12
|
-
"assertions": [
|
|
13
|
-
{
|
|
14
|
-
"type": "human",
|
|
15
|
-
"check": "qmd-sync search is run before grep/Read when the user navigates by description; authoritative file opened for the hit",
|
|
16
|
-
"observed": "SKILL.md (or agent file) carries the QMD-first step: run qmd-sync search before grep/Read, then open the authoritative file; no-op fallback when QMD is absent",
|
|
17
|
-
"result": "pass"
|
|
18
|
-
}
|
|
19
|
-
]
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"id": 2,
|
|
23
|
-
"scope": "behavior",
|
|
24
|
-
"set": "validation",
|
|
25
|
-
"prompt": "How does the project board render after intent 202 (short by default, paged on request)?",
|
|
26
|
-
"expected_output": "The project board shows, in order, and nothing else: a 2-3 sentence prose summary of what was delivered most recently (built in dashboard.rb from completed/completed_on data, not the 24h-windowed recently_worked), an Active table capped at 3 rows (Id|What|Stage, ordered lifecycle-stage descending with a savepoint tie-break), a Next-work table capped at 5 rows (Id|What|Value|Disposition|Flags), and a one-line footer stating true totals (e.g. '3 of 12 active, 5 of 47 next work') plus how to see everything. The raw Future table and its {{future.rows}} placeholder, and the separate Recently-worked table, are both gone from dashboard-project.md. dashboard-global.md carries the equivalent fix (D6): a prose summary in place of its recently-worked table, the same honest footer, and the same --limit-active/--limit-next/--all/--plain mechanics.",
|
|
27
|
-
"files": ["skills/dashboard/templates/dashboard-global.md", "skills/dashboard/templates/dashboard-project.md", "skills/dashboard/SKILL.md"],
|
|
28
|
-
"assertions": [
|
|
29
|
-
{
|
|
30
|
-
"type": "convention",
|
|
31
|
-
"check": "project board template has summary+active+next_work+footer only (no future, no recently_worked table); global template has summary+footer added; SKILL.md documents the new payload fields and CLI flags",
|
|
32
|
-
"observed": "templates carry {{summary}}, {{active.rows}} (Id|What|Stage), {{next_work.rows}} (Id|What|Value|Disposition|Flags), {{footer}}; {{future.rows}} and the recently-worked table are removed from both; SKILL.md Step 1/2 document summary/footer/active_total/active_shown/next_total/next_shown and --limit-active/--limit-next/--all/--plain",
|
|
33
|
-
"result": "pass"
|
|
34
|
-
}
|
|
35
|
-
]
|
|
36
|
-
}
|
|
37
|
-
]
|
|
38
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# How Classification Works (Deterministic)
|
|
2
|
-
|
|
3
|
-
The script (`dashboard.rb`) computes Effort/Value/Flags/Override/Caps deterministically;
|
|
4
|
-
the agent never re-derives them. Read this to explain or debug a ranking or disposition.
|
|
5
|
-
|
|
6
|
-
- **Effort** — small for `research`/`exploration`/`bugfix`, for already-scoped intents
|
|
7
|
-
(plan/checklist exists), or a **branch id** (folgezettel depth ≥ 2, e.g. `4a`, `12b3`); big
|
|
8
|
-
otherwise. A root id (a bare number) is always depth 1, so it is never demoted by this rule.
|
|
9
|
-
- **Value → high** when any of: explicit `value: high`; a human-authored **root** intent; or
|
|
10
|
-
an intent that is a `source` of ≥1 other intent (it has spawned follow-on work). A purely
|
|
11
|
-
relational `chain` entry alone is **not** a value signal (intent 68) — else low.
|
|
12
|
-
- **Flags** — `unblocked` only when a **future** intent has **all** its `sources` done AND at
|
|
13
|
-
least one source's completion date is strictly later than the intent's own `created` date (a
|
|
14
|
-
genuine wait, not a birth-time default); `in-progress` only when the savepoint ledger shows
|
|
15
|
-
real post-birth activity, not just the creation stamp; `stale` only on future intents past
|
|
16
|
-
the staleness threshold. All three kept low-noise by design.
|
|
17
|
-
- **Override** — a `value: high|low` frontmatter field always wins (pre-stamped data, never
|
|
18
|
-
model judgment at render time).
|
|
19
|
-
- **Caps**: the next-work list and the project board's `active`/`future` lists are capped at
|
|
20
|
-
8 entries plus a trailing "+N more" line; each entry's text is truncated to 120 characters
|
|
21
|
-
with a trailing ellipsis. Applies to the Markdown board only (the ASCII renderer has its own
|
|
22
|
-
separate `CELL_CAP`).
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# 🧩 Plastic · Global Board, {{date}}
|
|
2
|
-
|
|
3
|
-
{{summary}}
|
|
4
|
-
|
|
5
|
-
## Where we are
|
|
6
|
-
|
|
7
|
-
{{counts.active}} intents active, {{counts.done}} done, {{counts.future}} queued for later.
|
|
8
|
-
|
|
9
|
-
## Projects, active {{project_totals.active}}, done {{project_totals.done}}, future {{project_totals.future}}
|
|
10
|
-
{{projects.lines}}
|
|
11
|
-
|
|
12
|
-
## Most-valuable next work
|
|
13
|
-
|
|
14
|
-
| Id | What | Value | Disposition | Flags |
|
|
15
|
-
| --- | --- | --- | --- | --- |
|
|
16
|
-
{{next_work.rows}}
|
|
17
|
-
|
|
18
|
-
{{footer}}
|
|
19
|
-
|
|
20
|
-
**What would you like to work on next?** (type an **intent id**, a **project name**, or anything **new** you'd like to start)
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# 📦 {{slug}} · Project Board, {{date}}
|
|
2
|
-
|
|
3
|
-
{{summary}}
|
|
4
|
-
|
|
5
|
-
**Active**
|
|
6
|
-
|
|
7
|
-
| Id | What | Stage | Worker | Activity |
|
|
8
|
-
| --- | --- | --- | --- | --- |
|
|
9
|
-
{{active.rows}}
|
|
10
|
-
|
|
11
|
-
**Most-valuable next work**
|
|
12
|
-
|
|
13
|
-
| Id | What | Value | Disposition | Flags |
|
|
14
|
-
| --- | --- | --- | --- | --- |
|
|
15
|
-
{{next_work.rows}}
|
|
16
|
-
|
|
17
|
-
{{footer}}
|
|
18
|
-
|
|
19
|
-
**What would you like to work on next?** (type an **intent id**, or **global** to go back)
|
package/skills/direct/SKILL.md
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
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.
|
|
@@ -1,59 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,299 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: plastic-doctor
|
|
3
|
-
description: Use when diagnosing Plastic installation health, after updates, or when something seems broken. Runs checks and reports findings with fix options.
|
|
4
|
-
user-invocable: true
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Doctor: Plastic Health Check
|
|
8
|
-
|
|
9
|
-
## Scopes
|
|
10
|
-
|
|
11
|
-
Doctor has three scopes. Pick the right one for the situation:
|
|
12
|
-
|
|
13
|
-
| Scope | Flag | When it runs | States |
|
|
14
|
-
|-------|------|--------------|--------|
|
|
15
|
-
| Core check | `--core` | SessionStart hook (automatic), also available on demand | Binary: pass or error |
|
|
16
|
-
| Store check | `--store [global\|<slug>]` | Dashboard load, the project route of `plastic-intent-continuing` | Three-state: pass / warn / fail |
|
|
17
|
-
| Full check | (no flag) | After every update (automatic), or `/plastic-doctor` | Three-state: pass / warn / fail |
|
|
18
|
-
|
|
19
|
-
### `--core` (binary, operational-readiness only)
|
|
20
|
-
|
|
21
|
-
Checks ONLY that Plastic is loaded and ready for work: agent registration (skills,
|
|
22
|
-
subagents, hooks/harnesses present and registered), core files (manifest-backed
|
|
23
|
-
presence/hash checks, excluding `agent_model_drift`, which is a non-boot
|
|
24
|
-
config-honoring check, never run at core), manifest sync (global + agent manifest
|
|
25
|
-
SHA256), every registered project's path resolving to a real, existing directory,
|
|
26
|
-
and the global store being reachable (`INDEX.md` present; no orphan/ghost content
|
|
27
|
-
scanning). Result is binary: exit 0 on pass, non-zero on error. It never produces
|
|
28
|
-
warnings, and it never scans store content.
|
|
29
|
-
|
|
30
|
-
It checks two install manifests as part of core files and manifest sync:
|
|
31
|
-
|
|
32
|
-
- `~/.plastic/manifest.json` (global manifest, covers PLASTIC.md and global scripts)
|
|
33
|
-
- `~/.claude/plastic/manifest.json` (agent-side manifest, covers agent scripts and hooks)
|
|
34
|
-
|
|
35
|
-
Each manifest maps a file path to its SHA256.
|
|
36
|
-
|
|
37
|
-
**On failure**, the report states this guided route, in order:
|
|
38
|
-
|
|
39
|
-
1. Offer fixes in the `/plastic-doctor` conversation (the Fix all / Select individually /
|
|
40
|
-
Skip router from Steps 4-5 below); doctor itself only reports, and each chosen repair
|
|
41
|
-
is dispatched to the maintenance tool or skill that owns it.
|
|
42
|
-
2. If that does not resolve it, roll back to the last known-good version via
|
|
43
|
-
`plastic-rollback` (restores from the local, append-only `versions.json` ledger of
|
|
44
|
-
versions actually run).
|
|
45
|
-
3. Optionally report the issue via the feedback command (`scripts/feedback-report`,
|
|
46
|
-
backing the `plastic-feedback` skill), which composes a local report plus a
|
|
47
|
-
prefilled GitHub issue URL and never holds a credential or contacts GitHub
|
|
48
|
-
directly.
|
|
49
|
-
|
|
50
|
-
### `--store [global|<slug>]`
|
|
51
|
-
|
|
52
|
-
Checks the operations Plastic itself depends on in one store: QMD search reachability (scoped
|
|
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, 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
|
|
60
|
-
present or absent, present naming it available, absent noting it as an optional integration
|
|
61
|
-
never installed by doctor. Scope options:
|
|
62
|
-
|
|
63
|
-
- No argument (`:all`): checks all stores (global and all project stores), QMD reachability
|
|
64
|
-
unscoped across every collection.
|
|
65
|
-
- `global`: checks only the global store, QMD scoped to `plastic-global`, no tool-readiness
|
|
66
|
-
checks (code-navigation tools have no meaning against the global store).
|
|
67
|
-
- A project slug (e.g. `--store plastic`): checks only that project's store, QMD scoped to
|
|
68
|
-
`plastic-<slug>`, plus Serena/Enola readiness for that project.
|
|
69
|
-
|
|
70
|
-
Produces three-state results (pass / warn / fail) and is run per-scope at dashboard load time:
|
|
71
|
-
the global board uses `--store global`, a project board uses `--store <slug>`. **This IS the
|
|
72
|
-
load-time full project check** named by 219's doctrine: no separate mechanism exists or is
|
|
73
|
-
needed, since a project slug's scan already carries every per-project finding scoped to that
|
|
74
|
-
project alone.
|
|
75
|
-
|
|
76
|
-
### Full doctor (no flag)
|
|
77
|
-
|
|
78
|
-
Runs the install-wide surface: agent registration, core files (including config-honoring
|
|
79
|
-
drift), manifest sync is core-only and not part of this run, deprecation checks, config-ask
|
|
80
|
-
checks, install-integrity checks, skill-lint (advisory), QMD reachability (unscoped, every
|
|
81
|
-
collection), and the global store's own conventions/done-signals content. **Never carries a
|
|
82
|
-
per-project finding**; that is `--store <slug>`'s job (see above). This is what
|
|
83
|
-
`/plastic-doctor` invokes, and it also runs automatically after every `plastic-update`
|
|
84
|
-
(informational, does not block or revert the update).
|
|
85
|
-
|
|
86
|
-
## When to Use
|
|
87
|
-
|
|
88
|
-
- User invokes `/plastic-doctor` (full check)
|
|
89
|
-
- After `plastic-update` completes (automatically, full check)
|
|
90
|
-
- When hooks aren't firing, skills aren't loading, or something seems broken
|
|
91
|
-
- When the user says "check plastic", "diagnose", "what's wrong with plastic"
|
|
92
|
-
|
|
93
|
-
## Procedure
|
|
94
|
-
|
|
95
|
-
### Step 1: Run the diagnostic script
|
|
96
|
-
|
|
97
|
-
```bash
|
|
98
|
-
ruby ~/.plastic/scripts/doctor.rb --agent claude
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
Replace `claude` with the current agent type if known (`codex`, `hermes`).
|
|
102
|
-
|
|
103
|
-
Parse the JSON output from stdout. The script is read-only and never modifies
|
|
104
|
-
files. Errors go to stderr.
|
|
105
|
-
|
|
106
|
-
Exit codes indicate check results, not script failure:
|
|
107
|
-
- `0`: all checks passed
|
|
108
|
-
- `1`: warnings found
|
|
109
|
-
- `2`: failures found
|
|
110
|
-
|
|
111
|
-
All three exit codes mean the script ran successfully. Do not treat non-zero
|
|
112
|
-
as an error.
|
|
113
|
-
|
|
114
|
-
### Step 2: Determine overall status
|
|
115
|
-
|
|
116
|
-
Read the `status` field from the JSON root:
|
|
117
|
-
|
|
118
|
-
| Status | Meaning |
|
|
119
|
-
|--------|---------|
|
|
120
|
-
| `pass` | Everything is healthy |
|
|
121
|
-
| `warn` | Warnings found but Plastic works normally |
|
|
122
|
-
| `fail` | Blocking issues that prevent Plastic from operating |
|
|
123
|
-
|
|
124
|
-
### Step 3: Fill the report template
|
|
125
|
-
|
|
126
|
-
Read `report.md` from the same directory as this SKILL.md
|
|
127
|
-
(`~/.plastic/skills/doctor/report.md` at runtime, or the plugin source
|
|
128
|
-
`skills/doctor/report.md` during development).
|
|
129
|
-
|
|
130
|
-
Group checks by category. For each category, list the checks with their
|
|
131
|
-
status icon and message. If a check has `details`, list them as sub-items.
|
|
132
|
-
|
|
133
|
-
Present the filled template to the user.
|
|
134
|
-
|
|
135
|
-
### Step 4: Offer fixes (if applicable)
|
|
136
|
-
|
|
137
|
-
If any checks have `fixable: true` AND status is not `pass`:
|
|
138
|
-
|
|
139
|
-
1. Group fixable items by category
|
|
140
|
-
2. Show what each fix would do (from `fix_hint`)
|
|
141
|
-
3. Ask the user: **"Fix all / Select individually / Skip"**
|
|
142
|
-
|
|
143
|
-
If no fixable issues exist, skip this step.
|
|
144
|
-
|
|
145
|
-
This "Fix all / Select individually / Skip" prompt IS the router the spec calls
|
|
146
|
-
`doctor --fix-all` (intent 197): doctor itself never mutates anything (see Step 5's table and
|
|
147
|
-
"Important Notes" below); "Fix all" means "dispatch every fixable finding to the maintenance
|
|
148
|
-
tool or skill that owns that class of repair," one row per fix_hint pattern.
|
|
149
|
-
|
|
150
|
-
### Step 5: Apply fixes
|
|
151
|
-
|
|
152
|
-
Use the `fix_hint` value to determine the correct action:
|
|
153
|
-
|
|
154
|
-
| Fix hint pattern | Agent action |
|
|
155
|
-
|---|---|
|
|
156
|
-
| "chmod +x on the listed files" | Run `chmod +x` on each file listed in `details` |
|
|
157
|
-
| "Create missing directory" | Run `mkdir -p` on the path |
|
|
158
|
-
| "Create INDEX.md with required sections" | Write INDEX.md with the 5 sections: Active, Future, Clusters, Abandoned, Completed |
|
|
159
|
-
| "Add missing entries to INDEX.md" | Add orphaned intents to the appropriate INDEX.md section |
|
|
160
|
-
| "Remove stale references from INDEX.md" | Edit INDEX.md to remove ghost references |
|
|
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>` (see Provisioning a project store below) to create the missing store |
|
|
163
|
-
| "Re-run installer" | Run `npx -y @zalom/plastic@<channel> install --claude` (or `--codex`/`--hermes`/`--all` for that agent; channel: -alpha->@alpha, -beta->@beta, else @latest) |
|
|
164
|
-
| "Run the Plastic installer to bootstrap the store" | Run `npx -y @zalom/plastic@<channel> install --claude` (or `--codex`/`--hermes`/`--all`; channel: -alpha->@alpha, -beta->@beta, else @latest) to restore the global store's plastic_home directory or INDEX.md |
|
|
165
|
-
| "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 |
|
|
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) |
|
|
170
|
-
|
|
171
|
-
For fixes the agent cannot handle automatically, explain what the user needs
|
|
172
|
-
to do manually. The `revisions.md` remedy is curator-applied (a move-and-record
|
|
173
|
-
relocation, not a mechanical edit) and stays human-gated by the Step 4
|
|
174
|
-
Fix / Select / Skip prompt.
|
|
175
|
-
|
|
176
|
-
Read `../plastic-conventions/references/maintenance-and-revisions.md` for WORK versus
|
|
177
|
-
MAINTENANCE, the `revisions.md` move-and-record contract, and the violation-tag catalog behind
|
|
178
|
-
the `revisions.md` remedy above.
|
|
179
|
-
|
|
180
|
-
### Step 6: Verify
|
|
181
|
-
|
|
182
|
-
After applying fixes, re-run the diagnostic script:
|
|
183
|
-
|
|
184
|
-
```bash
|
|
185
|
-
ruby ~/.plastic/scripts/doctor.rb --agent claude
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
Show the updated results.
|
|
189
|
-
|
|
190
|
-
- If all checks pass: announce success.
|
|
191
|
-
- If issues remain: explain what is still wrong and what the user can do.
|
|
192
|
-
|
|
193
|
-
## Post-Update Mode
|
|
194
|
-
|
|
195
|
-
When invoked from `plastic-update` (not directly by the user):
|
|
196
|
-
|
|
197
|
-
1. Run the diagnostic script as in Step 1.
|
|
198
|
-
2. If all checks pass, show a single line: **"Health check: all clear."**
|
|
199
|
-
3. If issues are found: show the full report (Steps 3-6).
|
|
200
|
-
|
|
201
|
-
This keeps the update flow clean when nothing is wrong.
|
|
202
|
-
|
|
203
|
-
## Important Notes
|
|
204
|
-
|
|
205
|
-
- The script is **read-only**. It inspects but never modifies files.
|
|
206
|
-
All fixes are performed by the agent using standard tools.
|
|
207
|
-
- The script outputs JSON to stdout. Any diagnostic errors go to stderr.
|
|
208
|
-
- Non-zero exit codes mean "issues found", not "script crashed".
|
|
209
|
-
Always parse stdout regardless of exit code.
|
|
210
|
-
|
|
211
|
-
## Doctor-Exclusions: Known-Exempt Findings
|
|
212
|
-
|
|
213
|
-
Some `savepoint_operational` findings can never legitimately close (a terminal intent with no
|
|
214
|
-
real `outcome.md` has no disposition to echo, and doctor never invents one), so each store
|
|
215
|
-
carries a `doctor-exclusions` file, sibling to that store's `INDEX.md`, recording
|
|
216
|
-
knowingly-exempt `(intent_id, rule)` pairs. Format: one `rule_name id id id` line per rule,
|
|
217
|
-
blank lines and `#` comments ignored. v1 honors exactly one rule, `savepoint_operational`.
|
|
218
|
-
|
|
219
|
-
**Reading the count.** When any exclusion applies, the `savepoint_operational` check's message
|
|
220
|
-
folds in the count and the file's path, e.g. `"... (3 excluded via ~/.plastic/doctor-exclusions)"`.
|
|
221
|
-
A malformed line in the file forces the check to `warn` with the parse error in `details`, even
|
|
222
|
-
when zero real gaps remain, so a broken file is never silently permissive.
|
|
223
|
-
|
|
224
|
-
**Both surfaces, one line.** A registration is honored by the store-wide `savepoint_operational`
|
|
225
|
-
check and by the per-intent `doctor.rb --intent <id>` run, which reports the same missing
|
|
226
|
-
`savepoint.md` under the check name `intent_savepoint_truthful`. Register the id once. The
|
|
227
|
-
per-intent run honors it only for an intent that is terminal in `INDEX.md`, and never suppresses
|
|
228
|
-
a phantom-savepoint-line finding.
|
|
229
|
-
|
|
230
|
-
**Hand-editing.** The file is plain text; add a line (or append ids to an existing rule line) and
|
|
231
|
-
save. No installer step, no reindex, and no `revisions.md` entry is required or written.
|
|
232
|
-
|
|
233
|
-
**Populating it in bulk.** Run the maintenance tool, dry-run first:
|
|
234
|
-
|
|
235
|
-
```bash
|
|
236
|
-
ruby ~/.plastic/scripts/maintenance-run --tool register-exclusions
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
This computes every current `savepoint_operational` violation across all stores (or one store
|
|
240
|
-
via `--store <key>`), through doctor's own finding function, and prints what it would register
|
|
241
|
-
without writing anything. Review the output, then re-run with `--apply` to write the file(s) and
|
|
242
|
-
land one scoped git commit. It unions with any existing hand-added ids (never drops one) and
|
|
243
|
-
skips, rather than aborts on, any intent dir holding a fresh delivery lock.
|
|
244
|
-
|
|
245
|
-
**Dead-row notice.** A registered row can go dead (gap repaired, id mistyped, or the intent
|
|
246
|
-
directory gone). When any row is dead, the message adds a second suffix next to the exclusion
|
|
247
|
-
count naming the count, the file, and the prune command - purely informational, status and exit
|
|
248
|
-
code unchanged. Prune it the same way, dry-run first: register-exclusions --prune [--apply]. It
|
|
249
|
-
removes exactly the dead rows through the same writer and commit, but holds back an id whose
|
|
250
|
-
intent dir carries a fresh lock or has not gone terminal yet (nothing to suppress there yet),
|
|
251
|
-
naming both as kept.
|
|
252
|
-
|
|
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
|
-
```
|
|
295
|
-
|
|
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
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
# Plastic Doctor Report
|
|
2
|
-
|
|
3
|
-
<!-- =======================================================================
|
|
4
|
-
AGENT INSTRUCTIONS -- How to fill this template
|
|
5
|
-
=========================================================================
|
|
6
|
-
1. Run the doctor script. It outputs JSON with check results.
|
|
7
|
-
2. Replace every {{placeholder}} below with the corresponding JSON value.
|
|
8
|
-
3. For the category sections: the template shows ONE example section.
|
|
9
|
-
Repeat that pattern for each unique category in the checks array.
|
|
10
|
-
The scope determines which categories appear:
|
|
11
|
-
--core scope: agent_registration, core_files (binary pass/error only)
|
|
12
|
-
--store scope: global_store, conventions, project_stores
|
|
13
|
-
full (no flag): all six categories below
|
|
14
|
-
The six known categories and their display names are:
|
|
15
|
-
global_store -> "Global Store"
|
|
16
|
-
conventions -> "Conventions"
|
|
17
|
-
agent_registration -> "Agent Registration"
|
|
18
|
-
core_files -> "Core Files"
|
|
19
|
-
project_stores -> "Project Stores"
|
|
20
|
-
deprecations -> "Deprecations"
|
|
21
|
-
done_signals -> "Done Signals"
|
|
22
|
-
session_ledger -> "Session Ledger" (global store only)
|
|
23
|
-
4. For each check within a category, emit one line with the status icon
|
|
24
|
-
and the check message. If the check has non-empty details, list them
|
|
25
|
-
as indented sub-items.
|
|
26
|
-
5. The "Fixable Issues" section should ONLY appear if at least one check
|
|
27
|
-
has fixable=true AND status is not "pass". Omit the entire section
|
|
28
|
-
otherwise.
|
|
29
|
-
6. Status icons (plain text, no emoji):
|
|
30
|
-
pass -> [PASS]
|
|
31
|
-
warn -> [WARN]
|
|
32
|
-
fail -> [FAIL]
|
|
33
|
-
7. The overall status icon in the header uses the same mapping.
|
|
34
|
-
8. After filling, remove all HTML comments -- they are instructions only.
|
|
35
|
-
======================================================================= -->
|
|
36
|
-
|
|
37
|
-
## {{overall_status_icon}} Overall: {{status}} -- Plastic v{{version}}
|
|
38
|
-
|
|
39
|
-
Checked at: {{timestamp}}
|
|
40
|
-
|
|
41
|
-
### Summary
|
|
42
|
-
|
|
43
|
-
{{pass}} passed, {{warn}} warnings, {{fail}} failed -- {{total}} checks total
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
<!-- =====================================================================
|
|
48
|
-
CATEGORY SECTIONS
|
|
49
|
-
======================================================================
|
|
50
|
-
Repeat the block below ONCE PER CATEGORY present in the checks array.
|
|
51
|
-
Group checks by their "category" field. Use the display name mapping
|
|
52
|
-
above for the heading. Within each category, list every check as a
|
|
53
|
-
single line: status icon + message. If a check has non-empty "details",
|
|
54
|
-
list each detail as an indented bullet beneath.
|
|
55
|
-
|
|
56
|
-
Example category section (for agent_registration with two checks):
|
|
57
|
-
===================================================================== -->
|
|
58
|
-
|
|
59
|
-
### Agent Registration
|
|
60
|
-
|
|
61
|
-
- [PASS] Claude Code adapter registered
|
|
62
|
-
- [FAIL] 2 hook scripts not executable
|
|
63
|
-
- ~/.claude/hooks/plastic-session-start
|
|
64
|
-
- ~/.claude/hooks/plastic-record
|
|
65
|
-
|
|
66
|
-
<!-- =====================================================================
|
|
67
|
-
Repeat the above pattern for each category found in the checks array.
|
|
68
|
-
Only include categories that have at least one check.
|
|
69
|
-
Order categories as they appear in the checks array.
|
|
70
|
-
===================================================================== -->
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
<!-- =====================================================================
|
|
75
|
-
FIXABLE ISSUES SECTION
|
|
76
|
-
======================================================================
|
|
77
|
-
Include this section ONLY if one or more checks have fixable=true AND
|
|
78
|
-
status is "warn" or "fail". If no fixable issues exist, omit everything
|
|
79
|
-
from the "Fixable Issues" heading through the end of the horizontal
|
|
80
|
-
rule that follows the table.
|
|
81
|
-
|
|
82
|
-
For each fixable check that is not "pass", emit one table row:
|
|
83
|
-
| status_icon | check_message | fix_hint |
|
|
84
|
-
===================================================================== -->
|
|
85
|
-
|
|
86
|
-
### Fixable Issues
|
|
87
|
-
|
|
88
|
-
| Status | Issue | Fix |
|
|
89
|
-
|--------|-------|-----|
|
|
90
|
-
| [FAIL] | 2 hook scripts not executable | chmod +x on the listed files |
|
|
91
|
-
|
|
92
|
-
<!-- =====================================================================
|
|
93
|
-
Repeat one row per fixable non-pass check.
|
|
94
|
-
===================================================================== -->
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
<!-- =====================================================================
|
|
99
|
-
FOOTER -- always include this line exactly as written.
|
|
100
|
-
===================================================================== -->
|
|
101
|
-
|
|
102
|
-
Doctor only reports; it never fixes anything itself. Ask me to fix these issues and I will offer Fix all / Select individually / Skip, then route each chosen repair through the tool that owns it.
|