feat(bin): unify design tasks into one planning conversation - #272
Merged
Merged
Conversation
Keep Kun research and optional visuals, dependency-aware questioning, and short ADRs in a single design path instead of stacked workflows, and leave plugin lifecycle to the captain-owned install outside this repo. Co-authored-by: Cursor <cursoragent@cursor.com>
…lanning conversation
HelloWorldSungin
force-pushed
the
fm/fm-unified-kun-matt-planning
branch
from
September 14, 2026 03:02
f2dad68 to
b4f82e8
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Intent
The captain approved one planning conversation rather than stacked Kun, Matt and ADR workflows. Use Kun research and visual proposals where useful; selectively use Matt dependency-aware questioning and domain-modeling. Retain short committed ADRs only for consequential architectural tradeoffs, not routine configuration changes. Preserve existing decisions and in-flight designs.
What Changed
fm-brief.sh --designnow writes a brief for one planning conversation instead of stacked Kun, Matt and ADR passes. The worker researches facts first and may uselavish-axifor a visual proposal, but that review is optional. It uses the dispatch-pinnedgrillingskill only to ask the next unblocked decision, one keyed question at a time, and usesdomain-modelingfor terms. It must not importgrill-with-docs,to-spec,to-tickets,wayfinder,implementorCONTEXT.md. A short ADR is written only when domain-modeling's ADR bar is met. If the change turns out to be routine configuration, the worker stops with aneeds-decisioninstead of writing an ADR.fm-spawn.sh's pinned-skills preamble now says to use those skills inside the one conversation. Thedesign-profileskill,AGENTS.mdand the docs now describe Design as an ADR task for consequential architectural tradeoffs. They say routine configuration changes are ships, and that no design interview or visual review goes in front of authorized, well-specified implementation. Live tasks keep their existing briefs and keyed decision inventory.fm-design-skills.sh,fm-brief.shandfm-spawn.sh, plus related comments, now call the plugin install "captain-owned" instead of pointing to an auto-updating/pluginaction.tests/fm-brief.test.sh,tests/fm-design-skills.test.shandtests/fm-outcome-manifest.test.shwere updated to match the new brief and error wording.🤖 Generated with Claude Code
Risk Assessment
✅ Low: Most of the change is prompt, doc and error-message wording. The only runtime effect is new text in the generated design brief and in the design-skill refusal messages. It meets the stated intent: one planning conversation, optional visual proposals, grilling used selectively, ADRs held to the domain-modeling ADR bar, and in-flight briefs left untouched. The tests check that generated output.
Testing
I ran the design and ship scaffolding CLIs in an isolated FM_HOME against the real installed Matt plugin. The design brief carries the one-conversation contract: optional lavish-axi, one unblocked grilling question at a time, domain-modeling's ADR bar with no ceremonial ADRs, and no /plugin updater. The ship brief has none of the planning stack. A missing plugin is refused with captain-owned wording and no brief is written, and an existing in-flight brief is left byte-identical. The targeted tests for design dispatch pinning, relaunch, manifest provenance and the harness matrix all passed, but they use stub harnesses, so those scenarios are not counted as live. Real worker sessions were not launched, so how a model actually follows the brief is still untested. Everything is CLI or text output, so there are no screenshots. The worktree was left clean.
Evidence: Real plugin resolve + design scaffold transcript
Evidence: Generated design brief (worker-facing prompt)
Evidence: Ship brief, missing-plugin refusal, in-flight preservation transcript
Evidence: Targeted design/brief/relaunch/manifest test output
Evidence: Design dispatch matrix output
Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
tests/fm-brief.test.sh:1572- The new ship-brief check runsfm-brief.sh ship-no-planning-stack sample-ship ... >/dev/null 2>&1and never checks its exit code or that the brief exists.assert_no_grepis! grep -F pat file, and grep returns 2 on a missing file, so if this scaffold ever fails (bad arg, new required env, refusal) all threeassert_no_grepchecks (grilling, lavish-axi, planning conversation) pass without testing anything. Capture rc andexpect_code 0, orassert_grep/[ -f ]the brief before the negative checks.bin/fm-spawn.sh:1977- The change rewords plugin provenance from 'auto-updating, captain uses /plugin' to 'captain-owned install that can change between tasks', but two places keep the old framing: the comment at bin/fm-spawn.sh:1977 ('the captain has that plugin on auto-update') and docs/scripts.md:45 ('captain-installed mattpocock plugin'). Align them with the new wording so the plugin lifecycle is described one way everywhere.🔧 Fix applied.
✅ Re-checked - no issues remain.
bin/fm-design-skills-lib.sh:28- This change rewords the plugin as a 'captain-owned install that can change between tasks' everywhere else, and round 1 already fixed the same leftover wording in fm-spawn.sh and docs/scripts.md. The comment on adopt_relaunch_design_skills still says 'a later plugin auto-update must not silently rebind the interview'. Change it to something like 'a later change to the captain-owned install must not silently rebind the interview' so the plugin lifecycle is described one way.✅ **Test** - passed
✅ No issues found.
bin/fm-design-skills.sh checkagainst the real captain-installed mattpocock plugin (v1.2.3)FM_HOME=<tmp> bin/fm-brief.sh unified-design sample --design --mode no-mistakesand inspected the rendered Design profile sectionFM_HOME=<tmp> bin/fm-brief.sh plain-ship sample --mode no-mistakesthen grep for grilling/lavish-axi/planning conversation/domain-modeling (none found)FM_MATTPOCOCK_PLUGIN_REGISTRY=/nonexistent bin/fm-brief.sh blocked-design sample --design(refused rc=1, no brief written)FM_MATTPOCOCK_PLUGIN_REGISTRY=/nonexistent bin/fm-design-skills.sh resolve(captain-owned refusal wording)bash tests/fm-design-skills.test.sh(includes the fm-spawn design dispatch: pinned paths, one-conversation wording, refusal)bash tests/fm-brief.test.shgit diff --name-status 668b61f1 989f42f4to confirm no docs/adr or in-flight design files changed✅ No issues found.
bin/fm-design-skills.sh checkandresolveagainst the real installed mattpocock-skills 1.2.3 registryFM_HOME=<tmp> bin/fm-brief.sh design-live sample --design --mode no-mistakeswith the real plugin, then read the generated brief.mdChecked that the real plugin's domain-modeling SKILL.md defines the 3-part ADR bar the brief cites, and that grilling's 'ask whole frontier' is overridden by the briefFM_HOME=<tmp> bin/fm-brief.sh ship-live sample --mode no-mistakesand counted grilling/lavish-axi/planning conversation/ADR in the briefFM_MATTPOCOCK_PLUGIN_REGISTRY=/nonexistent.json bin/fm-brief.sh design-missing ... --designandbin/fm-design-skills.sh checkrefusal pathsPre-seeded an in-flight design brief under the old contract and re-ranfm-brief.sh design-inflight --designto confirm it is not rewritten (sha1 unchanged)bash tests/fm-design-skills.test.sh(drives fm-spawn.sh --design dispatch pinning with stub harness)bash tests/fm-brief.test.shbash tests/fm-control-relaunch.test.sh(design relaunch keeps pin/inbox/work on claude, codex, pi)bash tests/fm-outcome-manifest.test.shbash tests/fm-spawn-dispatch-profile.test.sh(design matrix across harnesses)✅ **Document** - passed
✅ No issues found.
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ No issues found.
✅ **Push** - passed
✅ No issues found.
✅ No issues found.