Use when breaking down a project into ideas, proposals, and tasks using Fennec's DB-backed PM. Use when user says plan, roadmap, backlog, decompose, elaborate, propose, or wants to organize work. All state stored in Fennec DB, visible in the web dashboard. Replaces markdown-file-based project-planning.
Structured project planning that uses Fennec's database-backed entities exclusively. No local markdown files — everything is stored in the Fennec daemon via fennec_execute MCP tool and visible in the web dashboard at http://localhost:3000.
Idea (intent capture)
→ Elaboration (AI-driven Q&A to refine scope)
→ Proposal (formalized plan from elaboration)
→ Decomposition (AI agent explores codebase, produces task plan)
→ Tasks + Task Group + Dependencies (execution units)
→ Mission (multi-milestone orchestration for large efforts)
All entities live in PostgreSQL. All operations go through fennec_execute.
http://localhost:4567fennec.projects.list() to check, to registerfennec.projects.onboard({ name, path })| Mode | Trigger | What It Does |
|---|---|---|
| Plan | New feature, no existing idea | Full pipeline: idea → elaborate → propose → decompose → approve |
| Quick | Small/clear task, no elaboration needed | Create tasks directly, optionally group them |
| Add | New work for existing project | Create idea, elaborate, add to existing or new task group |
| Review | Check status, see what's planned | List ideas, proposals, tasks, missions — show progress |
| Decide | Record architectural trade-off | Log decision with rationale and context |
For substantial features that need scoping before implementation.
const idea = await fennec.ideas.create({
projectId: "<id>",
title: "Add user authentication with JWT",
content: "Full auth system: register, login, token refresh, middleware, role-based access control..."
});
// Save idea.id for next steps
Let Fennec's AI generate clarifying questions and answer them automatically based on codebase context:
const { round, summary } = await fennec.ideas.elaborateAI(idea.id);
// round contains generated questions + answers
// summary is a text overview of elaboration findings
Review the summary. If more depth is needed, call elaborateAI again — it creates additional rounds.
Convert elaboration answers into a formal proposal:
const { proposal } = await fennec.ideas.synthesize(idea.id);
// proposal has: id, title, description, status: "draft"
Review the proposal description. If it looks good:
await fennec.proposals.submit(proposal.id); // draft → pending
await fennec.proposals.approve(proposal.id); // pending → approved
To reject with feedback:
await fennec.proposals.reject(proposal.id, "Need to include rate limiting");
Use the AI decomposer to break the approved work into parallelizable tasks:
const { planId } = await fennec.projects.decompose(projectId, {
intent: proposal.description, // or refine the intent
strategy: "auto" // "parallel" | "sequential" | "auto"
});
This spawns an agent that explores the codebase. Poll for completion:
const result = await fennec.projects.getDecomposition(projectId, planId);
// result.status: "running" | "completed"
// result.plan: { tasks, rationale, estimatedComplexity, warnings }
IMPORTANT: The decomposition runs async. Poll every 10-15 seconds until status === "completed". The plan has a 10-minute cache TTL.
Once status === "completed", review result.plan:
Approve to create actual tasks + task group + dependencies:
const materialized = await fennec.projects.approveDecomposition(projectId, planId);
// materialized: { groupId, tasks: [{id, title, localId}], dependenciesCreated, decisionId }
The decomposer auto-logs a decision on approval, but log additional context:
await fennec.decisions.log({
projectId,
title: "Approved auth implementation plan",
rationale: "6 tasks in 3 parallel groups, estimated moderate complexity",
context: "Decomposed from idea " + idea.id
});
For clear, well-defined work that doesn't need elaboration.
// Create task group
const group = await fennec.taskGroups.create({
projectId,
title: "Sprint 5 — API cleanup",
description: "Fix response formats and add validation"
});
// Create tasks in the group
const t1 = await fennec.tasks.create({
projectId,
title: "Standardize error response format",
description: "All endpoints return { error: string, code?: string }",
priority: "medium",
groupId: group.id
});
const t2 = await fennec.tasks.create({
projectId,
title: "Add Zod validation to task routes",
priority: "low",
groupId: group.id
});
// Add dependencies if needed
await fennec.tasks.createDependency(t2.id, t1.id); // t2 depends on t1
// List existing task groups to find where new work fits
const groups = await fennec.taskGroups.list({ projectId });
// Create new idea for the addition
const idea = await fennec.ideas.create({
projectId,
title: "Add WebSocket authentication",
content: "Extend existing auth to validate WS connections..."
});
// Quick AI elaboration
const { summary } = await fennec.ideas.elaborateAI(idea.id);
// If small enough, create task directly in existing group
const task = await fennec.tasks.create({
projectId,
title: "Add auth middleware to WebSocket upgrade handler",
description: summary,
priority: "high",
groupId: groups[0].id // add to existing group
});
// Full project status
const [ideas, tasks, groups, missions, decisions] = await Promise.all([
fennec.ideas.list({ projectId }),
fennec.tasks.list({ projectId }),
fennec.taskGroups.list({ projectId }),
fennec.missions.list({ projectId }),
fennec.decisions.list({ projectId }),
]);
// Task breakdown by status
const byStatus = {};
for (const t of tasks) {
byStatus[t.status] = (byStatus[t.status] || 0) + 1;
}
return { ideas: ideas.length, tasks: byStatus, groups: groups.length, missions: missions.length, decisions: decisions.length };
Every significant trade-off should be recorded:
await fennec.decisions.log({
projectId,
title: "Use JWT over session cookies for auth",
rationale: "Stateless, works with microservices, simpler for API-first architecture. Trade-off: token revocation requires allowlist.",
context: "Decided during auth planning, see idea <id>"
});
Search past decisions for context:
const results = await fennec.knowledge.search("authentication approach", { projectId, limit: 5 });
For work spanning multiple task groups with validation checkpoints, use missions:
// List missions for a project
const missions = await fennec.missions.list({ projectId });
// Get mission details with milestones and events
const detail = await fennec.missions.get(missionId);
// detail: { mission, milestones, events }
// Start mission execution
await fennec.missions.start(missionId);
// Monitor milestones
const milestones = await fennec.missions.listMilestones(missionId);
// Pause/resume if needed
await fennec.missions.pause(missionId);
await fennec.missions.resume(missionId);
elaborateAI and decompose instead of manual breakdownfennec.decisions.logapproveDecompositionfennec.knowledge.search for past context before planningPlan: ideas.create → ideas.elaborateAI → ideas.synthesize → proposals.submit/approve → projects.decompose → projects.approveDecomposition
Quick: taskGroups.create → tasks.create (with groupId) → tasks.createDependency
Add: ideas.create → ideas.elaborateAI → tasks.create (in existing group)
Review: ideas.list + tasks.list + taskGroups.list + missions.list + decisions.list
Decide: decisions.log + knowledge.search