@zalom/plastic 1.14.0 → 2.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/PLASTIC.md +101 -294
  2. package/README.md +5 -6
  3. package/agents/plastic-advisor.md +18 -17
  4. package/agents/plastic-enforcer.md +57 -69
  5. package/agents/plastic-executor.md +34 -20
  6. package/agents/plastic-faux-advisor.md +18 -18
  7. package/config_asks.yml +38 -0
  8. package/hooks/capture +4 -0
  9. package/hooks/check-update +12 -3
  10. package/hooks/close +5 -0
  11. package/hooks/hooks.json +9 -49
  12. package/hooks/record +4 -0
  13. package/package.json +3 -2
  14. package/scripts/agent-report +8 -9
  15. package/scripts/append-ledger +195 -0
  16. package/scripts/codex-hook +101 -95
  17. package/scripts/dashboard.rb +4 -4
  18. package/scripts/doctor.rb +106 -43
  19. package/scripts/end-intent +77 -76
  20. package/scripts/exec-worktree +11 -20
  21. package/scripts/file-session-intent +61 -0
  22. package/scripts/hook-capture +242 -0
  23. package/scripts/hook-close +34 -0
  24. package/scripts/hook-record +149 -0
  25. package/scripts/hook-session-start +95 -12
  26. package/scripts/install.rb +8 -6
  27. package/scripts/lib/agent_models.rb +1 -7
  28. package/scripts/lib/arm.rb +283 -0
  29. package/scripts/lib/backfill_intent.rb +316 -0
  30. package/scripts/lib/bridge.rb +24 -1597
  31. package/scripts/lib/doctor_core.rb +17 -88
  32. package/scripts/lib/doctor_session_ledger.rb +106 -0
  33. package/scripts/lib/exec_worktree.rb +14 -60
  34. package/scripts/lib/harness_text.rb +5 -4
  35. package/scripts/lib/hook_registry.rb +44 -107
  36. package/scripts/lib/insights.rb +3 -4
  37. package/scripts/lib/installer_core.rb +19 -30
  38. package/scripts/lib/lock.rb +6 -26
  39. package/scripts/lib/outcome_guard.rb +7 -5
  40. package/scripts/lib/project_validator.rb +30 -1
  41. package/scripts/lib/roadmap_queue.rb +3 -3
  42. package/scripts/lib/roadmap_savepoint.rb +1 -1
  43. package/scripts/lib/rule_catalog.rb +6 -3
  44. package/scripts/lib/savepoint.rb +320 -0
  45. package/scripts/lib/scaffold_intent.rb +13 -179
  46. package/scripts/lib/session_backfill.rb +184 -0
  47. package/scripts/lib/session_close.rb +84 -0
  48. package/scripts/lib/session_git.rb +469 -0
  49. package/scripts/lib/session_ledger.rb +497 -0
  50. package/scripts/lib/store_discovery.rb +1 -1
  51. package/scripts/lib/store_provisioning.rb +1 -1
  52. package/scripts/maintenance-run +7 -7
  53. package/scripts/new-intent +63 -4
  54. package/scripts/plastic-lock +94 -41
  55. package/scripts/promote-session-item +150 -0
  56. package/scripts/rebuild-graph +1 -1
  57. package/scripts/roadmap-next +2 -2
  58. package/scripts/rollback.rb +42 -3
  59. package/scripts/scaffold-intent +37 -63
  60. package/scripts/session-commit +116 -0
  61. package/scripts/spawn-preamble +5 -5
  62. package/scripts/update.rb +7 -3
  63. package/skills/agent-advisor/SKILL.md +3 -3
  64. package/skills/agent-advisor/references/advisor-protocol.md +20 -20
  65. package/skills/auto/SKILL.md +218 -317
  66. package/skills/auto/evals/evals.json +10 -10
  67. package/skills/auto/references/agent-architecture.md +102 -90
  68. package/skills/auto/references/agent-report-contract.md +4 -21
  69. package/skills/auto/references/end-tail.md +47 -53
  70. package/skills/auto/references/human-report-contract.md +8 -8
  71. package/skills/conventions/SKILL.md +1 -3
  72. package/skills/conventions/references/lifecycle-and-savepoints.md +35 -1
  73. package/skills/conventions/references/locks-and-worktrees.md +47 -55
  74. package/skills/conventions/references/maintenance-and-revisions.md +12 -12
  75. package/skills/dashboard/SKILL.md +1 -1
  76. package/skills/direct/SKILL.md +66 -0
  77. package/skills/direct/references/request-signals.md +59 -0
  78. package/skills/doctor/SKILL.md +58 -11
  79. package/skills/doctor/report.md +3 -1
  80. package/skills/install/SKILL.md +11 -9
  81. package/skills/intent-continuing/SKILL.md +131 -89
  82. package/skills/intent-continuing/references/boarding-matrix.md +34 -0
  83. package/skills/intent-continuing/references/context-management.md +2 -2
  84. package/skills/intent-creating/SKILL.md +2 -2
  85. package/skills/intent-creating/references/lifecycle.md +1 -1
  86. package/skills/intent-ending/SKILL.md +28 -37
  87. package/skills/intent-ending/evals/evals.json +4 -4
  88. package/skills/intent-executing/SKILL.md +12 -49
  89. package/skills/intent-executing/plan-reviewer-prompt.md +39 -0
  90. package/skills/intent-speccing/SKILL.md +108 -51
  91. package/skills/intent-speccing/evals/evals.json +5 -5
  92. package/skills/intent-speccing/references/per-section-fill-rules.md +4 -4
  93. package/skills/intent-speccing/references/self-verify-checklist.md +1 -2
  94. package/skills/project-creating/SKILL.md +1 -1
  95. package/skills/releasing/SKILL.md +7 -8
  96. package/skills/tutorial/SKILL.md +2 -2
  97. package/skills/tutorial/references/track-1-guided.md +16 -18
  98. package/skills/tutorial/references/track-2-auto.md +12 -13
  99. package/skills/tutorial/references/track-3-projects-and-roadmaps.md +2 -2
  100. package/templates/agents.md +4 -7
  101. package/templates/project.yml +7 -0
  102. package/templates/roadmap.md +1 -1
  103. package/templates/savepoint.md +2 -2
  104. package/templates/session-intent.md +29 -0
  105. package/agents/plastic-brainstorming.md +0 -48
  106. package/agents/plastic-future-intent-researcher.md +0 -35
  107. package/agents/plastic-intent-curator.md +0 -47
  108. package/agents/plastic-intent-discovery.md +0 -43
  109. package/agents/plastic-planner.md +0 -56
  110. package/agents/plastic-spec-specialist.md +0 -53
  111. package/hooks/auto-arm +0 -5
  112. package/hooks/bash-gate +0 -3
  113. package/hooks/continue +0 -31
  114. package/hooks/edit-gates +0 -3
  115. package/hooks/future-intent-check +0 -25
  116. package/hooks/gate-check +0 -12
  117. package/hooks/power-tools +0 -8
  118. package/scripts/hook-auto-arm +0 -51
  119. package/scripts/hook-bash-gate +0 -78
  120. package/scripts/hook-code-gate +0 -38
  121. package/scripts/hook-continue +0 -48
  122. package/scripts/hook-create-gate +0 -51
  123. package/scripts/hook-edit-gates +0 -58
  124. package/scripts/hook-future-intent-check +0 -90
  125. package/scripts/hook-gate-check +0 -169
  126. package/scripts/hook-links-gate +0 -54
  127. package/scripts/hook-lock-gate +0 -47
  128. package/scripts/hook-power-tools +0 -38
  129. package/scripts/hook-savepoint-pre +0 -32
  130. package/scripts/lib/codex_edit_gates.rb +0 -138
  131. package/scripts/lib/edit_gates.rb +0 -398
  132. package/scripts/lib/links_gate.rb +0 -140
  133. package/scripts/lib/qmd_hook.rb +0 -41
  134. package/scripts/lib/spec_header.rb +0 -83
  135. package/scripts/lib/start_intent.rb +0 -296
  136. package/scripts/start-intent +0 -89
  137. package/skills/_active-intent-gate.md +0 -26
  138. package/skills/auto/references/tiers.md +0 -100
  139. package/skills/continuing/SKILL.md +0 -34
  140. package/skills/continuing/evals/evals.json +0 -91
  141. package/skills/conventions/references/gates-and-enforcement.md +0 -53
  142. package/skills/conventions/references/tiers-and-dispatch.md +0 -135
  143. package/skills/doctor/references/gates-stuck-detection.md +0 -43
  144. package/skills/intent-brainstorming/SKILL.md +0 -118
  145. package/skills/intent-brainstorming/evals/evals.json +0 -67
  146. package/skills/intent-continuing/evals/evals.json +0 -145
  147. package/skills/intent-discovering/SKILL.md +0 -56
  148. package/skills/intent-grilling/SKILL.md +0 -108
  149. package/skills/intent-linking/SKILL.md +0 -128
  150. package/skills/intent-linking/evals/evals.json +0 -22
  151. package/skills/intent-linking/references/zettelkasten.md +0 -45
  152. package/skills/intent-locking/SKILL.md +0 -64
  153. package/skills/intent-planning/SKILL.md +0 -145
  154. package/skills/intent-planning/evals/evals.json +0 -81
  155. package/skills/intent-planning/references/plan-format.md +0 -130
  156. package/skills/intent-researching/SKILL.md +0 -123
  157. package/skills/intent-researching/evals/evals.json +0 -22
  158. package/skills/intent-savepoint/SKILL.md +0 -83
  159. package/skills/intent-savepoint/references/context-management.md +0 -32
  160. package/skills/intent-starting/SKILL.md +0 -151
  161. package/skills/intent-starting/evals/evals.json +0 -117
  162. package/skills/intent-starting/references/boarding-matrix.md +0 -35
  163. package/skills/project-continuing/SKILL.md +0 -119
  164. package/skills/project-continuing/evals/evals.json +0 -100
  165. package/skills/roadmap-continuing/SKILL.md +0 -89
  166. package/skills/roadmap-continuing/evals/evals.json +0 -82
  167. package/skills/skill-creating/SKILL.md +0 -75
  168. package/skills/skill-creating/evals/evals.json +0 -108
  169. package/skills/skill-creating/references/agents.md +0 -168
  170. package/skills/skill-creating/references/defaults-first.md +0 -23
  171. package/skills/skill-creating/references/evals.md +0 -41
  172. package/skills/skill-creating/references/hooks.md +0 -251
  173. package/skills/skill-creating/references/progressive-disclosure.md +0 -176
  174. package/skills/skill-creating/references/scripts.md +0 -166
  175. package/skills/skill-creating/references/skills.md +0 -169
  176. package/skills/skill-creating/scripts/scaffold.rb +0 -313
  177. package/skills/skill-evaluating/SKILL.md +0 -141
  178. package/skills/skill-evaluating/assets/eval-template.json +0 -12
  179. package/skills/skill-evaluating/evals/evals.json +0 -75
  180. package/skills/skill-evaluating/references/convention-checks.md +0 -76
  181. package/skills/skill-evaluating/references/eval-methodology.md +0 -154
  182. package/skills/store-curating/SKILL.md +0 -64
  183. package/skills/store-curating/evals/evals.json +0 -38
  184. package/skills/store-indexing/SKILL.md +0 -93
  185. package/skills/store-indexing/evals/evals.json +0 -22
  186. package/skills/store-indexing/references/zettelkasten-linking.md +0 -32
  187. package/skills/store-provisioning/SKILL.md +0 -55
  188. /package/skills/{project-continuing → intent-continuing}/references/board-fill.md +0 -0
  189. /package/skills/{roadmap-continuing → intent-continuing}/references/liveness-ranking.md +0 -0
  190. /package/skills/{intent-brainstorming → intent-speccing}/references/design-principles.md +0 -0
