@zalom/plastic 2.0.0-alpha.27 → 2.0.0-alpha.29

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.
Files changed (207) hide show
  1. package/PLASTIC.md +13 -139
  2. package/README.md +345 -133
  3. package/agents/plastic-enforcer.md +9 -10
  4. package/agents/plastic-executor.md +1 -1
  5. package/bin/crap +4 -0
  6. package/bin/lib/context_budget.rb +35 -1
  7. package/bin/lib/skill_census.rb +839 -0
  8. package/bin/plastic +6 -0
  9. package/bin/plastic-skill-census +114 -0
  10. package/bin/verify-change +345 -0
  11. package/deprecations.yml +1 -1
  12. package/{skills/agent-advisor/references → docs/help}/advisor-protocol.md +4 -7
  13. package/{skills/auto/references → docs/help}/agent-architecture.md +7 -7
  14. package/{skills/conventions/references → docs/help}/completion-and-done.md +1 -1
  15. package/{skills/auto/references → docs/help}/human-report-contract.md +17 -19
  16. package/{skills/conventions/references → docs/help}/roadmaps.md +2 -2
  17. package/{skills/tutorial/references → docs/help}/track-1-guided.md +8 -8
  18. package/{skills/tutorial/references → docs/help}/track-2-auto.md +5 -5
  19. package/{skills/tutorial/references → docs/help}/track-3-projects-and-roadmaps.md +24 -17
  20. package/package.json +3 -2
  21. package/scripts/append-ledger +2 -1
  22. package/scripts/dashboard.rb +10 -9
  23. package/scripts/day-summary +2 -1
  24. package/scripts/doctor.rb +48 -42
  25. package/scripts/end-intent +2 -8
  26. package/scripts/file-session-intent +2 -1
  27. package/scripts/hook-capture +4 -3
  28. package/scripts/hook-close +2 -1
  29. package/scripts/hook-record +3 -2
  30. package/scripts/hook-savepoint +3 -2
  31. package/scripts/hook-session-start +5 -4
  32. package/scripts/hook-stop +2 -1
  33. package/scripts/insight-append +1 -2
  34. package/scripts/install.rb +3 -1
  35. package/scripts/lib/active_delivery.rb +1 -1
  36. package/scripts/lib/arm.rb +2 -1
  37. package/scripts/lib/backup.rb +65 -0
  38. package/scripts/lib/cli/command.rb +85 -0
  39. package/scripts/lib/cli/commands/auto.rb +18 -0
  40. package/scripts/lib/cli/commands/auto_brief.rb +44 -0
  41. package/scripts/lib/cli/commands/auto_lock.rb +60 -0
  42. package/scripts/lib/cli/commands/auto_report.rb +50 -0
  43. package/scripts/lib/cli/commands/auto_take.rb +25 -0
  44. package/scripts/lib/cli/commands/backup.rb +43 -0
  45. package/scripts/lib/cli/commands/checkout.rb +25 -0
  46. package/scripts/lib/cli/commands/continue.rb +66 -0
  47. package/scripts/lib/cli/commands/doctor.rb +20 -0
  48. package/scripts/lib/cli/commands/feedback.rb +40 -0
  49. package/scripts/lib/cli/commands/help.rb +69 -0
  50. package/scripts/lib/cli/commands/hook.rb +32 -0
  51. package/scripts/lib/cli/commands/index.rb +23 -0
  52. package/scripts/lib/cli/commands/install.rb +21 -0
  53. package/scripts/lib/cli/commands/installer_verb.rb +37 -0
  54. package/scripts/lib/cli/commands/intent.rb +19 -0
  55. package/scripts/lib/cli/commands/intent_answer.rb +37 -0
  56. package/scripts/lib/cli/commands/intent_command.rb +53 -0
  57. package/scripts/lib/cli/commands/intent_end.rb +61 -0
  58. package/scripts/lib/cli/commands/intent_new.rb +62 -0
  59. package/scripts/lib/cli/commands/intent_note.rb +43 -0
  60. package/scripts/lib/cli/commands/intent_rule.rb +36 -0
  61. package/scripts/lib/cli/commands/intent_show.rb +25 -0
  62. package/scripts/lib/cli/commands/intent_spec.rb +44 -0
  63. package/scripts/lib/cli/commands/intent_step.rb +43 -0
  64. package/scripts/lib/cli/commands/intent_verify.rb +26 -0
  65. package/scripts/lib/cli/commands/migrate.rb +16 -0
  66. package/scripts/lib/cli/commands/migrate_stores.rb +31 -0
  67. package/scripts/lib/cli/commands/next.rb +49 -0
  68. package/scripts/lib/cli/commands/project.rb +19 -0
  69. package/scripts/lib/cli/commands/project_links.rb +42 -0
  70. package/scripts/lib/cli/commands/project_list.rb +20 -0
  71. package/scripts/lib/cli/commands/project_new.rb +72 -0
  72. package/scripts/lib/cli/commands/query.rb +31 -0
  73. package/scripts/lib/cli/commands/render.rb +25 -0
  74. package/scripts/lib/cli/commands/roadmap.rb +19 -0
  75. package/scripts/lib/cli/commands/roadmap_check.rb +44 -0
  76. package/scripts/lib/cli/commands/roadmap_log.rb +54 -0
  77. package/scripts/lib/cli/commands/roadmap_next.rb +34 -0
  78. package/scripts/lib/cli/commands/roadmap_show.rb +45 -0
  79. package/scripts/lib/cli/commands/rollback.rb +20 -0
  80. package/scripts/lib/cli/commands/search.rb +60 -0
  81. package/scripts/lib/cli/commands/session.rb +18 -0
  82. package/scripts/lib/cli/commands/session_commit.rb +42 -0
  83. package/scripts/lib/cli/commands/session_handoff.rb +34 -0
  84. package/scripts/lib/cli/commands/session_summary.rb +35 -0
  85. package/scripts/lib/cli/commands/status.rb +68 -0
  86. package/scripts/lib/cli/commands/subcommand_list.rb +36 -0
  87. package/scripts/lib/cli/commands/sync.rb +46 -0
  88. package/scripts/lib/cli/commands/uninstall.rb +20 -0
  89. package/scripts/lib/cli/commands/update.rb +20 -0
  90. package/scripts/lib/cli/commands/version.rb +53 -0
  91. package/scripts/lib/cli/frontier.rb +84 -0
  92. package/scripts/lib/cli/legacy.rb +50 -0
  93. package/scripts/lib/cli/output.rb +102 -0
  94. package/scripts/lib/cli/scope.rb +127 -0
  95. package/scripts/lib/cli/table.rb +64 -0
  96. package/scripts/lib/cli.rb +94 -0
  97. package/scripts/lib/compact_instructions.rb +8 -0
  98. package/scripts/lib/day_summary.rb +4 -3
  99. package/scripts/lib/doctor_core.rb +7 -32
  100. package/scripts/lib/doctor_session_ledger.rb +2 -1
  101. package/scripts/lib/feedback_report.rb +1 -1
  102. package/scripts/lib/graph_measure_models.rb +3 -1
  103. package/scripts/lib/index_entry.rb +9 -0
  104. package/scripts/lib/installer_core.rb +73 -19
  105. package/scripts/lib/intent_screen.rb +3 -3
  106. package/scripts/lib/lock.rb +2 -2
  107. package/scripts/lib/node_input.rb +3 -2
  108. package/scripts/lib/preflight.rb +4 -6
  109. package/scripts/lib/project_config.rb +2 -1
  110. package/scripts/lib/project_validator.rb +3 -2
  111. package/scripts/lib/qmd_sync.rb +8 -7
  112. package/scripts/lib/reference_archive.rb +45 -0
  113. package/scripts/lib/release_guard.rb +2 -0
  114. package/scripts/lib/report_screen.rb +4 -3
  115. package/scripts/lib/rlm/corpus.rb +13 -0
  116. package/scripts/lib/rlm/probe.rb +29 -0
  117. package/scripts/lib/rlm/query.rb +22 -0
  118. package/scripts/lib/roadmap_queue.rb +2 -2
  119. package/scripts/lib/roadmap_savepoint.rb +1 -1
  120. package/scripts/lib/runner_absorb.rb +3 -2
  121. package/scripts/lib/search_index.rb +55 -0
  122. package/scripts/lib/session_git.rb +4 -3
  123. package/scripts/lib/sqlite.rb +22 -0
  124. package/scripts/lib/store_discovery.rb +7 -6
  125. package/scripts/lib/store_layout.rb +54 -0
  126. package/scripts/lib/store_provisioning.rb +2 -1
  127. package/scripts/lib/store_sync.rb +85 -0
  128. package/scripts/lib/stores_move.rb +93 -0
  129. package/scripts/lib/verify_intent.rb +2 -7
  130. package/scripts/lib/version_number.rb +48 -0
  131. package/scripts/lib/work_graph.rb +59 -0
  132. package/scripts/lib/worktree.rb +3 -8
  133. package/scripts/lib/worktree_sweep.rb +3 -2
  134. package/scripts/link-suggest +2 -1
  135. package/scripts/migrate-to-global +1 -1
  136. package/scripts/new-intent +3 -12
  137. package/scripts/plastic-lock +3 -2
  138. package/scripts/promote-session-item +3 -2
  139. package/scripts/release-check +10 -5
  140. package/scripts/report-screen +1 -1
  141. package/scripts/session-commit +2 -1
  142. package/scripts/spawn-preamble +2 -2
  143. package/scripts/update.rb +25 -4
  144. package/scripts/write-handoff +2 -1
  145. package/templates/agents.md +6 -6
  146. package/templates/render.css +10 -0
  147. package/bin/plastic.js +0 -70
  148. package/skills/agent-advisor/SKILL.md +0 -84
  149. package/skills/auto/SKILL.md +0 -297
  150. package/skills/auto/evals/evals.json +0 -255
  151. package/skills/auto/references/end-tail.md +0 -64
  152. package/skills/conventions/SKILL.md +0 -29
  153. package/skills/dashboard/SKILL.md +0 -180
  154. package/skills/dashboard/evals/evals.json +0 -38
  155. package/skills/dashboard/references/classification.md +0 -22
  156. package/skills/dashboard/templates/dashboard-global.md +0 -20
  157. package/skills/dashboard/templates/dashboard-project.md +0 -19
  158. package/skills/direct/SKILL.md +0 -66
  159. package/skills/direct/references/request-signals.md +0 -59
  160. package/skills/doctor/SKILL.md +0 -305
  161. package/skills/doctor/report.md +0 -102
  162. package/skills/feedback/SKILL.md +0 -98
  163. package/skills/feedback/references/transport-and-privacy.md +0 -65
  164. package/skills/feedback/report.md +0 -36
  165. package/skills/install/SKILL.md +0 -215
  166. package/skills/intent-continuing/SKILL.md +0 -156
  167. package/skills/intent-continuing/references/board-fill.md +0 -52
  168. package/skills/intent-continuing/references/boarding-matrix.md +0 -35
  169. package/skills/intent-continuing/references/context-management.md +0 -28
  170. package/skills/intent-continuing/references/liveness-ranking.md +0 -57
  171. package/skills/intent-creating/SKILL.md +0 -89
  172. package/skills/intent-creating/evals/evals.json +0 -72
  173. package/skills/intent-creating/references/lifecycle.md +0 -81
  174. package/skills/intent-creating/references/wikilinks.md +0 -8
  175. package/skills/intent-ending/SKILL.md +0 -182
  176. package/skills/intent-ending/evals/evals.json +0 -74
  177. package/skills/intent-executing/SKILL.md +0 -87
  178. package/skills/intent-executing/evals/evals.json +0 -66
  179. package/skills/intent-executing/implementer-prompt.md +0 -47
  180. package/skills/intent-executing/spec-reviewer-prompt.md +0 -27
  181. package/skills/intent-speccing/SKILL.md +0 -136
  182. package/skills/intent-speccing/evals/evals.json +0 -126
  183. package/skills/intent-speccing/references/design-principles.md +0 -44
  184. package/skills/intent-speccing/references/per-section-fill-rules.md +0 -92
  185. package/skills/intent-speccing/references/self-verify-checklist.md +0 -37
  186. package/skills/project-creating/SKILL.md +0 -162
  187. package/skills/project-creating/references/hubs-projects.md +0 -55
  188. package/skills/project-creating/references/project-scaffolding.md +0 -97
  189. package/skills/releasing/SKILL.md +0 -376
  190. package/skills/releasing/references/deprecations.md +0 -60
  191. package/skills/releasing/references/promotion-and-tagging.md +0 -70
  192. package/skills/releasing/references/release-lines.md +0 -105
  193. package/skills/roadmap/SKILL.md +0 -90
  194. package/skills/roadmap/references/file-format.md +0 -134
  195. package/skills/roadmap/references/operations.md +0 -112
  196. package/skills/rollback/SKILL.md +0 -91
  197. package/skills/tutorial/SKILL.md +0 -66
  198. package/skills/tutorial/evals/evals.json +0 -186
  199. package/skills/uninstall/SKILL.md +0 -75
  200. package/skills/update/SKILL.md +0 -126
  201. /package/{skills/auto/references → docs/help}/agent-report-contract.md +0 -0
  202. /package/{skills/intent-executing → docs/help}/code-quality-reviewer-prompt.md +0 -0
  203. /package/{skills/conventions/references → docs/help}/knowledge-graph.md +0 -0
  204. /package/{skills/conventions/references → docs/help}/lifecycle-and-savepoints.md +0 -0
  205. /package/{skills/conventions/references → docs/help}/locks-and-worktrees.md +0 -0
  206. /package/{skills/conventions/references → docs/help}/maintenance-and-revisions.md +0 -0
  207. /package/{skills/intent-executing → docs/help}/plan-reviewer-prompt.md +0 -0
