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