feat(capabilities): general draft content capability (batch + select-and-say revise) - #107
Open
sameeeeeeep wants to merge 2 commits into
Open
feat(capabilities): general draft content capability (batch + select-and-say revise)#107sameeeeeeep wants to merge 2 commits into
draft content capability (batch + select-and-say revise)#107sameeeeeeep wants to merge 2 commits into
Conversation
…elect-and-say revise)
The composition vision was missing a factored, general content-drafting
capability — every existing core is single-purpose (batch = a YC application,
reachout = one lead's sequence). `draft.core.js` fills that gap and ships two
actions on one capability:
• draft(input, sb) — N distinct pieces of one format (x-thread, x-single,
linkedin, ig-caption, ig-carousel), grounded in a
voice/angle/audience brief. The content pipeline's
last stage.
• revise(input, sb) — one piece + a steer, re-drafted in place. The primitive
behind notch "select-and-say" (select a block → your
words become a steer → re-run JUST that piece), on the
same `steers` contract reachout already uses.
Registered in switchboard-mcp/registry.mjs (one import + MANIFESTS push) →
wrapp__draft__draft / wrapp__draft__revise, composable by the planner and the
edit layer via the shared run(input, sb) contract.
Verified: mock-sb unit test (messy-fence parse, n-count pad/truncate, steer
ordering, format guides, actionTable run-parity) all green; real end-to-end run
through the user's own Claude drafts + revises real posts correctly.
Not yet wired into the launcher/MCP live path (needs daemon+MCP reload).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…voice-fix draft prompt
Builds out the select-and-say edit loop and the "help every step" principle,
and fixes the draft voice.
draft (prompt fix): replaced the hook/CTA-oriented prompt with a hard VOICE
rule — one idea per piece; no announcements, no "I call them X" coinage-reveals,
no feature-bullet cadence, no screenshot-bait aphorisms, no rhetorical-question
endings, no sign-off clichés; keep the person's plain words instead of polishing
them. Stripped "scroll-stopping hook"/closing-CTA from every format guide. Fixed
a latent ${count} interpolation bug in the no-topic branch.
record (new capability): the "no step ends with 'you go do it'" principle as
code. plan() turns a written post into a spoken teleprompter (paced lines) +
shot plan + setup checklist; buildRecordGuide()/guide() emit a teach-mode guru
flow that speaks each line and walks the take — the human only supplies face and
voice. Registered as wrapp__record__plan / wrapp__record__guide.
arrange (new capability): the EDITOR, not the writer. Takes a person's own raw
words and only cuts filler / fixes transcription / breaks into lines / reorders
— never adds a sentence, hook, or aphorism. This is what should back select-and-
say for a founder's own voice (generate-from-a-brief produced slop). Registered
as wrapp__arrange__arrange.
draft wrapp UI (new): examples/apps/src/draft.js (+ draft.html, wrapps/draft/
switchboard.json, build + harness wiring) — the select-and-say front-end. Each
piece renders with a steerRow; on steer submit it calls revise({piece,steers,
brief}, relay) in-page and swaps THAT piece in place, others untouched.
Verified: draft + record unit tests green; registry loads all of
wrapp__{draft__draft,draft__revise,record__plan,record__guide,arrange__arrange};
draft UI builds + a live harness run swapped one piece in place on steer.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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.
What & where
Adds the general content-drafting capability the composition vision was missing. This is the capability layer — not the launcher (
packages/menubar/is untouched). It's the piece the launcher will eventually compose.examples/apps/src/core/draft.core.js— new capability corepackages/switchboard-mcp/registry.mjs— registers it (one import + MANIFESTS push)Why
Every existing core is single-purpose (
batch= a YC application,reachout= one lead's sequence). A real dogfood test — composing capabilities for a live "start making content on X/IG/LinkedIn" goal — confirmed the seed→strategy half composes (ideabrain.brief→autopilot.slate) but there was no general "draft N posts" capability to close it. This is that capability.Two actions, one capability
draft(input, sb)— N distinct pieces of one format (x-thread,x-single,linkedin,ig-caption,ig-carousel), grounded in a voice/angle/audience brief. The content pipeline's last stage.revise(input, sb)— one piece + a steer, re-drafted in place. The primitive behind notch select-and-say (select a block → your words become a steer → re-run just that piece), on the samesteerscontractreachoutalready uses.Both surface as
wrapp__draft__draft/wrapp__draft__reviseand are composable by the planner + edit layer via the sharedrun(input, sb)contract.Verification
actionTable()run-parity (the exact call the connector makes).revise("punchier, lead with the stat")tightens correctly.Not in this PR (follow-ups)
onAsk/ live MCP path (needs daemon+MCP reload — the running MCP won't hot-reloadregistry.mjs).compose.mjsplanner (query +actionTable()→ plan → chained run).revise→ notch select-and-say edit layer; steers →taste.md.🤖 Generated with Claude Code