planpilot supports two input layouts through plan_paths in planpilot.json:
- Unified file (
unified) - Split files (
epics,stories,tasks)
plan_paths:
{
"plan_paths": { "unified": ".plans/plan.json" }
}plan.json:
{
"items": [
{
"id": "E1",
"type": "EPIC",
"title": "Payments Platform",
"goal": "Unify payment flows",
"requirements": ["R1"],
"acceptance_criteria": ["AC1"]
}
]
}plan_paths:
{
"plan_paths": {
"epics": ".plans/epics.json",
"stories": ".plans/stories.json",
"tasks": ".plans/tasks.json"
}
}Split files are arrays. type is optional/ignored; loader assigns type by file role.
epics.json:
[
{
"id": "E1",
"title": "Payments Platform",
"goal": "Unify payment flows",
"requirements": ["R1"],
"acceptance_criteria": ["AC1"]
}
]stories.json:
[
{
"id": "S1",
"title": "Checkout API",
"goal": "Expose stable payment endpoint",
"parent_id": "E1",
"requirements": ["R2"],
"acceptance_criteria": ["AC2"]
}
]tasks.json:
[
{
"id": "T1",
"title": "Add idempotency keys",
"goal": "Prevent duplicate charges",
"parent_id": "S1",
"requirements": ["R3"],
"acceptance_criteria": ["AC3"],
"depends_on": ["T0"]
}
]Required for all items:
idtitlegoalrequirementsacceptance_criteria
Important optional fields:
parent_idsub_item_idsdepends_onestimateverificationscopespec_ref
- IDs must be globally unique.
- Parent type rules:
- story -> epic
- task -> story
- epic cannot have parent
- Reference checks depend on
validation_mode:strict: unresolved refs failpartial: unresolved refs allowed when item is not loaded
For full validation semantics, see modules/plan.md.