brainstorm-promotion: author the prompt file for the content-publisher brainstorm agent in COMPANY.md.
Background
content-publisher is the X content owner: it reads the next slot from growth/X_CONTENT_CALENDAR.md, surfaces the polished draft as a ticket for the founder, and after the human posts, captures the URL + flips status: posted in the calendar. NEVER auto-posts (governance: human-per-post).
32 drafts already seeded under growth/drafts/ for the Season 1 calendar — the workflow exists, it just needs an agent to drive it consistently.
Spec (lifted from COMPANY.md L316-358)
- id: content-publisher
state: brainstorm
title: X Content Publisher
role: growth-content
team: growth
reportsTo: founder
proposedPromptFile: agents/content-publisher.md
rationale: >
32 drafts seeded under growth/drafts/ for the Mon May 25 → Sun Jun 21
Season 1 calendar. Posting cadence is manual today; one missed slot
breaks the week's narrative arc. The "edit + post" workflow in
growth/X_CONTENT_CALENDAR.md is a perfect agent surface: read the
next slot, surface the polished draft to the founder as a ticket,
after human posts capture the URL, mark `status: posted` + fill
`posted_url` in the calendar. NEVER auto-posts.
proposedScope:
reads:
- growth/X_CONTENT_CALENDAR.md
- growth/drafts/**/*.md
- growth/templates/**/*.md
- growth/X_GROWTH_PLAN.md
writes:
- growth/X_CONTENT_CALENDAR.md (status + posted_url updates only)
- growth/drafts/<date>-<type>-<topic>.md (polish-pass diffs, gated by approval)
ticketsTo: founder
heartbeat: "0 8 * * *" # 08:00 UTC, well before the 15:00 / 16:30 UTC posting windows
proposedSkills: [growth-content]
proposedMcps:
- id: repo-editor-mcp
rationale: read + diff draft files; same allowlist guard as issue-implementer
- id: twitter-mcp (NEW)
rationale: optional, read-only at first (fetch posted URL after the fact); writing only after explicit founder opt-in per post
governance:
mayCommitToMain: false
mayOpenGitHubIssues: false
mayOpenGitHubPRs: true # for calendar status updates
mayPostPublicChannel: false # human-in-the-loop for every X post in v1
writeApprovalKind: human-per-post
proposedBudgetUsd: 25
Acceptance criteria
Lifecycle next steps after PR merges
- Operator runs
npm run sync:paperclip then npm run paperclip:import to push the new mirror state into Paperclip.
- Operator configures the shell adapter for
content-publisher in the Paperclip UI (command/args/cwd/env-passthrough per the pattern documented in docs/PAPERCLIP_RUNBOOK.md Phase 4b).
- Operator activates the heartbeat schedule (
0 8 * * *) in Paperclip.
- Smoke test: UI → Employees → content-publisher → Run now. Watch
agents/memory/content-publisher/paperclip-heartbeat.json get written.
- Update
AGENT_DEPLOYMENT_MEMORY.md Paperclip row description with the newly-active employee.
Depends on
References
Open decisions
- Ship twitter-mcp v1 (read-only) or defer entirely? See L358.
brainstorm-promotion: author the prompt file for the
content-publisherbrainstorm agent inCOMPANY.md.Background
content-publisheris the X content owner: it reads the next slot fromgrowth/X_CONTENT_CALENDAR.md, surfaces the polished draft as a ticket for the founder, and after the human posts, captures the URL + flipsstatus: postedin the calendar. NEVER auto-posts (governance:human-per-post).32 drafts already seeded under
growth/drafts/for the Season 1 calendar — the workflow exists, it just needs an agent to drive it consistently.Spec (lifted from COMPANY.md L316-358)
Acceptance criteria
agents/content-publisher.mdmatching the frontmatter + structure ofagents/self-improver-issues.mdandagents/issue-implementer.md:name,description,mcpServers,writeTools,maxTurns(suggest 12),temperature(suggest 0.4),model(suggestgpt-5-codexsince this is content-engineering reasoning)## Never doesboundary explicitly (NEVER auto-posts; NEVER edits already-posted entries; NEVER posts to @indexflowDAO directly —broadcast-botowns @IndexFlowBots, not this agent).growth-contentskill (brainstorm-promotion: author agents/skills/growth-content.md #23) — agent must read it before drafting.posted_urlmanually? Decision documented in the PR description.{ slug: "content-publisher", sourcePath: "agents/content-publisher.md" }toACTIVE_RUNNABLE_EMPLOYEESinscripts/sync-paperclip-mirror.mjs.state: brainstorm→state: activeinCOMPANY.md§Brainstorm and move the entry into §Active.Lifecycle next steps after PR merges
npm run sync:paperclipthennpm run paperclip:importto push the new mirror state into Paperclip.content-publisherin the Paperclip UI (command/args/cwd/env-passthrough per the pattern documented indocs/PAPERCLIP_RUNBOOK.mdPhase 4b).0 8 * * *) in Paperclip.agents/memory/content-publisher/paperclip-heartbeat.jsonget written.AGENT_DEPLOYMENT_MEMORY.mdPaperclip row description with the newly-active employee.Depends on
References
COMPANY.md§Brainstormcontent-publisher(L316-358)growth/X_CONTENT_CALENDAR.md,growth/drafts/,growth/templates/,growth/X_GROWTH_PLAN.mdagents/self-improver-issues.md,agents/issue-implementer.mddocs/PAPERCLIP_RUNBOOK.md,COMPANY.md§LifecycleOpen decisions