@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.
- package/PLASTIC.md +13 -139
- package/README.md +345 -133
- package/agents/plastic-enforcer.md +9 -10
- package/agents/plastic-executor.md +1 -1
- package/bin/crap +4 -0
- package/bin/lib/context_budget.rb +35 -1
- package/bin/lib/skill_census.rb +839 -0
- package/bin/plastic +6 -0
- package/bin/plastic-skill-census +114 -0
- package/bin/verify-change +345 -0
- package/deprecations.yml +1 -1
- package/{skills/agent-advisor/references → docs/help}/advisor-protocol.md +4 -7
- package/{skills/auto/references → docs/help}/agent-architecture.md +7 -7
- package/{skills/conventions/references → docs/help}/completion-and-done.md +1 -1
- package/{skills/auto/references → docs/help}/human-report-contract.md +17 -19
- package/{skills/conventions/references → docs/help}/roadmaps.md +2 -2
- package/{skills/tutorial/references → docs/help}/track-1-guided.md +8 -8
- package/{skills/tutorial/references → docs/help}/track-2-auto.md +5 -5
- package/{skills/tutorial/references → docs/help}/track-3-projects-and-roadmaps.md +24 -17
- package/package.json +3 -2
- package/scripts/append-ledger +2 -1
- package/scripts/dashboard.rb +10 -9
- package/scripts/day-summary +2 -1
- package/scripts/doctor.rb +48 -42
- package/scripts/end-intent +2 -8
- package/scripts/file-session-intent +2 -1
- package/scripts/hook-capture +4 -3
- package/scripts/hook-close +2 -1
- package/scripts/hook-record +3 -2
- package/scripts/hook-savepoint +3 -2
- package/scripts/hook-session-start +5 -4
- package/scripts/hook-stop +2 -1
- package/scripts/insight-append +1 -2
- package/scripts/install.rb +3 -1
- package/scripts/lib/active_delivery.rb +1 -1
- package/scripts/lib/arm.rb +2 -1
- package/scripts/lib/backup.rb +65 -0
- package/scripts/lib/cli/command.rb +85 -0
- package/scripts/lib/cli/commands/auto.rb +18 -0
- package/scripts/lib/cli/commands/auto_brief.rb +44 -0
- package/scripts/lib/cli/commands/auto_lock.rb +60 -0
- package/scripts/lib/cli/commands/auto_report.rb +50 -0
- package/scripts/lib/cli/commands/auto_take.rb +25 -0
- package/scripts/lib/cli/commands/backup.rb +43 -0
- package/scripts/lib/cli/commands/checkout.rb +25 -0
- package/scripts/lib/cli/commands/continue.rb +66 -0
- package/scripts/lib/cli/commands/doctor.rb +20 -0
- package/scripts/lib/cli/commands/feedback.rb +40 -0
- package/scripts/lib/cli/commands/help.rb +69 -0
- package/scripts/lib/cli/commands/hook.rb +32 -0
- package/scripts/lib/cli/commands/index.rb +23 -0
- package/scripts/lib/cli/commands/install.rb +21 -0
- package/scripts/lib/cli/commands/installer_verb.rb +37 -0
- package/scripts/lib/cli/commands/intent.rb +19 -0
- package/scripts/lib/cli/commands/intent_answer.rb +37 -0
- package/scripts/lib/cli/commands/intent_command.rb +53 -0
- package/scripts/lib/cli/commands/intent_end.rb +61 -0
- package/scripts/lib/cli/commands/intent_new.rb +62 -0
- package/scripts/lib/cli/commands/intent_note.rb +43 -0
- package/scripts/lib/cli/commands/intent_rule.rb +36 -0
- package/scripts/lib/cli/commands/intent_show.rb +25 -0
- package/scripts/lib/cli/commands/intent_spec.rb +44 -0
- package/scripts/lib/cli/commands/intent_step.rb +43 -0
- package/scripts/lib/cli/commands/intent_verify.rb +26 -0
- package/scripts/lib/cli/commands/migrate.rb +16 -0
- package/scripts/lib/cli/commands/migrate_stores.rb +31 -0
- package/scripts/lib/cli/commands/next.rb +49 -0
- package/scripts/lib/cli/commands/project.rb +19 -0
- package/scripts/lib/cli/commands/project_links.rb +42 -0
- package/scripts/lib/cli/commands/project_list.rb +20 -0
- package/scripts/lib/cli/commands/project_new.rb +72 -0
- package/scripts/lib/cli/commands/query.rb +31 -0
- package/scripts/lib/cli/commands/render.rb +25 -0
- package/scripts/lib/cli/commands/roadmap.rb +19 -0
- package/scripts/lib/cli/commands/roadmap_check.rb +44 -0
- package/scripts/lib/cli/commands/roadmap_log.rb +54 -0
- package/scripts/lib/cli/commands/roadmap_next.rb +34 -0
- package/scripts/lib/cli/commands/roadmap_show.rb +45 -0
- package/scripts/lib/cli/commands/rollback.rb +20 -0
- package/scripts/lib/cli/commands/search.rb +60 -0
- package/scripts/lib/cli/commands/session.rb +18 -0
- package/scripts/lib/cli/commands/session_commit.rb +42 -0
- package/scripts/lib/cli/commands/session_handoff.rb +34 -0
- package/scripts/lib/cli/commands/session_summary.rb +35 -0
- package/scripts/lib/cli/commands/status.rb +68 -0
- package/scripts/lib/cli/commands/subcommand_list.rb +36 -0
- package/scripts/lib/cli/commands/sync.rb +46 -0
- package/scripts/lib/cli/commands/uninstall.rb +20 -0
- package/scripts/lib/cli/commands/update.rb +20 -0
- package/scripts/lib/cli/commands/version.rb +53 -0
- package/scripts/lib/cli/frontier.rb +84 -0
- package/scripts/lib/cli/legacy.rb +50 -0
- package/scripts/lib/cli/output.rb +102 -0
- package/scripts/lib/cli/scope.rb +127 -0
- package/scripts/lib/cli/table.rb +64 -0
- package/scripts/lib/cli.rb +94 -0
- package/scripts/lib/compact_instructions.rb +8 -0
- package/scripts/lib/day_summary.rb +4 -3
- package/scripts/lib/doctor_core.rb +7 -32
- package/scripts/lib/doctor_session_ledger.rb +2 -1
- package/scripts/lib/feedback_report.rb +1 -1
- package/scripts/lib/graph_measure_models.rb +3 -1
- package/scripts/lib/index_entry.rb +9 -0
- package/scripts/lib/installer_core.rb +73 -19
- package/scripts/lib/intent_screen.rb +3 -3
- package/scripts/lib/lock.rb +2 -2
- package/scripts/lib/node_input.rb +3 -2
- package/scripts/lib/preflight.rb +4 -6
- package/scripts/lib/project_config.rb +2 -1
- package/scripts/lib/project_validator.rb +3 -2
- package/scripts/lib/qmd_sync.rb +8 -7
- package/scripts/lib/reference_archive.rb +45 -0
- package/scripts/lib/release_guard.rb +2 -0
- package/scripts/lib/report_screen.rb +4 -3
- package/scripts/lib/rlm/corpus.rb +13 -0
- package/scripts/lib/rlm/probe.rb +29 -0
- package/scripts/lib/rlm/query.rb +22 -0
- package/scripts/lib/roadmap_queue.rb +2 -2
- package/scripts/lib/roadmap_savepoint.rb +1 -1
- package/scripts/lib/runner_absorb.rb +3 -2
- package/scripts/lib/search_index.rb +55 -0
- package/scripts/lib/session_git.rb +4 -3
- package/scripts/lib/sqlite.rb +22 -0
- package/scripts/lib/store_discovery.rb +7 -6
- package/scripts/lib/store_layout.rb +54 -0
- package/scripts/lib/store_provisioning.rb +2 -1
- package/scripts/lib/store_sync.rb +85 -0
- package/scripts/lib/stores_move.rb +93 -0
- package/scripts/lib/verify_intent.rb +2 -7
- package/scripts/lib/version_number.rb +48 -0
- package/scripts/lib/work_graph.rb +59 -0
- package/scripts/lib/worktree.rb +3 -8
- package/scripts/lib/worktree_sweep.rb +3 -2
- package/scripts/link-suggest +2 -1
- package/scripts/migrate-to-global +1 -1
- package/scripts/new-intent +3 -12
- package/scripts/plastic-lock +3 -2
- package/scripts/promote-session-item +3 -2
- package/scripts/release-check +10 -5
- package/scripts/report-screen +1 -1
- package/scripts/session-commit +2 -1
- package/scripts/spawn-preamble +2 -2
- package/scripts/update.rb +25 -4
- package/scripts/write-handoff +2 -1
- package/templates/agents.md +6 -6
- package/templates/render.css +10 -0
- package/bin/plastic.js +0 -70
- package/skills/agent-advisor/SKILL.md +0 -84
- package/skills/auto/SKILL.md +0 -297
- package/skills/auto/evals/evals.json +0 -255
- package/skills/auto/references/end-tail.md +0 -64
- package/skills/conventions/SKILL.md +0 -29
- package/skills/dashboard/SKILL.md +0 -180
- package/skills/dashboard/evals/evals.json +0 -38
- package/skills/dashboard/references/classification.md +0 -22
- package/skills/dashboard/templates/dashboard-global.md +0 -20
- package/skills/dashboard/templates/dashboard-project.md +0 -19
- package/skills/direct/SKILL.md +0 -66
- package/skills/direct/references/request-signals.md +0 -59
- package/skills/doctor/SKILL.md +0 -305
- package/skills/doctor/report.md +0 -102
- package/skills/feedback/SKILL.md +0 -98
- package/skills/feedback/references/transport-and-privacy.md +0 -65
- package/skills/feedback/report.md +0 -36
- package/skills/install/SKILL.md +0 -215
- package/skills/intent-continuing/SKILL.md +0 -156
- package/skills/intent-continuing/references/board-fill.md +0 -52
- package/skills/intent-continuing/references/boarding-matrix.md +0 -35
- package/skills/intent-continuing/references/context-management.md +0 -28
- package/skills/intent-continuing/references/liveness-ranking.md +0 -57
- package/skills/intent-creating/SKILL.md +0 -89
- package/skills/intent-creating/evals/evals.json +0 -72
- package/skills/intent-creating/references/lifecycle.md +0 -81
- package/skills/intent-creating/references/wikilinks.md +0 -8
- package/skills/intent-ending/SKILL.md +0 -182
- package/skills/intent-ending/evals/evals.json +0 -74
- package/skills/intent-executing/SKILL.md +0 -87
- package/skills/intent-executing/evals/evals.json +0 -66
- package/skills/intent-executing/implementer-prompt.md +0 -47
- package/skills/intent-executing/spec-reviewer-prompt.md +0 -27
- package/skills/intent-speccing/SKILL.md +0 -136
- package/skills/intent-speccing/evals/evals.json +0 -126
- package/skills/intent-speccing/references/design-principles.md +0 -44
- package/skills/intent-speccing/references/per-section-fill-rules.md +0 -92
- package/skills/intent-speccing/references/self-verify-checklist.md +0 -37
- package/skills/project-creating/SKILL.md +0 -162
- package/skills/project-creating/references/hubs-projects.md +0 -55
- package/skills/project-creating/references/project-scaffolding.md +0 -97
- package/skills/releasing/SKILL.md +0 -376
- package/skills/releasing/references/deprecations.md +0 -60
- package/skills/releasing/references/promotion-and-tagging.md +0 -70
- package/skills/releasing/references/release-lines.md +0 -105
- package/skills/roadmap/SKILL.md +0 -90
- package/skills/roadmap/references/file-format.md +0 -134
- package/skills/roadmap/references/operations.md +0 -112
- package/skills/rollback/SKILL.md +0 -91
- package/skills/tutorial/SKILL.md +0 -66
- package/skills/tutorial/evals/evals.json +0 -186
- package/skills/uninstall/SKILL.md +0 -75
- package/skills/update/SKILL.md +0 -126
- /package/{skills/auto/references → docs/help}/agent-report-contract.md +0 -0
- /package/{skills/intent-executing → docs/help}/code-quality-reviewer-prompt.md +0 -0
- /package/{skills/conventions/references → docs/help}/knowledge-graph.md +0 -0
- /package/{skills/conventions/references → docs/help}/lifecycle-and-savepoints.md +0 -0
- /package/{skills/conventions/references → docs/help}/locks-and-worktrees.md +0 -0
- /package/{skills/conventions/references → docs/help}/maintenance-and-revisions.md +0 -0
- /package/{skills/intent-executing → docs/help}/plan-reviewer-prompt.md +0 -0
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"skill_name": "plastic-intent-creating",
|
|
3
|
-
"notes": "Intent 68. Scope: output-quality for the sources-vs-chain construction rules (D1/D2). Asserts the related-but-not-spawned case produces NO sources plus a predecessor chain link and a ## Links mirror, contrasted with the created-from case (true ascendant -> --sources set, reciprocal chain). The machine-checkable half lives in test/new_intent_test.rb (test_sources_path_gets_child_in_chain_frontmatter); this file documents the agent-facing scenario for skill evaluation and is NOT run by bin/test.",
|
|
4
|
-
"evals": [
|
|
5
|
-
{
|
|
6
|
-
"id": 1,
|
|
7
|
-
"scope": "behavior",
|
|
8
|
-
"set": "train",
|
|
9
|
-
"prompt": "Create an intent for adding a retry policy to the uploader. It's related to intent 41 (the upload pipeline work) but it's independent: it did not come out of intent 41's lifecycle.",
|
|
10
|
-
"expected_output": "A new root intent is created with EMPTY sources (it was not created from 41). The relation is recorded on the PREDECESSOR: intent 41 gains the new intent's id in its frontmatter chain, and a [[<new-id>]] wikilink is added to intent 41's ## Links. The new intent is NOT given 41 in --sources (the related-but-not-spawned rule). No false symmetry: 41 keeps the new id on chain with no reciprocal sources.",
|
|
11
|
-
"files": [],
|
|
12
|
-
"assertions": [
|
|
13
|
-
{
|
|
14
|
-
"type": "code",
|
|
15
|
-
"check": "new intent sources is empty",
|
|
16
|
-
"observed": "sources: []",
|
|
17
|
-
"result": "pass"
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
"type": "code",
|
|
21
|
-
"check": "predecessor 41 chain includes new id",
|
|
22
|
-
"observed": "41.chain includes <new-id>",
|
|
23
|
-
"result": "pass"
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"type": "code",
|
|
27
|
-
"check": "predecessor 41 ## Links has [[<new-id>]] mirror",
|
|
28
|
-
"observed": "[[<new-id>]] present in 41 ## Links",
|
|
29
|
-
"result": "pass"
|
|
30
|
-
}
|
|
31
|
-
]
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"id": 2,
|
|
35
|
-
"scope": "behavior",
|
|
36
|
-
"set": "validation",
|
|
37
|
-
"prompt": "Create an intent that is the direct continuation of intent 41: it emerged from intent 41's lifecycle and could not exist without it.",
|
|
38
|
-
"expected_output": "Because the new intent was genuinely CREATED FROM 41 (D1), it carries 41 in --sources (or branches from 41, which merges 41 into sources via the redundant-explicit rule). The reciprocal I1 backlink lands: intent 41's frontmatter chain gains the new intent's id. This is the created-from case, contrasted with the related-but-not-spawned case in eval 1.",
|
|
39
|
-
"files": [],
|
|
40
|
-
"assertions": [
|
|
41
|
-
{
|
|
42
|
-
"type": "code",
|
|
43
|
-
"check": "new intent sources includes 41",
|
|
44
|
-
"observed": "sources includes 41",
|
|
45
|
-
"result": "pass"
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
"type": "code",
|
|
49
|
-
"check": "predecessor 41 chain includes new id (I1 reciprocity)",
|
|
50
|
-
"observed": "41.chain includes <new-id>",
|
|
51
|
-
"result": "pass"
|
|
52
|
-
}
|
|
53
|
-
]
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
"id": 3,
|
|
57
|
-
"scope": "behavior",
|
|
58
|
-
"set": "validation",
|
|
59
|
-
"prompt": "QMD is present. The user says: create an intent to add retry to the uploader.",
|
|
60
|
-
"expected_output": "Before allocating the id / scaffolding, runs `ruby ~/.plastic/scripts/qmd-sync search \"add retry to the uploader\"` to surface a near-duplicate or true predecessor, then opens the authoritative intent file for any hit (reusing a near-duplicate or setting a real predecessor in --sources). No-op fallback to INDEX.md / file scan when QMD is absent.",
|
|
61
|
-
"files": [],
|
|
62
|
-
"assertions": [
|
|
63
|
-
{
|
|
64
|
-
"type": "human",
|
|
65
|
-
"check": "qmd-sync search is run before id allocation; authoritative file opened for any hit; informs reuse / --sources",
|
|
66
|
-
"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",
|
|
67
|
-
"result": "pass"
|
|
68
|
-
}
|
|
69
|
-
]
|
|
70
|
-
}
|
|
71
|
-
]
|
|
72
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
# Building an Intent — Full Lifecycle Detail
|
|
2
|
-
|
|
3
|
-
## What → `## Intent` section
|
|
4
|
-
|
|
5
|
-
The desire. One paragraph. What the human or agent wants.
|
|
6
|
-
This exists from the moment the intent is created.
|
|
7
|
-
|
|
8
|
-
**Deliverable:** `{ID}--{slug}.md`
|
|
9
|
-
|
|
10
|
-
## Why → `## Context` + `### Decisions` sections
|
|
11
|
-
|
|
12
|
-
Why this intent exists. Grows over time through brainstorming and exploration.
|
|
13
|
-
|
|
14
|
-
- **Context** — what we knew going in + what we decided along the way
|
|
15
|
-
- **Decisions** — main premises derived from Context plus decisions from brainstorming/grilling
|
|
16
|
-
- Decisions are Why-level: "status belongs on actions because multiple workstreams", not How-level: "use ACTION_N.md files"
|
|
17
|
-
|
|
18
|
-
**Deliverable:** `spec.md` (consolidated specification from Context + Decisions + brainstorming)
|
|
19
|
-
|
|
20
|
-
## How → Planning and preparation
|
|
21
|
-
|
|
22
|
-
Research decisions, create the implementation plan, define actions.
|
|
23
|
-
|
|
24
|
-
**Deliverable:** `plan.md` + `actions/` + `checklist.md` (execution registry with checkboxes covering all actions)
|
|
25
|
-
|
|
26
|
-
## Exec → Execute actions
|
|
27
|
-
|
|
28
|
-
Execute actions from the plan, track progress via checklist.
|
|
29
|
-
|
|
30
|
-
**Deliverable:** `outcome.md` (detailed result). `## Outcome` in intent.md = short summary written as last step.
|
|
31
|
-
|
|
32
|
-
## `## Insights` — Append-only work log
|
|
33
|
-
|
|
34
|
-
Captured throughout ALL stages. One-liner bullet points.
|
|
35
|
-
Never modified, only appended.
|
|
36
|
-
|
|
37
|
-
Tracks: stage transitions, decisions, shifts, blocks, cancellations, material for future intents.
|
|
38
|
-
This is how execution is tracked. When this intent completes, Insights
|
|
39
|
-
is where to look for what comes next. New intents spawned from this one,
|
|
40
|
-
plus related-but-not-spawned successors it leads to, appear in the `chain`
|
|
41
|
-
field.
|
|
42
|
-
|
|
43
|
-
## `## Links`
|
|
44
|
-
|
|
45
|
-
The human-readable projection of the local knowledge graph, mirroring the
|
|
46
|
-
frontmatter exactly. Each entry is `- [[id--slug|<target's full intent: text>]]`,
|
|
47
|
-
a clickable `id--slug` wikilink target with the target intent's full `intent:`
|
|
48
|
-
text as the label (cross-store targets render
|
|
49
|
-
`- [[store:id--slug|<target's full intent: text>]]`). Ordering is mandatory: all
|
|
50
|
-
`sources` first (top), then all `chain`, frontmatter order preserved within each
|
|
51
|
-
group. Sources never appear at the end. No source/chain tags, no sub-grouping. An
|
|
52
|
-
intent with empty `sources` and `chain` carries the empty-state comment. Counterpart
|
|
53
|
-
to the frontmatter `sources` / `chain` edges, for Obsidian graph navigation.
|
|
54
|
-
|
|
55
|
-
## Conventions — Filesystem as Schema
|
|
56
|
-
|
|
57
|
-
State is derived from what exists, not from what's declared.
|
|
58
|
-
|
|
59
|
-
| Convention | Signal |
|
|
60
|
-
|---|---|
|
|
61
|
-
| No `## Context` | Intent is fleeting (quick capture, non-actionable) |
|
|
62
|
-
| `## Context` has content | Intent is permanent (developed, actionable) |
|
|
63
|
-
| `## Outcome` has content | Intent is done |
|
|
64
|
-
| `## Insights` has `(autonomous)` entries | Intent is/was being delivered autonomously |
|
|
65
|
-
|
|
66
|
-
### Transitions
|
|
67
|
-
|
|
68
|
-
- Fleeting → permanent: add `## Context` (one-way, also makes it actionable)
|
|
69
|
-
- There is no separate "non-actionable → actionable" transition — permanence implies actionability
|
|
70
|
-
- Even research intents are actionable: the research itself is the action, the conclusion is the outcome
|
|
71
|
-
|
|
72
|
-
## Creating an Intent — Full Steps
|
|
73
|
-
|
|
74
|
-
1. Determine the target store: `~/.plastic/store/` for global intents (default), `~/.plastic/projects/{slug}/store/` for project intents
|
|
75
|
-
2. Decide branch vs root (this sets whether you pass `--parent`)
|
|
76
|
-
3. Scaffold with one call: `ruby ~/.plastic/scripts/new-intent --store <store> --intent "<one-line>" --slug <slug> [--parent <id>] [--sources id,id] [--tags ...]`. This allocates the id, creates the directory plus `actions/` and `resources/`, renders the born-complete intent file (frontmatter plus `## Intent`, `## Context`, `## Outcome`, `## Insights`, `## Links`), writes the sentinel placeholder lifecycle files, wires the reciprocal links, and self-validates.
|
|
77
|
-
4. Update the appropriate `INDEX.md` — add to Active section and appropriate cluster
|
|
78
|
-
|
|
79
|
-
The intent file is born complete with all five sanctioned `##` sections; the lifecycle files (`spec.md`/`plan.md`/`checklist.md`/`outcome.md`) are sentinel placeholders that read as "stage not reached" until an agent fills them and deletes the `<!-- plastic:placeholder -->` first line.
|
|
80
|
-
|
|
81
|
-
Always scaffold through `new-intent` (or this skill). Never hand-author intent files: `new-intent` validates the file it writes (`scripts/validate-intent`) and `end-intent` checks it again at close, and hand-authoring is the bypass this contract is designed to remove.
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
# Wikilink Conventions
|
|
2
|
-
|
|
3
|
-
| Syntax | Meaning |
|
|
4
|
-
|--------|---------|
|
|
5
|
-
| `[[ID]]` | Link to intent in same store (e.g., `[[1a1]]`) |
|
|
6
|
-
| `[[ID\|display text]]` | Link with human-readable label |
|
|
7
|
-
| `[[global:ID]]` | Link to intent in `~/.plastic/store/` |
|
|
8
|
-
| `[[project-slug:ID]]` | Link to intent in `~/.plastic/projects/{slug}/store/` |
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: plastic-intent-ending
|
|
3
|
-
description: >
|
|
4
|
-
Wrap, finish, or close an intent as delivered or abandoned. Use
|
|
5
|
-
when completing or abandoning an intent, when a graph's last node
|
|
6
|
-
reaches a terminal status (or, for a legacy intent, a checklist
|
|
7
|
-
reaches 100 percent) and Exec is finished, or when asked to "wrap
|
|
8
|
-
this up".
|
|
9
|
-
user-invocable: true
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# Intent Ending
|
|
13
|
-
|
|
14
|
-
The one procedure every terminal transition routes through. Auto mode, the
|
|
15
|
-
curator path, and releasing all call this skill (or its backing script,
|
|
16
|
-
`scripts/end-intent`) for the mechanical close instead of restating the same
|
|
17
|
-
prose three times. `abandoned` is the SAME procedure as `delivered`, not a
|
|
18
|
-
failure branch: only outcome.md content and the INDEX section differ.
|
|
19
|
-
|
|
20
|
-
Read `../plastic-conventions/references/completion-and-done.md` for what "intent done" means and
|
|
21
|
-
the End-stage tail behind the steps below. This path resolves relative to this skill's own
|
|
22
|
-
installed directory.
|
|
23
|
-
|
|
24
|
-
## The 8 steps (0-7)
|
|
25
|
-
|
|
26
|
-
| # | Step | Who does it |
|
|
27
|
-
|---|---|---|
|
|
28
|
-
| 0 | Precondition check | You, before touching outcome.md |
|
|
29
|
-
| 1 | backfill spec/plan/action/outcome from the record, self-check, intent-file `## Outcome` summary | `scripts/end-intent` |
|
|
30
|
-
| 2 | INDEX.md terminal move (Active -> Completed/Abandoned) | `scripts/end-intent` |
|
|
31
|
-
| 3 | the terminal savepoint line | `scripts/end-intent` |
|
|
32
|
-
| 4 | store auto-commit | `scripts/end-intent` |
|
|
33
|
-
| 5 | disarm (worktree + lock) | `scripts/end-intent` (intent 188) |
|
|
34
|
-
| 6 | QMD reindex, async, LAST | You |
|
|
35
|
-
| 7 | EM-to-CTO report | You |
|
|
36
|
-
|
|
37
|
-
Steps 1-5 are ONE callable script call, not several separate one-liners: this
|
|
38
|
-
is exactly what the failure mode this intent fixes looked like (releasing hand
|
|
39
|
-
authored the close in prose and dropped the savepoint bookend for two real
|
|
40
|
-
deliveries; separately, one session delivered four intents back to back and
|
|
41
|
-
never ran the old step-5 one-liner at all, intent 188). Never restate
|
|
42
|
-
outcome/INDEX/savepoint/disarm prose inline again; call `scripts/end-intent`.
|
|
43
|
-
|
|
44
|
-
### Step 0. Precondition (the record is what gets backfilled)
|
|
45
|
-
|
|
46
|
-
Nothing refuses the close any more (the 1.x write-time gate and `end-intent`'s
|
|
47
|
-
exit-6 structure gate were retired in 2.0, intents 302 and 308). What you leave
|
|
48
|
-
on disk is what the record becomes, so before the call:
|
|
49
|
-
|
|
50
|
-
1. For an intent with a `graph.md`: confirm every node's Status in `graph.md` is
|
|
51
|
-
terminal (`done` or `failed_verification`, nothing left `running`, `blocked`, or
|
|
52
|
-
waiting `needs_decision`), and that the last verify node's gates were
|
|
53
|
-
accepted. A node still open is not a refusal, it is a reported gap that lands
|
|
54
|
-
verbatim in the backfilled `## Follow-ups`.
|
|
55
|
-
For an intent with no `graph.md` (legacy): read checklist.md, tick every item as
|
|
56
|
-
it is actually performed, including an item that describes the close itself:
|
|
57
|
-
running this very procedure IS what that item describes; an unchecked box is not
|
|
58
|
-
a refusal, it is a reported gap. Also confirm every acceptance criterion in
|
|
59
|
-
spec.md is verifiable (tests pass, or the manual check described in its HOW line
|
|
60
|
-
was actually run).
|
|
61
|
-
2. Decide what you have to say. For an intent with a `graph.md`, never hand-write
|
|
62
|
-
`outcome.md`: `scripts/end-intent` GENERATES it, through
|
|
63
|
-
`scripts/lib/outcome_report.rb` (`scripts/outcome-report` is its standalone
|
|
64
|
-
CLI, useful for checking the generated text before the close). `## Delivered`,
|
|
65
|
-
`## Verification`, `## Graph diff`, and `## Findings` are read straight from
|
|
66
|
-
`graph.md`, `nodes/`, and the ledger every time, in plain wording a reader
|
|
67
|
-
recognizes, never hand-typed; when the generated wording is wrong, fix
|
|
68
|
-
`graph.md` or `nodes/`, the source it reads from, not the report. `## Summary`,
|
|
69
|
-
`## Needs you`, and `## Follow-ups`, and every frontmatter key but
|
|
70
|
-
`disposition`, are preserved byte for byte when you author them and
|
|
71
|
-
generated as plain facts otherwise. For an intent with no `graph.md`, a
|
|
72
|
-
spec.md, plan.md, action file, or outcome.md left as the scaffold placeholder
|
|
73
|
-
is written from the record by `scripts/end-intent` (the intent file's
|
|
74
|
-
`## Intent`, `### Decisions`, and `## Insights`, the checklist, the worktree
|
|
75
|
-
diff). A file you wrote, even under a still-present sentinel, is never touched.
|
|
76
|
-
|
|
77
|
-
### Step 1-5. Run `scripts/end-intent`
|
|
78
|
-
|
|
79
|
-
For an intent with a `graph.md`, do not author `outcome.md` by hand: run
|
|
80
|
-
`ruby ~/.plastic/scripts/outcome-report <intent_dir> --write --disposition delivered|abandoned`
|
|
81
|
-
if you want to see the generated text before the close, or let the single call below write it.
|
|
82
|
-
`## Summary`, `## Needs you`, and `## Follow-ups` are the sections worth your own words; edit
|
|
83
|
-
those into the file before the call when the generator's plain facts say too little (they are
|
|
84
|
-
preserved byte for byte). `## Needs you` is the literal None or a `| N | What | Why |` table.
|
|
85
|
-
On abandon, `## Summary` states the abandonment reason and the trail (see Pivot below). An
|
|
86
|
-
intent with no `graph.md` gets a placeholder outcome.md backfilled from the record instead,
|
|
87
|
-
with the close's disposition and the `--outcome-summary` line as its summary. Also author the
|
|
88
|
-
rich INDEX entry note now (a short line in the store's existing Completed/Abandoned
|
|
89
|
-
convention: mode, what shipped or why it was abandoned, suite result, merge/spawn notes);
|
|
90
|
-
content authoring stays with you, `--index-note` only appends what you write.
|
|
91
|
-
|
|
92
|
-
Then call the script once:
|
|
93
|
-
|
|
94
|
-
```bash
|
|
95
|
-
ruby ~/.plastic/scripts/end-intent \
|
|
96
|
-
--store <store_path> --id <intent_id> --disposition delivered|abandoned \
|
|
97
|
-
--session "$CLAUDE_CODE_SESSION_ID" \
|
|
98
|
-
--outcome-summary "<one-line ## Outcome summary for the intent file>" \
|
|
99
|
-
--index-note "<rich Completed/Abandoned entry description>"
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
This does all of steps 1-5 in order: backfills every missing or placeholder
|
|
103
|
-
spec.md, plan.md, action file, and outcome.md from the record (never a file
|
|
104
|
-
you wrote), runs doctor's per-intent structure check and the outcome guard as
|
|
105
|
-
a self-check that reports on stderr and proceeds (an unchecked box, a
|
|
106
|
-
malformed intent file, a wrong-disposition outcome.md you wrote), stamps the
|
|
107
|
-
intent file's `## Outcome` section, moves the INDEX.md
|
|
108
|
-
line from `## Active` to `## Completed` or `## Abandoned` (dated today,
|
|
109
|
-
idempotent, accepting either a real em dash or a plain hyphen as the id/
|
|
110
|
-
title separator on read while always emitting the real em dash on write)
|
|
111
|
-
with the `--index-note` text appended after the date so the entry stays
|
|
112
|
-
rich, appends the terminal savepoint line, commits the store repo, and
|
|
113
|
-
disarms (releases the code worktree and clears `delivery.lock`, verified
|
|
114
|
-
against the durable lock file on disk, never merely trusted). Omit
|
|
115
|
-
`--index-note` for a thin id+date entry, add `--no-commit` when a separate
|
|
116
|
-
commit step already covers the store (this never skips disarm), and
|
|
117
|
-
`--dry-run` to preview steps 1-5 with no writes.
|
|
118
|
-
|
|
119
|
-
Read `../plastic-conventions/references/completion-and-done.md` for the pre-flight lock guard
|
|
120
|
-
and the dirty-worktree refusal this call runs before writing anything (exit 4 and exit 5
|
|
121
|
-
below); this procedure only calls `end-intent`, it never re-implements them.
|
|
122
|
-
|
|
123
|
-
On the auto mode / curator path (no release), this single call performs the
|
|
124
|
-
FULL disarm (plain worktree remove, since the branch survives for later
|
|
125
|
-
reclaim). On a release-shipped path, `skills/releasing/SKILL.md` merges and
|
|
126
|
-
removes the worktree FIRST (its own step 8, merge-then-remove) before ever
|
|
127
|
-
calling this script, so by the time this call's step 5 runs, the worktree is
|
|
128
|
-
already gone (a harmless no-op) and only the lock is left to clear,
|
|
129
|
-
correctly, for the first time on that path (D7).
|
|
130
|
-
|
|
131
|
-
Exit codes: 0 success (the intent is closed AND its delivery lock is gone);
|
|
132
|
-
1 a usage or resolution failure, OR an INDEX id that resolves to neither
|
|
133
|
-
`## Active` nor the terminal section; 3 steps 1-4 already committed
|
|
134
|
-
but disarm could not verify the lock is gone afterward (run `/plastic-doctor
|
|
135
|
-
check the lock status`); 4 a live foreign session holds the lock (back off);
|
|
136
|
-
5 the code worktree is dirty (commit/stash first, or pass
|
|
137
|
-
`--discard-worktree-changes` deliberately).
|
|
138
|
-
|
|
139
|
-
### Step 6. QMD reindex, LAST
|
|
140
|
-
|
|
141
|
-
Only after step 5 has released the worktrees and cleared the lock, so the
|
|
142
|
-
index never references state about to disappear:
|
|
143
|
-
|
|
144
|
-
```bash
|
|
145
|
-
ruby ~/.plastic/scripts/qmd-sync reindex --store <store-root> --async
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
No-op when QMD is absent. Runs in the background so it never blocks the
|
|
149
|
-
turn.
|
|
150
|
-
|
|
151
|
-
### Step 7. Print `delivered`
|
|
152
|
-
|
|
153
|
-
Print `ruby ~/.plastic/scripts/report-screen delivered <intent_dir>` as the first characters
|
|
154
|
-
of the reply: nothing before it, no fence, or the hook cannot paint it. Asked, Delivered (with
|
|
155
|
-
its Proven-by column), Evidence, and Needs you come straight from the record - the EM-to-CTO
|
|
156
|
-
report, impact and risk first, in plain language, with the decision left to the human (merge,
|
|
157
|
-
release, or accept). See `outcome.md` for the details; do not restate it verbatim.
|
|
158
|
-
|
|
159
|
-
## Abandoned is the same procedure
|
|
160
|
-
|
|
161
|
-
`disposition: abandoned` runs the identical steps 0-7. The only differences
|
|
162
|
-
are outcome.md content (Summary states why this was abandoned, not what was
|
|
163
|
-
delivered) and the INDEX target section (`## Abandoned` instead of
|
|
164
|
-
`## Completed`). Never branch the mechanical steps by disposition; the
|
|
165
|
-
script already does that internally.
|
|
166
|
-
|
|
167
|
-
## Mid-flight pivot
|
|
168
|
-
|
|
169
|
-
When the work that shipped differs from what spec.md or plan.md originally
|
|
170
|
-
called for, do not retcon those documents. Record the decision once in
|
|
171
|
-
`## Insights`, then let outcome.md carry the truth of what actually
|
|
172
|
-
happened, including the abandoned trail when part of the work was dropped
|
|
173
|
-
mid-flight. outcome.md is truth of delivery; spec and plan stay the
|
|
174
|
-
historical record of what was planned.
|
|
175
|
-
|
|
176
|
-
## Routing
|
|
177
|
-
|
|
178
|
-
`plastic-releasing`, `plastic-auto`, and `plastic-intent-executing` all delegate their mechanical
|
|
179
|
-
close to this skill (or call `scripts/end-intent` directly for steps 1-5).
|
|
180
|
-
None of them restate the outcome/INDEX/savepoint/disarm prose inline any
|
|
181
|
-
more; if you find one that does, that surface has drifted and should route
|
|
182
|
-
here instead.
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"skill_name": "plastic-intent-ending",
|
|
3
|
-
"notes": "Intent 161. Scopes: description triggering (3-6) and behavior (1-2: the two mandatory D6 cases). Case B graduates into test/end_intent_test.rb (test_done_bookend_lands_once_and_is_idempotent) per evaluating-skills conventions.",
|
|
4
|
-
"evals": [
|
|
5
|
-
{
|
|
6
|
-
"id": 1,
|
|
7
|
-
"scope": "behavior",
|
|
8
|
-
"set": "train",
|
|
9
|
-
"prompt": "checklist.md has one unchecked non-completion item. Try to complete the intent.",
|
|
10
|
-
"expected_output": "Ticks or finishes the item before calling scripts/end-intent, because an unchecked box is reported by the structure self-check and lands verbatim in the backfilled Follow-ups; never a refusal (the write-time gate was removed in 2.0, intents 302 and 308).",
|
|
11
|
-
"files": [],
|
|
12
|
-
"assertions": [
|
|
13
|
-
{ "type": "human", "check": "SKILL.md Step 0 states that nothing refuses the close, that an unchecked box is a reported gap landing in Follow-ups, and instructs finishing the checklist before the call", "result": "expect-pass" },
|
|
14
|
-
{ "type": "code", "check": "scripts/end-intent exits 0 on an unchecked '- [ ]' item and prints 'structure check: intent_checklist_complete' (test/end_intent_test.rb)", "result": "pass" }
|
|
15
|
-
]
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
"id": 2,
|
|
19
|
-
"scope": "behavior",
|
|
20
|
-
"set": "train",
|
|
21
|
-
"prompt": "Run the mechanical close (scripts/end-intent) for a delivered intent with a real outcome.md.",
|
|
22
|
-
"expected_output": "The terminal savepoint line lands exactly once in savepoint.md, and a second run of the same command does not duplicate it (this is the regression the intent fixes: releasing used to skip this line entirely).",
|
|
23
|
-
"files": [],
|
|
24
|
-
"assertions": [
|
|
25
|
-
{ "type": "human", "check": "SKILL.md Step 1-4 calls scripts/end-intent as one script instead of restating the outcome/INDEX/savepoint one-liners in prose", "result": "expect-pass" },
|
|
26
|
-
{ "type": "code", "check": "test/end_intent_test.rb#test_done_bookend_lands_once_and_is_idempotent is green", "result": "pass" }
|
|
27
|
-
]
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
"id": 3,
|
|
31
|
-
"scope": "triggering",
|
|
32
|
-
"set": "train",
|
|
33
|
-
"prompt": "Mark intent 87 done, it shipped.",
|
|
34
|
-
"expected_output": "Activates plastic-intent-ending to run the mechanical close (outcome.md, INDEX move, savepoint bookend, commit, disarm, reindex, report).",
|
|
35
|
-
"files": [],
|
|
36
|
-
"assertions": [
|
|
37
|
-
{ "type": "code", "check": "router CHOICE == plastic-intent-ending", "result": "expect-pass" }
|
|
38
|
-
]
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"id": 4,
|
|
42
|
-
"scope": "triggering",
|
|
43
|
-
"set": "train",
|
|
44
|
-
"prompt": "This one's not worth finishing, abandon it and wrap this up.",
|
|
45
|
-
"expected_output": "Activates plastic-intent-ending (indirect trigger: 'wrap this up' names no lifecycle vocabulary directly). Abandoned runs the identical procedure, only outcome.md content and the INDEX section differ.",
|
|
46
|
-
"files": [],
|
|
47
|
-
"assertions": [
|
|
48
|
-
{ "type": "code", "check": "router CHOICE == plastic-intent-ending", "result": "expect-pass" }
|
|
49
|
-
]
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
"id": 5,
|
|
53
|
-
"scope": "triggering",
|
|
54
|
-
"set": "validation",
|
|
55
|
-
"prompt": "Start work on intent 87.",
|
|
56
|
-
"expected_output": "Does NOT activate plastic-intent-ending; this is a resume request (plastic-intent-continuing), the opposite end of the lifecycle from a close.",
|
|
57
|
-
"files": [],
|
|
58
|
-
"assertions": [
|
|
59
|
-
{ "type": "code", "check": "router CHOICE != plastic-intent-ending", "result": "expect-pass" }
|
|
60
|
-
]
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
"id": 6,
|
|
64
|
-
"scope": "triggering",
|
|
65
|
-
"set": "validation",
|
|
66
|
-
"prompt": "Cut a release and tag it v1.2.0.",
|
|
67
|
-
"expected_output": "Does NOT activate plastic-intent-ending directly; activates plastic-releasing, which internally calls scripts/end-intent for the mechanical close as one of its own steps.",
|
|
68
|
-
"files": [],
|
|
69
|
-
"assertions": [
|
|
70
|
-
{ "type": "code", "check": "router CHOICE == plastic-releasing", "result": "expect-pass" }
|
|
71
|
-
]
|
|
72
|
-
}
|
|
73
|
-
]
|
|
74
|
-
}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: plastic-intent-executing
|
|
3
|
-
description: Use when you have a graph or a plan to execute. A graph delivery runs on
|
|
4
|
-
`scripts/runner`'s three verbs, `step`, `status`, and `answer`; older, non-graph work
|
|
5
|
-
dispatches the `plastic-executor` agent for one consolidated action.
|
|
6
|
-
user-invocable: true
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Executing a Plan
|
|
10
|
-
|
|
11
|
-
## Step 0: Sync Worktree First
|
|
12
|
-
|
|
13
|
-
Before touching any file the graph or the plan names, sync the code worktree with main so no
|
|
14
|
-
edit lands on a path a merged rename or delete already removed:
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
git -C <worktree> fetch origin && git -C <worktree> merge --ff-only origin/main
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
If a named file or directory is missing (renamed or removed upstream), stop and report it
|
|
21
|
-
rather than editing a stale path. Read
|
|
22
|
-
`../plastic-conventions/references/locks-and-worktrees.md` for delivery isolation before
|
|
23
|
-
touching the worktree above.
|
|
24
|
-
|
|
25
|
-
## step
|
|
26
|
-
|
|
27
|
-
`ruby scripts/runner step <intent_dir>` computes which nodes in `graph.md`/`nodes/*.md` are
|
|
28
|
-
ready, applies dispatch policy (model, call cap), and prints a spawn block per dispatched node
|
|
29
|
-
- agent, model, node input path, the one test command, the call cap - fenced in its own stdout.
|
|
30
|
-
The runner itself never spawns an agent (327 D42). Call `step` again after each dispatched
|
|
31
|
-
node returns.
|
|
32
|
-
|
|
33
|
-
### Graph dispatch: the paste
|
|
34
|
-
|
|
35
|
-
The dispatch step is the paste, not a lead's hand-typed brief: copy each spawn block into the
|
|
36
|
-
Agent tool as its own dispatch, verbatim.
|
|
37
|
-
|
|
38
|
-
On Claude Code, the session spawns each dispatched node as a background subagent of its
|
|
39
|
-
per-kind agent (`plastic-node-work`, `plastic-node-verify`, `plastic-node-research`) named in
|
|
40
|
-
the spawn block. On Codex, one node runs over `codex exec` in a sandbox scoped to its kind and
|
|
41
|
-
writes only a return file, which the next `step` absorbs the same way it absorbs a Claude Code
|
|
42
|
-
return.
|
|
43
|
-
|
|
44
|
-
## status
|
|
45
|
-
|
|
46
|
-
`ruby scripts/runner status <intent_dir>` renders the graph's ledger state: which nodes are
|
|
47
|
-
running, done, blocked, or waiting on a decision. Safe to poll constantly; read node status
|
|
48
|
-
through `NodeLedger.status` before dispatching anything, never re-derive it by eye.
|
|
49
|
-
|
|
50
|
-
## answer
|
|
51
|
-
|
|
52
|
-
`ruby scripts/runner answer <intent_dir> --node <id> --decision "<text>"` closes a
|
|
53
|
-
`needs_decision` node with the owner's ruling, recorded to the ledger, so `step` can resume
|
|
54
|
-
the graph past it.
|
|
55
|
-
|
|
56
|
-
## Non-graph work
|
|
57
|
-
|
|
58
|
-
When the intent has no `graph.md`, dispatch ONE `plastic-executor` subagent with the whole
|
|
59
|
-
consolidated action pasted in (never a file reference): every task's full text, every action
|
|
60
|
-
file with its failure-mode matrix, the checklist items it must tick, the project context, and
|
|
61
|
-
the worktree path. It writes the matrix's tests and commits them red, implements the
|
|
62
|
-
consolidated action in order, ticks each item as it lands (see `## Tick-as-you-land`), and
|
|
63
|
-
drives the test suite green. Read its response by code: DONE or DONE_WITH_CONCERNS proceeds;
|
|
64
|
-
NEEDS_CONTEXT provides the missing context and re-dispatches; BLOCKED stops and reports.
|
|
65
|
-
|
|
66
|
-
## Tick-as-you-land
|
|
67
|
-
|
|
68
|
-
A tick is two edits, made together: mark the item's box `[x]`, and move its
|
|
69
|
-
checklist item from `## In Progress` to `## Completed` in `checklist.md`;
|
|
70
|
-
then add one `## Session Log` row (Date, Items Completed, Notes). The box is
|
|
71
|
-
the half the state screen's Progress bar reads: `IntentScreen::ITEM_RE` and
|
|
72
|
-
`progress_fields` count `[x]`, not which section the line sits in, so a line
|
|
73
|
-
moved to `## Completed` with its box left unmarked still reads as zero
|
|
74
|
-
progress. Do not batch several tasks' worth of checklist updates into one
|
|
75
|
-
later edit; tick the moment the task is verified, before moving to the next
|
|
76
|
-
task.
|
|
77
|
-
|
|
78
|
-
## Position in the cycle
|
|
79
|
-
|
|
80
|
-
- **Before:** the graph (`graph.md`, `nodes/*.md`), or `plan.md`/`checklist.md`, exists; the
|
|
81
|
-
worktree is armed.
|
|
82
|
-
- **Produces:** code changes and a ticked checklist.
|
|
83
|
-
- **Next:** `plastic-intent-ending` owns `outcome.md`, generated through
|
|
84
|
-
`scripts/outcome-report`, and the rest of the mechanical close.
|
|
85
|
-
|
|
86
|
-
Read `../plastic-conventions/references/lifecycle-and-savepoints.md` for the subagent
|
|
87
|
-
report-home contract this handoff relies on.
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"skill_name": "plastic-intent-executing",
|
|
3
|
-
"notes": "Intent 164. New evals.json for the executing-plan skill: refuse-to-present-unverified, sync-worktree-first, and the reroute-vs-dispatch distinction. 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": "A task just landed: a new method was added and its test file was written. The agent is about to tell the owner the task is done and move to the next one.",
|
|
10
|
-
"expected_output": "Before presenting the completed task to the owner, the agent independently verifies it: greps the changed file or runs the specific test, rather than restating what it intended to do. It does not present the claim until the grep or test run has actually been observed.",
|
|
11
|
-
"files": [],
|
|
12
|
-
"assertions": [
|
|
13
|
-
{
|
|
14
|
-
"type": "human",
|
|
15
|
-
"check": "a grep or test run against the actual artifact is shown before the owner-facing claim; no claim is presented as done without that observed check",
|
|
16
|
-
"result": "expect-pass"
|
|
17
|
-
}
|
|
18
|
-
]
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"id": 2,
|
|
22
|
-
"scope": "behavior",
|
|
23
|
-
"set": "validation",
|
|
24
|
-
"prompt": "The agent finished implementing a task and, without running anything, tells the owner \"Task 3 is complete and the tests pass.\"",
|
|
25
|
-
"expected_output": "This is a refusal case: the skill does not allow presenting a pass claim without first grepping or running the artifact. The correct behavior is to run the verification first and only then report the observed result.",
|
|
26
|
-
"files": [],
|
|
27
|
-
"assertions": [
|
|
28
|
-
{
|
|
29
|
-
"type": "human",
|
|
30
|
-
"check": "the skill's stated hard rule blocks an unverified claim like this; expected behavior is verify-then-report, not report-then-hope",
|
|
31
|
-
"result": "expect-pass"
|
|
32
|
-
}
|
|
33
|
-
]
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
"id": 3,
|
|
37
|
-
"scope": "behavior",
|
|
38
|
-
"set": "train",
|
|
39
|
-
"prompt": "Execution is starting for an intent whose plan.md was written two days ago; the code worktree has not been touched since.",
|
|
40
|
-
"expected_output": "Before Step 1 (Load Plan), the agent syncs the code worktree with main: `git -C <worktree> fetch origin && git -C <worktree> merge --ff-only origin/main`, then verifies the plan's target files exist at the paths plan.md names before editing any of them.",
|
|
41
|
-
"files": [],
|
|
42
|
-
"assertions": [
|
|
43
|
-
{
|
|
44
|
-
"type": "code",
|
|
45
|
-
"check": "the fetch-and-merge --ff-only sync command runs before Load Plan; target file existence is checked before the first edit",
|
|
46
|
-
"result": "expect-pass"
|
|
47
|
-
}
|
|
48
|
-
]
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
"id": 4,
|
|
52
|
-
"scope": "behavior",
|
|
53
|
-
"set": "validation",
|
|
54
|
-
"prompt": "The plan's next step reads \"run /plastic-intent-speccing\" as a human-facing instruction to consolidate the spec once Exec finishes an audit task.",
|
|
55
|
-
"expected_output": "The agent tells the user to type the /plastic-intent-speccing command themselves; it does not dispatch a subagent with that slash-command text as a prompt, and it does not paste an agent-facing dispatch prompt at the user instead.",
|
|
56
|
-
"files": [],
|
|
57
|
-
"assertions": [
|
|
58
|
-
{
|
|
59
|
-
"type": "human",
|
|
60
|
-
"check": "the slash-command instruction is directed at the user, not handed to the Agent tool as a subagent prompt; no dispatch-prompt text leaks into the user-facing message",
|
|
61
|
-
"result": "expect-pass"
|
|
62
|
-
}
|
|
63
|
-
]
|
|
64
|
-
}
|
|
65
|
-
]
|
|
66
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
# Implementer Subagent Prompt
|
|
2
|
-
|
|
3
|
-
You are implementing a specific task from a plan. You have been given the full task text below.
|
|
4
|
-
|
|
5
|
-
## Your Task
|
|
6
|
-
|
|
7
|
-
{{TASK_TEXT}}
|
|
8
|
-
|
|
9
|
-
## Project Context
|
|
10
|
-
|
|
11
|
-
{{PROJECT_CONTEXT}}
|
|
12
|
-
|
|
13
|
-
## Active Intent
|
|
14
|
-
|
|
15
|
-
{{INTENT_CONTEXT}}
|
|
16
|
-
|
|
17
|
-
## Instructions
|
|
18
|
-
|
|
19
|
-
1. Read the task carefully. If anything is unclear, report NEEDS_CONTEXT with what you need.
|
|
20
|
-
2. Implement exactly what the task specifies — nothing more, nothing less.
|
|
21
|
-
3. Write tests first when the task includes test steps (TDD).
|
|
22
|
-
4. Follow the file paths specified in the task exactly.
|
|
23
|
-
5. Commit after each logical unit of work, and in the same step tick the checklist item that
|
|
24
|
-
unit lands: mark its box `[x]` and move the line to `## Completed`, then append the
|
|
25
|
-
savepoint `Commit` line
|
|
26
|
-
(`scripts/savepoint-note <intent_dir> --kind Commit --text "<sha> <what it proves>"`). A
|
|
27
|
-
commit without its tick is incomplete.
|
|
28
|
-
6. When done, self-review against this checklist:
|
|
29
|
-
- [ ] All steps in the task are completed
|
|
30
|
-
- [ ] Tests pass
|
|
31
|
-
- [ ] Code is clean and follows project conventions
|
|
32
|
-
- [ ] No unrelated changes
|
|
33
|
-
- [ ] Every landed unit's checklist item is ticked
|
|
34
|
-
|
|
35
|
-
## Report Format
|
|
36
|
-
|
|
37
|
-
End your work with one of these status lines:
|
|
38
|
-
|
|
39
|
-
**DONE** — All steps completed, tests pass, code committed.
|
|
40
|
-
|
|
41
|
-
**DONE_WITH_CONCERNS** — Completed but I noticed: [describe concerns].
|
|
42
|
-
|
|
43
|
-
**NEEDS_CONTEXT** — I need clarification on: [specific questions].
|
|
44
|
-
|
|
45
|
-
**BLOCKED** — Cannot proceed because: [describe blocker].
|
|
46
|
-
|
|
47
|
-
It is always OK to report BLOCKED or NEEDS_CONTEXT. Do not guess or improvise when uncertain.
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# Spec Compliance Reviewer Prompt
|
|
2
|
-
|
|
3
|
-
The implementer says they finished this task. Verify independently — their report may be incomplete or optimistic.
|
|
4
|
-
|
|
5
|
-
## Task Requirements
|
|
6
|
-
|
|
7
|
-
{{TASK_TEXT}}
|
|
8
|
-
|
|
9
|
-
## Instructions
|
|
10
|
-
|
|
11
|
-
1. Read the actual code that was written (not the implementer's report)
|
|
12
|
-
2. Compare line by line against the task requirements
|
|
13
|
-
3. Check for:
|
|
14
|
-
- Missing requirements — anything in the task that wasn't implemented
|
|
15
|
-
- Extra work — anything added that the task didn't ask for
|
|
16
|
-
- Misunderstandings — code that doesn't match what the task intended
|
|
17
|
-
- Test coverage — are all specified behaviors tested?
|
|
18
|
-
|
|
19
|
-
## Report Format
|
|
20
|
-
|
|
21
|
-
**PASS** — All task requirements are correctly implemented. No gaps, no extras.
|
|
22
|
-
|
|
23
|
-
**FAIL** — Issues found:
|
|
24
|
-
- [file:line] Description of what's wrong and what was expected
|
|
25
|
-
- [file:line] Description of what's missing
|
|
26
|
-
|
|
27
|
-
Be specific. Reference exact file paths and line numbers.
|