Ship build-proposal — a plan-agent skill that turns a half-formed idea into a decision-complete proposal. It codifies the proposal's 8-step research→decide→author loop, the Tier 0/1/2 right-sizing gate, the canonical artifact shape, and the operating principles, then hands the result to the planning layer for the “how”.
Read and implement all steps in the plan at docs/plans/add-build-proposal-skill.html — Ship build-proposal, a plan-agent skill that authors decision-complete proposals. Start from the embedded digest: awk '!f && /<script[^>]*id="plan-digest"/{f=1;next} f && /<\/script>/{exit} f' docs/plans/add-build-proposal-skill.html
add-build-proposal-skill.html
docs/plans/add-build-proposal-skill.html
Context
The source proposal-builder-skill.md codifies a thinking-partner workflow that takes a vague idea (“compare X to ours”, “should we adopt Y”) to a decision-complete proposal — grounding every claim, separating facts from decisions, driving a human decision cadence, and committing a living artifact. It is a proposal, not an execution plan: its own “Next step” is to convert it into one, and it explicitly stops at the handoff to the planning layer. The proposal locked four decisions — name proposal-builder, placement in the agentics marketplace, a dedicated docs/proposals/ dir, and a hard stop at handoff. This plan implements that handoff inside this repo. Three packaging choices were confirmed: ship it as a build-proposal skill inside the existing plan-agent plugin (invoked /plan-agent:build-proposal); bundle two trimmed worked exemplars; and wire deep-research as optional with a WebSearch/WebFetch + Explore fallback. The design-md-spec-alignment.md proposal is the Tier 2 exemplar the skill must be able to reproduce.
Files to Modify
- kit/plugins/plan-agent/skills/build-proposal/
SKILL.mdnew the build-proposal workflow skill- references/
artifact-shape.mdnew canonical proposal templateoperating-principles.mdnew principles + capability mapexample-design-md-spec-alignment.mdnew trimmed Tier 2 exemplarexample-proposal-builder-skill.mdnew trimmed recursive exemplar- kit/plugins/plan-agent/
.claude-plugin/plugin.jsonmodified description updateCHANGELOG.mdmodified 2.5.0 entryREADME.mdmodified document the skill.claude-plugin/marketplace.jsonmodified bump to 2.5.0, tagsdocs/proposals/.gitkeepnew artifact root scaffoldtests/plugins/test-build-proposal.shnew structural smoke testCLAUDE.mdmodified plan-agent capability row
Diagram
Frame + tierFan-out researchSynthesize · facts vs decisionsResolve with humanAuthor + deepenConverge + hand off/plan-agent:implementation-plan <slug>.md- Idea → decision-complete proposal
- Codebase + web grounding
- Facts-vs-decisions cadence
- Living docs/proposals/ artifact
- One-shot cited web report
- Optional research delegate
- Fallback: WebSearch/WebFetch + Explore
- Owns the “how”
- Receives the decided proposal
- Produces the HTML execution plan
Steps
docs/proposals/ artifact root, via a committed .gitkeep) and author SKILL.md. Frontmatter: name: build-proposal; model: opus (matching implementation-plan's research-heavy profile); omit disable-model-invocation so the skill stays model-invocable (peers omit the field); a drafted three-part description ≤200 chars whose trigger clause uses “idea / should-we / compare-and-align” wording and explicitly avoids implementation-plan's “plan document / HTML plan / write a plan file” phrasing; full allowed-tools (Read, Write, Edit, Glob, Grep, Bash, AskUserQuestion, ToolSearch, ExitPlanMode, WebSearch, WebFetch, Skill, Agent); argument-hint. Body under 500 lines — each of the 8 loop steps carrying its key imperative (e.g. “Frame: restate the idea in one line, name the domains, ask 2–3 clarifying questions if underspecified, then proceed”) — plus a runtime artifact-dir resolver — --dir flag → planAgent.proposalsDirectory setting → docs/proposals/ → default, mirroring how implementation-plan resolves plansDirectory — that mkdir -ps the resolved dir, and one-level pointers to the two references.
implementation-plan (idea / “should-we” vs. plan-document intent). The skill delegates research to deep-research via Skill and fans out via Agent/WebSearch/WebFetch, so all must be declared in allowed-tools.Verify
grep confirms name: build-proposal, model: opus, and no disable-model-invocation line; the description is ≤200 chars, three-part, and shares no trigger phrase with implementation-plan; the body shows all three tiers and the eight numbered steps; wc -l < 500; allowed-tools lists Skill, Agent, WebSearch, WebFetch alongside ToolSearch+ExitPlanMode; the body resolves the artifact dir via --dir → planAgent.proposalsDirectory → docs/proposals/ in order; docs/proposals/.gitkeep exists.references/artifact-shape.md capturing the canonical proposal artifact: front-matter (status: proposal→plan, type, created), Context, Core finding (block quote), Side-by-side comparison table, Locked & resolved decisions (dated), Workstreams/options, Risks & tensions, Open questions (decisions-only), Roadmap (phased, S/M/L), Appendices.
Verify
references/artifact-shape.md path.references/operating-principles.md with (a) the ten operating principles (ground every claim, quantify, separate facts from decisions, recommendation-first questions, record & propagate, iterative deepening, parallel fan-out, surface incidental findings, commit each round, signal convergence) and (b) the relationship-to-existing-capabilities map.
deep-research framing must match the chosen optional-with-fallback wiring.Verify
deep-research is described as an optional delegate with a WebSearch/WebFetch + Explore fallback (not a hard dependency); the implementation-plan handoff seam (“should-we + what” → “how”) is named.gh api "repos/shawn-sandy/agentic-acss-plugins/contents/docs/proposals/proposal-builder-skill.md?ref=claude/design-md-spec-alignment-sitq7t" -H "Accept: application/vnd.github.raw" (and the docs/plans/design-md-spec-alignment.md path) — then write trimmed copies directly under references/ as example-design-md-spec-alignment.md and example-proposal-builder-skill.md (no examples/ subdir, so references stay one level deep). Trim each to front-matter + core finding + locked decisions + one appendix; stamp a header with the source URL + commit SHA/date; audit the trimmed content for inadvertent internal URLs or credentials.
skill-authoring.md; the SHA/date stamp makes future drift from the external source detectable.Verify
references/example-*.md files exist at one level, retain valid front-matter and a core-finding block, carry a source-URL + SHA/date header, and contain no internal URLs or credentials..claude-plugin/marketplace.json bump plan-agent version 2.4.1 → 2.5.0 (MINOR — new skill), extend its description to name /plan-agent:build-proposal, and add tags proposal and research (singular only — drop the redundant proposals plural).
main.Verify
node -e "require('./.claude-plugin/marketplace.json')" parses; the plan-agent entry shows version: 2.5.0 and a description naming build-proposal; the settings JSON-validation hook passes.plugin.json description (no version field), add a ## 2.5.0 CHANGELOG entry dated today, add a build-proposal row + component section to the README Features table, and update the plan-agent row in the root CLAUDE.md plugin table.
Verify
## 2.5.0 heading dated 2026-06-15; README lists /plan-agent:build-proposal; grep confirms plugin.json has no version key both before and after the description edit; the CLAUDE.md plan-agent row mentions build-proposal.tests/plugins/test-build-proposal.sh with numbered PASS/FAIL assertions and a failure counter (matching test-plan-digest.sh): the SKILL.md frontmatter contract; description ≤200 chars with the three-part structure (regex on the “ — ” separators) and no trigger-phrase overlap with implementation-plan; body wc -l < 500; both references and both example-*.md resolve; marketplace.json plan-agent version dynamically greater than git show origin/main:.claude-plugin/marketplace.json (not a hardcoded 2.4.1); plugin.json carries no version key; and an optional fixture slice asserting a generated docs/proposals/<slug>.md matches the canonical sections.
tests/plugins/*.sh family.Verify
bash tests/plugins/test-build-proposal.sh exits 0; the activation-collision and dynamic-version assertions are present (not a hardcoded 2.4.1).Tests
File: tests/plugins/test-build-proposal.sh
Type: smoke test
Asserts: /plan-agent:build-proposal resolves — SKILL.md present with valid name/description frontmatter, the body carries the Tier 0/1/2 gate and all 8 workflow steps, both references and both example-*.md resolve (flat, one level), and marketplace.json registers plan-agent above the origin/main version (valid JSON).
Run: bash tests/plugins/test-build-proposal.sh
File: tests/plugins/test-build-proposal.sh
Targets: the SKILL.md YAML frontmatter and body
Key cases: name is build-proposal (kebab, no reserved words); model: opus and no disable-model-invocation line; description ≤200 chars with a three-part structure (regex on the “ — ” separators) and no trigger-phrase overlap with implementation-plan; body wc -l < 500; allowed-tools lists Skill, Agent, WebSearch, WebFetch alongside ToolSearch + ExitPlanMode.
File: tests/plugins/test-build-proposal.sh (+ existing publish checks)
Targets: the .claude-plugin/marketplace.json plan-agent entry
Key cases: JSON parses; the plan-agent version is 2.5.0 and dynamically greater than git show origin/main:.claude-plugin/marketplace.json (no hardcoded 2.4.1); description names build-proposal; no version key in plugin.json.
File: manual acceptance — guided smoke
Targets: the /plan-agent:build-proposal flow end-to-end
Key cases: invoking on a sample idea writes docs/proposals/<slug>.md in the canonical shape (front-matter, core finding, locked decisions), asks recommendation-first questions, and stops at handoff without authoring an execution plan. Automatable slice: after a real invocation, grep the output file for the canonical section headings — a fixture check independent of LLM quality; the reasoning quality stays a guided manual smoke.
Acceptance Criteria
Verification
Run bash tests/plugins/test-build-proposal.sh and confirm it exits 0 (skill present and structurally complete, references + example-*.md resolve, plan-agent registered above the origin/main version with valid JSON). Load the plugin locally with claude --plugin-dir ./kit/plugins/plan-agent and confirm /plan-agent:build-proposal <a half-formed idea> activates the new skill (not implementation-plan), runs the Tier gate and 8-step loop, writes a docs/proposals/<slug>.md in the canonical shape with recommendation-first questions, and stops at the planning handoff — then confirm that artifact feeds straight into /plan-agent:implementation-plan docs/proposals/<slug>.md via its existing .md conversion path. Confirm node -e "require('./.claude-plugin/marketplace.json')" parses and the plan-agent version is 2.5.0. Finally, run /skill-reviewer:reviewing-skills on the new SKILL.md for a scored audit (description ≤200 chars, progressive disclosure, one-level references).
Completion Checklist
Completion Report
No items to report — all requirements met.
Team Review (2026-06-16 00:58:49 UTC) — 5 core reviewers, Apply all
Executive Summary
Architecturally sound and convention-aligned; the panel converged on a consistent set of concrete, high-confidence improvements rather than any blocking objection. No reviewer recommended rejection. All accepted findings were integrated into the plan in place (see Triage Outcome).
Role-by-Role
- Architecture (sound): the handoff seam to implementation-plan had no mechanical contract;
docs/proposals/lacked a resolution hierarchy; deep-research delegation needsSkillin allowed-tools; exemplar provenance could go stale. - Completeness (moderately executable): Step 4 didn't say how to fetch the external-branch sources (critical); the description text was undrafted; an allowed-tools contradiction vs. the source proposal;
docs/proposals/never created;model:undecided; the body was specified by headings only. - Testability: the three-part-description and <500-line checks weren't mechanized; activation-collision untested; an automatable E2E slice (output-file shape) was available but unused; the hardcoded 2.4.1 comparison is drift-prone.
- Risk (high): ambient-activation collision with implementation-plan; under-specified 8-step body; cross-repo exemplar provenance; missing
docs/proposals/dir; no plugin.json version-leak pre-check. - Conventions:
references/examples/nesting violates "references one level deep" (high); omitdisable-model-invocationrather than setfalse; rename the test totest-build-proposal.sh; drop the redundantproposalstag.
Agreements & Conflicts
- Agree (3 reviewers):
docs/proposals/must exist before runtime writes — resolved via a committed.gitkeep+ a runtimemkdir -p. - Agree (3 reviewers): the activation boundary vs. implementation-plan needs to be real and tested — resolved via a drafted disjoint description + a collision assertion.
- No conflicts: findings were complementary; the only tension (the source proposal's "omit allowed-tools" vs. listing tools) was resolved toward the repo's actual convention — peers list allowed-tools.
Highest-Risk Issues (all resolved)
- External-branch exemplar fetch unspecified (blocker) → added the
gh api … vnd.github.rawcommand to Step 4. - Ambient-activation collision → drafted a disjoint description + a test assertion; criterion 8 strengthened.
docs/proposals/missing at runtime →.gitkeep+mkdir -p; new criterion 9.references/examples/two-level nesting → flattened toreferences/example-*.md.
Triage Outcome — Apply all (accepted as-is)
- Step 1: drafted three-part description; full allowed-tools incl.
Skill/Agent/WebSearch/WebFetch;model: opus; omitdisable-model-invocation; per-step body imperatives; runtimemkdir -p docs/proposals+.gitkeepscaffold. - Step 4:
gh apiretrieval command; flattened toreferences/example-*.md; source-URL + SHA/date stamp + sensitive-content audit. - Step 5: dropped the redundant
proposalstag (keptproposal,research). - Step 6: plugin.json version-leak pre-check (before and after the edit).
- Step 7: renamed to
test-build-proposal.sh; addedwc -l< 500, a three-part-description regex, an activation-collision grep, and a dynamicorigin/mainversion comparison; plus an optional output-shape fixture slice. - Propagated: Tests, Files, Acceptance Criteria (now 9), Verification, and the embedded digest were all updated to match; the handoff seam to implementation-plan is now concrete via its
.mdconversion path. - Post-review decision (2026-06-16):
docs/proposals/configurability — deferred at review time — was resolved per user direction to mirrorplansDirectory(--dir→planAgent.proposalsDirectory→docs/proposals/→ default), now encoded in Step 1. Proposal artifacts are committed (tracked via.gitkeep), consistent withdocs/plans/.