@zalom/plastic 1.0.3 → 1.1.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-reference.md +11 -11
- package/PLASTIC.md +11 -9
- package/README.md +48 -1
- package/agents/plastic-enforcer.md +8 -5
- package/agents/plastic-future-intent-researcher.md +1 -1
- package/agents/plastic-intent-curator.md +9 -10
- package/agents/plastic-spec-specialist.md +9 -6
- package/bin/plastic.js +2 -2
- package/hooks/check-update +1 -1
- package/hooks/continue +1 -1
- package/package.json +1 -1
- package/scripts/dashboard.rb +29 -24
- package/scripts/doctor.rb +188 -9
- package/scripts/end-intent +330 -0
- package/scripts/hook-code-gate +1 -1
- package/scripts/hook-continue +2 -2
- package/scripts/hook-create-gate +2 -2
- package/scripts/hook-session-start +1 -1
- package/scripts/install.rb +2 -1
- package/scripts/lib/bridge.rb +116 -3
- package/scripts/lib/dashboard_banner.rb +8 -9
- package/scripts/lib/installer_core.rb +17 -8
- package/scripts/lib/legacy_bookend_amnesty.rb +35 -0
- package/scripts/lib/release_guard.rb +62 -0
- package/scripts/lib/roadmap_queue.rb +285 -0
- package/scripts/lib/roadmap_savepoint.rb +213 -0
- package/scripts/lib/store_provisioning.rb +1 -1
- package/scripts/lib/worktree.rb +21 -0
- package/scripts/new-intent +2 -1
- package/scripts/read-config +3 -3
- package/scripts/roadmap-next +44 -0
- package/scripts/roadmap-savepoint +64 -0
- package/scripts/{versions.rb → rollback.rb} +33 -41
- package/scripts/update.rb +1 -1
- package/skills/_active-intent-gate.md +1 -1
- package/skills/_decision-tables.md +50 -0
- package/skills/auto/SKILL.md +69 -68
- package/skills/auto/evals/evals.json +4 -4
- package/skills/auto/references/agent-architecture.md +2 -2
- package/skills/continuing/SKILL.md +23 -130
- package/skills/continuing/evals/evals.json +26 -80
- package/skills/dashboard/SKILL.md +18 -15
- package/skills/dashboard/references/classification.md +3 -3
- package/skills/dashboard/templates/dashboard-global.md +8 -23
- package/skills/dashboard/templates/dashboard-project.md +7 -26
- package/skills/doctor/SKILL.md +3 -3
- package/skills/install/SKILL.md +10 -10
- package/skills/{brainstorming → intent-brainstorming}/SKILL.md +43 -45
- package/skills/intent-brainstorming/evals/evals.json +67 -0
- package/skills/{brainstorming → intent-brainstorming}/references/design-principles.md +12 -17
- package/skills/intent-continuing/SKILL.md +99 -0
- package/skills/intent-continuing/evals/evals.json +145 -0
- package/skills/intent-continuing/references/context-management.md +28 -0
- package/skills/{creating-intent → intent-creating}/SKILL.md +3 -3
- package/skills/{creating-intent → intent-creating}/evals/evals.json +1 -1
- package/skills/{intent-discovery → intent-discovering}/SKILL.md +1 -1
- package/skills/intent-ending/SKILL.md +151 -0
- package/skills/intent-ending/evals/evals.json +74 -0
- package/skills/{executing-plan → intent-executing}/SKILL.md +75 -15
- package/skills/intent-executing/evals/evals.json +66 -0
- package/skills/{brainstorming-grill-me → intent-grilling}/SKILL.md +4 -4
- package/skills/{linking-intents → intent-linking}/SKILL.md +1 -1
- package/skills/{linking-intents → intent-linking}/evals/evals.json +1 -1
- package/skills/{lock → intent-locking}/SKILL.md +1 -1
- package/skills/{writing-plans → intent-planning}/SKILL.md +48 -20
- package/skills/intent-planning/evals/evals.json +66 -0
- package/skills/{writing-plans → intent-planning}/references/plan-format.md +31 -7
- package/skills/{research → intent-researching}/SKILL.md +2 -2
- package/skills/{research → intent-researching}/evals/evals.json +1 -1
- package/skills/{savepoint → intent-savepoint}/SKILL.md +13 -1
- package/skills/intent-speccing/SKILL.md +69 -0
- package/skills/intent-speccing/evals/evals.json +126 -0
- package/skills/intent-speccing/references/per-section-fill-rules.md +92 -0
- package/skills/intent-speccing/references/self-verify-checklist.md +38 -0
- package/skills/intent-starting/SKILL.md +2 -2
- package/skills/intent-starting/evals/evals.json +2 -2
- package/skills/project-continuing/SKILL.md +104 -0
- package/skills/project-continuing/evals/evals.json +100 -0
- package/skills/project-continuing/references/board-fill.md +33 -0
- package/skills/{creating-project → project-creating}/SKILL.md +2 -2
- package/skills/releasing/SKILL.md +66 -14
- package/skills/releasing/references/release-lines.md +105 -0
- package/skills/roadmap/SKILL.md +7 -1
- package/skills/roadmap/references/file-format.md +30 -1
- package/skills/roadmap/references/operations.md +26 -6
- package/skills/roadmap-continuing/SKILL.md +85 -0
- package/skills/roadmap-continuing/evals/evals.json +82 -0
- package/skills/roadmap-continuing/references/liveness-ranking.md +56 -0
- package/skills/{versions → rollback}/SKILL.md +30 -20
- package/skills/{creating-skills → skill-creating}/SKILL.md +2 -2
- package/skills/{creating-skills → skill-creating}/evals/evals.json +5 -5
- package/skills/{creating-skills → skill-creating}/references/progressive-disclosure.md +2 -2
- package/skills/{evaluating-skills → skill-evaluating}/SKILL.md +1 -1
- package/skills/{evaluating-skills → skill-evaluating}/evals/evals.json +3 -3
- package/skills/{intent-curator → store-curating}/SKILL.md +6 -7
- package/skills/{intent-curator → store-curating}/evals/evals.json +1 -1
- package/skills/{managing-index → store-indexing}/SKILL.md +6 -7
- package/skills/{managing-index → store-indexing}/evals/evals.json +1 -1
- package/skills/{add-project-store → store-provisioning}/SKILL.md +2 -2
- package/skills/tutorial/SKILL.md +65 -0
- package/skills/tutorial/evals/evals.json +186 -0
- package/skills/tutorial/references/track-1-guided.md +123 -0
- package/skills/tutorial/references/track-2-auto.md +95 -0
- package/skills/tutorial/references/track-3-projects-and-roadmaps.md +110 -0
- package/skills/uninstall/SKILL.md +2 -2
- package/skills/update/SKILL.md +3 -3
- package/templates/agents.md +7 -7
- package/templates/config.yml +2 -1
- package/templates/index.md +4 -1
- package/skills/brainstorming/evals/evals.json +0 -22
- package/skills/savepoint/references/context-management.md +0 -32
- /package/skills/{creating-intent → intent-creating}/references/lifecycle.md +0 -0
- /package/skills/{creating-intent → intent-creating}/references/wikilinks.md +0 -0
- /package/skills/{executing-plan → intent-executing}/code-quality-reviewer-prompt.md +0 -0
- /package/skills/{executing-plan → intent-executing}/implementer-prompt.md +0 -0
- /package/skills/{executing-plan → intent-executing}/spec-reviewer-prompt.md +0 -0
- /package/skills/{linking-intents → intent-linking}/references/zettelkasten.md +0 -0
- /package/skills/{continuing → intent-savepoint}/references/context-management.md +0 -0
- /package/skills/{creating-project → project-creating}/references/hubs-projects.md +0 -0
- /package/skills/{creating-project → project-creating}/references/project-scaffolding.md +0 -0
- /package/skills/{creating-skills → skill-creating}/references/agents.md +0 -0
- /package/skills/{creating-skills → skill-creating}/references/evals.md +0 -0
- /package/skills/{creating-skills → skill-creating}/references/hooks.md +0 -0
- /package/skills/{creating-skills → skill-creating}/references/scripts.md +0 -0
- /package/skills/{creating-skills → skill-creating}/references/skills.md +0 -0
- /package/skills/{creating-skills → skill-creating}/scripts/scaffold.rb +0 -0
- /package/skills/{evaluating-skills → skill-evaluating}/assets/eval-template.json +0 -0
- /package/skills/{evaluating-skills → skill-evaluating}/references/convention-checks.md +0 -0
- /package/skills/{evaluating-skills → skill-evaluating}/references/eval-methodology.md +0 -0
- /package/skills/{managing-index → store-indexing}/references/zettelkasten-linking.md +0 -0
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"skill_name": "plastic-continuing",
|
|
3
|
-
"notes": "Intent
|
|
3
|
+
"notes": "Intent 158a1. New bare front-door router restored per intent 96 (D8). Scopes: description triggering (1-5) and routing behavior (6-9), the latter checked as convention against SKILL.md's routing table.",
|
|
4
4
|
"results": {
|
|
5
|
-
"triggering": { "cases":
|
|
6
|
-
"behavior": { "cases":
|
|
5
|
+
"triggering": { "cases": 5, "passed": 5, "run": "2026-07-10, one subagent per case" },
|
|
6
|
+
"behavior": { "cases": 4, "passed": 4, "evidence": "convention checks against skills/continuing/SKILL.md's routing table" }
|
|
7
7
|
},
|
|
8
8
|
"evals": [
|
|
9
9
|
{
|
|
10
10
|
"id": 1, "scope": "triggering", "set": "train",
|
|
11
11
|
"prompt": "continue",
|
|
12
|
-
"expected_output": "Activates plastic-continuing (the bare 'continue' keyword is the documented trigger).",
|
|
12
|
+
"expected_output": "Activates plastic-continuing (the bare 'continue' keyword is the router's documented trigger).",
|
|
13
13
|
"files": [],
|
|
14
14
|
"assertions": [
|
|
15
15
|
{ "type": "code", "check": "router CHOICE == plastic-continuing", "observed": "plastic-continuing", "result": "pass" }
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
"id": 3, "scope": "triggering", "set": "validation",
|
|
29
|
-
"prompt": "pick up where we left off
|
|
29
|
+
"prompt": "pick up where we left off",
|
|
30
30
|
"expected_output": "Activates plastic-continuing.",
|
|
31
31
|
"files": [],
|
|
32
32
|
"assertions": [
|
|
@@ -34,26 +34,17 @@
|
|
|
34
34
|
]
|
|
35
35
|
},
|
|
36
36
|
{
|
|
37
|
-
"id": 4, "scope": "triggering", "set": "
|
|
38
|
-
"prompt": "
|
|
39
|
-
"expected_output": "Activates plastic-continuing (
|
|
37
|
+
"id": 4, "scope": "triggering", "set": "validation",
|
|
38
|
+
"prompt": "where was I",
|
|
39
|
+
"expected_output": "Activates plastic-continuing (indirect trigger: a continue request that never says 'continue').",
|
|
40
40
|
"files": [],
|
|
41
41
|
"assertions": [
|
|
42
42
|
{ "type": "code", "check": "router CHOICE == plastic-continuing", "observed": "plastic-continuing", "result": "pass" }
|
|
43
43
|
]
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
|
-
"id": 5, "scope": "triggering", "set": "
|
|
47
|
-
"prompt": "continue
|
|
48
|
-
"expected_output": "Does NOT settle on plastic-continuing for execution. Shares 'continue' but the autonomous-delivery intent routes to plastic-auto.",
|
|
49
|
-
"files": [],
|
|
50
|
-
"assertions": [
|
|
51
|
-
{ "type": "code", "check": "router CHOICE == plastic-auto", "observed": "plastic-auto", "result": "pass" }
|
|
52
|
-
]
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
"id": 6, "scope": "triggering", "set": "validation",
|
|
56
|
-
"prompt": "continue the for-loop to the next iteration in this function",
|
|
46
|
+
"id": 5, "scope": "triggering", "set": "validation",
|
|
47
|
+
"prompt": "continue the for-loop in this function",
|
|
57
48
|
"expected_output": "Does NOT activate plastic-continuing. Near-miss: shares 'continue' but is a code-editing task.",
|
|
58
49
|
"files": [],
|
|
59
50
|
"assertions": [
|
|
@@ -61,84 +52,39 @@
|
|
|
61
52
|
]
|
|
62
53
|
},
|
|
63
54
|
{
|
|
64
|
-
"id":
|
|
65
|
-
"prompt": "
|
|
66
|
-
"expected_output": "
|
|
67
|
-
"files": [],
|
|
68
|
-
"assertions": [
|
|
69
|
-
{ "type": "code", "check": "router CHOICE != plastic-continuing", "observed": "none", "result": "pass" }
|
|
70
|
-
]
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
"id": 8, "scope": "triggering", "set": "validation",
|
|
74
|
-
"prompt": "what's the dashboard look like right now",
|
|
75
|
-
"expected_output": "May activate plastic-dashboard rather than plastic-continuing; an overview request without 'continue/resume' is a dashboard task.",
|
|
76
|
-
"files": [],
|
|
77
|
-
"assertions": [
|
|
78
|
-
{ "type": "code", "check": "router CHOICE != plastic-continuing", "observed": "plastic-dashboard", "result": "pass" }
|
|
79
|
-
]
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
"id": 9, "scope": "behavior", "set": "train",
|
|
83
|
-
"prompt": "Does the skill defer boot to the SessionStart hook rather than running it itself?",
|
|
84
|
-
"expected_output": "SKILL.md states boot (health check, core context, version banner, statusline) is owned by hook-session-start / plastic-statusline, not this skill.",
|
|
85
|
-
"files": ["skills/continuing/SKILL.md"],
|
|
86
|
-
"assertions": [
|
|
87
|
-
{ "type": "convention", "check": "SKILL.md says boot is owned by the SessionStart hook and the skill does not run it", "observed": "'Boot is not this skill's job.' paragraph naming hook-session-start and plastic-statusline", "result": "pass" }
|
|
88
|
-
]
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
"id": 10, "scope": "behavior", "set": "train",
|
|
92
|
-
"prompt": "Does the skill avoid running doctor / setting the statusline itself?",
|
|
93
|
-
"expected_output": "SKILL.md does NOT instruct running doctor.rb --core or setting the statusline; it attributes those to the hooks.",
|
|
94
|
-
"files": ["skills/continuing/SKILL.md"],
|
|
95
|
-
"assertions": [
|
|
96
|
-
{ "type": "convention", "check": "no in-skill boot step invokes doctor.rb --core or sets the statusline; both are attributed to hooks", "observed": "doctor --core and statusline mentioned only as hook-owned in the 'Boot is not this skill's job' note", "result": "pass" }
|
|
97
|
-
]
|
|
98
|
-
},
|
|
99
|
-
{
|
|
100
|
-
"id": 11, "scope": "behavior", "set": "train",
|
|
101
|
-
"prompt": "Is dashboard selection project-aware?",
|
|
102
|
-
"expected_output": "Project loaded -> `dashboard.rb project <slug>`; otherwise -> `dashboard.rb continue`. Skill only invokes, does not render.",
|
|
103
|
-
"files": ["skills/continuing/SKILL.md"],
|
|
104
|
-
"assertions": [
|
|
105
|
-
{ "type": "convention", "check": "both dashboard invocations present and gated on project detection", "observed": "'dashboard.rb project <slug>' and 'dashboard.rb continue' in the 'Continue (present the dashboard)' section", "result": "pass" }
|
|
106
|
-
]
|
|
107
|
-
},
|
|
108
|
-
{
|
|
109
|
-
"id": 12, "scope": "behavior", "set": "validation",
|
|
110
|
-
"prompt": "Is ledger-resume conditional and ledger-driven?",
|
|
111
|
-
"expected_output": "Resume fires only when a specific intent is named; reads savepoint.md last line as stage, verifies the stage file, rebuilds on drift, derives next step from first unchecked checklist item.",
|
|
55
|
+
"id": 6, "scope": "behavior", "set": "train",
|
|
56
|
+
"prompt": "continue",
|
|
57
|
+
"expected_output": "Bare 'continue' with no further target dispatches to the project route (plastic-project-continuing), the routing table's default.",
|
|
112
58
|
"files": ["skills/continuing/SKILL.md"],
|
|
113
59
|
"assertions": [
|
|
114
|
-
{ "type": "convention", "check": "
|
|
60
|
+
{ "type": "convention", "check": "routing table's default row maps bare continue/resume/no target to plastic-project-continuing", "observed": "present", "result": "pass" }
|
|
115
61
|
]
|
|
116
62
|
},
|
|
117
63
|
{
|
|
118
|
-
"id":
|
|
119
|
-
"prompt": "
|
|
120
|
-
"expected_output": "
|
|
64
|
+
"id": 7, "scope": "behavior", "set": "train",
|
|
65
|
+
"prompt": "continue --intent 4a",
|
|
66
|
+
"expected_output": "Dispatches to the intent route (plastic-intent-continuing).",
|
|
121
67
|
"files": ["skills/continuing/SKILL.md"],
|
|
122
68
|
"assertions": [
|
|
123
|
-
{ "type": "convention", "check": "
|
|
69
|
+
{ "type": "convention", "check": "routing table maps --intent {id} to plastic-intent-continuing", "observed": "present", "result": "pass" }
|
|
124
70
|
]
|
|
125
71
|
},
|
|
126
72
|
{
|
|
127
|
-
"id":
|
|
128
|
-
"prompt": "
|
|
129
|
-
"expected_output": "
|
|
73
|
+
"id": 8, "scope": "behavior", "set": "validation",
|
|
74
|
+
"prompt": "resume the statusline-coloring intent",
|
|
75
|
+
"expected_output": "Dispatches to the intent route (plastic-intent-continuing): a specific intent named by description.",
|
|
130
76
|
"files": ["skills/continuing/SKILL.md"],
|
|
131
77
|
"assertions": [
|
|
132
|
-
{ "type": "convention", "check": "
|
|
78
|
+
{ "type": "convention", "check": "routing table maps a named specific intent (by id or description) to plastic-intent-continuing", "observed": "present", "result": "pass" }
|
|
133
79
|
]
|
|
134
80
|
},
|
|
135
81
|
{
|
|
136
|
-
"id":
|
|
137
|
-
"prompt": "
|
|
138
|
-
"expected_output": "
|
|
82
|
+
"id": 9, "scope": "behavior", "set": "validation",
|
|
83
|
+
"prompt": "continue the consistency-dividend roadmap",
|
|
84
|
+
"expected_output": "Dispatches to the roadmap route (plastic-roadmap-continuing).",
|
|
139
85
|
"files": ["skills/continuing/SKILL.md"],
|
|
140
86
|
"assertions": [
|
|
141
|
-
{ "type": "
|
|
87
|
+
{ "type": "convention", "check": "routing table maps a named roadmap/delivery batch to plastic-roadmap-continuing", "observed": "present", "result": "pass" }
|
|
142
88
|
]
|
|
143
89
|
}
|
|
144
90
|
]
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
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 a
|
|
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
4
|
user-invocable: false
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Dashboard — Plastic Work Cockpit
|
|
8
8
|
|
|
9
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** (
|
|
10
|
+
**where we are** (recently worked), **where we go next** (the most-valuable next work), and
|
|
11
11
|
**how to conduct it** (a disposition per intent). The human-facing surface is **Markdown**,
|
|
12
12
|
because the user's UI renders Markdown natively but collapses raw tool-call stdout.
|
|
13
13
|
|
|
@@ -19,7 +19,7 @@ state → byte-identical payload, regardless of model. Do NOT hand-summarize int
|
|
|
19
19
|
|
|
20
20
|
- User invokes `/plastic-dashboard`
|
|
21
21
|
- User asks "where are we", "what's next", "what should I work on", "show me the intents"
|
|
22
|
-
- `plastic-continuing` lands on the board on resume
|
|
22
|
+
- `plastic-project-continuing` lands on the board on resume
|
|
23
23
|
- `plastic-auto` reads `--json` to choose the next dispatchable intent
|
|
24
24
|
|
|
25
25
|
## Procedure (the Markdown board — default human surface)
|
|
@@ -34,9 +34,9 @@ ruby ~/.plastic/scripts/dashboard.rb [continue|project <slug>] --data
|
|
|
34
34
|
- `project <slug>` → that **project** board payload (`mode: "project"`).
|
|
35
35
|
|
|
36
36
|
The payload is read-only JSON. Global-board fields: `date`, `store_health`, `recently_worked`,
|
|
37
|
-
`
|
|
38
|
-
`counts`, `projects`, `project_totals`. Project-board fields: `slug`,
|
|
39
|
-
`description`, `recently_worked`, `
|
|
37
|
+
`next_work` (a flat, rank-ordered list of `{id, intent, scope, lifecycle, value, disposition,
|
|
38
|
+
flags, line}`), `counts`, `projects`, `project_totals`. Project-board fields: `slug`,
|
|
39
|
+
`store_health`, `description`, `recently_worked`, `next_work`, `counts`, `active`, `future`.
|
|
40
40
|
|
|
41
41
|
Each board load runs the scoped store check (`doctor --store <scope>`): the global board runs
|
|
42
42
|
`--store global` and a project board runs `--store <slug>`. The result rides in the payload as
|
|
@@ -51,13 +51,16 @@ Templates live in this skill's `templates/` directory:
|
|
|
51
51
|
`~/.claude/skills/plastic-dashboard/templates/dashboard-global.md` and
|
|
52
52
|
`dashboard-project.md`.
|
|
53
53
|
|
|
54
|
-
Fill mechanically
|
|
55
|
-
- `{{a.b.count}}` → the integer (e.g. `
|
|
54
|
+
Fill mechanically, no rewriting, no re-sorting:
|
|
55
|
+
- `{{a.b.count}}` → the integer (e.g. `counts.active` = that count).
|
|
56
56
|
- `{{...lines}}` → join the list's `.line` strings with **real newlines** (one per line).
|
|
57
|
-
These lines
|
|
58
|
-
`<br
|
|
57
|
+
These are ordinary prose lines, not glyph-led bullets: never add a Markdown `-` bullet,
|
|
58
|
+
never emit `<br>`. If a list is empty, render `_(none)_`.
|
|
59
|
+
- `next_work.lines` → the most-valuable next work, already ranked; each line reads
|
|
60
|
+
`"<id> <intent, truncated>"`. Use each entry's `disposition`/`flags` fields when the prose
|
|
61
|
+
needs to say why an item is next.
|
|
59
62
|
- `projects.lines` → one line per project:
|
|
60
|
-
`- **{slug}
|
|
63
|
+
`- **{slug}**: {description}, active {active}, done {done}, future {future}, last accessed {last_accessed_at[0,10]}`.
|
|
61
64
|
- Scalars (`{{date}}`, `{{slug}}`, `{{description}}`) → substitute verbatim.
|
|
62
65
|
|
|
63
66
|
### Step 3 — Present it (mandatory, every invocation)
|
|
@@ -84,7 +87,7 @@ a no-op when QMD is absent, so fall back to the existing INDEX.md / file scan.
|
|
|
84
87
|
The board lists everything; the user navigates by free prose (no capped picker):
|
|
85
88
|
- On the **global** board, the user replies with an **intent id** (work it), a **project
|
|
86
89
|
name** (re-run `project <slug> --data` and present that board), or **"new"** (start a new
|
|
87
|
-
intent in global via `plastic-creating
|
|
90
|
+
intent in global via `plastic-intent-creating`).
|
|
88
91
|
- On a **project** board, the user replies with an **intent id**, or **"global"** to return.
|
|
89
92
|
|
|
90
93
|
## Auto-mode contract (`--json`)
|
|
@@ -112,7 +115,7 @@ a raw terminal. The Markdown board (`--data` + template) is the surface for the
|
|
|
112
115
|
## How classification works (deterministic)
|
|
113
116
|
|
|
114
117
|
The script computes Effort/Value/Flags/Override/Caps; the agent never re-derives them.
|
|
115
|
-
To explain or debug a
|
|
118
|
+
To explain or debug a ranking or disposition, read `references/classification.md`.
|
|
116
119
|
|
|
117
120
|
## Eval
|
|
118
121
|
|
|
@@ -123,7 +126,7 @@ intentional change means the skill is broken.
|
|
|
123
126
|
|
|
124
127
|
## Notes
|
|
125
128
|
|
|
126
|
-
-
|
|
127
|
-
|
|
129
|
+
- Board lines are ordinary prose, not a rigid grid: the boards are UI-only and may evolve,
|
|
130
|
+
so they need not be valid Markdown lists. Never emit `<br>`.
|
|
128
131
|
- Clusters (Zettelkasten grouping in INDEX.md) are intentionally not rendered.
|
|
129
132
|
- Additive: changes no core lifecycle, gate, or cycle logic.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# How Classification Works (Deterministic)
|
|
2
2
|
|
|
3
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
|
|
4
|
+
the agent never re-derives them. Read this to explain or debug a ranking or disposition.
|
|
5
5
|
|
|
6
6
|
- **Effort** — small for `research`/`exploration`/`bugfix`, for already-scoped intents
|
|
7
7
|
(plan/checklist exists), or a **branch id** (folgezettel depth ≥ 2, e.g. `4a`, `12b3`); big
|
|
@@ -16,7 +16,7 @@ the agent never re-derives them. Read this to explain or debug a quadrant assign
|
|
|
16
16
|
the staleness threshold. All three kept low-noise by design.
|
|
17
17
|
- **Override** — a `value: high|low` frontmatter field always wins (pre-stamped data, never
|
|
18
18
|
model judgment at render time).
|
|
19
|
-
- **Caps
|
|
20
|
-
entries plus a trailing "+N more" line; each entry's text is truncated to 120 characters
|
|
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
21
|
with a trailing ellipsis. Applies to the Markdown board only (the ASCII renderer has its own
|
|
22
22
|
separate `CELL_CAP`).
|
|
@@ -1,31 +1,16 @@
|
|
|
1
|
-
# 🧩 Plastic · Global Board
|
|
1
|
+
# 🧩 Plastic · Global Board, {{date}}
|
|
2
2
|
|
|
3
|
-
**Recently worked**
|
|
3
|
+
**Recently worked** (last 24h)
|
|
4
4
|
{{recently_worked.lines}}
|
|
5
5
|
|
|
6
|
-
## Where we
|
|
6
|
+
## Where we are
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|---|---|---|
|
|
10
|
-
| **High value** | ⚡ **Quick win** · {{matrix.quick_win.count}} | ★ **Next big thing** · {{matrix.next_big.count}} |
|
|
11
|
-
| **Low value** | → **Defer (agent)** · {{matrix.defer.count}} | ⚑ **Triage** · {{matrix.triage.count}} |
|
|
8
|
+
{{counts.active}} intents active, {{counts.done}} done, {{counts.future}} queued for later.
|
|
12
9
|
|
|
13
|
-
|
|
14
|
-
{{matrix.quick_win.lines}}
|
|
15
|
-
|
|
16
|
-
**★ Next big thing** — big effort, high value
|
|
17
|
-
{{matrix.next_big.lines}}
|
|
18
|
-
|
|
19
|
-
**→ Defer (agent)** — small effort, low value
|
|
20
|
-
{{matrix.defer.lines}}
|
|
21
|
-
|
|
22
|
-
**⚑ Triage** — big effort, low value
|
|
23
|
-
{{matrix.triage.lines}}
|
|
24
|
-
|
|
25
|
-
🔬 **Research → agent**
|
|
26
|
-
{{matrix.research.lines}}
|
|
27
|
-
|
|
28
|
-
## Projects · active {{project_totals.active}} · done {{project_totals.done}} · future {{project_totals.future}}
|
|
10
|
+
## Projects, active {{project_totals.active}}, done {{project_totals.done}}, future {{project_totals.future}}
|
|
29
11
|
{{projects.lines}}
|
|
30
12
|
|
|
13
|
+
## Most-valuable next work
|
|
14
|
+
{{next_work.lines}}
|
|
15
|
+
|
|
31
16
|
**What would you like to work on next?** (type an **intent id**, a **project name**, or anything **new** you'd like to start)
|
|
@@ -1,33 +1,11 @@
|
|
|
1
|
-
# 📦 {{slug}} · Project Board
|
|
1
|
+
# 📦 {{slug}} · Project Board, {{date}}
|
|
2
2
|
|
|
3
3
|
{{description}}
|
|
4
4
|
|
|
5
|
-
**Recently worked**
|
|
5
|
+
**Recently worked** (last active work, last 24h)
|
|
6
6
|
{{recently_worked.lines}}
|
|
7
7
|
|
|
8
|
-
##
|
|
9
|
-
|
|
10
|
-
| | Small effort | Big effort |
|
|
11
|
-
|---|---|---|
|
|
12
|
-
| **High value** | ⚡ **Quick win** · {{matrix.quick_win.count}} | ★ **Next big thing** · {{matrix.next_big.count}} |
|
|
13
|
-
| **Low value** | → **Defer (agent)** · {{matrix.defer.count}} | ⚑ **Triage** · {{matrix.triage.count}} |
|
|
14
|
-
|
|
15
|
-
**⚡ Quick win** — small effort, high value
|
|
16
|
-
{{matrix.quick_win.lines}}
|
|
17
|
-
|
|
18
|
-
**★ Next big thing** — big effort, high value
|
|
19
|
-
{{matrix.next_big.lines}}
|
|
20
|
-
|
|
21
|
-
**→ Defer (agent)** — small effort, low value
|
|
22
|
-
{{matrix.defer.lines}}
|
|
23
|
-
|
|
24
|
-
**⚑ Triage** — big effort, low value
|
|
25
|
-
{{matrix.triage.lines}}
|
|
26
|
-
|
|
27
|
-
🔬 **Research → agent**
|
|
28
|
-
{{matrix.research.lines}}
|
|
29
|
-
|
|
30
|
-
## Intents · active {{counts.active}} · done {{counts.done}} · future {{counts.future}}
|
|
8
|
+
## Intents, active {{counts.active}}, done {{counts.done}}, future {{counts.future}}
|
|
31
9
|
|
|
32
10
|
**Active**
|
|
33
11
|
{{active.lines}}
|
|
@@ -35,6 +13,9 @@
|
|
|
35
13
|
**Future**
|
|
36
14
|
{{future.lines}}
|
|
37
15
|
|
|
38
|
-
|
|
16
|
+
## Most-valuable next work
|
|
17
|
+
{{next_work.lines}}
|
|
18
|
+
|
|
19
|
+
**Legend** · ○ What ◔ Why ◑ How ◕ Exec ● Done
|
|
39
20
|
|
|
40
21
|
**What would you like to work on next?** (type an **intent id**, or **global** to go back)
|
package/skills/doctor/SKILL.md
CHANGED
|
@@ -13,7 +13,7 @@ Doctor has three scopes. Pick the right one for the situation:
|
|
|
13
13
|
| Scope | Flag | When it runs | States |
|
|
14
14
|
|-------|------|--------------|--------|
|
|
15
15
|
| Core check | `--core` | SessionStart hook (automatic), also available on demand | Binary: pass or error |
|
|
16
|
-
| Store check | `--store [global\|<slug>]` | Dashboard load, `plastic-continuing` | Three-state: pass / warn / fail |
|
|
16
|
+
| Store check | `--store [global\|<slug>]` | Dashboard load, `plastic-project-continuing` | Three-state: pass / warn / fail |
|
|
17
17
|
| Full check | (no flag) | After every update (automatic), or `/plastic-doctor` | Three-state: pass / warn / fail |
|
|
18
18
|
|
|
19
19
|
### `--core` (binary, manifest-backed)
|
|
@@ -118,9 +118,9 @@ Use the `fix_hint` value to determine the correct action:
|
|
|
118
118
|
| "Add missing entries to INDEX.md" | Add orphaned intents to the appropriate INDEX.md section |
|
|
119
119
|
| "Remove stale references from INDEX.md" | Edit INDEX.md to remove ghost references |
|
|
120
120
|
| "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 |
|
|
121
|
-
| "Run: provision-project-store {slug}" | Run `provision-project-store <slug>` (or invoke the `plastic-
|
|
121
|
+
| "Run: provision-project-store {slug}" | Run `provision-project-store <slug>` (or invoke the `plastic-store-provisioning` skill) to create the missing store |
|
|
122
122
|
| "Re-run installer" | Run `npx -y @zalom/plastic@<channel> install --agent <agent>` (channel: -alpha->@alpha, -beta->@beta, else @latest) |
|
|
123
|
-
| "Dispatch plastic-
|
|
123
|
+
| "Dispatch plastic-store-curating ... revisions.md ..." | Invoke the `plastic-store-curating` (or the agent) to 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.md > Structural maintenance and revisions.md. For a missing required section, restore or reproject it instead. |
|
|
124
124
|
|
|
125
125
|
For fixes the agent cannot handle automatically, explain what the user needs
|
|
126
126
|
to do manually. The `revisions.md` remedy is curator-applied (a move-and-record
|
package/skills/install/SKILL.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: plastic-install
|
|
3
|
-
description: Use when initializing Plastic globally (~/.plastic/) or locally in a project, or to re-install/repair a broken installation. Accepts channel flags (--alpha, --beta, --latest) to select release channel. First install defaults to --
|
|
3
|
+
description: 'Use when initializing Plastic globally (~/.plastic/) or locally in a project, or to re-install/repair a broken installation. Accepts channel flags (--alpha, --beta, --latest) to select release channel. First install defaults to --latest (stable); reinstalls match the already-installed channel. Global install is recommended: it creates the global intent store as a git-backed repository. Local install creates .plastic/ in the current project for testing.'
|
|
4
4
|
user-invocable: true
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Install Plastic
|
|
8
8
|
|
|
9
|
-
> **Recommended path:** for a first install, run `npx -y @zalom/plastic@
|
|
10
|
-
> in your shell (or `bunx -y @zalom/plastic@
|
|
9
|
+
> **Recommended path:** for a first install, run `npx -y @zalom/plastic@latest install --claude`
|
|
10
|
+
> in your shell (or `bunx -y @zalom/plastic@latest install --claude` if you use Bun). This skill
|
|
11
11
|
> exists to **re-install or repair** an existing setup from inside the agent, and to
|
|
12
12
|
> drive interactive global configuration. Whenever this skill performs an install or
|
|
13
13
|
> re-install, it **runs `/plastic-doctor` afterward** and reports the result.
|
|
@@ -16,7 +16,7 @@ user-invocable: true
|
|
|
16
16
|
|
|
17
17
|
If Plastic is installed, derive `<channel>` from `~/.plastic/VERSION`: a version containing
|
|
18
18
|
`-alpha` means `@alpha`, `-beta` means `@beta`, otherwise `@latest`. If not installed
|
|
19
|
-
(first install), default to `@
|
|
19
|
+
(first install), default to `@latest`. The user can always override with
|
|
20
20
|
`--alpha` / `--beta` / `--latest`.
|
|
21
21
|
|
|
22
22
|
## Re-install / repair
|
|
@@ -35,18 +35,18 @@ Then **run `/plastic-doctor`** and report what it found.
|
|
|
35
35
|
|
|
36
36
|
| Flag | Behavior |
|
|
37
37
|
|------|----------|
|
|
38
|
-
| `--latest` | Install from the stable channel |
|
|
39
|
-
| `--beta` | Install from the beta channel
|
|
38
|
+
| `--latest` | Install from the stable channel (default on a first install) |
|
|
39
|
+
| `--beta` | Install from the beta channel |
|
|
40
40
|
| `--alpha` | Install from the alpha channel |
|
|
41
41
|
|
|
42
42
|
When invoked from within Claude Code (re-install or channel switch), the skill
|
|
43
43
|
runs the appropriate npx command:
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
|
-
# Stable
|
|
46
|
+
# Stable (default on a first install)
|
|
47
47
|
npx -y @zalom/plastic@latest install --claude
|
|
48
48
|
|
|
49
|
-
# Beta
|
|
49
|
+
# Beta
|
|
50
50
|
npx -y @zalom/plastic@beta install --claude
|
|
51
51
|
|
|
52
52
|
# Alpha
|
|
@@ -68,10 +68,10 @@ Run `/plastic-install` with no arguments.
|
|
|
68
68
|
Check if `~/.plastic/VERSION` exists.
|
|
69
69
|
- If yes: announce "Plastic is already installed at ~/.plastic/. Run `/plastic-update` to
|
|
70
70
|
sync core files, or use the re-install command above to repair in place."
|
|
71
|
-
- If no: run the fresh install command (default `@
|
|
71
|
+
- If no: run the fresh install command (default `@latest`, or the channel the user named):
|
|
72
72
|
|
|
73
73
|
```bash
|
|
74
|
-
npx -y @zalom/plastic@
|
|
74
|
+
npx -y @zalom/plastic@latest install --claude
|
|
75
75
|
```
|
|
76
76
|
|
|
77
77
|
This single command, via `install.rb` (`bootstrap` + `distribute`), creates `store/`,
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: plastic-brainstorming
|
|
3
|
-
description: "Explore intent requirements and design before implementation. Produces
|
|
2
|
+
name: plastic-intent-brainstorming
|
|
3
|
+
description: "Explore intent requirements and design before implementation, through conversational prose questions asked one at a time (no multiple-choice chips), persisting each owner ruling immediately as an insight. Produces the enriched Why (Context and Decisions) in the active intent directory; hands off to /plastic-intent-speccing for spec.md."
|
|
4
4
|
user-invocable: true
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Brainstorming Ideas Into Designs
|
|
8
8
|
|
|
9
|
-
Help turn ideas into fully formed designs
|
|
9
|
+
Help turn ideas into fully formed designs through natural collaborative dialogue.
|
|
10
10
|
|
|
11
|
-
Announce: "I'm using the brainstorming skill to explore the design for intent {id}
|
|
11
|
+
Announce: "I'm using the brainstorming skill to explore the design for intent {id}: {name}."
|
|
12
12
|
|
|
13
|
-
Start by understanding the current project context, then ask questions one at a time to refine the idea. Once you understand what you're building, present the design and
|
|
13
|
+
Start by understanding the current project context, then ask questions one at a time, in prose, to refine the idea. Once you understand what you're building, present the design and collect the owner's rulings on it. This skill's product is the enriched Why, not spec.md.
|
|
14
14
|
|
|
15
15
|
<HARD-GATE>
|
|
16
|
-
Do NOT invoke any implementation skill, write any code, scaffold any project, or take any implementation action until you have presented a design and the user has
|
|
16
|
+
Do NOT invoke any implementation skill, write any code, scaffold any project, or take any implementation action until you have presented a design and the user has ruled on it. This applies to EVERY project regardless of perceived simplicity.
|
|
17
17
|
</HARD-GATE>
|
|
18
18
|
|
|
19
19
|
## Active Intent Gate
|
|
@@ -21,34 +21,32 @@ Do NOT invoke any implementation skill, write any code, scaffold any project, or
|
|
|
21
21
|
Before proceeding, resolve the active intent:
|
|
22
22
|
|
|
23
23
|
1. **Detect store:** Read `~/.plastic/projects.yml`, match CWD against registered project paths. If match → project store at `~/.plastic/projects/{slug}/store/`. If no match → global store at `~/.plastic/store/`.
|
|
24
|
-
2. **Find active intent:** Read `INDEX.md` from the detected store. Look under `## Active`. If exactly one → use it. If multiple → ask which. If none → refuse: "No active intent. Create one first with /plastic-creating
|
|
24
|
+
2. **Find active intent:** Read `INDEX.md` from the detected store. Look under `## Active`. If exactly one → use it. If multiple → ask which. If none → refuse: "No active intent. Create one first with /plastic-intent-creating"
|
|
25
25
|
3. **Resolve intent directory:** `{store}/store/{id}--{slug}/`
|
|
26
26
|
|
|
27
27
|
All artifacts go to the intent directory. Never write to external paths.
|
|
28
28
|
|
|
29
29
|
## Anti-Pattern: "This Is Too Simple To Need A Design"
|
|
30
30
|
|
|
31
|
-
Every project goes through this process. A todo list, a single-function utility, a config change
|
|
31
|
+
Every project goes through this process. A todo list, a single-function utility, a config change: all of them. "Simple" projects are where unexamined assumptions cause the most wasted work. The design can be short (a few sentences for truly simple projects), but you MUST present it and get a ruling.
|
|
32
32
|
|
|
33
33
|
## Checklist
|
|
34
34
|
|
|
35
35
|
You MUST create a task for each of these items and complete them in order:
|
|
36
36
|
|
|
37
|
-
1. **Explore project context
|
|
38
|
-
2. **
|
|
39
|
-
3. **Propose 2-3 approaches
|
|
40
|
-
4. **Present design
|
|
41
|
-
5. **
|
|
42
|
-
6. **
|
|
43
|
-
7. **User reviews written spec** — ask user to review before proceeding
|
|
44
|
-
8. **Transition to planning** — invoke `plastic-writing-plans`
|
|
37
|
+
1. **Explore project context**: check files, docs, recent commits, read active intent
|
|
38
|
+
2. **Grill in prose**: ask conversational prose questions, one at a time, no multiple-choice chips; understand purpose/constraints/success criteria
|
|
39
|
+
3. **Propose 2-3 approaches**: with trade-offs and your recommendation
|
|
40
|
+
4. **Present design**: in sections scaled to their complexity, get a ruling after each section
|
|
41
|
+
5. **Collect rulings**: for each owner ruling, immediately persist it (see Collect rulings below); never batch
|
|
42
|
+
6. **Hand off to /plastic-intent-speccing**: the enriched Why is done; do not author spec.md here
|
|
45
43
|
|
|
46
44
|
## Process Flow
|
|
47
45
|
|
|
48
|
-
The Checklist above states the ordered flow (steps 1-
|
|
46
|
+
The Checklist above states the ordered flow (steps 1-6). For the same flow as a
|
|
49
47
|
diagram, read `references/design-principles.md`.
|
|
50
48
|
|
|
51
|
-
**The terminal state is
|
|
49
|
+
**The terminal state is the handoff below.** Do NOT invoke any implementation skill and do NOT write spec.md. Brainstorming's product is the enriched Why.
|
|
52
50
|
|
|
53
51
|
## The Process
|
|
54
52
|
|
|
@@ -56,9 +54,9 @@ diagram, read `references/design-principles.md`.
|
|
|
56
54
|
- QMD-first (when available): before scanning the store with grep/Read for prior decisions, specs, or outcomes, run `ruby ~/.plastic/scripts/qmd-sync search "<terms>"` to surface candidate, prior, or related intents, then open the authoritative intent file for any hit you act on. The command is a no-op when QMD is absent, so fall back to the existing INDEX.md / file scan.
|
|
57
55
|
- Check out the current project state first (files, docs, recent commits)
|
|
58
56
|
- Before asking detailed questions, assess scope: if the request describes multiple independent subsystems (e.g., "build a platform with chat, file storage, billing, and analytics"), flag this immediately. Don't spend questions refining details of a project that needs to be decomposed first.
|
|
59
|
-
- If the project is too large for a single spec, help the user decompose into sub-projects: what are the independent pieces, how do they relate, what order should they be built? Then brainstorm the first sub-project through the normal design flow. Each sub-project gets its own spec → plan → implementation cycle.
|
|
60
|
-
- For appropriately-scoped projects, ask questions one at a time to refine the idea
|
|
61
|
-
-
|
|
57
|
+
- If the project is too large for a single spec, help the user decompose into sub-projects: what are the independent pieces, how do they relate, what order should they be built? Then brainstorm the first sub-project through the normal design flow. Each sub-project gets its own Why → spec → plan → implementation cycle.
|
|
58
|
+
- For appropriately-scoped projects, ask questions one at a time, in prose, to refine the idea
|
|
59
|
+
- Ask conversational prose questions, not multiple-choice chips. A short menu of named options is fine when the choice is genuinely enumerable, but phrase it as a sentence, not a bulleted picker.
|
|
62
60
|
- Only one question per message - if a topic needs more exploration, break it into multiple questions
|
|
63
61
|
- Focus on understanding: purpose, constraints, success criteria
|
|
64
62
|
|
|
@@ -80,39 +78,39 @@ guidance (what makes a good interface, when a file has grown too large) and
|
|
|
80
78
|
existing-codebase guidance (follow established patterns, fold in targeted
|
|
81
79
|
improvements without unrelated refactoring).
|
|
82
80
|
|
|
83
|
-
##
|
|
84
|
-
**Documentation:**
|
|
85
|
-
- Write the validated design (spec) to `{intent_dir}/spec.md` using the `${CLAUDE_PLUGIN_ROOT}/templates/spec.md` form
|
|
86
|
-
- Use elements-of-style:writing-clearly-and-concisely skill if available
|
|
87
|
-
- Commit to the store repo:
|
|
88
|
-
```
|
|
89
|
-
cd {store_root} && git add . && git commit -m "docs: spec for intent {id} — {name}"
|
|
90
|
-
```
|
|
81
|
+
## Collect rulings
|
|
91
82
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
1. **Placeholder scan:** Any "TBD", "TODO", incomplete sections, or vague requirements? Fix them.
|
|
95
|
-
2. **Internal consistency:** Do any sections contradict each other? Does the architecture match the feature descriptions?
|
|
96
|
-
3. **Scope check:** Is this focused enough for a single implementation plan, or does it need decomposition?
|
|
97
|
-
4. **Ambiguity check:** Could any requirement be interpreted two different ways? If so, pick one and make it explicit.
|
|
83
|
+
Each owner ruling triggers one immediate persist call, never a batch. The moment the
|
|
84
|
+
owner rules on a question or a design section, before moving to the next one, run:
|
|
98
85
|
|
|
99
|
-
|
|
86
|
+
```
|
|
87
|
+
ruby ~/.plastic/scripts/insight-append {intent_dir} "<ruling text>" --stage Why --author human
|
|
88
|
+
```
|
|
100
89
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
90
|
+
When a later ruling conflicts with an earlier one already on record, append a new
|
|
91
|
+
insight that names the superseded ruling and states plainly that this one supersedes
|
|
92
|
+
it. Both insights stay on record; the later one wins.
|
|
104
93
|
|
|
105
|
-
|
|
94
|
+
When presenting a batch of design options or rulings for the owner to choose, read
|
|
95
|
+
`~/.plastic/_decision-tables.md` and follow the numbered-table procedure.
|
|
106
96
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
97
|
+
## Handoff
|
|
98
|
+
|
|
99
|
+
Why exploration complete. The enriched Why is captured (Context, Decisions, one
|
|
100
|
+
insight per ruling). Invoke /plastic-intent-speccing to consolidate it into spec.md.
|
|
101
|
+
Do not author spec.md here.
|
|
102
|
+
|
|
103
|
+
## Gate position
|
|
104
|
+
|
|
105
|
+
- **Before:** an active intent exists with the lock armed.
|
|
106
|
+
- **Produces:** the enriched Why (`## Context`, `### Decisions`, one `## Insights` entry per ruling).
|
|
107
|
+
- **Next:** /plastic-intent-speccing consolidates the enriched Why into spec.md.
|
|
110
108
|
|
|
111
109
|
## Key Principles
|
|
112
110
|
|
|
113
111
|
- **One question at a time** - Don't overwhelm with multiple questions
|
|
114
|
-
- **
|
|
112
|
+
- **Prose, not chips** - Ask conversational prose questions; skip multiple-choice menus
|
|
115
113
|
- **YAGNI ruthlessly** - Remove unnecessary features from all designs
|
|
116
114
|
- **Explore alternatives** - Always propose 2-3 approaches before settling
|
|
117
|
-
- **Incremental validation** - Present design,
|
|
115
|
+
- **Incremental validation** - Present design, collect a ruling before moving on
|
|
118
116
|
- **Be flexible** - Go back and clarify when something doesn't make sense
|