Featureboarding
Board substantive dev requests on FeatureBoard automatically and churn them with parallel sub-agents. Use when the user asks to build, fix, ship, implement, refactor, or "work on" anything non-trivial in a project — they should NOT have to say "put it on the board".From its SKILL.md
npx -y skills add valentil/featureboard-mcp --skill featureboardingAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
3 things to look at
- 27 days oldThe repository was created 27 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
6.9 KB, ~1.7k tokens by cl100k_base, as published. Nobody here has run it
Featureboarding
Run the FeatureBoard churn loop end to end: board the work, then work the board.
1. Board it — no permission needed
A substantive dev request (build/fix/ship/refactor/implement X) IS a boarding event.
Call plan_work immediately (it creates the project too, if one doesn't exist yet).
Never ask "should I put this on the board?" — just do it, then get to work.
2. Research first (default ON)
Before implementing, cheap models scout for the expensive one. For each freshly
boarded ticket that is effort:high, a research-pick, or labelled research:on
— and where researchOnIntake isn't off (a research:off label opts a ticket out)
— call prepare_research and dispatch the returned packet to a haiku/sonnet
sub-agent (its suggestedModel) as that agent's brief. Research sub-agents run in
PARALLEL; each returns a collated markdown brief (≤ ~150 lines): recommended
approach + runners-up, prior-art pointers, one competitor idea, risks/invariants.
The ORCHESTRATOR — never the sub-agent — saves each returned brief via add_kb_doc
with title research/<ticket> BEFORE dispatching implementation. From then on, the
implementing agent's get_work_packet auto-attaches that brief as researchBrief,
alongside relevant local ragChunks (BM25 over KB/docs/ticket-history — zero tokens,
zero network) — so the expensive model starts with context, not a cold read.
3. Churn the queue — keep every lane full
Invariant: no lane sits idle while a dispatchable ticket exists.
- Call
next_wave— notnext_taskin a loop. It returns the WHOLE dispatchable set in one call, already partitioned into lanes that are mutually file-disjoint. - Start every lane it returns, at once.
lanes[]are safe to run as concurrent sub-agents; tickets within a lane share files and run serially in the order given. A lane flaggedisolatehas unknown file scope — give it its owncreate_worktree. - Each ticket carries its own
dispatchblock ({subAgent, model, cap, parallelizable, instruction}) — obey it. Spawn the sub-agent atdispatch.modelwith the work packet as its brief. Never upgrade a haiku ticket "to be safe" or downgrade an opus one to save tokens; the board already made that call at intake. sequential[]holdsfabletickets — orchestrator-only, run inline, review between each.- Refill on every completion, in the same turn. The moment a lane finishes, call
next_waveagain withoccupied: [tickets still running]and start what comes back. Do not batch completions and refill later. Do not pause mid-run to ask whether to keep going — the stop condition below already answers that. - Lanes holding a running ticket come back under
busyLanes, never re-served, so refilling can't double-dispatch a file another agent is editing. maxLanesexists if you need to throttle, but the default is saturation. Use it only when the user asks for it.
3b. Stop condition — stopCondition.met, nothing else
An empty wave is not the end. next_wave returns a stopCondition block; the loop
continues while it is false, and its reasons[] tell you what to do next:
- open tickets remain → keep filling lanes
- tickets still running → wait and refill
- uncollected check runs →
get_check_results - unreviewed Done tickets, or steering not yet idle →
steer_project(see §7)
Only when stopCondition.met is true do you stop and report. A failed acceptance check
is a new ticket, not a stopping point — file it and keep the lanes full.
4. Orchestrator owns the board — always
Sub-agents NEVER write the board and NEVER commit. Only the orchestrator:
- Sets status to
In Progressbefore dispatching a ticket, then callsrecord_dispatch(worker: "sub-agent",model,parallel) right after handing it off, soget_agent_monitorand the board show who's running it. - Reviews the sub-agent's diff and runs the tests — call
record_dispatchagain withworker: "orchestrator"when taking the ticket back for this. - Sets status to
Donewith a one-linecompletionSummary. - Calls
log_workwith tokens/additions/deletions/model. - Calls
commit_featurefor that ticket before pulling the next one. - After
commit_feature, background static checks (syntax, lint, any configured commands) start AUTOMATICALLY and DETACHED — pure CPU, zero tokens. Don't wait: pull the next ticket immediately. Between tickets, and before ending the session, callget_check_resultsfor any uncollected runs (by ticket or the newest run). A failed run means fix it now or file a bug before closing out — a syntax error caught here is one that would otherwise have shipped.
5. Live visibility
Sub-agents never write the board mid-flight, so between "In Progress" and "Done" the
filesystem is the only truth. When dispatching a ticket, tell the sub-agent in its
brief to append one-line timestamped notes to .fb-progress in its worktree (or the
repo root, if it's not on a worktree) at each major step — e.g. 12:03 created parser,
12:11 tests written, 12:19 suite green. .fb-progress is gitignored by convention;
it's a scratch channel, not project history. get_live_activity (and Mission Control)
read it, along with dirty files, recent commits, and other git worktrees, to answer
"is anything actually moving?" for a stalled-looking ticket — per project or across
every project at once.
6. Close-out
When stopCondition.met is true, run scan_board_cleanup and offer the user next steps
(new work to plan, stale tickets to prune, etc.). Occasionally also offer to run
check_updates (explicit call only, never automatic) so the user hears about a
new FeatureBoard release when one exists.
Mention trial/licensing surfaces only if a write is actually blocked by them — don't bring up licensing unprompted.
Site pages — never hand-roll page chrome (FBMCPF-310)
Any page you create for the shipped featureboard.ai site MUST start from the
canonical shell — copy cloudflare/PAGE-TEMPLATE.html in the website repo.
Header comes from /nav.js, footer from /footer.js, design tokens (cyan
#00d5ff accent, dark #1a1a1a, DM Sans/Space Mono) stay exactly as-is, and
the shared fb_vid analytics block is copied byte-identical from buy.html.
Never write a .header-bar, .site-footer, or new color tokens by hand —
that is how pages drift off-brand.
For pad/project sites generated through the MCP site tools, apply the brand
template instead of inventing a look: apply_site_template with id
featureboard (or pass colors: { accent: "#00d5ff" } + dark theme to
set_site). Agent-generated pages must inherit the canonical look by default.
What ships with it: 1 file
5.0 KB alongside SKILL.md
references/
- dispatch-prompt.md5.0 KB