@@ -1,136 +0,0 @@
1
- ---
2
- name: plastic-intent-speccing
3
- description: >-
4
- Thinking mode for an intent: the conversation that turns an idea into rulings, the
5
- research that backs them, and the action files that say how the work runs. Use when the
6
- user wants to think a request through before building it, says "let's design this",
7
- "brainstorm", "grill me", "research this first", "spec this intent", "write the spec",
8
- or when a prompt is too vague to run directly and the direct skill routes here. Also
9
- fires on an indirect ask that never names a spec, such as "turn what we just discussed
10
- into the contract the work runs from." Absorbs what the former intent-brainstorming,
11
- intent-grilling, and intent-researching skills used to do (intent 304).
12
- user-invocable: true
13
- ---
14
-
15
- # Intent Speccing: thinking mode
16
-
17
- Speccing is optional: a ruled or small-enough intent skips straight to How/Exec, and this
18
- skill runs only when the request genuinely needs a design conversation first.
19
-
20
- One skill for the whole thinking conversation on an intent. It asks one question at a time,
21
- records every owner ruling the moment it lands, grills when asked, deposits research in
22
- `resources/`, and ends by writing the action files the work runs from and consolidating the
23
- rulings into `spec.md`. There is no separate brainstorm, grill, or research skill; those are
24
- the modes below.
25
-
26
- ## Active intent
27
-
28
- Resolve the active intent before anything else: read `~/.plastic/projects.yml`, match the
29
- working directory against registered project paths (a match means the project store at
30
- `~/.plastic/projects/{slug}/store/`, no match means `~/.plastic/store/`), then read that
31
- store's `INDEX.md` under `## Active`. Exactly one active intent is the one to work; several
32
- means ask which; none means stop and say so ("No active intent. Create one first with
33
- /plastic-intent-creating"). Every artifact goes into `{store}/{id}--{slug}/`; never write
34
- outside it.
35
-
36
- ## The conversation
37
-
38
- QMD-first: before scanning the store by hand for prior decisions, specs, or research, run
39
- `ruby ~/.plastic/scripts/qmd-sync search "<terms>"` and open the authoritative intent file for
40
- any hit you act on. The command is a no-op when QMD is absent.
41
-
42
- 1. **Context first.** Check the project state (files, docs, recent commits) and the intent's
43
- `## Context` and `## Insights`. Assess scope: a request that describes several independent
44
- subsystems is decomposed first, one thinking conversation per piece, before any detail
45
- question is spent.
46
- 2. **One question per message, in prose.** No multiple-choice chips; a short menu of named
47
- options is fine when the choice is genuinely enumerable, phrased as a sentence. Focus on
48
- purpose, constraints, and success criteria. Before asking how something works, look:
49
- in a codebase the answer is usually on disk.
50
- 3. **Propose two or three approaches** with trade-offs, leading with the recommendation and
51
- the reason for it. YAGNI: strip what the design does not need.
52
- 4. **Present the design in sections** scaled to their complexity (a few sentences when
53
- straightforward, up to 300 words when nuanced): architecture, components, data flow,
54
- error handling, testing. Get a ruling after each section. Read
55
- `references/design-principles.md` before proposing a design for the unit-boundary and
56
- existing-codebase guidance (follow established patterns, no unrelated refactoring).
57
- 5. **Record every ruling as it lands.** The moment the owner rules, before the next question:
58
- ```
59
- ruby ~/.plastic/scripts/insight-append {intent_dir} "<ruling text>" --stage Why --author human
60
- ```
61
- Never batch. A later ruling that conflicts with an earlier one gets a new insight naming
62
- the superseded one; both stay on record and the later wins. When presenting a batch of
63
- options for the owner to pick from, read `~/.plastic/_decision-tables.md` and follow the
64
- numbered-table procedure.
65
-
66
- No implementation starts until a design has been presented and ruled on. That holds for a
67
- config change and a one-function utility as much as for a subsystem; the design can be three
68
- sentences, but it is presented.
69
-
70
- ### Grill mode
71
-
72
- When the owner says "grill me" or asks to stress-test a plan or design, the same conversation
73
- turns relentless. Identify the root in one sentence and restate it. Walk the decision tree
74
- branch by branch: state the branch, ask a specific question, lead with your own recommended
75
- answer, resolve before moving on, name dependencies between decisions and resolve the
76
- upstream one first. Do not accept "it depends" without "on what?"; do not skip edge cases; do
77
- not assume when you can verify; challenge assumptions ("why not the alternative?"). Every
78
- three or four questions, summarize what is decided. At natural checkpoints, about every ten
79
- questions, offer to continue or to pause and capture what is decided; a pause records every
80
- ruling so far and stops. When all branches are resolved, list the decisions and the deferred
81
- items, then offer the hand-off below.
82
-
83
- ### Research mode
84
-
85
- When a question needs evidence rather than a ruling, research it and deposit the report in
86
- `{intent_dir}/resources/{type}--{topic}.md`, with `{type}` one of `deep-research`,
87
- `competitive-analysis`, `technical-spike`, `reference`, `landscape-survey` and `{topic}` in
88
- kebab-case. Choose the depth and say why: shallow (one or two searches plus a look at the
89
- code, minutes) for a narrow factual question; deep (several sources, cross-checked, a
90
- landscape or an architectural decision, or when a wrong answer would cause an architectural
91
- mistake) through the harness's deep-research capability when it has one, else a manual
92
- fan-out of searches. The report carries a summary, findings with citations, sources, and a
93
- "Relevance to intent" section; tables for findings and comparisons. Log one line in the
94
- intent's `## Insights` naming the file and the key finding. Research does not chain to
95
- another step; the conversation decides what to do with it.
96
-
97
- ## Closing the conversation
98
-
99
- When the rulings are enough to build from:
100
-
101
- 1. **Write the action files.** Every ruling that says how the work runs lands in
102
- `actions/ACTION_N.md` (at least one real file, no placeholder): the files to touch, the
103
- order, the tests that prove each step, the rules. The action files are what direct mode or
104
- an auto team executes; they exist before the work runs.
105
- 2. **Consolidate `spec.md`** from the rulings, section by section in template order. Read
106
- `references/per-section-fill-rules.md` when filling the template. Build the ruling ledger
107
- in fixed order first: `## Context` and `### Decisions`, then `## Insights` newest-last so a
108
- later ruling supersedes an earlier one, then `resources/discovery--<slug>.md`, then any
109
- other `resources/*.md`. Encode every ruling into its section; a collapsed single-line
110
- section is complete when it names everything. If a section cannot be filled from the
111
- ledger, stop and ask for the missing ruling; never invent scope. A spec.md left as the
112
- placeholder is backfilled from the record at close (`## Problem`, `## Decisions`,
113
- `## Acceptance Criteria`; the rest stays stub text), so consolidate only when the
114
- rulings say more than the record already does.
115
- 3. **Self-verify.** Read `references/self-verify-checklist.md` before presenting; fix any
116
- failing check and re-verify from the top.
117
- 4. **Present and hand off.** Print `ruby ~/.plastic/scripts/report-screen plan <intent_dir>` as
118
- the first characters of the reply: nothing before it, no fence, or the hook cannot paint it.
119
- It carries Asked, Decisions, Steps, Mode, Reviewer, then the Steps and Risks tables, filled
120
- from `spec.md` and the action files just written, never restated by eye. Then offer the
121
- routes: run it now inline when the work is small enough for direct mode; hand to
122
- `plastic-auto` when the owner says auto and the checklist above passes (all decisions
123
- resolved, scope bounded, dependencies named, success criteria defined); or keep thinking.
124
-
125
- Report, in this order: which files were written (`spec.md` new or rewritten, the action
126
- files), the count of acceptance criteria, which `## Insights` rulings superseded an earlier
127
- decision and where each landed, and the route chosen. If step 2 stopped for a missing
128
- ruling, report that instead: which section, what is missing, the question put to the owner.
129
-
130
- ## References
131
-
132
- | Trigger | Read |
133
- |---|---|
134
- | Before proposing a design (unit boundaries, existing codebases) | `references/design-principles.md` |
135
- | Filling the spec template (closing step 2) | `references/per-section-fill-rules.md` |
136
- | Self-verifying before presenting (closing step 3) | `references/self-verify-checklist.md` |
@@ -1,126 +0,0 @@
1
- {
2
- "skill_name": "plastic-intent-speccing",
3
- "notes": "Intent 163. Scopes: description triggering (1-4) and behavior (5-8: all-8-sections output, mandatory superseding-ruling case, STOP-and-ask gap rule, tabular alternatives with no em-dash). No dedicated Ruby test file backs this skill yet (natural-language guided command), so all assertions are result: expect-pass pending a real observed run, per the evals.json convention.",
4
- "evals": [
5
- {
6
- "id": 1,
7
- "scope": "triggering",
8
- "set": "train",
9
- "prompt": "The active intent is at Why with Context and Decisions recorded. Consolidate the enriched Why into spec.md.",
10
- "expected_output": "Activates plastic-intent-speccing (the user-typed Why-to-How consolidation command).",
11
- "files": [],
12
- "assertions": [
13
- {
14
- "type": "code",
15
- "check": "router CHOICE == plastic-intent-speccing",
16
- "result": "expect-pass"
17
- }
18
- ]
19
- },
20
- {
21
- "id": 2,
22
- "scope": "triggering",
23
- "set": "train",
24
- "prompt": "Turn what we just discussed into the contract the planner builds from.",
25
- "expected_output": "Activates plastic-intent-speccing; an indirect trigger that names neither the skill nor spec.md.",
26
- "files": [],
27
- "assertions": [
28
- {
29
- "type": "code",
30
- "check": "router CHOICE == plastic-intent-speccing",
31
- "result": "expect-pass"
32
- }
33
- ]
34
- },
35
- {
36
- "id": 3,
37
- "scope": "triggering",
38
- "set": "validation",
39
- "prompt": "Brainstorm this intent.",
40
- "expected_output": "Activates plastic-intent-speccing (brainstorming is a mode of the thinking conversation since intent 304).",
41
- "files": [],
42
- "assertions": [
43
- {
44
- "type": "code",
45
- "check": "router CHOICE != plastic-intent-speccing",
46
- "result": "expect-pass"
47
- }
48
- ]
49
- },
50
- {
51
- "id": 4,
52
- "scope": "triggering",
53
- "set": "validation",
54
- "prompt": "Write the plan.",
55
- "expected_output": "Does NOT activate plastic-intent-speccing; a plan is written from the action files by the executing skill.",
56
- "files": [],
57
- "assertions": [
58
- {
59
- "type": "code",
60
- "check": "router CHOICE != plastic-intent-speccing",
61
- "result": "expect-pass"
62
- }
63
- ]
64
- },
65
- {
66
- "id": 5,
67
- "scope": "behavior",
68
- "set": "train",
69
- "prompt": "Intent Y is at Why: Context describes the problem and goal, and 5 Decisions are recorded resolving scope, approach, and one rejected alternative. Consolidate into spec.md.",
70
- "expected_output": "Produces spec.md starting at the Spec heading; all 8 template sections present once, in template order (Problem, Goals, Non-Goals, Approach, Alternatives Considered, Decisions, Acceptance Criteria, Open Questions); no template placeholder text remains; every recorded Decision is encoded into its matching section.",
71
- "files": [],
72
- "assertions": [
73
- {
74
- "type": "human",
75
- "check": "The file starts at the Spec heading; all 8 sections appear once each, in template order; no placeholder text; every Decision traces to a section",
76
- "result": "expect-pass"
77
- }
78
- ]
79
- },
80
- {
81
- "id": 6,
82
- "scope": "behavior",
83
- "set": "train",
84
- "prompt": "Intent Z has Decisions recording D4: ship the setting as a CLI flag. A later Insights entry, timestamped after D4, reads: superseding ruling, ship as a config-file setting instead of a CLI flag, per user correction. Consolidate into spec.md.",
85
- "expected_output": "The produced spec Approach and Decisions sections encode the LATER ruling (config-file setting); the superseded earlier Decision (CLI flag) does not stand as the shipped design in any section. The Decisions section notes that the later Insight supersedes D4.",
86
- "files": [],
87
- "assertions": [
88
- {
89
- "type": "human",
90
- "check": "Approach and Decisions state the config-file setting, not the CLI flag; no section still asserts the CLI-flag path as the shipped design",
91
- "result": "expect-pass"
92
- }
93
- ]
94
- },
95
- {
96
- "id": 7,
97
- "scope": "behavior",
98
- "set": "validation",
99
- "prompt": "Intent W is at Why. Context says the team wants error handling that is more resilient, but no Decision or Insight states which specific mechanism (retry, circuit breaker, or fallback) was chosen. Consolidate into spec.md.",
100
- "expected_output": "Stops at step 5 (the gap rule) instead of inventing an Approach; asks the user which error-handling mechanism was decided, naming the missing ruling and the section it blocks.",
101
- "files": [],
102
- "assertions": [
103
- {
104
- "type": "human",
105
- "check": "no invented Approach or Decisions content fills the gap; the agent asks for the missing ruling instead of guessing a default mechanism",
106
- "result": "expect-pass"
107
- }
108
- ]
109
- },
110
- {
111
- "id": 8,
112
- "scope": "behavior",
113
- "set": "validation",
114
- "prompt": "Intent V has Decisions recording 3 rejected alternatives, each with a one-line reason it lost. Consolidate into spec.md.",
115
- "expected_output": "Alternatives Considered renders as a table (Alternative, Not chosen because), not the bullet-dash form shown in the template; the produced spec file contains no em-dashes or en-dashes anywhere in the file.",
116
- "files": [],
117
- "assertions": [
118
- {
119
- "type": "human",
120
- "check": "Alternatives Considered is a two-column table with one row per rejected alternative; a full-file dash-glyph scan of the produced spec file finds none",
121
- "result": "expect-pass"
122
- }
123
- ]
124
- }
125
- ]
126
- }
@@ -1,44 +0,0 @@
1
- # Design Principles: Unit Boundaries and Existing Codebases
2
-
3
- General good-developer guidance behind two parts of the Process: how to design for
4
- isolation and clarity, and how to behave in an existing codebase. Also holds the
5
- Process Flow diagram (the same ordered flow the Checklist already states as numbered
6
- steps).
7
-
8
- ## Design for isolation and clarity
9
-
10
- - Break the system into smaller units that each have one clear purpose, communicate through well-defined interfaces, and can be understood and tested independently
11
- - For each unit, you should be able to answer: what does it do, how do you use it, and what does it depend on?
12
- - Can someone understand what a unit does without reading its internals? Can you change the internals without breaking consumers? If not, the boundaries need work.
13
- - Smaller, well-bounded units are also easier for you to work with - you reason better about code you can hold in context at once, and your edits are more reliable when files are focused. When a file grows large, that's often a signal that it's doing too much.
14
-
15
- ## Working in existing codebases
16
-
17
- - Explore the current structure before proposing changes. Follow existing patterns.
18
- - Where existing code has problems that affect the work (e.g., a file that's grown too large, unclear boundaries, tangled responsibilities), include targeted improvements as part of the design - the way a good developer improves code they're working in.
19
- - Don't propose unrelated refactoring. Stay focused on what serves the current goal.
20
-
21
- ## Process Flow (diagram)
22
-
23
- The Checklist above already states this ordered flow as numbered steps 1-6; this
24
- diagram is the same flow in a visual form.
25
-
26
- ```dot
27
- digraph brainstorming {
28
- "Explore project context" [shape=box];
29
- "Grill in prose" [shape=box];
30
- "Propose 2-3 approaches" [shape=box];
31
- "Present design sections" [shape=box];
32
- "Owner rules?" [shape=diamond];
33
- "Collect rulings\n(persist each immediately)" [shape=box];
34
- "Invoke /plastic-intent-speccing" [shape=doublecircle];
35
-
36
- "Explore project context" -> "Grill in prose";
37
- "Grill in prose" -> "Propose 2-3 approaches";
38
- "Propose 2-3 approaches" -> "Present design sections";
39
- "Present design sections" -> "Owner rules?";
40
- "Owner rules?" -> "Present design sections" [label="no, revise"];
41
- "Owner rules?" -> "Collect rulings\n(persist each immediately)" [label="yes"];
42
- "Collect rulings\n(persist each immediately)" -> "Invoke /plastic-intent-speccing";
43
- }
44
- ```
@@ -1,92 +0,0 @@
1
- # Per-Section Fill Rules
2
-
3
- The single shared method for turning the rulings into `spec.md`. `plastic-intent-speccing`
4
- (the thinking conversation) and the auto orchestrator both point here; neither restates these
5
- rules. One fill rule per template section, in template order.
6
-
7
- Read the ruling ledger first (built in step 2 of the SKILL.md sequence): `## Context` plus
8
- `### Decisions`, then `## Insights` newest-last (a later ruling supersedes an earlier
9
- conflicting one), then `resources/discovery--<slug>.md`, then any other `resources/*.md`.
10
- Every rule below names which part of that ledger feeds the section.
11
-
12
- ## 1. Problem
13
-
14
- Source: the intent's `## Intent` line plus the problem narrative in `## Context`.
15
-
16
- State the problem as a problem, not a solution: what is broken, missing, or costly today, for
17
- whom. Do not describe the fix here, that belongs in Approach. If `## Insights` records a later
18
- reframe of the problem (a scope correction, a retargeted root cause), the later framing wins.
19
-
20
- ## 2. Goals
21
-
22
- Source: explicit goal statements in `## Context`, plus any `### Decisions` entry that commits to
23
- delivering a specific outcome.
24
-
25
- One bullet per goal, each a concrete, observable outcome the delivery must reach. Encode every
26
- Decision that commits to an outcome as its own bullet, do not compress two Decisions into one
27
- vague goal. A single-line collapsed Goals section is complete if it names every
28
- outcome; do not pad it with restated Problem text.
29
-
30
- ## 3. Non-Goals
31
-
32
- Source: `### Decisions` entries that name something explicitly out of scope, and `## Insights`
33
- rulings that narrowed scope after the initial brainstorm.
34
-
35
- One bullet per excluded item, each naming what is out and, briefly, why (a sibling intent owns
36
- it, a scope-reframe ruling cut it, it is a future intent). If a later Insight narrows scope
37
- further than an earlier Decision, the Insight's narrower boundary is the one recorded.
38
-
39
- ## 4. Approach
40
-
41
- Source: every `### Decisions` entry that describes HOW, resolved into one coherent narrative.
42
-
43
- Write prose, not a decision list. Synthesize the chosen path so it reads as one design: what
44
- gets built, in what shape, and how the pieces fit. Every Decision that shapes the approach must
45
- be traceable to a sentence here, but do not restate each Decision by its Dn label, that
46
- enumeration belongs in the Decisions section. Use a table only where the Approach itself compares
47
- options inline (rare; usually that comparison belongs in Alternatives Considered instead).
48
-
49
- ## 5. Alternatives Considered
50
-
51
- Source: `### Decisions` entries and `## Insights` rulings that name a rejected path and the
52
- reason it lost.
53
-
54
- Render as a table, not the template's bullet-dash form, so the reason column stays uniform and
55
- free of dash-glyph punctuation:
56
-
57
- | Alternative | Not chosen because |
58
- |---|---|
59
- | <rejected path> | <the ruling's stated reason, paraphrased> |
60
-
61
- One row per rejected alternative. If two Decisions reject variants of the same alternative, merge
62
- them into one row rather than duplicating it. Never use an em-dash or en-dash in the reason
63
- column; write "because" or a colon instead.
64
-
65
- ## 6. Decisions
66
-
67
- Source: `### Decisions` verbatim, in the order recorded, one entry per Decision.
68
-
69
- One bullet per decision, each keeping its `Dn` label and its ruling in paraphrase or verbatim.
70
- Do not drop a decision because it seems minor: every Decision must appear here even if its effect
71
- on the shipped Approach or Goals is small. When `## Insights` records a later ruling that
72
- supersedes an earlier Decision, add or amend the bullet to state the later ruling and note which
73
- earlier Decision it supersedes.
74
-
75
- ## 7. Acceptance Criteria
76
-
77
- Source: any criteria named directly in `### Decisions` or `## Insights`, plus one inferred
78
- criterion per Goal that has no explicit criterion on record.
79
-
80
- One checkbox bullet per criterion, each concretely checkable: a fact a reviewer can confirm true
81
- or false by inspection, a command, or a file, never a vague quality judgment. Every Goal must map
82
- to at least one criterion. A criterion that cannot be checked without more interpretation is not
83
- done, rewrite it or ask (the gap rule, SKILL.md step 5).
84
-
85
- ## 8. Open Questions
86
-
87
- Source: any question raised during Why that has no matching Decision or Insight resolving it.
88
-
89
- List each unresolved question as its own bullet. If every question raised during Why has a
90
- resolving Decision or Insight, write `None` and, directly under it, one line per resolved
91
- question naming which Decision or Insight resolved it (so a reader can audit the resolution
92
- instead of taking "None" on faith).
@@ -1,37 +0,0 @@
1
- # Self-Verify Checklist
2
-
3
- Run this before presenting spec.md (SKILL.md step 7). Ten checks: the four points of
4
- brainstorming's proven Spec Self-Review, merged with the six binding output checks this skill
5
- adds. Fix any failing check, then re-verify from the top; do not present a spec that fails one of
6
- these.
7
-
8
- ## Brainstorming's four Spec Self-Review points
9
-
10
- 1. **Placeholder scan.** Any "TBD", "TODO", incomplete section, or vague requirement left in the
11
- draft? Fix it before moving on.
12
- 2. **Internal consistency.** Do any two sections contradict each other? Does the Approach
13
- actually match what Goals and Acceptance Criteria describe?
14
- 3. **Scope check.** Is this spec focused enough for a single implementation plan, or does the
15
- Problem actually describe more than one independent piece of work that needs decomposing
16
- first?
17
- 4. **Ambiguity check.** Could any requirement be read two different ways? If so, pick one
18
- reading and rewrite the line so only that reading survives.
19
-
20
- ## The six binding output checks
21
-
22
- 5. **No template placeholder text remains.** No literal `<intent name>`, `<alternative>`, `...`,
23
- sample bracket text, or other template filler from `templates/spec.md` survives anywhere in
24
- the artifact.
25
- 6. **No header line.** The file starts at the `# Spec:` heading; there is no `Tier:` line (removed in 2.0, intent 304).
26
- 7. **All 8 sections present, in template order.** Problem, Goals, Non-Goals, Approach,
27
- Alternatives Considered, Decisions, Acceptance Criteria, Open Questions, each present once, in
28
- that order, none merged into another.
29
- 8. **Every `## Insights` ruling is traceable to a spec line.** Walk the Insights log entry by
30
- entry: each one lands in some section of the spec. Where two rulings conflict, the later one
31
- (further down the log) is the one that landed, and the earlier one does not silently persist
32
- in a different section.
33
- 9. **Acceptance criteria are concretely checkable.** Each Acceptance Criteria bullet reads as a
34
- fact a reviewer can confirm true or false by inspection, a command, or a named file, not a
35
- quality judgment a reviewer would have to interpret.
36
- 10. **No em-dashes or en-dashes anywhere in the artifact.** Scan the full file; replace any dash
37
- glyph with a comma, period, parenthesis, or colon.
@@ -1,162 +0,0 @@
1
- ---
2
- name: plastic-project-creating
3
- description: >-
4
- Create a new project from an implementation intent. Sets up project directory,
5
- git init, AGENTS.md with founding intent decisions, plastic-install --local,
6
- tactical mirror, projects.yml registration, and framework scaffolding.
7
- Use when an implementation intent spawns a project, or manually by user.
8
- user-invocable: true
9
- ---
10
-
11
- # Creating a Project
12
-
13
- ## Precondition
14
-
15
- An active intent must exist with enough context to define a project — at minimum: name/slug, path, and key decisions from `## Context > ### Decisions`.
16
-
17
- ## Workflow
18
-
19
- ### 1. Determine Project Identity
20
-
21
- - **Slug:** derived from intent name (kebab-case, 2-4 words) or user-specified
22
- - **Path:** from `~/.plastic/config.yml` `project_roots` (first entry as default), or user-specified
23
- - Confirm path with user before creation
24
-
25
- ### 2. Create Project Directory
26
-
27
- ```bash
28
- mkdir -p <project_root>/<slug>
29
- cd <project_root>/<slug>
30
- git init
31
- ```
32
-
33
- ### 3. Run `plastic-install --local`
34
-
35
- Invoke `plastic-install --local` in the project directory. This creates:
36
- ```
37
- .plastic/
38
- ├── store/
39
- ├── INDEX.md
40
- └── config.yml
41
- ```
42
-
43
- ### 4. Populate AGENTS.md
44
-
45
- Create `AGENTS.md` in the project root from the skeleton in
46
- `references/project-scaffolding.md` ("AGENTS.md skeleton"): read it now and fill in
47
- the project name, governing intent IDs, decisions, and project-specific rules.
48
-
49
- ### 5. Create Tactical Mirror
50
-
51
- Create the first intent in the project's store at `~/.plastic/projects/{slug}/store/`
52
- using the frontmatter, sections, and INDEX.md line in `references/project-scaffolding.md`
53
- ("Tactical mirror intent"), including the Hub multi-intent variant if there is more
54
- than one founding intent.
55
-
56
- **Directory:** `~/.plastic/projects/{slug}/store/1--{slug}/`
57
- **File:** `~/.plastic/projects/{slug}/store/1--{slug}/1--{slug}.md`
58
-
59
- ### 6. Register in projects.yml
60
-
61
- Read `~/.plastic/projects.yml` and add the entry shown in
62
- `references/project-scaffolding.md` ("projects.yml registration block"). For
63
- Hub-spawned projects, `parent` references the primary founding intent.
64
-
65
- ### 7. Provision the Project Store
66
-
67
- The `provision-project-store` verb is the single source of truth for store
68
- creation. Run it after the project is registered in step 6 (the provisioner
69
- requires registration), and before the QMD step:
70
-
71
- ```bash
72
- ruby ~/.plastic/scripts/provision-project-store <slug>
73
- ```
74
-
75
- This ensures `~/.plastic/projects/<slug>/store/` exists with `.gitkeep`, and
76
- writes `INDEX.md` and `project.yml` only if missing. It is idempotent, so it is
77
- safe even when the tactical mirror in step 5 already created the store directory.
78
- Do not create the store with an inline `mkdir`; the provisioner is the only place
79
- a store is made. For a project that is already registered but store-less, use the
80
- `plastic-doctor` skill's provisioning section instead.
81
-
82
- ### 8. Mark Global Intent(s) Completed
83
-
84
- For each founding intent:
85
-
86
- 1. Write `## Outcome` in the intent file:
87
- > "Spawned project `<slug>` at `<path>`. Decisions carried to AGENTS.md. Tactical mirror: `project-<slug>:1`."
88
- 2. Write `outcome.md` with full details (all decisions, project path, tactical mirror ID)
89
- 3. Update `chain` to include `project-<slug>:1`
90
- 4. Move from `## Active` to `## Completed` in `~/.plastic/INDEX.md` (with today's date)
91
-
92
- ### 9. Framework Scaffolding
93
-
94
- If decisions specify a framework, run the appropriate scaffolding command AFTER steps 3-4 (so scaffolding doesn't overwrite Plastic files or AGENTS.md):
95
-
96
- | Framework | Command |
97
- |---|---|
98
- | Rails | `rails new <slug> [options from decisions] --skip-git` (skip git — already initialized) |
99
- | Node/npm | `npm init -y` |
100
- | Ruby gem | `bundle gem <slug>` |
101
- | Other | As specified in decisions |
102
-
103
- After scaffolding, verify AGENTS.md and `.plastic/` still exist. If scaffolding overwrote them, restore.
104
-
105
- ### 10. Auto-commit Both Stores
106
-
107
- ```bash
108
- cd ~/.plastic && git add . && git commit -m "feat: spawn project <slug> from intent <ID>"
109
- cd <project> && git add . && git commit -m "feat: initialize project from intent <ID>"
110
- ```
111
-
112
- ### 11. Register the project store with QMD (optional)
113
-
114
- If QMD is installed, register the new project's store as a search collection:
115
-
116
- ```bash
117
- ruby ~/.plastic/scripts/qmd-sync register --store ~/.plastic/projects/<slug>/store
118
- ```
119
-
120
- `qmd-sync` no-ops when QMD is absent, so run it unconditionally. This adds the
121
- `plastic-<slug>` collection and indexes it.
122
-
123
- ### 12. Self-Check with validate-project
124
-
125
- Before announcing, verify the spawn actually landed everything it claims to
126
- have created. Run:
127
-
128
- ```bash
129
- ruby ~/.plastic/scripts/validate-project <slug>
130
- ```
131
-
132
- If this exits 0, proceed to step 13. If it exits non-zero, STOP: do not
133
- proceed to Announce. Read the `missing:` and error lines it printed to
134
- stderr, fix the named gap(s), for example:
135
-
136
- - missing `project.yml` or `INDEX.md` or `store/`: re-run
137
- `ruby ~/.plastic/scripts/provision-project-store <slug>` (step 7), then
138
- re-check
139
- - missing project-root `AGENTS.md`: repeat step 4 (populate AGENTS.md at the
140
- project root, not `~/.plastic/projects/<slug>/`)
141
- - project directory missing on disk: repeat step 2
142
- - not registered in projects.yml: repeat step 6
143
-
144
- Re-run `validate-project <slug>` after each fix until it exits 0. Only a
145
- project spawn that passes this self-check moves on to be announced as
146
- created. A spawn that never verifies itself is exactly the bug this step
147
- exists to close (intent 190; the intent-26 spawn shipped with no
148
- `project.yml` and no root `AGENTS.md`, caught only weeks later by a doctor
149
- sweep).
150
-
151
- ### 13. Announce
152
-
153
- Log in `## Insights` of each founding intent:
154
- > "Project `<slug>` created at `<path>`. Tactical mirror: `project-<slug>:1` (autonomous)"
155
-
156
- Announce to user:
157
- > "Project `<slug>` created at `<path>`. AGENTS.md populated with [N] decisions from [founding intent IDs]. Tactical mirror `1` is now the active intent in the project store."
158
-
159
- ## References
160
-
161
- - Read `references/project-scaffolding.md` before steps 4-6, for the AGENTS.md skeleton, the tactical mirror intent format, and the projects.yml registration block
162
- - Read `references/hubs-projects.md` for the full hub/project relationship model, project creation flow, and cross-linking conventions
@@ -1,55 +0,0 @@
1
- # Hubs and Projects
2
-
3
- ## Hubs
4
-
5
- A Hub is a cloud of intents around related topics. Hubs emerge naturally from
6
- Folgezettel branching — intents that spawn in the same direction cluster.
7
-
8
- - A Hub can spawn a Project. The Hub holds the founding ideas.
9
- - A single intent can also spawn a Project.
10
- - Hub-spawned projects revolve around different ideas around related topics.
11
- - Intent-spawned projects revolve around the single founding intent.
12
- - A Project is the deliverable outcome of one or more intents.
13
-
14
- Hubs are represented as clusters in INDEX.md.
15
-
16
- ## Projects — Full Detail
17
-
18
- A Project is a deliverable grouping of intents. Projects have two stores:
19
-
20
- - **Global store** (`~/.plastic/store/`): strategic intents
21
- - **Project store** (`~/.plastic/projects/{slug}/store/`): tactical intents
22
-
23
- `projects.yml` maps project slugs to codebase paths:
24
- ```yaml
25
- projects:
26
- plastic:
27
- path: "/path/to/plastic"
28
- remote: "git@github.com:org/plastic.git"
29
- registered: '2026-05-26'
30
- status: active
31
- ```
32
-
33
- Config resolution: `~/.plastic/projects/{slug}/config.yml` overrides `~/.plastic/config.yml`.
34
-
35
- Cross-linking: project intents reference global intents via `[[global:ID]]`. Global intents reference project intents via `[[project-slug:ID]]`.
36
-
37
- ## Privacy and Collaboration
38
-
39
- **Plastic is personal.** All intent data lives under `~/.plastic/` — one location,
40
- one git repo, never pushed. Each person has their own intent store.
41
-
42
- Collaboration happens through pull requests and project conventions, not shared intents.
43
- When an intent delivers something that changes how a project works, the decision gets
44
- written into the project's shared files (README, docs, config). The intents themselves
45
- are private working memory.
46
-
47
- ## Project Creation Flow
48
-
49
- When an implementation intent spawns a project:
50
- 1. Determine project path from config `project_roots` or intent context
51
- 2. `gh repo create --private` (agent-created repos are always private by default)
52
- 3. Set up project directory, git init, AGENTS.md with founding intent decisions
53
- 4. Register in `projects.yml`
54
- 5. Create tactical mirror in project store
55
- 6. The global intent completes; the tactical mirror becomes the active intent