@@ -1,108 +0,0 @@
1
- ---
2
- name: plastic-intent-grilling
3
- description: >-
4
- Deep brainstorming that interviews the user relentlessly about a plan or design until reaching shared understanding.
5
- Use when user wants to stress-test a plan, get grilled on their design, or mentions "grill me".
6
- Pair with plastic-intent-brainstorming for quick ideation and use grill-me for thorough interrogation. If superpowers:brainstorming is installed it complements this skill, but it is not required.
7
- user-invocable: true
8
- ---
9
-
10
- # Grill Me — Deep Brainstorming
11
-
12
- You are about to interview the user relentlessly. This is NOT a quick brainstorm — it is a thorough interrogation of every assumption, dependency, and design decision until you reach shared understanding.
13
-
14
- ## Detect Mode
15
-
16
- **Coding mode** — the user is designing something that involves code (feature, architecture, refactor, system design):
17
- - You CAN and SHOULD explore the codebase to answer your own questions
18
- - Before asking "how does X work?", check if you can find out yourself
19
- - Ground your questions in what actually exists, not what you imagine
20
-
21
- **Non-coding mode** — the user is designing something conceptual (process, workflow, strategy, product):
22
- - No codebase to explore
23
- - Focus purely on the design tree
24
-
25
- ## Workflow
26
-
27
- ### 1. Identify the Root
28
-
29
- Ask: "What are we designing?" Get the one-sentence version. Restate it back to confirm.
30
-
31
- ### 2. Walk the Decision Tree
32
-
33
- For each branch of the design:
34
-
35
- 1. **State the branch** — "Let's talk about [aspect]."
36
- 2. **Ask your question** — Be specific. "How will X handle Y when Z happens?"
37
- 3. **Provide your recommended answer** — Always lead with what YOU think the answer should be, based on what you know. Let the user confirm, correct, or redirect.
38
- 4. **Resolve before moving on** — Do not leave ambiguity. If the user says "I'm not sure", help them decide. Push.
39
- 5. **Track dependencies** — If decision A affects decision B, say so. Resolve A first.
40
-
41
- ### 3. Be Relentless
42
-
43
- - Do NOT accept vague answers. "It depends" requires "on what?"
44
- - Do NOT skip edge cases. "What happens when the list is empty?"
45
- - Do NOT assume. If you think you know, verify.
46
- - Do NOT be polite at the expense of thoroughness. Friendly but unrelenting.
47
- - DO challenge the user's assumptions. "Why not [alternative]?"
48
- - DO synthesize as you go. After every 3-4 questions, summarize what's been decided.
49
-
50
- ### 4. Time Awareness
51
-
52
- This process is thorough. It typically takes 20-45 minutes for a complex design. At natural checkpoints (~every 10 questions), offer:
53
-
54
- > "We've covered [areas]. Still to explore: [areas]. Continue, or pause and capture what we have?"
55
-
56
- If the user wants to pause, capture all decisions made so far into the active intent's `## Context` / `### Decisions`, ready for /plastic-intent-speccing to consolidate later.
57
-
58
- ### 5. Close Out
59
-
60
- When all branches are resolved:
61
-
62
- 1. Record every ruling in the active intent's `## Context` / `### Decisions`, then hand off
63
- to /plastic-intent-speccing to consolidate them into `spec.md` (that skill owns
64
- `spec.md` exclusively)
65
- 2. List all decisions made
66
- 3. List any deferred items (things the user explicitly chose to decide later)
67
- 4. Proceed to Autonomous Handoff Offer (step 6)
68
-
69
- ### 6. Autonomous Handoff Offer
70
-
71
- After closing out (decisions listed, spec consolidated by /plastic-intent-speccing), assess whether the agent has enough context to deliver the intent autonomously.
72
-
73
- **Self-assessment checklist:**
74
- - All key decisions resolved (no open "it depends" or "TBD")
75
- - Scope is clear and bounded
76
- - Dependencies are identified
77
- - Success criteria are defined
78
-
79
- If ALL items pass, offer autonomous delivery:
80
-
81
- > "I have enough context to take this from here. Here's my understanding:
82
- >
83
- > **Decisions:** [list key decisions]
84
- > **Scope:** [one-line scope summary]
85
- > **Approach:** [high-level approach]
86
- >
87
- > Want to grill more, or should I go autonomous?"
88
-
89
- - If human says go → invoke `plastic-auto`
90
- - If human says grill more → continue grilling (reset to step 2)
91
- - If human says neither (wants to drive manually) → proceed as before (offer planning)
92
-
93
- This offer replaces the final question in Close Out ("Ready to plan implementation, or do you want another pass?"). The new options are:
94
- 1. Go autonomous (`plastic-auto`)
95
- 2. Grill more (continue interrogation)
96
- 3. Plan manually (invoke `superpowers:writing-plans` or proceed with human-driven planning)
97
-
98
- ## Relationship to superpowers:brainstorming
99
-
100
- | | superpowers:brainstorming | plastic-intent-grilling |
101
- |---|---|---|
102
- | Speed | Quick (5-10 min) | Thorough (20-45 min) |
103
- | Depth | Surface-level exploration | Exhaustive decision tree |
104
- | When | Starting ideation, exploring options | Stress-testing a design, resolving ambiguity |
105
- | Output | Initial spec | Battle-tested spec with all branches resolved |
106
- | Style | Collaborative, exploratory | Interrogative, relentless |
107
-
108
- Use `superpowers:brainstorming` to generate ideas. Use `plastic-intent-grilling` to pressure-test them.
@@ -1,128 +0,0 @@
1
- ---
2
- name: plastic-intent-linking
3
- description: Use when creating connections between intents, the user says "link" or "connect", or when discovering that two intents are related. Manages sources, chain, and cross-reference links.
4
- user-invocable: false
5
- ---
6
-
7
- # Linking Intents
8
-
9
- ## When to Use
10
- - During intent creation (automatic: ask about related intents)
11
- - User says "link", "connect", "relates to"
12
- - Agent discovers a relationship between intents during work
13
-
14
- ## Discovery and ranking are separate
15
-
16
- Two distinct steps, do not conflate them:
17
-
18
- 1. **Discovery** (finding candidate related intents) may use any tool: grep, find, ripgrep,
19
- or QMD/Serena when present (QMD-first per the project rule). Discovery casts a wide net.
20
- 2. **Ranking** the candidates is a CONTEXT-INFLUENCE judgement: read each candidate's `## Intent`
21
- and `## Context` and ask whether that context actually informed this intent. Ranking is NOT a
22
- structural metric (no shared-file or shared-symbol grading: on intent 90, matching whole files
23
- flagged 35 intents because ~20 touch `bridge.rb`). It is NOT a similarity score either (QMD
24
- relevance measures topic proximity, not influence). A script cannot make this call; an agent
25
- does.
26
-
27
- ## The three tiers (by context influence)
28
-
29
- Read `../plastic-conventions/references/knowledge-graph.md` for the full linking doctrine behind
30
- these tiers, the sources-versus-chain distinction, and the `## Links` projection. This path
31
- resolves relative to this skill's own installed directory.
32
-
33
- - **sources:** the foundational context that shaped this intent's CREATION (a split, an idea born
34
- during development, a merge). Earns an edge. Decided by origin, never inferred.
35
- - **chain:** the context that materially helps DELIVER this intent. HIGH bar: only the genuinely
36
- delivery-moving intents, not everything in the same area. Earns an edge, reflected in `## Links`.
37
- Worked example (intent 90): 79 created it so 79 is a source; 80 deferred the exact fix 90 makes,
38
- so its context directly helps delivery and 80 is chain; 49/66/73 are same-area background, so
39
- they get a shared tag and no link.
40
- - **tags:** loose theme grouping for search. NOT a link.
41
-
42
- **Timing.** The influence judgement happens at What/Why (and during upkeep), guided by this rule.
43
- It does not wait for code to exist; it is reasoning over the candidate's context, not over a diff.
44
-
45
- **Record the call.** For every edge an agent adds, store a rating (high / medium / low) plus a
46
- one-line reason as a dated line under the intent file's `## Insights` section (per 96 D3, link
47
- rationale lives in the intent file, not a side file). It stays out of frontmatter (graph only) and
48
- out of the projected `## Links` label, so the audit trail never breaks the projection identity.
49
-
50
- ## `## Links` is derived (never author it by hand)
51
-
52
- `## Links` is a DERIVED view of `sources` then `chain`, not a place to write links. Never
53
- hand-write a `## Links` line, and never auto-delete one. To add a link, add the frontmatter
54
- edge (below), then let the projection regenerate the section (`scripts/project-links`).
55
-
56
- Run `scripts/link-suggest <id>` to gather candidate intents WITH each one's Intent and Context (the
57
- evidence you judge influence on) and to flag drift (a `## Links` line with no frontmatter edge
58
- behind it). To record a confirmed edge plus its rating and reason, run it with
59
- `--record <id> --edge <sources|chain> --rating <high|medium|low> --reason "..." --confirm`. It never
60
- grades influence itself, never writes an edge without `--confirm`, and never deletes.
61
-
62
- ## Connection Types (the frontmatter edges)
63
-
64
- ### 1. Sources (Backward)
65
- The `sources` array in frontmatter. The direct ascendant(s) this intent was created from / emerged from the lifecycle of (formation, not topic similarity), backward links to the work it was built out of:
66
- ```yaml
67
- sources: ["1a", "1a2"]
68
- ```
69
-
70
- ### 2. Chain (Forward)
71
- The `chain` array in frontmatter. What this intent spawned AND related-but-not-spawned successors it leads to, forward links to children, follow-on, and related work:
72
- ```yaml
73
- chain: ["1b1", "1b2"]
74
- ```
75
-
76
- ### 3. Tags (for discovery, not links)
77
- Shared tags in frontmatter enable filtered discovery. Use `project-<name>` tags for project membership. A shared tag is a loose theme grouping: it earns NO edge.
78
- ```yaml
79
- tags: [plastic, project-reddit-kb]
80
- ```
81
-
82
- ## Workflow
83
-
84
- ### 1. Identify Intents to Connect
85
-
86
- QMD-first (when available): before scanning the store with grep/Read, run
87
- `ruby ~/.plastic/scripts/qmd-sync search "<terms>"` to surface candidate, prior, or related
88
- intents to propose as sources/chain, then open the authoritative intent file for any hit you act
89
- on. The command is a no-op when QMD is absent, so fall back to the directory scan below.
90
-
91
- Show existing intents by scanning the store's directory for intent files:
92
- ```bash
93
- for dir in $STORE_ROOT/store/*/; do
94
- f=$(find "$dir" -maxdepth 1 -name "*.md" ! -name "spec.md" ! -name "plan.md" ! -name "checklist.md" ! -name "outcome.md" ! -name "savepoint.md" | head -1)
95
- [ -n "$f" ] && ruby -ryaml -e '
96
- data = File.read(ARGV[0]).split("---")[1]
97
- parsed = YAML.safe_load(data)
98
- puts "#{parsed["id"]} | #{parsed["intent"]}" if parsed
99
- ' "$f" 2>/dev/null
100
- done
101
- ```
102
-
103
- ### 2. Choose Connection Type
104
- Ask the user which type of connection:
105
- - **source**: "this was CREATED FROM that" (D1). The reciprocal update is one-directional (I1): add the ascendant id to this intent's `sources[]` AND add this intent's id to the ascendant's `chain[]`. A merely-related (not-created-from) connection is NOT a source: record it on the predecessor's `chain[]` only, plus a `## Links` wikilink, with NO `sources` (the related-but-not-spawned rule).
106
- - **cross-reference**: "these are related" (add wikilink in `## Links` of both intents)
107
-
108
- ### 3. Apply Connection
109
-
110
- **For sources (a true created-from edge only):**
111
- Update frontmatter arrays on both intents (I1, two-sided):
112
- - Add the parent's ID to the child's `sources` array
113
- - Add the child's ID to the parent's `chain` array
114
-
115
- For the merely-related case, only the predecessor's `chain` (and both sides' `## Links`)
116
- get the link, never `sources`. `chain` is NOT strictly the reverse of `sources` (I2):
117
- relational `chain` entries are valid and must never be "corrected" by adding a reciprocal
118
- `sources`.
119
-
120
- **For cross-references:**
121
- Add a wikilink in the `## Links` section of **both** intents (bidirectional).
122
-
123
- ### 4. Update INDEX.md Clusters
124
- If both intents share a topic, ensure they're in the same cluster.
125
-
126
- ## References
127
-
128
- - Read `references/zettelkasten.md` for the three Zettelkasten structures (Folgezettel, directed graph, tags), ID encoding rules, and dual-mode (Obsidian + programmatic) design
@@ -1,22 +0,0 @@
1
- {
2
- "skill_name": "plastic-intent-linking",
3
- "notes": "Intent 66a. Spec for the QMD-first discovery step (surface candidate/related intents to propose as sources/chain before grep/Read). Runner is intent 76; this case is a spec, not executed.",
4
- "evals": [
5
- {
6
- "id": 1,
7
- "scope": "behavior",
8
- "set": "validation",
9
- "prompt": "QMD is present. The user says: link this intent to the related upload-pipeline work.",
10
- "expected_output": "Before scanning the store directory with grep/Read to identify related intents, runs `ruby ~/.plastic/scripts/qmd-sync search \"upload pipeline\"` to surface candidate or related intents to propose as sources/chain, then opens the authoritative intent file for any hit it links. No-op fallback to the directory scan when QMD is absent.",
11
- "files": [],
12
- "assertions": [
13
- {
14
- "type": "human",
15
- "check": "qmd-sync search is run before the directory scan; authoritative file opened for any hit before proposing sources/chain",
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
- }
@@ -1,45 +0,0 @@
1
- # Zettelkasten Structure
2
-
3
- Plastic implements three Zettelkasten structures:
4
-
5
- | Structure | Implementation | Purpose |
6
- |---|---|---|
7
- | Folgezettel (linked list) | `sources` + `chain` in frontmatter | Sequential provenance |
8
- | Directed graph (web of notes) | `## Links` with wikilinks | Obsidian navigation |
9
- | Tag-based taxonomy | `tags` in frontmatter | Topic grouping |
10
-
11
- INDEX.md is a structure note (hub), not a table of contents.
12
-
13
- `## Links` mirrors the frontmatter graph exactly. Each entry is
14
- `- [[id--slug|<target's full intent: text>]]` (cross-store: `- [[store:id--slug|...]]`),
15
- a clickable `id--slug` target with the target's full `intent:` text as the label.
16
- Ordering is mandatory: all `sources` first (top), then all `chain`, frontmatter order
17
- preserved within each group. Sources never appear at the end. No source/chain tags, no
18
- sub-grouping. An intent with empty `sources` and `chain` carries the empty-state comment.
19
-
20
- ## Folgezettel IDs
21
-
22
- IDs encode lineage using Luhmann's alternating convention:
23
- - Root intents: sequential numbers (`1`, `2`, `3`...)
24
- - Branches alternate letters and numbers: `1` → `1a` → `1a1` → `1a1a` → ...
25
- - Multiple branches from the same parent increment: `1a`, `1b`, `1c`
26
- - IDs are assigned at creation time and never change
27
-
28
- ## Knowledge Graph
29
-
30
- `sources` and `chain` form the directed knowledge graph:
31
- - `sources` = the direct ascendant(s) this intent was created from / emerged from the
32
- lifecycle of (formation, not topic similarity); a DAG (acyclic), strong must-load context.
33
- - `chain` = forward continuations AND related-but-not-spawned successors it leads to; a
34
- directed graph that may cycle, lighter contributory context.
35
- - Reciprocity is one-directional: every `sources` edge has a reciprocal `chain` entry (I1),
36
- but `chain` may carry relational entries with no reciprocal `sources` (I2), so the graph is
37
- NOT strictly double-linked.
38
-
39
- ## Dual-Mode
40
-
41
- This store works in two modes without modification:
42
- - **Obsidian** (human, offline) — browse, link, write markdown
43
- - **Programmatic** (any agent) — read/write via filesystem operations
44
-
45
- No special tooling required for either mode.
@@ -1,64 +0,0 @@
1
- ---
2
- name: plastic-intent-locking
3
- description: Inspect, repair, release, or reclaim an intent's delivery lock. Use when a lock-gate deny names /plastic-lock, when resuming interrupted work after a crash, reboot, or /tmp wipe, when a lock reads held or stale, or when the user says "fix the lock", "who holds the lock", or "reclaim the lock".
4
- user-invocable: false
5
- ---
6
-
7
- # Plastic Lock
8
-
9
- Command-only wrapper around `~/.plastic/scripts/plastic-lock`. The durable
10
- delivery lock is a `delivery.lock` file in the intent directory: ownership is
11
- session-keyed, liveness is a lease (the owner's hooks refresh the file mtime;
12
- stale means the heartbeat is older than the TTL). The /tmp bridge is only a
13
- cache; the lock file wins every disagreement.
14
-
15
- Read `../plastic-conventions/references/locks-and-worktrees.md` for delivery isolation in full:
16
- the single-owner lock, claims, worktrees, solo mode, and the station ledger behind every verb
17
- below. This path resolves relative to this skill's own installed directory.
18
-
19
- ## Verbs
20
-
21
- Run from the project (the intent resolves from this session's bridge), or pass
22
- `--intent-dir` explicitly:
23
-
24
- | Verb | What it does | When |
25
- |---|---|---|
26
- | `who` | Print a compact owner, heartbeat, claim, and delegate view from durable files only | Safe human inspection; requires `--intent-dir` |
27
- | `status` | Report the lock file, bridge cache, freshness, agreement | Always safe; run first |
28
- | `fix` | Idempotent repair: rebuild lock + bridge from disk truth for THIS session. Never touches a fresh foreign lock | Interrupted work, corrupted state, /tmp wiped, legacy pid locks |
29
- | `release` | Owner clears the lock | Ending or abandoning a boarding |
30
- | `reclaim` | Explicit takeover of a STALE lock; appends an audit line to savepoint.md | The owner is gone and the lease expired |
31
- | `delegate` | Owner registers a subagent session and optional provenance, or marks it `finished`/`failed` | Auto-mode orchestration |
32
-
33
- ```
34
- ruby ~/.plastic/scripts/plastic-lock status
35
- ruby ~/.plastic/scripts/plastic-lock who --intent-dir <store>/<id>--<slug>
36
- ruby ~/.plastic/scripts/plastic-lock fix --intent-dir <store>/<id>--<slug>
37
- ruby ~/.plastic/scripts/plastic-lock reclaim --intent-dir <store>/<id>--<slug>
38
- ruby ~/.plastic/scripts/plastic-lock delegate --delegate <subagent-session-id> \
39
- --harness codex --agent plastic-executor --model <model> --thread <thread-id>
40
- ruby ~/.plastic/scripts/plastic-lock delegate --delegate <subagent-session-id> --status finished
41
- ```
42
-
43
- When the current controller knows its provenance, `fix` and `reclaim` accept
44
- `--harness`, `--agent`, `--model`, `--thread`, and `--mode auto|guided`.
45
- Provenance is descriptive; the session remains the authorization identity.
46
-
47
- ## Rules
48
-
49
- - `fix` exits non-zero when another session holds a FRESH lock: back off, do
50
- not retry in a loop. `status` shows the owner.
51
- - `who` is strictly read-only. It reads `delivery.lock`, its mtime, and claim
52
- files; it never reads or repairs a bridge, searches transcripts, heartbeats,
53
- or writes. Missing legacy provenance displays as `Unknown` rather than being
54
- inferred.
55
- - The `delivery.lock` file mtime is the sole heartbeat and freshness truth.
56
- Provenance timestamps do not replace it.
57
- - Only the lock owner may register delegates or mark them `finished` or
58
- `failed`. Terminal status is observational and does not remove the delegate
59
- session from the authorization list. Finished and failed activity history is
60
- bounded to the 20 most recent terminal entries.
61
- - `reclaim` refuses a fresh lock. There is no silent reclaim anywhere; every
62
- takeover is audited in the intent's savepoint.md.
63
- - Acquiring a lock for new work is NOT this skill's job: board through
64
- `/plastic-intent-starting`, which calls the same repair internally.
@@ -1,145 +0,0 @@
1
- ---
2
- name: plastic-intent-planning
3
- description: "Write implementation plans from a spec. Produces plan.md, checklist.md, and at least one real actions/ACTION_N.md (every tier) in the active intent directory."
4
- user-invocable: true
5
- ---
6
-
7
- # Writing Plans
8
-
9
- ## Overview
10
-
11
- Write comprehensive implementation plans assuming the engineer has zero context for our codebase and questionable taste. Document everything they need to know: which files to touch for each task, code, testing, docs they might need to check, how to test it. Give them the whole plan as bite-sized tasks. DRY. YAGNI. TDD. Frequent commits.
12
-
13
- Assume they are a skilled developer, but know almost nothing about our toolset or problem domain. Assume they don't know good test design very well.
14
-
15
- ## Active Intent Gate
16
-
17
- Before proceeding, resolve the active intent:
18
-
19
- 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/`.
20
- 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"
21
- 3. **Resolve intent directory:** `{store}/store/{id}--{slug}/`
22
- 4. **Read spec:** Load `{intent_dir}/spec.md`. If no spec exists → refuse: "No spec found. Run /plastic-intent-speccing first."
23
-
24
- All artifacts go to the intent directory. Never write to external paths.
25
-
26
- ## Scope Check
27
-
28
- If the spec covers multiple independent subsystems, it should have been broken into sub-project specs during brainstorming. If it wasn't, suggest breaking this into separate plans, one per subsystem. Each plan should produce working, testable software on its own.
29
-
30
- ## Tier shapes
31
-
32
- Read `../plastic-conventions/references/tiers-and-dispatch.md` for tier sizing and the
33
- stage-to-agent dispatch rules behind this section. This path resolves relative to this skill's own
34
- installed directory.
35
-
36
- Read the spec's stamped `Tier:` line (written by intent-speccing) and pick the action shape it calls for. Every tier produces at least one REAL action file in `actions/`; the tier only changes how many:
37
-
38
- - **S or M (default):** write ONE consolidated `actions/ACTION_1.md` that carries the whole ordered delivery (the steps plus the exact changes). `plan.md` still holds the overall map and `checklist.md` still mirrors the task list. You may split into a few action files when that reads cleaner, but one real action file is the floor.
39
- - **L (many independent tasks, dispatched in parallel):** self-contained `actions/ACTION_N.md`, one per task, each readable without the plan (see `references/plan-format.md`).
40
-
41
- A `.gitkeep` never counts as an action, and an empty `actions/` fails the How gate at every tier. At S/M, keep it to a single consolidated action file rather than one-per-task; over-splitting a small intent is the S/M failure mode, an empty `actions/` is the tier-wide one.
42
-
43
- ## File Structure
44
-
45
- Before defining tasks, map out which files will be created or modified and what each one is responsible for. This is where decomposition decisions get locked in.
46
-
47
- - Design units with clear boundaries and well-defined interfaces. Each file should have one clear responsibility.
48
- - You reason best about code you can hold in context at once, and your edits are more reliable when files are focused. Prefer smaller, focused files over large ones that do too much.
49
- - Files that change together should live together. Split by responsibility, not by technical layer.
50
- - In existing codebases, follow established patterns. If the codebase uses large files, don't unilaterally restructure - but if a file you're modifying has grown unwieldy, including a split in the plan is reasonable.
51
-
52
- This structure informs the task decomposition. Each task should produce self-contained changes that make sense independently.
53
-
54
- ## Bite-Sized Task Granularity
55
-
56
- Granularity follows the `Tier:` line the spec stamped.
57
-
58
- **At M or L, each step is one action (2-5 minutes):**
59
- - "Write the failing test" - step
60
- - "Run it to make sure it fails" - step
61
- - "Implement the minimal code to make the test pass" - step
62
- - "Run the tests and make sure they pass" - step
63
- - "Commit" - step
64
-
65
- **At S, size each step to the work.** Do not slice a small delivery into fixed 2-5 minute steps. Keep steps coarse enough to read in one pass, and let the one consolidated `actions/ACTION_1.md` carry the whole delivery. Each step still names its exact file paths, its exact changes, and how it is verified. Only the slicing relaxes.
66
-
67
- This changes granularity, nothing else. Every tier still produces at least one real `actions/ACTION_N.md`, and an empty or `.gitkeep`-only `actions/` still fails the How gate (see `## Tier shapes` above).
68
-
69
- ## Plan Format
70
-
71
- For the exact plan/task/checklist/action format (the Plan Document Header
72
- template, the full Task Structure worked example, and the checklist.md /
73
- actions/ACTION_N.md templates), read `references/plan-format.md` before
74
- writing plan.md. Every plan starts with the header template and decomposes
75
- into tasks matching the Task Structure shape.
76
-
77
- ## No Placeholders
78
-
79
- Every step must contain the actual content an engineer needs. These are **plan failures**, never write them:
80
- - "TBD", "TODO", "implement later", "fill in details"
81
- - "Add appropriate error handling" / "add validation" / "handle edge cases"
82
- - "Write tests for the above" (without actual test code)
83
- - "Similar to Task N" (repeat the code; the engineer may be reading tasks out of order)
84
- - Steps that describe what to do without showing how (code blocks required for code steps)
85
- - References to types, functions, or methods not defined in any task
86
-
87
- ## Remember
88
- - Exact file paths always
89
- - Complete code in every step: if a step changes code, show the code
90
- - Exact commands with expected output
91
- - DRY, YAGNI, TDD, frequent commits
92
-
93
- ## Self-Review
94
-
95
- After writing the complete plan, look at the spec with fresh eyes and check the plan against it. This is a checklist you run yourself, not a subagent dispatch.
96
-
97
- **1. Spec coverage:** Skim each section/requirement in the spec. Can you point to a task that implements it? List any gaps.
98
-
99
- **2. Placeholder scan:** Search your plan for red flags, any of the patterns from the "No Placeholders" section above. Fix them.
100
-
101
- **3. Type consistency:** Do the types, method signatures, and property names you used in later tasks match what you defined in earlier tasks? A function called `clear_layers` in Task 3 but `clear_full_layers` in Task 7 is a bug.
102
-
103
- If you find issues, fix them inline. No need to re-review, just fix and move on. If you find a spec requirement with no task, add the task.
104
-
105
- ## Plastic Artifacts
106
-
107
- After writing `plan.md`, create `checklist.md` (execution registry following the
108
- FORM: `## In Progress`, `## Completed`, `## Session Log`) and at least one real
109
- `actions/ACTION_N.md` (self-contained, in an `actions/` directory inside the intent
110
- directory). At S/M write one consolidated `actions/ACTION_1.md`; at L write one
111
- `actions/ACTION_N.md` per task (see Tier shapes above). For the exact format of
112
- both, read `references/plan-format.md`.
113
-
114
- ## Owner-decision hard-gate items
115
-
116
- When a task depends on an owner decision that must be made before any code edit
117
- happens (a destructive step, a structural ruling, a merge that must land first),
118
- add a checklist item prefixed `[ORCHESTRATOR]` that names the decision and states
119
- plainly that it blocks all code edits until the owner rules on it. Order these
120
- items first: destructive or structural rulings apply before the sweeping edits
121
- that depend on them.
122
-
123
- When collecting owner rulings for `[ORCHESTRATOR]` hard-gate items, read
124
- `~/.plastic/_decision-tables.md` and follow the numbered-table procedure.
125
-
126
- ## Gate position
127
-
128
- - **Before:** `spec.md` exists.
129
- - **Produces:** `plan.md`, `checklist.md`, and at least one real `actions/ACTION_N.md` (every tier; one consolidated file at S/M, one per task at L).
130
- - **Next:** /plastic-intent-executing.
131
-
132
- Read `../plastic-conventions/references/lifecycle-and-savepoints.md` for the subagent
133
- report-home contract this handoff relies on.
134
-
135
- ## Git Commit
136
-
137
- After writing all artifacts (plan.md, checklist.md, and the actions/ACTION_N.md files), commit to the store:
138
-
139
- ```bash
140
- cd {store_root} && git add . && git commit -m "docs: plan for intent {id}: {name}"
141
- ```
142
-
143
- ## Execution Handoff
144
-
145
- Plan complete. Invoke `plastic-intent-executing` to begin execution.
@@ -1,81 +0,0 @@
1
- {
2
- "skill_name": "plastic-intent-planning",
3
- "notes": "Intent 164, updated by 133a. Evals for the writing-plans skill: action-file enforcement at every tier (S/M consolidate the delivery into one real actions/ACTION_1.md, L writes one actions/ACTION_N.md per task) and the checklist FORM plus [ORCHESTRATOR] hard-gate item convention. All assertions are pending a real observed run per the plastic-evaluating-skills convention.",
4
- "evals": [
5
- {
6
- "id": 1,
7
- "scope": "behavior",
8
- "set": "train",
9
- "prompt": "spec.md is stamped Tier: M and describes a single subsystem change touching four files across two tasks. Write the plan.",
10
- "expected_output": "Produces plan.md plus checklist.md plus at least one real actions/ACTION_N.md. At M the planner consolidates the whole delivery into a single actions/ACTION_1.md (it may split into a few files if that reads cleaner); the actions/ directory is never left empty or .gitkeep-only. checklist.md mirrors plan.md's task list.",
11
- "files": [],
12
- "assertions": [
13
- {
14
- "type": "code",
15
- "check": "at least one real (non-empty, non-.gitkeep) file exists under actions/ for this intent; checklist.md exists and mirrors plan.md's task list",
16
- "result": "expect-pass"
17
- }
18
- ]
19
- },
20
- {
21
- "id": 2,
22
- "scope": "behavior",
23
- "set": "train",
24
- "prompt": "spec.md is stamped Tier: S and describes a single-file config change. Write the plan.",
25
- "expected_output": "Produces plan.md plus checklist.md plus one consolidated actions/ACTION_1.md carrying the whole ordered delivery (the steps plus the exact changes). The actions/ directory is never left empty or .gitkeep-only, matching the every-tier action-file rule.",
26
- "files": [],
27
- "assertions": [
28
- {
29
- "type": "code",
30
- "check": "at least one real (non-empty, non-.gitkeep) actions/ACTION_N.md exists under actions/ for this intent; no empty or .gitkeep-only actions/ dir remains",
31
- "result": "expect-pass"
32
- }
33
- ]
34
- },
35
- {
36
- "id": 3,
37
- "scope": "behavior",
38
- "set": "train",
39
- "prompt": "spec.md is stamped Tier: L and describes a cross-cutting redesign decomposed into eight independent tasks meant to be dispatched to separate subagents in parallel. Write the plan.",
40
- "expected_output": "Produces self-contained actions/ACTION_N.md, one file per task, each readable without the plan (full task text, code, and commands copied in). checklist.md has one item per task.",
41
- "files": [],
42
- "assertions": [
43
- {
44
- "type": "code",
45
- "check": "actions/ directory contains one ACTION_N.md per task; each action file is self-contained (no bare references like \"see Task 3\" without the content)",
46
- "result": "expect-pass"
47
- }
48
- ]
49
- },
50
- {
51
- "id": 4,
52
- "scope": "behavior",
53
- "set": "validation",
54
- "prompt": "spec.md names an owner decision (whether to delete or archive a legacy table) that must be ruled on before any code edit in the plan can proceed. Write the plan.",
55
- "expected_output": "checklist.md includes a checklist item prefixed [ORCHESTRATOR] that names the owner decision and states it blocks all code edits until the owner rules; this item is ordered before the sweeping edit tasks that depend on it. checklist.md follows the FORM: ## In Progress, ## Completed (empty), ## Session Log with Date | Items Completed | Notes columns.",
56
- "files": [],
57
- "assertions": [
58
- {
59
- "type": "human",
60
- "check": "an [ORCHESTRATOR] item exists, names the decision, states it blocks code edits, and precedes dependent tasks; checklist.md has the three FORM sections in the right shape",
61
- "result": "expect-pass"
62
- }
63
- ]
64
- },
65
- {
66
- "id": 5,
67
- "scope": "behavior",
68
- "set": "validation",
69
- "prompt": "spec.md is stamped Tier: S. A prior draft left actions/ with only a .gitkeep. Write the plan and its actions.",
70
- "expected_output": "Writes at least one real actions/ACTION_1.md (non-empty, not the placeholder sentinel, not a .gitkeep) that consolidates the whole S-tier delivery. Leaving actions/ empty or .gitkeep-only is a plan failure that would block the How gate; the planner never does this at any tier.",
71
- "files": [],
72
- "assertions": [
73
- {
74
- "type": "code",
75
- "check": "actions/ contains at least one real action file (non-empty *.md, first line not the placeholder sentinel); no .gitkeep-only or empty actions/ dir remains",
76
- "result": "expect-pass"
77
- }
78
- ]
79
- }
80
- ]
81
- }