@zalom/plastic 2.0.0-alpha.8 → 2.0.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 +13 -136
- package/README.md +357 -133
- package/agents/plastic-enforcer.md +20 -15
- 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 +6 -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/{skills/conventions/references → docs/help}/completion-and-done.md +15 -16
- 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 +23 -13
- package/{skills/conventions/references → docs/help}/maintenance-and-revisions.md +1 -1
- package/{skills/conventions/references → docs/help}/roadmaps.md +2 -2
- 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 +62 -1
- 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 +238 -22
- 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 +19 -5
- 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 +48 -83
- 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 +99 -0
- package/scripts/lib/cli/commands/auto_report.rb +50 -0
- package/scripts/lib/cli/commands/auto_take.rb +31 -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 +53 -0
- package/scripts/lib/cli/commands/intent_end.rb +62 -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 +71 -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 +42 -0
- package/scripts/lib/cli/commands/project_list.rb +20 -0
- package/scripts/lib/cli/commands/project_new.rb +72 -0
- package/scripts/lib/cli/commands/query.rb +31 -0
- package/scripts/lib/cli/commands/render.rb +33 -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 +70 -0
- package/scripts/lib/cli/commands/roadmap_show.rb +45 -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 +46 -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 +30 -16
- 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 +229 -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 +532 -71
- package/scripts/lib/intent_screen.rb +9 -6
- 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 +377 -173
- 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 +913 -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 +1460 -74
- 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 +158 -8
- 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 +525 -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 +555 -0
- 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 +25 -18
- 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/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 +42 -33
- 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 +192 -30
- package/scripts/roadmap-graph +119 -0
- package/scripts/roadmap-savepoint +7 -0
- 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 +25 -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 +15 -2
- 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 -295
- 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/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 -173
- 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,255 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"skill_name": "plastic-auto",
|
|
3
|
-
"notes": "Intent 27. Scopes: description triggering (1-8) and behavior/output quality (9). Assertions written after observing Step-3 runs (one clean subagent router per case). Intent 63 added cases 10-11 (auto-mode enforcer-led team spin-up and solo fallback).",
|
|
4
|
-
"results": {
|
|
5
|
-
"triggering": {
|
|
6
|
-
"cases": 8,
|
|
7
|
-
"passed": 8,
|
|
8
|
-
"pass_at_1": 1.0,
|
|
9
|
-
"run": "2026-06-10, one subagent per case"
|
|
10
|
-
},
|
|
11
|
-
"behavior": {
|
|
12
|
-
"cases": 1,
|
|
13
|
-
"passed": 1,
|
|
14
|
-
"evidence": "dogfood: intent 27 itself delivered via auto produced spec->plan->checklist before any code edit; code-gate unit test proves pre-How project-code edits are blocked"
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
"evals": [
|
|
18
|
-
{
|
|
19
|
-
"id": 1,
|
|
20
|
-
"scope": "triggering",
|
|
21
|
-
"set": "train",
|
|
22
|
-
"prompt": "auto",
|
|
23
|
-
"expected_output": "Activates plastic-auto (the bare 'auto' keyword is the documented trigger).",
|
|
24
|
-
"files": [],
|
|
25
|
-
"assertions": [
|
|
26
|
-
{
|
|
27
|
-
"type": "code",
|
|
28
|
-
"check": "router CHOICE == plastic-auto",
|
|
29
|
-
"observed": "plastic-auto",
|
|
30
|
-
"result": "pass"
|
|
31
|
-
}
|
|
32
|
-
]
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
"id": 2,
|
|
36
|
-
"scope": "triggering",
|
|
37
|
-
"set": "train",
|
|
38
|
-
"prompt": "take it from here and deliver intent 27 end to end",
|
|
39
|
-
"expected_output": "Activates plastic-auto (autonomous delivery of an active intent).",
|
|
40
|
-
"files": [],
|
|
41
|
-
"assertions": [
|
|
42
|
-
{
|
|
43
|
-
"type": "code",
|
|
44
|
-
"check": "router CHOICE == plastic-auto",
|
|
45
|
-
"observed": "plastic-auto",
|
|
46
|
-
"result": "pass"
|
|
47
|
-
}
|
|
48
|
-
]
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
"id": 3,
|
|
52
|
-
"scope": "triggering",
|
|
53
|
-
"set": "validation",
|
|
54
|
-
"prompt": "go fully autonomous on the active intent, don't ask me questions",
|
|
55
|
-
"expected_output": "Activates plastic-auto.",
|
|
56
|
-
"files": [],
|
|
57
|
-
"assertions": [
|
|
58
|
-
{
|
|
59
|
-
"type": "code",
|
|
60
|
-
"check": "router CHOICE == plastic-auto",
|
|
61
|
-
"observed": "plastic-auto",
|
|
62
|
-
"result": "pass"
|
|
63
|
-
}
|
|
64
|
-
]
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
"id": 4,
|
|
68
|
-
"scope": "triggering",
|
|
69
|
-
"set": "train",
|
|
70
|
-
"prompt": "deliver this intent for me",
|
|
71
|
-
"expected_output": "Activates plastic-auto.",
|
|
72
|
-
"files": [],
|
|
73
|
-
"assertions": [
|
|
74
|
-
{
|
|
75
|
-
"type": "code",
|
|
76
|
-
"check": "router CHOICE == plastic-auto",
|
|
77
|
-
"observed": "plastic-auto",
|
|
78
|
-
"result": "pass"
|
|
79
|
-
}
|
|
80
|
-
]
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
"id": 5,
|
|
84
|
-
"scope": "triggering",
|
|
85
|
-
"set": "train",
|
|
86
|
-
"prompt": "set up a hook to automatically format the file on every save",
|
|
87
|
-
"expected_output": "Does NOT activate plastic-auto. Near-miss: shares 'auto*' but is a settings/hooks task (update-config).",
|
|
88
|
-
"files": [],
|
|
89
|
-
"assertions": [
|
|
90
|
-
{
|
|
91
|
-
"type": "code",
|
|
92
|
-
"check": "router CHOICE != plastic-auto",
|
|
93
|
-
"observed": "update-config",
|
|
94
|
-
"result": "pass"
|
|
95
|
-
}
|
|
96
|
-
]
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
"id": 6,
|
|
100
|
-
"scope": "triggering",
|
|
101
|
-
"set": "validation",
|
|
102
|
-
"prompt": "deliver the built package to the dist directory",
|
|
103
|
-
"expected_output": "Does NOT activate plastic-auto. Near-miss: shares 'deliver' but is a build/file task.",
|
|
104
|
-
"files": [],
|
|
105
|
-
"assertions": [
|
|
106
|
-
{
|
|
107
|
-
"type": "code",
|
|
108
|
-
"check": "router CHOICE != plastic-auto",
|
|
109
|
-
"observed": "none",
|
|
110
|
-
"result": "pass"
|
|
111
|
-
}
|
|
112
|
-
]
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
"id": 7,
|
|
116
|
-
"scope": "triggering",
|
|
117
|
-
"set": "train",
|
|
118
|
-
"prompt": "create a new intent for the dashboard idea",
|
|
119
|
-
"expected_output": "Does NOT activate plastic-auto; activates plastic-intent-creating.",
|
|
120
|
-
"files": [],
|
|
121
|
-
"assertions": [
|
|
122
|
-
{
|
|
123
|
-
"type": "code",
|
|
124
|
-
"check": "router CHOICE != plastic-auto",
|
|
125
|
-
"observed": "plastic-intent-creating",
|
|
126
|
-
"result": "pass"
|
|
127
|
-
}
|
|
128
|
-
]
|
|
129
|
-
},
|
|
130
|
-
{
|
|
131
|
-
"id": 8,
|
|
132
|
-
"scope": "triggering",
|
|
133
|
-
"set": "validation",
|
|
134
|
-
"prompt": "what's the status of my active intents?",
|
|
135
|
-
"expected_output": "Does NOT activate plastic-auto; this is a read/intent-continuing query.",
|
|
136
|
-
"files": [],
|
|
137
|
-
"assertions": [
|
|
138
|
-
{
|
|
139
|
-
"type": "code",
|
|
140
|
-
"check": "router CHOICE != plastic-auto",
|
|
141
|
-
"observed": "plastic-intent-continuing",
|
|
142
|
-
"result": "pass"
|
|
143
|
-
}
|
|
144
|
-
]
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
"id": 9,
|
|
148
|
-
"scope": "behavior",
|
|
149
|
-
"set": "train",
|
|
150
|
-
"prompt": "Active intent X exists with only a '## Intent' section. Deliver it in auto mode.",
|
|
151
|
-
"expected_output": "Arms the lifecycle gate first, then produces spec.md (Why), then plan.md + actions/ + checklist.md (How), and edits NO project code before plan.md + checklist.md exist. Disarms on completion.",
|
|
152
|
-
"files": [],
|
|
153
|
-
"assertions": [
|
|
154
|
-
{
|
|
155
|
-
"type": "human",
|
|
156
|
-
"check": "spec.md written before plan.md before any project-code edit",
|
|
157
|
-
"observed": "dogfood run of intent 27 followed this order",
|
|
158
|
-
"result": "pass"
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
"type": "code",
|
|
162
|
-
"check": "code-gate blocks project-code Edit/Write while pre-How (test/code_gate_test.rb)",
|
|
163
|
-
"observed": "test green",
|
|
164
|
-
"result": "pass"
|
|
165
|
-
}
|
|
166
|
-
]
|
|
167
|
-
},
|
|
168
|
-
{
|
|
169
|
-
"id": 10,
|
|
170
|
-
"scope": "behavior",
|
|
171
|
-
"set": "train",
|
|
172
|
-
"prompt": "Active intent X exists. Deliver it in auto mode on a harness that supports subagents.",
|
|
173
|
-
"expected_output": "Spins up one enforcer-led team per intent (plastic-enforcer, executor, an on-request reviewer). The enforcer IS the orchestrator: it writes spec.md, the action files, and checklist.md itself, dispatches one executor for the consolidated action on one branch, and dispatches an independent reviewer subagent at the final gate only.",
|
|
174
|
-
"files": [],
|
|
175
|
-
"assertions": [
|
|
176
|
-
{
|
|
177
|
-
"type": "human",
|
|
178
|
-
"check": "enforcer writes Why and How itself; one executor dispatched; independent reviewer only at final gate",
|
|
179
|
-
"observed": "dogfood: intents 60-62 delivered by exactly this enforcer-led team on a shared branch",
|
|
180
|
-
"result": "pass"
|
|
181
|
-
},
|
|
182
|
-
{
|
|
183
|
-
"type": "code",
|
|
184
|
-
"check": "agents/plastic-*.md role files ship and install into the harness agent dir, manifest-tracked (test/install_packaging_test.rb)",
|
|
185
|
-
"observed": "test green",
|
|
186
|
-
"result": "pass"
|
|
187
|
-
}
|
|
188
|
-
]
|
|
189
|
-
},
|
|
190
|
-
{
|
|
191
|
-
"id": 11,
|
|
192
|
-
"scope": "behavior",
|
|
193
|
-
"set": "validation",
|
|
194
|
-
"prompt": "Active intent X exists. Deliver it in auto mode on a harness with no subagent dispatch.",
|
|
195
|
-
"expected_output": "Falls back to a single agent walking the full What, Why, How, Exec cycle itself, preserving current behavior. The enforcer gate discipline still applies (arm the gate first, no project-code edits before plan.md + checklist.md exist).",
|
|
196
|
-
"files": [],
|
|
197
|
-
"assertions": [
|
|
198
|
-
{
|
|
199
|
-
"type": "human",
|
|
200
|
-
"check": "solo agent walks the full cycle when subagent dispatch is unavailable; gate discipline preserved",
|
|
201
|
-
"observed": "SKILL.md Team Spin-Up documents the solo fallback explicitly",
|
|
202
|
-
"result": "pass"
|
|
203
|
-
}
|
|
204
|
-
]
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
"id": 12,
|
|
208
|
-
"scope": "behavior",
|
|
209
|
-
"set": "validation",
|
|
210
|
-
"prompt": "A power-tool is present (qmd on PATH, or a .serena marker / serena on PATH). A substantive prompt arrives in auto mode.",
|
|
211
|
-
"expected_output": "The agent prefers the present tool because PLASTIC.md (loaded at session start) recommends QMD for intents and Enola, or Serena when Enola is absent, for code navigation. No hook appends a per-prompt line: the power-tools hook was removed in 2.0 (intent 309).",
|
|
212
|
-
"files": [],
|
|
213
|
-
"assertions": [
|
|
214
|
-
{
|
|
215
|
-
"type": "code",
|
|
216
|
-
"check": "PLASTIC.md carries the recommendation (doctrine_305_test) and PowerTools presence probes still back doctor's readiness checks (power_tools_test.rb)",
|
|
217
|
-
"observed": "doctrine_305_test test_plastic_md_carries_the_power_tools_mandate_as_a_recommendation; power_tools_test.rb presence probes",
|
|
218
|
-
"result": "pass"
|
|
219
|
-
}
|
|
220
|
-
]
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
"id": 13,
|
|
224
|
-
"scope": "behavior",
|
|
225
|
-
"set": "validation",
|
|
226
|
-
"prompt": "Neither qmd nor serena is present (no qmd on PATH, no .serena marker, no serena on PATH). A substantive prompt arrives.",
|
|
227
|
-
"expected_output": "Detect-then-degrade: PLASTIC.md's recommendation applies only when a tool is present, so nothing is required to install and no per-prompt line appears (there is no hook to emit one since intent 309).",
|
|
228
|
-
"files": [],
|
|
229
|
-
"assertions": [
|
|
230
|
-
{
|
|
231
|
-
"type": "code",
|
|
232
|
-
"check": "PowerTools.mandate returns nil when neither tool is present",
|
|
233
|
-
"observed": "power_tools_test.rb test_mandate_neither_is_nil",
|
|
234
|
-
"result": "pass"
|
|
235
|
-
}
|
|
236
|
-
]
|
|
237
|
-
},
|
|
238
|
-
{
|
|
239
|
-
"id": 14,
|
|
240
|
-
"scope": "behavior",
|
|
241
|
-
"set": "validation",
|
|
242
|
-
"prompt": "QMD is present. In auto mode the user says: deliver the work on the uploader retry policy (no intent id given).",
|
|
243
|
-
"expected_output": "Before scanning the store with grep/Read to find the matching intent, runs `ruby ~/.plastic/scripts/qmd-sync search \"uploader retry policy\"` to surface the candidate intent, then opens the authoritative intent file for the hit it takes over. This discovery step is distinct from the completion-time reindex step. No-op fallback to INDEX.md / file scan when QMD is absent.",
|
|
244
|
-
"files": [],
|
|
245
|
-
"assertions": [
|
|
246
|
-
{
|
|
247
|
-
"type": "human",
|
|
248
|
-
"check": "qmd-sync search is run before grep/Read during discovery; authoritative file opened for the hit; reindex step stays separate",
|
|
249
|
-
"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",
|
|
250
|
-
"result": "pass"
|
|
251
|
-
}
|
|
252
|
-
]
|
|
253
|
-
}
|
|
254
|
-
]
|
|
255
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# End-Tail Mechanics: Arm.disarm and the Ordering
|
|
2
|
-
|
|
3
|
-
Deep mechanics behind two spots in `SKILL.md`: how `plastic-lock arm` resolves a session id
|
|
4
|
-
when it takes an intent, and why the End-tail steps in Completion (release the worktree, clear
|
|
5
|
-
the lock, reset the pointer, reindex) run in that exact order. The `/tmp` bridge JSON these
|
|
6
|
-
steps once also purged was removed in 2.0 (intent 307); `scripts/lib/arm.rb` is what remains.
|
|
7
|
-
|
|
8
|
-
## Table of Contents
|
|
9
|
-
|
|
10
|
-
- [Session resolution](#session-resolution)
|
|
11
|
-
- [Disarm ordering and worktree cleanup rationale](#disarm-ordering-and-worktree-cleanup-rationale)
|
|
12
|
-
- [QMD reindex ordering rationale](#qmd-reindex-ordering-rationale)
|
|
13
|
-
|
|
14
|
-
## Session resolution
|
|
15
|
-
|
|
16
|
-
`Arm.resolve_session` picks the first non-empty of: the explicit id (`--session`, or the hook
|
|
17
|
-
stdin `session_id` when a caller has it), the `CLAUDE_CODE_SESSION_ID` the CLI read, then a
|
|
18
|
-
deterministic derived key (a hash of the store and the intent id). It never returns nil, so
|
|
19
|
-
the arm verb works even when every session variable is empty; a session-less arm and a later
|
|
20
|
-
session-less close resolve to the same key.
|
|
21
|
-
|
|
22
|
-
Arming acquires the durable `delivery.lock` in the intent dir, keyed by that resolved session
|
|
23
|
-
and stamped with `run_mode`. Ownership is session-keyed, not process-keyed, so the arm command
|
|
24
|
-
exiting is fine by construction: the lock stays yours for every later tool call in this
|
|
25
|
-
session, and the record hook refreshes its lease on every write you make. The same call writes
|
|
26
|
-
the intent id into the session pointer (`~/.plastic/store/.tmp/<session>/current`), which is
|
|
27
|
-
why the capture and record hooks stop treating your prompts as day-ledger items for the rest
|
|
28
|
-
of the delivery.
|
|
29
|
-
|
|
30
|
-
## Disarm ordering and worktree cleanup rationale
|
|
31
|
-
|
|
32
|
-
`Arm.disarm` runs the ordered End tail: it releases the worktree first, then clears the
|
|
33
|
-
intent's `delivery.lock` as its recorded owner, and only then resets the session pointer to
|
|
34
|
-
today's day id (when it still names this intent). The worktree goes first so a released lock
|
|
35
|
-
never points at a checkout another session could claim; the pointer goes last so the record
|
|
36
|
-
hook keeps heartbeating the lock until the lock is gone.
|
|
37
|
-
|
|
38
|
-
**Mechanized since intent 188.** `scripts/end-intent` performs this disarm itself, as its own
|
|
39
|
-
step 5, after steps 1-4 (outcome/INDEX/savepoint/commit) commit. A pre-flight lock guard
|
|
40
|
-
refuses on a live foreign session (exit 4) and reclaims a stale foreign lock automatically
|
|
41
|
-
(audited to savepoint.md); a dirty code worktree refuses before removal (exit 5,
|
|
42
|
-
`--discard-worktree-changes` overrides deliberately); and the durable lock file is checked
|
|
43
|
-
again after disarm, never merely trusted (exit 3 if it is somehow still present).
|
|
44
|
-
|
|
45
|
-
**Worktree cleanup (mandatory, intent 73c3).** `end-intent`'s step 5 calls `Arm.disarm` by
|
|
46
|
-
default, which calls `Worktree.release` on the block `Arm.worktree_block` derives from
|
|
47
|
-
`projects.yml` and the intent id, removing the intent's code worktree under
|
|
48
|
-
`<repo>/.claude/worktrees/{id}--{slug}` and pruning the repo. This is the plain remove path:
|
|
49
|
-
the disarm route does NOT merge, so use it only when no release merges the branch (the branch
|
|
50
|
-
survives and can be reclaimed).
|
|
51
|
-
|
|
52
|
-
When the work is being shipped through a release, do NOT rely on this plain remove.
|
|
53
|
-
`skills/releasing/SKILL.md` runs its worktree-merge step BEFORE its `end-intent` call, merging
|
|
54
|
-
the intent's code branch (`plastic/{id}--{slug}`) back to the repo's default branch BEFORE
|
|
55
|
-
the worktree is removed, via `Worktree.finish(Arm.bridge_hash(intent_dir: ...), merge: true)`
|
|
56
|
-
(merge-then-remove), so the integrated work is not lost. By the time `end-intent`'s own step 5
|
|
57
|
-
runs afterward, the worktree is already gone (a harmless no-op) and only the delivery lock and
|
|
58
|
-
the pointer are left to clear. Never leave an orphaned worktree, and run `git worktree prune`
|
|
59
|
-
if you hit a stale reference.
|
|
60
|
-
|
|
61
|
-
## QMD reindex ordering rationale
|
|
62
|
-
|
|
63
|
-
Completion is the lifecycle event that keeps the search index fresh. `<store-root>` is the
|
|
64
|
-
store that holds this intent (the global store or the project store). The reindex is the LAST
|
|
65
|
-
End-tail step, run after the disarm, so the index never references a lock that is about to
|
|
66
|
-
disappear.
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# Human Report Contract (the three report screens, intent 317)
|
|
2
|
-
|
|
3
|
-
D15: the prose EM-to-CTO briefing this doc used to define is retired. The orchestrator now
|
|
4
|
-
prints one of three report screens, filled from the record by `scripts/report-screen`, never
|
|
5
|
-
written by eye:
|
|
6
|
-
|
|
7
|
-
- **`report-screen state <intent_dir> [--changed "<text>"]`** - the mid-delivery report. One
|
|
8
|
-
intent's field table (Store, Status, Stage, Savepoint, Progress, Next, Insight) plus a
|
|
9
|
-
`Changed` row naming what caused the print, and its Steps table.
|
|
10
|
-
- **`report-screen state --all <store_root>`** - the roster across every in-delivery intent,
|
|
11
|
-
most recently changed first, then one collapsed block (Stage, Next, Changed, first three
|
|
12
|
-
open steps) per intent.
|
|
13
|
-
- **`report-screen delivered <intent_dir>`** - the post-delivery report, printed once at close:
|
|
14
|
-
Asked, Delivered (with a Proven-by column), Evidence, Needs you.
|
|
15
|
-
- **`report-screen delay <intent_dir>`** - printed only on request ("why did X take so long"):
|
|
16
|
-
the delivery as a timeline plus the derived `Where the time went` line.
|
|
17
|
-
|
|
18
|
-
## The five triggers for `state`
|
|
19
|
-
|
|
20
|
-
Print `state` (one intent, or `--all` for the roster) on any of these; a checklist tick alone,
|
|
21
|
-
an executor's intermediate commit, or an agent going idle is NOT one of them:
|
|
22
|
-
|
|
23
|
-
| Trigger | Scope |
|
|
24
|
-
|---|---|
|
|
25
|
-
| A savepoint line lands (a stage boundary: Why, How, Exec started, outcome written, Done) | that intent |
|
|
26
|
-
| A review verdict returns (plan review or post-execution review), naming what it changed | that intent |
|
|
27
|
-
| A blocker or needs-input is logged | that intent |
|
|
28
|
-
| A merge or a release lands | that intent |
|
|
29
|
-
| The owner asks ("where are we", "state of X", "continue X") | all in delivery, or the one named |
|
|
30
|
-
|
|
31
|
-
`delivered` prints exactly once, at Completion. `delay` prints only when the owner asks why a
|
|
32
|
-
delivery took long.
|
|
33
|
-
|
|
34
|
-
Every verb prints the same plain Markdown on every harness (owner ruling 2026-08-31); where a
|
|
35
|
-
harness can paint it (Claude Code, through 316a's message-display hook), it substitutes a
|
|
36
|
-
painted rendering of that same output, never a different one, and no skill or script branches
|
|
37
|
-
on harness name to decide.
|
|
38
|
-
|
|
39
|
-
## Depth for small work
|
|
40
|
-
|
|
41
|
-
For small work in auto mode, only the How-boundary `state` screen prints mid-flight (its
|
|
42
|
-
`Changed` row names what the What and Why steps did, since there is no separate briefing per
|
|
43
|
-
stage any more). Larger work prints `state` at every trigger in the table above. This is a
|
|
44
|
-
depth cut, not a different report: the screen's shape never changes, only how often it fires.
|
|
45
|
-
A delivery still ends with `outcome.md` plus one `delivered` screen.
|
|
46
|
-
|
|
47
|
-
## One report per audience
|
|
48
|
-
|
|
49
|
-
A delivery produces exactly two artifacts: `outcome.md` (authored by `plastic-intent-ending`)
|
|
50
|
-
and one `delivered` screen at the End stage. No stage or skill restates a delivery already
|
|
51
|
-
written to `outcome.md`; point at it instead. Skills do not open with a banner that names the
|
|
52
|
-
skill or restates the intent id and name the owner just typed. Announce only what the reader
|
|
53
|
-
cannot already know: an error, a result, a choice with its reason, or a handoff.
|
|
54
|
-
|
|
55
|
-
## Boundary vs intent 74
|
|
56
|
-
|
|
57
|
-
Intent 74's report contract (`references/agent-report-contract.md`) is the INTERNAL,
|
|
58
|
-
machine-checked handoff from a dispatched specialist back to the orchestrator: a structured
|
|
59
|
-
envelope plus a per-role payload. This contract is the OUTWARD screen shown to the owner.
|
|
60
|
-
Different direction, different audience, different form. The orchestrator reads the intent 74
|
|
61
|
-
report and reflects it into the record (savepoint, outcome.md) that `report-screen` then
|
|
62
|
-
renders. The two never merge.
|
|
63
|
-
|
|
64
|
-
## Brevity: point, don't repeat
|
|
65
|
-
|
|
66
|
-
Surface rules are owned by the `writing-style` skill. This contract does not restate them. Its
|
|
67
|
-
job is naming which screen prints when, not the wording inside it - `report-screen` derives
|
|
68
|
-
every cell from the record (D14), so there is no prose left to style here.
|
|
69
|
-
|
|
70
|
-
## Emission: guided vs auto
|
|
71
|
-
|
|
72
|
-
In guided mode, `state` prints at each stage boundary and the human decides before the next
|
|
73
|
-
stage starts.
|
|
74
|
-
|
|
75
|
-
In auto mode, `state` prints at every trigger for larger work; for small work only the How
|
|
76
|
-
boundary prints (see `## Depth for small work` above). The orchestrator takes the go-ahead
|
|
77
|
-
itself and moves on, except at the existing hard stops (destructive action without a safe
|
|
78
|
-
alternative, project-path confirm).
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: plastic-conventions
|
|
3
|
-
description: >
|
|
4
|
-
Chapters of Plastic doctrine used by more than one skill: the knowledge graph,
|
|
5
|
-
lifecycle and savepoints, locks and
|
|
6
|
-
worktrees, completion, maintenance, and roadmaps. Read a chapter when its trigger
|
|
7
|
-
applies to the work in front of you.
|
|
8
|
-
user-invocable: false
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# Plastic Conventions
|
|
12
|
-
|
|
13
|
-
The chapters below hold Plastic doctrine that more than one skill needs. Core always-on
|
|
14
|
-
conventions stay in `~/.plastic/PLASTIC.md`, which is injected at session start. Read a chapter
|
|
15
|
-
when the trigger in the second column applies to the work in front of you.
|
|
16
|
-
|
|
17
|
-
| Chapter | Read it when |
|
|
18
|
-
|---|---|
|
|
19
|
-
| `references/knowledge-graph.md` | when creating, linking, curating, or indexing intents and you need the sources-vs-chain doctrine, the tiers of influence, the `## Links` projection, or branch-vs-root directory semantics |
|
|
20
|
-
| `references/lifecycle-and-savepoints.md` | when running a lifecycle stage or a savepoint and you need the subagent report-home contract for how an insight reaches the intent |
|
|
21
|
-
| `references/locks-and-worktrees.md` | before taking or releasing a delivery lock, and when working with claims, worktrees, solo mode, or the station ledger |
|
|
22
|
-
| `references/completion-and-done.md` | when ending an intent, for what "intent done" means and the End-stage tail |
|
|
23
|
-
| `references/maintenance-and-revisions.md` | before any structural maintenance edit, for WORK vs MAINTENANCE, the `revisions.md` move-and-record contract, the violation-tag catalog, and the context-economy measurement buckets |
|
|
24
|
-
| `references/roadmaps.md` | when creating, ordering, closing, or consuming a roadmap, for the file format and the status-mirror rule |
|
|
25
|
-
|
|
26
|
-
Other skills read these chapters directly at
|
|
27
|
-
`../plastic-conventions/references/<chapter>.md`, resolved relative to their own installed
|
|
28
|
-
directory. All three harnesses install skills flat into one shared skills root through the same
|
|
29
|
-
`install_skills_flat` call, so that path is harness-independent.
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: plastic-dashboard
|
|
3
|
-
description: Use when the user wants an overview of intents, asks "where are we", "what's next", "what should I work on", "show the dashboard", or invokes /plastic-dashboard. Renders the intent store(s) as Markdown prose, the global board as a narrative of work done, each project board as a short summary plus its most-valuable next work, and emits a machine-readable queue that auto mode consumes.
|
|
4
|
-
user-invocable: false
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Dashboard — Plastic Work Cockpit
|
|
8
|
-
|
|
9
|
-
A deterministic overview of the intent store(s). It answers three questions at a glance:
|
|
10
|
-
**where we are** (recently worked), **where we go next** (the most-valuable next work), and
|
|
11
|
-
**how to conduct it** (a disposition per intent). The human-facing surface is **Markdown**,
|
|
12
|
-
because the user's UI renders Markdown natively but collapses raw tool-call stdout.
|
|
13
|
-
|
|
14
|
-
The script does all the data work. The agent fills a Markdown template from the script's
|
|
15
|
-
payload with near-zero reasoning and **presents the filled board in its reply**. Same store
|
|
16
|
-
state → byte-identical payload, regardless of model. Do NOT hand-summarize intents.
|
|
17
|
-
|
|
18
|
-
## When to Use
|
|
19
|
-
|
|
20
|
-
- User invokes `/plastic-dashboard`
|
|
21
|
-
- User asks "where are we", "what's next", "what should I work on", "show me the intents"
|
|
22
|
-
- `plastic-intent-continuing` lands on the board on a bare resume
|
|
23
|
-
- `plastic-auto` reads `--json` to choose the next dispatchable intent
|
|
24
|
-
|
|
25
|
-
## Procedure (the Markdown board — default human surface)
|
|
26
|
-
|
|
27
|
-
### Step 1 — Get the data payload
|
|
28
|
-
|
|
29
|
-
```bash
|
|
30
|
-
ruby ~/.plastic/scripts/dashboard.rb [continue|project <slug>] --data
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
- `continue` (default) → the **global** board payload (`mode: "global"`).
|
|
34
|
-
- `project <slug>` → that **project** board payload (`mode: "project"`).
|
|
35
|
-
|
|
36
|
-
The payload is read-only JSON. Global-board fields: `date`, `store_health`, `summary`,
|
|
37
|
-
`next_work`, `next_total`, `next_shown`, `counts`, `projects`, `project_totals`, `footer`.
|
|
38
|
-
Project-board fields: `slug`, `store_health`, `description`, `summary`, `counts`, `active`,
|
|
39
|
-
`active_total`, `active_shown`, `next_work`, `next_total`, `next_shown`, `footer`. `summary`
|
|
40
|
-
and `footer` are finished prose strings (2-3 sentences and one line respectively), built in
|
|
41
|
-
`dashboard.rb` and substituted verbatim, exactly like `{{date}}`/`{{description}}` already
|
|
42
|
-
are - never re-worded or re-derived by the skill. Each list carries cell-ready fields for
|
|
43
|
-
its table: `next_work` rows are
|
|
44
|
-
`{id, intent, scope, lifecycle, value, disposition, flags, what, flags_label, line}`;
|
|
45
|
-
`active` rows carry
|
|
46
|
-
`{id, intent, created, bullet, scope, what, stage, worker, activity, line}`. The `what`,
|
|
47
|
-
`scope`, `worker`, `activity`, and `flags_label` cell fields arrive pipe-escaped and
|
|
48
|
-
whitespace-normalized.
|
|
49
|
-
|
|
50
|
-
Each board load runs the scoped store check (`doctor --store <scope>`): the global board runs
|
|
51
|
-
`--store global` and a project board runs `--store <slug>`. The result rides in the payload as
|
|
52
|
-
`store_health` (`{scope, status, summary, failing_checks}`). Surface it as a one-line
|
|
53
|
-
store-health note on the board (for example `store health: pass (3/3)` or
|
|
54
|
-
`store health: warn (orphaned_intents)`). It is non-fatal: a warn or fail is shown as data and
|
|
55
|
-
never blocks the board.
|
|
56
|
-
|
|
57
|
-
### Step 2 — Fill the matching template
|
|
58
|
-
|
|
59
|
-
Templates live in this skill's `templates/` directory:
|
|
60
|
-
`~/.claude/skills/plastic-dashboard/templates/dashboard-global.md` and
|
|
61
|
-
`dashboard-project.md`.
|
|
62
|
-
|
|
63
|
-
Fill mechanically, no rewriting, no re-sorting:
|
|
64
|
-
- `{{a.b.count}}` → the integer (e.g. `counts.active` = that count).
|
|
65
|
-
- `{{<list>.rows}}` → the two intent lists (`active`, `next_work`) render as **Markdown table
|
|
66
|
-
rows**. The template hard-codes each table's header and separator; this placeholder becomes
|
|
67
|
-
one data row per list entry, joined with real newlines, in that table's fixed column order
|
|
68
|
-
(below). Drop each cell from the named payload field **verbatim**: cells arrive pre-escaped
|
|
69
|
-
and whitespace-normalized from the script (pipes escaped as `\|`), so never re-escape,
|
|
70
|
-
re-truncate, or reword them. Never emit `<br>`.
|
|
71
|
-
- `next_work` → `| {id} | {what} | {value} | {disposition} | {flags_label} |`
|
|
72
|
-
- `active` → `| {id} | {what} | {stage} | {worker} | {activity} |`
|
|
73
|
-
Empty list → one full-width row with `_(none)_` in the Id column and every other cell blank,
|
|
74
|
-
matching that table's column count (e.g. `| _(none)_ | | | | |` for the 5-column next_work
|
|
75
|
-
table, `| _(none)_ | | | |` for the 5-column active table). Neither list carries an overflow
|
|
76
|
-
"+N more" row anymore (D5, intent 202): the true pool size rides on the payload as
|
|
77
|
-
`active_total`/`next_total` (shown counts as `active_shown`/`next_shown`), and `{{footer}}`
|
|
78
|
-
states it in prose instead.
|
|
79
|
-
- `{{projects.lines}}` (global board only) → the project rollup stays **prose**, one line per
|
|
80
|
-
project (not a table):
|
|
81
|
-
`- **{slug}**: {description}, active {active}, done {done}, future {future}, last accessed {last_accessed_at[0,10]}`.
|
|
82
|
-
- Scalars (`{{date}}`, `{{slug}}`, `{{summary}}`, `{{footer}}`) → substitute verbatim. `summary`
|
|
83
|
-
and `footer` are finished prose built in `dashboard.rb`; do not rewrite, shorten, or
|
|
84
|
-
re-derive them from the counts - that is exactly the non-determinism D5 rules out.
|
|
85
|
-
|
|
86
|
-
### Paging (conversational, D4)
|
|
87
|
-
|
|
88
|
-
The board shows a short page by default (Active capped at 3, Next-work at 5). When the
|
|
89
|
-
user asks for "more" or "all", re-invoke Step 1 with an explicit flag and re-fill the
|
|
90
|
-
template with the new payload - nothing is persisted to disk, the offset lives only in the
|
|
91
|
-
chat turn:
|
|
92
|
-
- "all" → add `--all` (lifts both caps to unbounded; the footer then shows equal shown/total).
|
|
93
|
-
- "more" → add `--limit-active N`/`--limit-next N` with a larger `N` for whichever list the
|
|
94
|
-
user is paging.
|
|
95
|
-
|
|
96
|
-
For a real, own-terminal pager instead, point the owner at `--plain`:
|
|
97
|
-
`ruby ~/.plastic/scripts/dashboard.rb project <slug> --plain | less` (or `continue --plain`
|
|
98
|
-
for the global board). `--plain` prints the full, uncapped board as plain text with no
|
|
99
|
-
Markdown table syntax; it is a separate CLI mode from `--data`, not something this skill
|
|
100
|
-
fills a template from.
|
|
101
|
-
|
|
102
|
-
### Step 3 — Present it (mandatory, every invocation)
|
|
103
|
-
|
|
104
|
-
**Paste the filled Markdown into your reply.** This is non-optional: if the reply does not
|
|
105
|
-
contain the filled Markdown, the user sees nothing — tool-call stdout and hook
|
|
106
|
-
`additionalContext` are both invisible to them. Never describe the board instead of showing
|
|
107
|
-
it, and never assume a hook already showed it for you.
|
|
108
|
-
|
|
109
|
-
`hook-continue` also emits a one-line `systemMessage` summary (counts, and the next big thing
|
|
110
|
-
when there is one) as a hook-owned fallback, independent of the agent's reply. Treat that line
|
|
111
|
-
as a floor only, not a substitute for this step: it carries no matrix, no recently-worked
|
|
112
|
-
section, and no entry-flow prompt. Presenting the full board here remains mandatory regardless
|
|
113
|
-
of whether the summary line fired. This stays a soft, agent-followed mechanism — there is no
|
|
114
|
-
stronger enforcement for a full multi-section Markdown document in this harness today.
|
|
115
|
-
|
|
116
|
-
### Step 4 — Entry flow (the board is the menu)
|
|
117
|
-
|
|
118
|
-
QMD-first (when available): when the user navigates by describing an intent rather than giving its
|
|
119
|
-
id, before scanning the store with grep/Read run `ruby ~/.plastic/scripts/qmd-sync search "<terms>"`
|
|
120
|
-
to surface the candidate intent, then open the authoritative intent file for the hit. The command is
|
|
121
|
-
a no-op when QMD is absent, so fall back to the existing INDEX.md / file scan.
|
|
122
|
-
|
|
123
|
-
The board lists everything; the user navigates by free prose (no capped picker):
|
|
124
|
-
- On the **global** board, the user replies with an **intent id** (work it), a **project
|
|
125
|
-
name** (re-run `project <slug> --data` and present that board), or **"new"** (start a new
|
|
126
|
-
intent in global via `plastic-intent-creating`).
|
|
127
|
-
- On a **project** board, the user replies with an **intent id**, or **"global"** to return.
|
|
128
|
-
|
|
129
|
-
## Auto-mode contract (`--json`)
|
|
130
|
-
|
|
131
|
-
`plastic-auto` consumes a separate machine-readable manifest (unchanged):
|
|
132
|
-
|
|
133
|
-
```bash
|
|
134
|
-
ruby ~/.plastic/scripts/dashboard.rb [continue|project <slug>|all] --json
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
```json
|
|
138
|
-
{ "generated_for": "auto-mode", "scope": "<scope|all>",
|
|
139
|
-
"next_big_thing": "<id|null>",
|
|
140
|
-
"dispatchable_queue": [ {"id","scope","disposition","type","value","effort","flags","rank"} ],
|
|
141
|
-
"human_only": ["<id>", "..."] }
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
Work `dispatchable_queue` in `rank` order (`defer`/`research`); leave `human_only` for the user.
|
|
145
|
-
|
|
146
|
-
## Text modes (terminal / legacy)
|
|
147
|
-
|
|
148
|
-
`dashboard.rb [continue|project <slug>|all]` with no flag still prints the ASCII cockpit for
|
|
149
|
-
a raw terminal. The Markdown board (`--data` + template) is the surface for the chat UI.
|
|
150
|
-
|
|
151
|
-
## How classification works (deterministic)
|
|
152
|
-
|
|
153
|
-
The script computes Effort/Value/Flags/Override/Caps; the agent never re-derives them.
|
|
154
|
-
To explain or debug a ranking or disposition, read `references/classification.md`.
|
|
155
|
-
|
|
156
|
-
## Eval
|
|
157
|
-
|
|
158
|
-
The eval is the payload + golden snapshots: run the engine against the fixture store and
|
|
159
|
-
assert the `--data` payload shape/sorting/classification and the byte-identical `--json` +
|
|
160
|
-
text goldens in [`test/fixtures/dashboard/`](https://github.com/zalom/plastic/tree/main/test/fixtures/dashboard). See [`dashboard_test.rb`](https://github.com/zalom/plastic/blob/main/test/dashboard_test.rb). Drift without an
|
|
161
|
-
intentional change means the skill is broken.
|
|
162
|
-
|
|
163
|
-
## Notes
|
|
164
|
-
|
|
165
|
-
- The two intent lists (active, next work) render as Markdown tables; the prose summary,
|
|
166
|
-
footer, counts, and the project rollup stay prose (intent 202). No Value x Effort grid
|
|
167
|
-
returns. Never emit `<br>`.
|
|
168
|
-
- Clusters (Zettelkasten grouping in INDEX.md) are intentionally not rendered.
|
|
169
|
-
- Additive: changes no core lifecycle, gate, or cycle logic.
|
|
@@ -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
|
-
}
|