ijfw-agents-md
Maintain canonical AGENTS.md (open spec). Trigger: 'agents.md', 'update AGENTS.md', or auto-fired by ijfw-team after agent generation.
Use when the user says 'plan this', 'plan it', 'make a plan', 'let's plan', 'draft a plan', 'how should we tackle this', 'break this down', or invokes '/ijfw-plan'. Produces a falsifiable PLAN.md (software, book, campaign, design, research) with task breakdown, dependency
$ npx -y skills add FerroxLabs/ijfw --skill ijfw-plan --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/ijfw-planContext preview
The summary Claude sees to decide when to auto-load this skill.
Use when the user says 'plan this', 'plan it', 'make a plan', 'let's plan', 'draft a plan', 'how should we tackle this', 'break this down', or invokes '/ijfw-plan'. Produces a falsifiable PLAN.md (software, book, campaign, design, research) with task breakdown, dependency
name: ijfw-plan description: "Use when the user says 'plan this', 'plan it', 'make a plan', 'let's plan', 'draft a plan', 'how should we tackle this', 'break this down', or invokes '/ijfw-plan'. Produces a falsifiable PLAN.md (software, book, campaign, design, research) with task breakdown, dependency wave-table, and success criteria — gated by validatePlan() + ijfw-plan-checker before dispatch." since: '1.5.0' allowed-tools: Read, Write, Edit, Bash, Grep, Glob, AskUserQuestion, Agent
You are the orchestrator-facing trigger that turns a brief (and optionally a SPEC.md / research notes) into an executable PLAN.md. Plan output is the same shape across domains: software slice, book chapter, marketing campaign, design system release, research milestone. The deliverables differ; the structure doesn't.
This skill is the body for the `/ijfw-plan` slash command. Both paths land here. Slash invocation may pass `[brief description]` as `$1`.
1. User explicitly asks: "plan this", "plan it", "make a plan", "let's plan", "draft a plan", "break this down". 2. `/ijfw-plan` slash command is invoked. 3. ijfw-workflow Deep path enters the Plan gate after Discovery + Research. 4. ijfw-spec-phase has emitted SPEC.md and the user wants HOW next.
If `.ijfw/memory/brief.md` is missing AND no SPEC.md exists for the active slice, ask one clarifying question first: `What are we planning? (one sentence)`. Never guess.
1. `.ijfw/memory/brief.md` — original ask + success criteria. 2. `.ijfw/memory/research.md` — anything Discovery / Research surfaced. 3. `.planning/<milestone>/<phase>/SPEC.md` — locked acceptance criteria. 4. `.planning/<milestone>/<phase>/CONTEXT.md` — decisions resolved in discuss. 5. `.planning/ROADMAP.md` — where this slice sits in the bigger arc. 6. `.planning/PROJECT.md` — non-negotiables.
Detect domain from brief language and project layout:
Domain choice changes vocabulary, NOT the output shape.
If a phase is active (`.ijfw/state/active-milestone` + `.ijfw/state/active-phase` both exist), write to `.planning/<milestone>/<phase>/PLAN.md` and also mirror the task list to `.ijfw/memory/plan.md` for the runtime gate to read.
Otherwise write the primary plan to `.ijfw/memory/plan.md`.
--- domain: software | book | campaign | design-system | research time_budget: HOUR_1 | HOUR_2_3 | HOUR_4_5 | HOUR_6_PLUS brief_ref: .ijfw/memory/brief.md spec_ref: .planning/<milestone>/<phase>/SPEC.md # optional created_at: <ISO-8601> --- # PLAN — <slice name> ## Goal <One-sentence outcome — what ships when this plan completes.> ## Success Criteria 1. <Falsifiable, binary pass/fail.> 2. <...> ## Tasks ### Task task_id: T01 — <verb-noun title> - **Deliverable:** <file path / chapter draft / asset / dataset> - **Acceptance:** <done when ...> - **Touches:** <file paths / chapter sections / channels> - **Depends:** <task_id> | none - **Risk:** low | medium | high — <one-line reason> ### Task task_id: T02 — ... ## Dependency Wave Table | Wave | Tasks (parallel within wave) | Gates between waves | |------|------------------------------|---------------------| | W1 | T01, T02 | none | | W2 | T03 (depends T01) | T01 acceptance met | | W3 | T04, T05 (depends T02, T03) | T03 acceptance met | ## Out of Scope (Deferred to backlog) - <Mentioned in brief but cut from this slice; reason.>
Multi-domain examples (substitute deliverables, keep the shape):
= `npm test -- login` exit 0. Touches = `src/auth/`, `tests/auth/`.
from outline covered, POV consistent, word count ±10% of target. Touches = `chapters/04-*`, `outline.md`.
Acceptance = subject line + preview text + body locked, links tracked. Touches = `campaign/launch-week/`, `analytics/utm-plan.md`.
contrast ratios meet WCAG AA, dark-mode pair validated. Touches = `tokens/`, `docs/migration.md`.
Before drafting, ask one AskUserQuestion to lock the time budget:
{
"question": "How much focused time do we have for this slice?",
"header": "Time budget",
"options": [
{ "label": "≤ 1 hour", "description": "Up to 3 tasks; smallest viable slice" },
{ "label": "2-3 hours", "description": "Up to 7 tasks; one feature end-to-end" },
{ "label": "4-5 hours", "description": "Up to 12 tasks; meaningful slice with polish" },
{ "label": "6+ hours", "description": "Unlimited tasks; full milestone scope" }
]
}Record the choice in PLAN.md frontmatter as `time_budget`. The pre-dispatch gate uses it to detect budget overrun.
Before handing the plan to execute, run the deterministic gate that's wired into the existing `ijfw_state` MCP tool's `subagent.post-done` verb routing (v1.5.0 T13 — single state-SDK face, cap stays 12/12):
// Library — no new MCP tool needed (cap is 12/12).
const { validatePlan } = require('./mcp-server/src/orchestrator/plan-checker.js');
const planText = fs.readFileSync('.ijfw/memory/plan.md', 'utf8');
const { findings, blocked } = validatePlan(planText, { strict: false });The gate checks (all defined in `plan-chec
IJFW — It Just F*cking Works. Ferrox Labs' local-first infrastructure for AI coding agents: shared memory, smart routing, multi-AI cross-audits, disciplined workflow.
Repo: FerroxLabs/ijfw
Maintain canonical AGENTS.md (open spec). Trigger: 'agents.md', 'update AGENTS.md', or auto-fired by ijfw-team after agent generation.
Session-end auto-extraction of lessons, errors, fixes, and user feedback into structured memory. Fires at session end. Requires consent on first run.
Terse conventional commits. Trigger: commit, git commit, /ijfw-commit
Use when a milestone is shipping and you need to archive its artifacts, generate a summary, and seed the next milestone. Trigger: 'milestone complete', 'ship…
Compress memory/context files into terse form. Trigger: /compress, compress file
Use when the user says: 'compute', 'crunch this', 'analyze logs', 'aggregate the data', 'run a script', 'dedupe', 'count by', 'top N', or any data-shaping ask.…