Kodo Flow
"Documentation-driven task management, the way Git intended."
What is Kodo Flow?
Kodo Flow is a lightweight, file-based task management methodology. Every task is a plain Markdown file sitting inside your repository, right alongside the code it describes. There is no external service to authenticate against, no database to back up, and no proprietary format to migrate away from someday. Your task history is your Git history.
Because tasks are ordinary files, they work with every editor, every CI system, and every
AI coding tool. You can grep them, git log them, review them in a
pull request, and auto-generate them from a script. Nothing about the methodology requires
a specific IDE, plugin, or operating system.
The core idea is simple: a task moves through your workflow by moving its file between
folders — backlog/, doing/, done/. The folder is
the status. Git records who moved it and when. That is the entire system.
Core Principles
- Tasks are documents. Every task is a self-contained Markdown file with YAML frontmatter and free-form prose sections. It carries its own context — why the work exists, what done looks like, which files are affected — so a developer (or an AI assistant) can understand it without hunting through a separate ticketing system.
- The filesystem is the board. Status is encoded by folder location, not by a field value in a database. Moving a file is the status change. No API calls, no synchronization lag, no merge conflicts on a central store.
-
Git is the system of record. Every status transition, every edit to
acceptance criteria, every note added mid-task — all of it flows through a normal
git commit. You get a full audit trail, branching, code review, and blame for free. - Convention over configuration. The folder layout, frontmatter fields, and file naming scheme are defined once. Everyone on the team (and every tool) shares a single mental model. There is nothing to configure per-project.
- Human-readable first, tool-friendly second. Task files read naturally as prose. Structured fields (frontmatter) are kept minimal so they stay easy to edit by hand. Tooling — editors, scripts, AI — can parse and manipulate them, but a developer with nothing but a terminal can always read, move, and update a task without any tooling at all.
Repository Structure
Kodo Flow uses three artifact types, each in its own folder. Where this root lives in
your repository is up to you — docs/, a top-level folder, or anywhere else
that fits your project.
your-root/
├── epics/ # Broad initiatives (flat folder, no sub-states)
│ └── EPIC-1-platform-hardening.md
├── specs/ # Requirements and design documents (flat folder)
│ └── SPEC-3-auth-requirements.md
└── tasks/ # Kanban board — the only folder with sub-states
├── backlog/ # Planned work not yet started
│ └── TASK-1-add-login-page.md
├── doing/ # Work currently in progress
│ └── TASK-42-api-rate-limiting.md
└── done/ # Completed work (never deleted)
└── TASK-7-initial-setup.md
Only tasks/ has the backlog/, doing/,
done/ sub-states that form the Kanban board. Epics and specs are flat
folders — they don't have a workflow status because they describe intent and requirements,
not deliverable units of work.
File names always embed the stable ID: PREFIX-N-short-slug.md. The prefix
and number are permanent; the slug is a human-readable hint that can be updated as the
work evolves. See IDs and Cross-references for how artifacts reference
each other.
The done/ folder accumulates completed tasks indefinitely. Do not delete
them — they are a searchable record of decisions made and work delivered.
IDs and Cross-references
The three artifact types form a simple hierarchy. References only point upward — a child declares its parent, never the other way around:
| Prefix | Artifact | References | Purpose |
|---|---|---|---|
EPIC-N |
Epic | — | A broad initiative or theme. Stands alone; does not reference other artifacts, including specs or tasks. |
SPEC-N |
Spec | epic: EPIC-N |
A requirements or design document scoped to one epic. |
TASK-N |
Task | spec: SPEC-N |
A discrete unit of deliverable work that implements part of a spec. |
Upward, child-declared membership
An epic is not responsible for knowing which specs belong to it, and a spec is not
responsible for knowing which tasks implement it. Membership is always declared by the
child. To find all specs under an epic, grep for epic: EPIC-N across the
specs folder — the parent file itself never needs updating when a child is added or removed.
Stable IDs, not paths
Every artifact declares its ID in frontmatter and the ID is embedded in the file name. Cross-references always use just the ID — never a file path — so a file can be renamed without breaking any reference elsewhere in the system.
A spec referencing its parent epic can do so in several ways:
# Plain ID in frontmatter — canonical form, always accepted by tooling
epic: EPIC-1
# Markdown link in frontmatter — also accepted; tooling strips the path and reads the ID
epic: [EPIC-1](../epics/EPIC-1-platform-hardening.md)
# In prose — for human navigation in rendered Markdown
See [EPIC-1](../epics/EPIC-1-platform-hardening.md) for the initiative context.
The plain ID form is preferred in frontmatter fields. The Markdown link form is also accepted — useful when copying a reference from rendered prose — and tooling will resolve both identically. The ID prefix is always the authoritative key; the path component of the link is ignored.
Resolving an ID
Any ID can be resolved without tooling by grepping frontmatter across the repository:
grep -r "^id: SPEC-3" .
Renaming SPEC-3-auth-requirements.md to
SPEC-3-authentication-and-authorization.md is a safe refactor: every
reference says spec: SPEC-3, not a path. The only thing that must never
change is the prefix and number.
No leading zeros
IDs use plain integers: TASK-1, TASK-42, EPIC-3,
SPEC-12. Do not pad with zeros. Leading zeros create an artificial ceiling
(pad to three digits and you imply a limit of 999) and make lexicographic sorting
misleading once you exceed the padding width.
Task File Format
Each task file begins with YAML frontmatter, followed by free-form Markdown sections. Below is a complete example:
---
id: TASK-42
title: Add rate limiting to the public API
type: feature
priority: high
readiness: ready
epic: EPIC-1
spec: SPEC-3
labels:
- backend
depends_on:
- TASK-38
estimate: m
risk: low
created_at: 2026-03-01
---
## Goal
Prevent API abuse by enforcing per-client request limits without
degrading response times for well-behaved clients.
## Acceptance Criteria
- [ ] Requests exceeding the limit receive HTTP 429 with a `Retry-After` header
- [ ] Limits are configurable per API key tier (free / pro / enterprise)
- [ ] P99 latency for requests under the limit does not increase by more than 5 ms
- [ ] Limit counters reset on a rolling 60-second window
## Notes
Using an in-process token-bucket per worker. Redis is not available in
the current infra — revisit if we go multi-region.
## Code Paths
- `src/api/middleware/rate_limit.py`
- `src/api/config/tiers.yaml`
Frontmatter field reference
| Field | Required | Description |
|---|---|---|
id |
Yes |
Stable typed identifier — TASK-N, EPIC-N, or
SPEC-N. Never changes after creation, even if the file is renamed.
See IDs and Cross-references.
|
title |
Yes | One-line description of the work. Should complete the sentence "We need to…" |
priority |
No | critical / high / medium / low. Defaults to medium if omitted. |
type |
No | feature / bug / chore / spike / research / refactor. Defaults to feature if omitted. |
readiness |
No | draft / ready / blocked / in_review / cancelled. Indicates whether the task is fully specified and ready to be worked. |
epic |
No | EPIC-N ID of the parent epic. Accepted as a plain ID or a Markdown link — EPIC-1 and [EPIC-1](../epics/EPIC-1-slug.md) are equivalent. |
spec |
No |
SPEC-N ID of the spec this task implements. Accepted as a plain ID or a Markdown link — SPEC-3 and [SPEC-3](../specs/SPEC-3-slug.md) are equivalent.
|
labels |
No | YAML list of free-form tag strings (e.g. backend, infra). |
depends_on |
No | YAML list of TASK-N IDs that must be completed before this task can start. |
estimate |
No | T-shirt size estimate: xs / s / m / l / xl. |
risk |
No | low / medium / high. Flags tasks with significant uncertainty or blast radius. |
created_at |
No | ISO 8601 date (YYYY-MM-DD) the task was first written. |
Markdown sections
The sections below the frontmatter are free-form prose. The names shown above (Goal, Acceptance Criteria, Notes, Code Paths) are recommended but not enforced. Add, rename, or omit sections to fit your team's needs. The only convention is that a task should always contain enough context that a developer — or an AI assistant — can pick it up cold and understand what needs to be done and why.
Getting Started
No installation required. Set up the folder structure, write a task file, and start working.
-
Create the folder structure inside your existing repository. Choose a root path that fits your project — a top-level folder, under
docs/, or anywhere else:
Commit this empty structure with amkdir -p epics specs tasks/backlog tasks/doing tasks/done.gitkeepin each folder so the directories are tracked. -
Write your first task. Create a file like
tasks/backlog/TASK-1-your-first-task.mdwith at minimum a frontmatter block and a Goal section. Use the example above as a starting point. -
Commit it to Git:
From this point on, every task change is a commit.git add tasks/ git commit -m "chore: initialize Kodo Flow task structure" -
Start a task by moving it from
backlog/todoing/and committing:
The folder move is the status change — no frontmatter edit required.git mv tasks/backlog/TASK-1-your-first-task.md \ tasks/doing/TASK-1-your-first-task.md git commit -m "Start TASK-1" -
Complete a task by moving it to
done/and committing. The file stays in the repository forever as a record of delivered work. -
Share the convention with your team. Add a brief note to your
CONTRIBUTING.mdexplaining the task folder layout and frontmatter fields. That is the only "setup" other developers need.
Using the KodoFlow Extension
The methodology is designed to work with any editor and any toolchain. If you use Visual Studio Code, the KodoFlow extension gives you a visual Kanban board over this same file structure — drag cards between columns to move tasks, click a card to open its Markdown file, and create new tasks through a guided prompt.
The extension scans your workspace for Kodo Flow task folders and reads and writes the same files described above. There is no proprietary format, no lock-in, and no divergence from the methodology. Team members without VS Code continue to work with plain files and Git commands.