@zalom/plastic 1.0.2 → 1.1.0
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 +37 -7
- package/README.md +47 -0
- package/agents/plastic-enforcer.md +3 -3
- package/agents/plastic-intent-curator.md +9 -10
- package/agents/plastic-intent-discovery.md +1 -0
- package/agents/plastic-spec-specialist.md +9 -6
- package/bin/plastic.js +2 -2
- package/package.json +1 -1
- package/scripts/dashboard.rb +2 -2
- package/scripts/doctor.rb +55 -7
- package/scripts/end-intent +330 -0
- package/scripts/hook-code-gate +1 -1
- package/scripts/hook-continue +1 -1
- package/scripts/hook-create-gate +2 -2
- package/scripts/hook-session-start +1 -1
- package/scripts/lib/bridge.rb +46 -13
- package/scripts/lib/dashboard_banner.rb +1 -1
- package/scripts/lib/installer_core.rb +8 -6
- package/scripts/lib/lock.rb +3 -3
- package/scripts/lib/store_provisioning.rb +1 -1
- package/scripts/new-intent +1 -1
- 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 +48 -64
- package/skills/auto/evals/evals.json +4 -4
- package/skills/auto/references/agent-architecture.md +2 -2
- package/skills/auto/references/agent-report-contract.md +3 -0
- package/skills/dashboard/SKILL.md +3 -2
- package/skills/doctor/SKILL.md +4 -3
- package/skills/humanizer/SKILL.md +1 -0
- package/skills/install/SKILL.md +2 -1
- package/skills/{brainstorming → intent-brainstorming}/SKILL.md +44 -45
- package/skills/intent-brainstorming/evals/evals.json +67 -0
- package/skills/{brainstorming → intent-brainstorming}/references/design-principles.md +12 -17
- package/skills/{continuing → intent-continuing}/SKILL.md +4 -3
- package/skills/{continuing → intent-continuing}/evals/evals.json +24 -24
- package/skills/{creating-intent → intent-creating}/SKILL.md +4 -3
- package/skills/{creating-intent → intent-creating}/evals/evals.json +1 -1
- package/skills/{intent-discovery → intent-discovering}/SKILL.md +3 -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 +76 -15
- package/skills/intent-executing/evals/evals.json +66 -0
- package/skills/{brainstorming-grill-me → intent-grilling}/SKILL.md +5 -4
- package/skills/{linking-intents → intent-linking}/SKILL.md +2 -1
- package/skills/{linking-intents → intent-linking}/evals/evals.json +1 -1
- package/skills/{lock → intent-locking}/SKILL.md +2 -1
- package/skills/{writing-plans → intent-planning}/SKILL.md +49 -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 +5 -2
- package/skills/{research → intent-researching}/evals/evals.json +1 -1
- package/skills/{savepoint → intent-savepoint}/SKILL.md +2 -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 +3 -2
- package/skills/intent-starting/evals/evals.json +2 -2
- package/skills/{creating-project → project-creating}/SKILL.md +3 -2
- package/skills/releasing/SKILL.md +19 -14
- package/skills/roadmap/SKILL.md +1 -0
- package/skills/{versions → rollback}/SKILL.md +31 -20
- package/skills/{creating-skills → skill-creating}/SKILL.md +3 -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/{creating-skills → skill-creating}/references/skills.md +1 -0
- package/skills/{evaluating-skills → skill-evaluating}/SKILL.md +2 -1
- package/skills/{evaluating-skills → skill-evaluating}/evals/evals.json +3 -3
- package/skills/{intent-curator → store-curating}/SKILL.md +7 -7
- package/skills/{intent-curator → store-curating}/evals/evals.json +1 -1
- package/skills/{managing-index → store-indexing}/SKILL.md +7 -7
- package/skills/{managing-index → store-indexing}/evals/evals.json +1 -1
- package/skills/{add-project-store → store-provisioning}/SKILL.md +3 -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 +1 -0
- package/skills/update/SKILL.md +2 -1
- package/templates/agents.md +7 -7
- package/skills/brainstorming/evals/evals.json +0 -22
- /package/skills/{continuing → intent-continuing}/references/context-management.md +0 -0
- /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/{savepoint → 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}/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
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "plastic-intent-planning",
|
|
3
|
+
"notes": "Intent 164. New evals.json for the writing-plans skill: tier-shape enforcement (S/M inline vs L actions/) 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 an inline plan-as-checklist: all tasks with rationale live directly in plan.md, and checklist.md mirrors the task list. No actions/ACTION_N.md files are created; the actions/ directory stays empty or absent.",
|
|
11
|
+
"files": [],
|
|
12
|
+
"assertions": [
|
|
13
|
+
{
|
|
14
|
+
"type": "code",
|
|
15
|
+
"check": "no files created 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 an inline plan-as-checklist. No actions/ files are created, matching the S/M default.",
|
|
26
|
+
"files": [],
|
|
27
|
+
"assertions": [
|
|
28
|
+
{
|
|
29
|
+
"type": "code",
|
|
30
|
+
"check": "no files created under actions/ for this intent",
|
|
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
|
+
}
|
|
@@ -18,7 +18,7 @@ plan.md so the shape matches on the first pass.
|
|
|
18
18
|
```markdown
|
|
19
19
|
# [Feature Name] Implementation Plan
|
|
20
20
|
|
|
21
|
-
> **For agentic workers:** Use `plastic-executing
|
|
21
|
+
> **For agentic workers:** Use `plastic-intent-executing` to implement this plan task-by-task.
|
|
22
22
|
|
|
23
23
|
**Goal:** [One sentence describing what this builds]
|
|
24
24
|
|
|
@@ -26,7 +26,10 @@ plan.md so the shape matches on the first pass.
|
|
|
26
26
|
|
|
27
27
|
**Tech Stack:** [Key technologies/libraries]
|
|
28
28
|
|
|
29
|
-
**Intent:** {id}
|
|
29
|
+
**Intent:** {id}: {name}
|
|
30
|
+
|
|
31
|
+
**Tier:** S|M|L, copied from the spec's stamped `Tier:` line. S and M plans are
|
|
32
|
+
inline plan-as-checklist (no `actions/`); L plans use `actions/ACTION_N.md`.
|
|
30
33
|
|
|
31
34
|
---
|
|
32
35
|
```
|
|
@@ -78,25 +81,46 @@ git commit -m "feat: add specific feature"
|
|
|
78
81
|
|
|
79
82
|
## checklist.md format
|
|
80
83
|
|
|
81
|
-
Execution registry with one checkbox per task
|
|
84
|
+
Execution registry with one checkbox per task, following this FORM regardless
|
|
85
|
+
of tier (S, M, or L):
|
|
82
86
|
|
|
83
87
|
```markdown
|
|
84
|
-
# Checklist
|
|
88
|
+
# Checklist: {name}
|
|
85
89
|
|
|
90
|
+
## In Progress
|
|
86
91
|
- [ ] Task 1: {task title}
|
|
87
92
|
- [ ] Task 2: {task title}
|
|
88
93
|
- [ ] Task 3: {task title}
|
|
89
|
-
|
|
94
|
+
|
|
95
|
+
## Completed
|
|
96
|
+
(empty at plan time; move each item here, checked, the moment its task lands)
|
|
97
|
+
|
|
98
|
+
## Session Log
|
|
99
|
+
| Date | Items Completed | Notes |
|
|
100
|
+
|------|-----------------|-------|
|
|
90
101
|
```
|
|
91
102
|
|
|
103
|
+
- `## In Progress` holds every unchecked task, in plan order.
|
|
104
|
+
- `## Completed` starts empty. As execution lands a task, move its item here
|
|
105
|
+
(checked) instead of leaving a checked box under `## In Progress`.
|
|
106
|
+
- `## Session Log` gets one row per work session: the date, which items
|
|
107
|
+
completed, and any deviation or finding worth recording.
|
|
108
|
+
- An owner-decision hard-gate item (see the parent SKILL.md's
|
|
109
|
+
`## Owner-decision hard-gate items`) is a normal checklist item prefixed
|
|
110
|
+
`[ORCHESTRATOR]`; it lives under `## In Progress` until the owner rules, then
|
|
111
|
+
moves to `## Completed` like any other item.
|
|
112
|
+
|
|
92
113
|
## actions/ACTION_N.md format
|
|
93
114
|
|
|
94
|
-
|
|
115
|
+
L tier only. S and M plans skip this file type entirely; their tasks live
|
|
116
|
+
inline in `plan.md` (see the parent SKILL.md's `## Tier shapes`).
|
|
117
|
+
|
|
118
|
+
One file per task. Each action is self-contained: a subagent can execute it without reading the plan.
|
|
95
119
|
|
|
96
120
|
```markdown
|
|
97
121
|
# Action {N}: {task title}
|
|
98
122
|
|
|
99
|
-
{Full task text copied from plan.md
|
|
123
|
+
{Full task text copied from plan.md: all steps, all code, all commands. Nothing omitted.}
|
|
100
124
|
```
|
|
101
125
|
|
|
102
126
|
Create the `actions/` directory inside the intent directory: `{intent_dir}/actions/`
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: plastic-
|
|
2
|
+
name: plastic-intent-researching
|
|
3
3
|
description: "Research a topic for the active intent. Agent decides shallow vs deep based on scope. Produces reports in the intent's resources/ directory."
|
|
4
|
+
user-invocable: true
|
|
4
5
|
---
|
|
5
6
|
|
|
6
7
|
# Research
|
|
@@ -14,7 +15,7 @@ Investigate a topic related to the active intent. Choose the right depth, produc
|
|
|
14
15
|
Before proceeding, resolve the active intent:
|
|
15
16
|
|
|
16
17
|
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/`.
|
|
17
|
-
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
|
|
18
|
+
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"
|
|
18
19
|
3. **Resolve intent directory:** `{store}/store/{id}--{slug}/`
|
|
19
20
|
|
|
20
21
|
## Check Prior Work First
|
|
@@ -81,6 +82,8 @@ Examples:
|
|
|
81
82
|
|
|
82
83
|
### Report Structure
|
|
83
84
|
|
|
85
|
+
Default to tabular-first per `PLASTIC.md` (## Tabular-First Reporting, intent 160): tables for findings and comparisons, prose for simple summaries.
|
|
86
|
+
|
|
84
87
|
```markdown
|
|
85
88
|
# {Type}: {Topic}
|
|
86
89
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: plastic-savepoint
|
|
2
|
+
name: plastic-intent-savepoint
|
|
3
3
|
description: Use when verifying or repairing an intent's savepoint ledger, when the user says "save" or "savepoint", or when a PreCompact hook fires. The ledger is written automatically by the gate hook at each lifecycle boundary; this skill only reads, verifies, and rebuilds it.
|
|
4
|
+
user-invocable: false
|
|
4
5
|
---
|
|
5
6
|
|
|
6
7
|
# Savepoint
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plastic-intent-speccing
|
|
3
|
+
description: >
|
|
4
|
+
Consolidate the enriched Why (`## Context`, `### Decisions`, `## Insights`) into `spec.md`
|
|
5
|
+
through a deterministic, judgment-free numbered sequence. Use when the user types the command
|
|
6
|
+
to turn the brainstorm into a spec, asks to "write the spec", "spec this intent", "consolidate
|
|
7
|
+
into spec.md", or the active intent is at Why with enough Decisions on record to close it out.
|
|
8
|
+
Also fires on an indirect request that never names spec.md, such as "turn what we just
|
|
9
|
+
discussed into the contract the planner builds from." Distinct from `plastic-intent-brainstorming`
|
|
10
|
+
(the exploration that produces the enriched Why, upstream of this skill) and
|
|
11
|
+
`plastic-intent-planning` (turns an existing spec.md into plan.md for How, downstream of this
|
|
12
|
+
skill).
|
|
13
|
+
user-invocable: true
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Intent Speccing
|
|
17
|
+
|
|
18
|
+
Consolidate the enriched Why into `spec.md` through eight fixed steps, one action per step. The
|
|
19
|
+
next action is never a judgment call: when a section cannot be filled from what is on record,
|
|
20
|
+
step 5 is to stop and ask, never invent.
|
|
21
|
+
|
|
22
|
+
## Precondition
|
|
23
|
+
|
|
24
|
+
Run only when the active intent is at Why (its `## Intent` and enriched `## Context` plus
|
|
25
|
+
`### Decisions` exist, `spec.md` does not yet exist or is being redone) and the user has asked to
|
|
26
|
+
consolidate that Why into the spec. If no intent is active, or the active intent is not at Why,
|
|
27
|
+
report that and stop; do not guess which intent is meant.
|
|
28
|
+
|
|
29
|
+
## The 8-step sequence
|
|
30
|
+
|
|
31
|
+
| Step | Action |
|
|
32
|
+
|---|---|
|
|
33
|
+
| 1 | Confirm the precondition above. |
|
|
34
|
+
| 2 | Read inputs in fixed order and build a ruling ledger: (a) `## Context` and `### Decisions`; (b) `## Insights` newest-last, so a later ruling supersedes an earlier conflicting one; (c) `resources/discovery--<slug>.md`; (d) any other `resources/*.md`. |
|
|
35
|
+
| 3 | Decide the tier: adopt the brainstorming `Tier:` recommendation from Decisions or Insights; otherwise apply the PLASTIC.md tiers rubric (S = single mechanism or file cluster, M = one subsystem, L = cross-cutting or novel design). |
|
|
36
|
+
| 4 | Fill the template section by section, all 8 sections in template order. Read `references/per-section-fill-rules.md` now, filling the template is the trigger. Write the tier as the literal top line above `# Spec:`. Encode every ruling into its matching section, later supersedes earlier on conflict. A collapsed single-line S/M section is complete and valid; do not pad it. |
|
|
37
|
+
| 5 | Gap rule: if any section cannot be filled from the ledger built in step 2, STOP and ask the user for the missing ruling. Never invent scope to fill a gap. |
|
|
38
|
+
| 6 | State the gate position (below) so the user knows what happens next. |
|
|
39
|
+
| 7 | Self-verify against the checklist. Read `references/self-verify-checklist.md` now, verifying before presenting is the trigger. Fix any failing check, then re-verify from the top. |
|
|
40
|
+
| 8 | Present `spec.md` for the user-review gate, then hand off to `plastic-intent-planning` for How. |
|
|
41
|
+
|
|
42
|
+
## Gate position (step 6)
|
|
43
|
+
|
|
44
|
+
The Why stage's deliverable is `spec.md`; the gate is satisfied the moment a complete, real
|
|
45
|
+
`spec.md` exists (this is the gates-by-name framing: gate-check enforces spec.md before plan.md,
|
|
46
|
+
not the Transition Gates table row). Writing `plan.md` is what opens the code gate for Exec, and
|
|
47
|
+
writing `plan.md` is not this skill's job, that is `plastic-intent-planning`. State this to the user
|
|
48
|
+
at step 6 so the handoff at step 8 is expected, not a surprise.
|
|
49
|
+
|
|
50
|
+
## Tier stamp (step 3, convention only)
|
|
51
|
+
|
|
52
|
+
Write `Tier: S|M|L` as the literal first line of the file, above the `# Spec:` heading. This line
|
|
53
|
+
is convention-only: the orchestrator and the planner read it, no gate and no doctor check
|
|
54
|
+
validates it.
|
|
55
|
+
|
|
56
|
+
## Completion report
|
|
57
|
+
|
|
58
|
+
State, in this order: which file was written (`spec.md`, new or rewritten), the stamped `Tier:`
|
|
59
|
+
value, the count of Acceptance Criteria produced (the surface the planner will cover), which
|
|
60
|
+
`## Insights` rulings superseded an earlier Decision (if any) and where each landed, and the
|
|
61
|
+
handoff target (`plastic-intent-planning`). If step 5 stopped for a missing ruling, report that
|
|
62
|
+
instead: which section, what is missing, and the question put to the user.
|
|
63
|
+
|
|
64
|
+
## References
|
|
65
|
+
|
|
66
|
+
| Trigger | Read |
|
|
67
|
+
|---|---|
|
|
68
|
+
| Filling the template (step 4) | `references/per-section-fill-rules.md` |
|
|
69
|
+
| Self-verifying before presenting (step 7) | `references/self-verify-checklist.md` |
|
|
@@ -0,0 +1,126 @@
|
|
|
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 intent-starting 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": "Does NOT activate plastic-intent-speccing; activates plastic-intent-brainstorming (exploration that produces the enriched Why, upstream of speccing).",
|
|
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; activates plastic-intent-planning (turns an existing spec.md into plan.md for How, downstream of speccing).",
|
|
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 with Tier: S|M|L as the literal top line above 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": "Tier line is literally the first line of the file; 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
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Per-Section Fill Rules
|
|
2
|
+
|
|
3
|
+
The single shared method for turning the enriched Why into `spec.md`. Both
|
|
4
|
+
`plastic-intent-speccing` (guided) and the `plastic-spec-specialist` agent (auto) point here;
|
|
5
|
+
neither restates these 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 (S/M tier) 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).
|
|
@@ -0,0 +1,38 @@
|
|
|
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. **Tier stamp is the top line.** `Tier: S|M|L` is the literal first line of the file, above the
|
|
26
|
+
`# Spec:` heading, not folded into a section body.
|
|
27
|
+
7. **All 8 sections present, in template order.** Problem, Goals, Non-Goals, Approach,
|
|
28
|
+
Alternatives Considered, Decisions, Acceptance Criteria, Open Questions, each present once, in
|
|
29
|
+
that order, none merged into another.
|
|
30
|
+
8. **Every `## Insights` ruling is traceable to a spec line.** Walk the Insights log entry by
|
|
31
|
+
entry: each one lands in some section of the spec. Where two rulings conflict, the later one
|
|
32
|
+
(further down the log) is the one that landed, and the earlier one does not silently persist
|
|
33
|
+
in a different section.
|
|
34
|
+
9. **Acceptance criteria are concretely checkable.** Each Acceptance Criteria bullet reads as a
|
|
35
|
+
fact a reviewer can confirm true or false by inspection, a command, or a named file, not a
|
|
36
|
+
quality judgment a reviewer would have to interpret.
|
|
37
|
+
10. **No em-dashes or en-dashes anywhere in the artifact.** Scan the full file; replace any dash
|
|
38
|
+
glyph with a comma, period, parenthesis, or colon.
|
|
@@ -5,6 +5,7 @@ description: >-
|
|
|
5
5
|
guided ONCE, then resume at the latest delivered station and run the cycle to Done. Use on
|
|
6
6
|
`continuing --intent {id}`, when a new intent is registered and the user asks to work it,
|
|
7
7
|
or when the user picks an intent to work. Requires the intent in INDEX `## Active`.
|
|
8
|
+
user-invocable: true
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Intent Starting — board a session onto an intent
|
|
@@ -56,7 +57,7 @@ enforces it: without a held lock, mutating writes to this active intent's dir ar
|
|
|
56
57
|
4. **Dispatch What-stage discovery (under the lock).** Right after arming, when the intent
|
|
57
58
|
was just activated in step 1 (on a resume that already has
|
|
58
59
|
`resources/discovery--<slug>.md`, skip: discovery runs once per intent, at activation
|
|
59
|
-
only), dispatch the `plastic-intent-discovery` agent (see the `plastic-intent-
|
|
60
|
+
only), dispatch the `plastic-intent-discovery` agent (see the `plastic-intent-discovering`
|
|
60
61
|
skill), now that this session owns the lock, deposit authorized as the owner session. Resolve its
|
|
61
62
|
model explicitly and pass it at dispatch time (belt-and-braces): `read-config
|
|
62
63
|
agents.models.plastic-intent-discovery --project <repo>`. The agent runs QMD discovery
|
|
@@ -87,7 +88,7 @@ that message, never delete a lock file by hand.
|
|
|
87
88
|
Read `savepoint.md` and classify from the **last line** alone, then verify ONLY that line's
|
|
88
89
|
artifact is real (sentinel-aware via `Bridge.stage_file_present?`). On drift (the last line
|
|
89
90
|
disagrees with files on disk), rebuild the ledger from disk and note the correction. Do not
|
|
90
|
-
inline the rebuild; the `plastic-savepoint` skill owns it:
|
|
91
|
+
inline the rebuild; the `plastic-intent-savepoint` skill owns it:
|
|
91
92
|
```bash
|
|
92
93
|
ruby -r ~/.plastic/scripts/lib/bridge -e 'Bridge.rebuild_savepoint("<intent_dir>")'
|
|
93
94
|
```
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"scope": "triggering",
|
|
41
41
|
"set": "validation",
|
|
42
42
|
"prompt": "continue",
|
|
43
|
-
"expected_output": "Does NOT activate plastic-intent-starting; bare 'continue' is plastic-continuing (no specific intent named).",
|
|
43
|
+
"expected_output": "Does NOT activate plastic-intent-starting; bare 'continue' is plastic-intent-continuing (no specific intent named).",
|
|
44
44
|
"files": [],
|
|
45
45
|
"assertions": [
|
|
46
46
|
{ "type": "code", "check": "router CHOICE != plastic-intent-starting", "result": "expect-pass" }
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"scope": "triggering",
|
|
52
52
|
"set": "validation",
|
|
53
53
|
"prompt": "create a new intent for the uploader retry policy",
|
|
54
|
-
"expected_output": "Does NOT activate plastic-intent-starting; activates plastic-creating
|
|
54
|
+
"expected_output": "Does NOT activate plastic-intent-starting; activates plastic-intent-creating.",
|
|
55
55
|
"files": [],
|
|
56
56
|
"assertions": [
|
|
57
57
|
{ "type": "code", "check": "router CHOICE != plastic-intent-starting", "result": "expect-pass" }
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: plastic-creating
|
|
2
|
+
name: plastic-project-creating
|
|
3
3
|
description: >-
|
|
4
4
|
Create a new project from an implementation intent. Sets up project directory,
|
|
5
5
|
git init, AGENTS.md with founding intent decisions, plastic-install --local,
|
|
6
6
|
tactical mirror, projects.yml registration, and framework scaffolding.
|
|
7
7
|
Use when an implementation intent spawns a project, or manually by user.
|
|
8
|
+
user-invocable: true
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Creating a Project
|
|
@@ -78,7 +79,7 @@ writes `INDEX.md` and `project.yml` only if missing. It is idempotent, so it is
|
|
|
78
79
|
safe even when the tactical mirror in step 5 already created the store directory.
|
|
79
80
|
Do not create the store with an inline `mkdir`; the provisioner is the only place
|
|
80
81
|
a store is made. For a project that is already registered but store-less, use the
|
|
81
|
-
`plastic-
|
|
82
|
+
`plastic-store-provisioning` skill instead.
|
|
82
83
|
|
|
83
84
|
### 8. Mark Global Intent(s) Completed
|
|
84
85
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: plastic-releasing
|
|
3
3
|
description: Use when merging a feature branch to main and tagging a release, bumping the version, or when the user says "release", "tag", or "ship it"
|
|
4
|
+
user-invocable: true
|
|
4
5
|
---
|
|
5
6
|
|
|
6
7
|
# Releasing
|
|
@@ -213,26 +214,30 @@ gh release edit <tag-name> --latest
|
|
|
213
214
|
|
|
214
215
|
### 8. Complete Active Intent
|
|
215
216
|
|
|
216
|
-
A release IS a delivery. The active intent that drove this work must be completed as part of the release process. This is NOT optional.
|
|
217
|
+
A release IS a delivery. The active intent that drove this work must be completed as part of the release process. This is NOT optional. The mechanical close (outcome/INDEX/savepoint/commit) is `plastic-intent-ending`'s job, not this skill's: run its backing script rather than restating that prose here.
|
|
217
218
|
|
|
218
|
-
1. Read `~/.plastic/INDEX.md`
|
|
219
|
+
1. Read `~/.plastic/INDEX.md` (or the project's INDEX.md) - find active intent(s) related to this release.
|
|
219
220
|
2. For each active intent being delivered:
|
|
220
|
-
a. Write `outcome.md`
|
|
221
|
-
b.
|
|
222
|
-
c.
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
221
|
+
a. Write a real `outcome.md` (never leave the scaffold placeholder), `disposition: delivered`, referencing the release tag.
|
|
222
|
+
b. Update `## Insights` with final observations.
|
|
223
|
+
c. Run the mechanical close (steps 1-4 of `plastic-intent-ending`): this stamps the intent file's `## Outcome` summary, moves the INDEX.md line to `## Completed` (dated today, with a rich entry description via `--index-note`), appends the savepoint `Done` bookend, and commits the store, all in one call:
|
|
224
|
+
```bash
|
|
225
|
+
ruby ~/.plastic/scripts/end-intent --store <store_path> --id <ID> --disposition delivered \
|
|
226
|
+
--outcome-summary "delivered in <tag-name>: <one-line summary>" \
|
|
227
|
+
--index-note "<tag-name>, <mode/tier>; <what shipped>; <suite result>"
|
|
228
|
+
```
|
|
229
|
+
d. Update clusters to show `_(completed)_` (the store-curating skill's job on its next pass).
|
|
226
230
|
|
|
227
231
|
**If no active intent exists for this release**, that itself is a problem - work happened outside the intent system. Log it and move on, but flag it.
|
|
228
232
|
|
|
229
233
|
### 9. Clean Up the Intent's Worktrees (merge-then-remove)
|
|
230
234
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
235
|
+
This is the release branch of `plastic-intent-ending`'s Step 5 disarm (`merge: true`), not a
|
|
236
|
+
separate concern: a release is the merge-then-remove path for the intent's worktrees (intent
|
|
237
|
+
73c3), so the intent's code branch is merged back into the default branch BEFORE the worktree
|
|
238
|
+
is removed. Drive it through `Worktree.finish` with `merge: true`, which merges the code
|
|
239
|
+
branch, then removes both worktrees (code + paired store), prunes both repos, and clears the
|
|
240
|
+
worktree block from the bridge:
|
|
236
241
|
|
|
237
242
|
```bash
|
|
238
243
|
ruby -r ~/.plastic/scripts/lib/worktree -r ~/.plastic/scripts/lib/bridge -e \
|
|
@@ -240,7 +245,7 @@ ruby -r ~/.plastic/scripts/lib/worktree -r ~/.plastic/scripts/lib/bridge -e \
|
|
|
240
245
|
```
|
|
241
246
|
|
|
242
247
|
(Uses `discover_bridge`, not a bare session-keyed `Bridge.read`, because a session can own more
|
|
243
|
-
than one live bridge now
|
|
248
|
+
than one live bridge now (intent 131) and `discover_bridge` resolves the right one for this cwd.)
|
|
244
249
|
|
|
245
250
|
Honor the worktree-cleanup rule: never leave an orphaned worktree, and run `git worktree
|
|
246
251
|
prune` in the affected repo if you hit a stale reference. For why this is the one place the
|