| name | odk |
| description | Use at the start of any project session, when deciding what to do next, or when working on any development lifecycle concern — specs, brainstorming, task planning, sprints, implementation, code review, or process improvement. This is the master skill for AI-assisted development. Use proactively whenever development work is happening. |
ODK — Oz Development Kit
What is ODK?
ODK is a customized AI-assisted development process skill. It exists because the ecosystem is full of generic tools — OpenSpec, Beads, Taskmaster, CCPM, Superpowers — that each solve 60% of the problem with opinions baked in that don't fit every workflow. After evaluating 20+ tools across memory, scaffolding, context management, and orchestration, the conclusion was clear: it's easier and better to build a customized development process that fits exactly, while stealing the good ideas from what already exists.
ODK is that customized process. It's opinionated about quality (specs first, enforcement gates, adversarial review) but flexible about implementation (use any AI agent, any editor, any language).
How ODK Works
ODK is organized into stages — sequential phases of the development lifecycle. Each stage has:
- overview.md — what the stage is, when to enter and exit, how it connects to other stages
- glossary.md — stage-specific terminology
- instructions.md — the SOP (Standard Operating Procedure) with step-by-step instructions using RFC 2119 constraints (MUST, SHOULD, MAY)
- aspects/ — sub-topics within the stage (not all stages have aspects)
When entering a stage, you MUST read overview.md and glossary.md first. These guide you to the specific instructions and aspects you need.
The Development Lifecycle
IDEA
│
▼
Stage 01: Brainstorming & Design ── produce narratives + component manifests + ADRs
│
▼
Stage 01.5: Ignition ── `odk ignite` generates runnable skeleton with tracked TODOs
│
▼
Stage 02: Task Management & Planning ── decompose into tasks (business logic only) with TODO assignment
│
▼
Stage 03: Execution ── agents implement TODOs with TDD, `odk task done` auto-checks resolution
│ Aspects: scaffolding, context, memory, trust,
│ cost & speed, observability, integration
│
▼
Stage 04: Learning & Improvement ── capture lessons, improve process
Which Stage Am I In?
No specs exist yet?
→ Enter Stage 01: docs/stages/01-brainstorming-and-design/
Existing design docs need translation to ODK format (rewrite)?
→ Enter Stage 01 in Rewrite mode — set existing_docs to the docs path. Skip brainstorming Q&A; translate docs directly into narratives + component manifests.
Specs exist but no runnable skeleton?
→ Enter Stage 01.5: docs/stages/01.5-ignition/
Skeleton exists but no epics/stories/tasks?
→ Enter Stage 02: docs/stages/02-task-management-and-planning/
Tasks exist and you need to implement one?
→ Enter Stage 03: docs/stages/03-execution/
Sprint complete, need to capture lessons?
→ Enter Stage 04: docs/stages/04-learning-and-improvement/
Need to modify an existing spec?
→ Re-enter Stage 01 (Major Feature or Small Change mode)
Need to propose a change to an existing spec without full re-brainstorm?
→ Use the spec evolution system: odk change propose (see cross-cutting/change-management.md)
Something went wrong during implementation?
→ Check Stage 02 instructions (Failure Handling section)
Not sure where to start?
→ Run odk doctor — it validates your environment and recommends next steps
Quick fix or tiny change?
→ Run odk task quick "description" — fast path for small changes that bypasses the full brainstorming cycle
Entering a Stage
Every time you enter a stage:
- Read
overview.md — understand what this stage does and its entry/exit criteria
- Read
glossary.md — learn the terminology for this stage
- Read
instructions.md — follow the SOP step by step
- Read aspect files as directed — overview.md tells you which aspects are relevant
Do NOT read all stages at once. Read the one you need right now.
Universal Principles
These apply across ALL stages:
UP-1: Every change goes through a PR with explicit human approval. No direct pushes to main. No auto-merges. No exceptions regardless of size. Code, specs, docs — everything.
ADRs: Every significant decision gets an ADR in docs/adrs/. Written immediately when the decision is made, not deferred. Include: what was decided, why, alternatives considered.
project-rules.md: Conventions, preferences, and domain knowledge in docs/project-rules.md. Agent-agnostic — any tool can read it. Updated throughout all stages.
Spec location: Every repository MUST have a designated spec directory (default docs/specs/). Any folder structure with markdown files works. MUST exist before development begins.
Component Manifest System
Specs are split into two complementary artifact types:
- Narratives — markdown storytelling in
docs/specs/. Human-readable prose describing the system design, flows, and rationale.
- Component manifests — structured YAML files in
.odk/components/. Machine-readable definitions of every entity, route, error, contract, requirement, NFR, and external dependency.
Every component manifest has a unique ID following the format odk:<type>:<namespace>/<name>. Examples:
odk:entity:orders/Order
odk:route:orders/create
odk:error:orders/insufficient-balance
odk:contract:orders/place-order
odk:requirement:orders/decimal-precision
odk:nfr:system/latency-p95
odk:external-dep:exchange/binance-rest
Always use the full ID. Never use shorthands.
Schemas
ODK ships with 13 default schemas in .odk/schemas/. These define the structure of each component type (entity, route, error, contract, requirement, nfr, external-dep, etc.). Projects can add custom schemas. Every schema field has a description. Every manifest MUST include a $schema field pointing to its schema — no schema = validation error.
Linking
Narratives reference components using inline links: [odk:entity:orders/Order], [odk:route:orders/create]. This creates a traceable connection between prose and structured data.
Two validation layers ensure consistency:
- Layer A (deterministic linker) — validates that every
[odk:...] reference in narratives points to an existing component manifest. Fast, runs as part of odk verify.
- Layer B (LLM scanner) — reads narrative prose and identifies concepts that SHOULD be linked to a component but aren't. Catches when the narrative describes "the Order entity" without linking it. Runs during spec check.
Tasks and Components
Tasks produced in Stage 02 have two kinds of references:
component_refs — which component manifests to implement (e.g., odk:entity:orders/Order, odk:route:orders/create)
spec_refs — which narrative files to read for context (e.g., orders.md)
Component CLI
odk component list
odk component show <id>
odk component create <type> <id>
odk component validate
odk component list-schemas
odk component show-schema <type>
odk component init-schemas
ODK CLI — Complete Reference
ODK provides a CLI tool for automation. Install with uv pip install -e odk/ from the repo root.
Initialization & Config
odk init --name <project>
odk config show|get|set|validate
Component Manifests
odk component list
odk component show <id>
odk component create <type> <id>
odk component validate
odk component list-schemas
odk component show-schema <type>
odk component init-schemas
Catalog
odk catalog search <query>
odk catalog install <name>
odk catalog list
odk catalog info <name>
odk catalog publish <path>
odk catalog uninstall <name>
Built-in catalog items:
odk-core-schemas — default component schemas
odk-default-reviewers — default spec reviewers (N01-N10)
python-quality — ruff, ty, pytest verification plugins
hexagonal-architecture — hexagonal architecture ignition pack
The catalog uses ChromaDB for semantic search. Local backend at ~/.odk/catalog/.
TODO Management
odk todo list
odk todo show <id>
odk todo assign <todo-id> <task-id>
odk todo auto-assign [--apply]
odk todo assign-batch <mapping>
odk todo done <todo-id>
odk todo coverage
TODOs are registered during ignition with ODK-TODO-NNN IDs. They track NotImplementedError placeholders in generated code. odk task done auto-checks that all assigned TODOs are resolved.
Ignition
odk ignite
odk ignite --dry-run
odk ignite --force
odk ignite --skip-verify
What ignition does:
- Reads installed ignition pack + ODK component manifests
- Runs generators as subprocesses (generator pack pattern)
- Tracks file hashes for idempotency — re-running skips unchanged files
- Detects developer ownership via GENERATED headers (no GENERATED headers in output — all files developer-owned)
- Registers TODOs for every
NotImplementedError placeholder
- Post-generation: syntax check, circular import detection, ruff format
- Auto-installs runtime dependencies via
uv
- App MUST start after ignition (e.g.,
uvicorn serves routes)
Ignition quality:
- Routes:
response_model, typed params, DI injection, service calls, error handling
- Services: DI constructor with port injection, CRUD methods fully implemented
- Schemas: Create/Update/Response per entity with
from_attributes
- Models:
ForeignKey + relationship() + back_populates
- External adapters organized by technology (e.g.,
yfinance/, alpaca/, apscheduler/)
Phased ignition (fullstack):
manifest.yaml supports phases — sequential generator groups
- Phases can export artifacts (e.g.,
openapi.json)
- Later phases consume artifacts from earlier phases via
ODK_ARTIFACT_* env vars
pack_ref references other installed packs (no generator duplication)
- Example:
fullstack-fastapi-nextjs pack composes backend + frontend + infrastructure phases
Stage 01 — Spec Quality
odk spec verify
odk spec verify --all-files
odk spec verify --verbose
odk spec list-criteria
Spec Reviewers: 10 YAML reviewer configs in src/odk/spec_reviewers/ (copied to .odk/spec-reviewers/ on odk init). Each reviewer has: id, name, threshold, model_tier, inline Python tools, and a detailed system prompt with examples and scoring rubric. Reviewers run as parallel Bedrock Converse API calls with forced structured output (toolChoice). Prompt caching shares spec content across reviewers (90% cost savings after first call).
Stage 02 — Task Management
odk task create-epic
odk task create-story
odk task create
odk task create-batch --from batch.yaml
odk task create-batch --from X --dry-run
odk task validate-dag
odk task plan-waves --agents N
odk task coverage [--spec-dir X]
odk task component-coverage
odk task component-coverage --exclude 'odk:page:*' --strict
odk task analyze-complexity
odk task add-gate <id> --type <type>
odk task ready
odk task list --epic E --story S --status open
odk task archive-done [--all-done]
odk task scaffold-batch
Guard System (Real-Time Enforcement)
Guards are a standalone Python script at .claude/hooks/guard.py, installed by odk init.
How guards work:
- Single script
.claude/hooks/guard.py reads tool context from stdin via select(), exits 2 to block
- Installed by
odk init alongside permissions.allow in .claude/settings.json for non-interactive use
- Works with
--allowedTools for headless sessions (NOT --dangerously-skip-permissions)
- Fire on every tool call — no opt-out, no bypass
- Available guards:
tdd-guard — blocks source file writes when no test has been written first
guard-no-noqa — blocks adding # noqa or # type: ignore comments
guard-no-mock-internals — blocks mocking internal classes (only mock at boundaries)
guard-no-manual-pr — blocks gh pr create (must use odk task done)
guard-no-proof-tamper — blocks manual editing of .odk/proofs/ files
guard-stage-gate — blocks stage-inappropriate actions (no code during brainstorming, no planning during execution)
SubagentStop hook:
- Blocks session end if
.odk/active-task.json exists
- Agent must run
odk task done before session can end
- Installed by
odk init
Fail-open behavior:
- Guards fail open — if stdin is empty, JSON is malformed, or state.json is unreadable, the guard allows the action rather than blocking
TDD Guard details:
- State machine: red → green → refactor → red
- Tracks state in
.odk/tdd-state.json
- Source dirs:
src/ and app/
- Resets on
git commit
- Writing to source files blocked until a corresponding test file exists and fails
Stage Gate details:
- Stage tracked in
.odk/state.json
- Auto-advances:
init → 01, spec-verify → 01.5, ignite → 02, task-start → 03
- CLI preconditions:
ignite requires schemas + pack + spec-verify; task-start requires TODOs
Stage 03 — Execution
odk task start <id>
odk task start <id> --base <branch>
odk task start <id> --force
odk task comment <id> "msg"
odk task block <id> --reason X
odk task done <id>
odk task done <id> --skip-plugin <name>
odk task add-subtask <id>
odk task tdd <id> --stage red|green|refactor
odk task quick "description"
odk scaffold list|info|apply|create
odk verify run --trigger pre-commit
odk verify run --trigger pre-push
odk verify run --auto-fix
odk verify run --retry N
odk verify run --repair
odk verify run --pr <URL>
odk verify run --no-cache
odk verify list
odk verify clear-cache
odk test generate --from <COMPONENT_ID>
odk test coverage
Multi-session orchestration pattern:
- For full implementations, use one
claude -p session per task (not one session for everything)
- Context limits make single-session full implementation impossible for large projects
- Pattern: loop over tasks, each gets its own session
- Use
--allowedTools "Bash,Edit,Write,Read,Grep,Glob" (NOT --dangerously-skip-permissions)
Stage 04 — Memory
odk memory index
odk memory search <query>
odk memory search <query> --mode hybrid
odk memory search <query> --depth index|summary|full
odk memory bootstrap <task-id>
odk memory extract <task-id>
odk memory retrospective --sprint X
odk memory audit
odk memory record-decision <TOPIC>
odk memory decision-history <TOPIC>
odk memory consolidate
Spec Evolution
odk change propose
odk change list
odk change status <id>
odk change archive <id>
odk change diff <id>
Watch System
odk watch install
odk watch poll
odk watch uninstall
odk watch status
PR Review Feedback
odk task review-comments <id>
Visual Companion
odk visual start
odk visual stop
odk visual push
odk visual feedback
odk visual screenshot
odk visual list
Glossary of Key Concepts
Component Manifest
A structured YAML file in .odk/components/ that defines a single entity, route, error, contract, requirement, NFR, or external dependency. Has a unique odk:<type>:<namespace>/<name> ID and a $schema reference.
Narrative
A markdown storytelling file in docs/specs/ that describes system design in prose. References component manifests via [odk:...] links.
Layer A (Deterministic Linker)
Validates that all [odk:...] references in narratives point to existing component manifests. Fast, deterministic.
Layer B (LLM Scanner)
Reads narrative prose and identifies concepts that should be linked to components but aren't. AI-based, runs during spec check.
Spec Reviewer
A YAML config file in src/odk/spec_reviewers/ (or .odk/spec-reviewers/ per project) that defines one quality criterion. Has: id (N01-N10), name, group, threshold, model_tier (smart, fast, or reasoning), inline Python tools, and a system prompt with examples and scoring rubric. Runs via Bedrock Converse API with forced structured output.
Model Tier
A logical name (smart, fast, reasoning) mapped to a Bedrock model ID in ai.model_tiers config. Both smart and fast default to Sonnet 4; reasoning defaults to Opus. Reviewers declare a tier, not a model ID.
Prompt Caching
Bedrock prompt caching that shares spec content across all reviewer calls. The first reviewer pays full input cost; remaining reviewers hit the cache for ~90% cost savings on the spec portion.
Proof Capture
Deterministic capture of verification command output to .odk/proofs/<task-id>/. Uses full verification report (all plugins) — each plugin's output saved to .odk/proofs/<task>/plugins/<name>.txt. PR body assembled from all plugin results. Screenshot proof required for UI tasks (routes/pages component_refs).
Structured Logging
Rotating file log at ~/.odk/logs/odk.log (10MB, 5 backups). Per-reviewer timing in spec verify output. --verbose flag shows DEBUG-level logs.
Guard System
A standalone Python script at .claude/hooks/guard.py that fires on every Claude Code tool call (Edit/Write/Bash) via PreToolUse hooks in .claude/settings.json. Uses select() for stdin reading, exits 2 to block. Guards block violations before they happen — no remediation needed. Fails open if stdin is empty or JSON is malformed. Installed by odk init alongside permissions.allow for non-interactive use. Guards include: tdd-guard, guard-no-noqa, guard-no-mock-internals, guard-no-manual-pr, guard-no-proof-tamper, guard-stage-gate.
Gate
An external blocking condition on a task. Types: pr-merged (waits for a PR), ci-passed (waits for CI), timer (waits for a time), human (waits for human action). Added via odk task add-gate.
component_refs vs spec_refs
Tasks have two kinds of references: component_refs point to component manifests (what to implement), spec_refs point to whole narrative files (what to read for context).
Batch YAML
A YAML file with top-level epics:, stories:, and tasks: sections for odk task create-batch. Each entity has an id field used for cross-referencing within the file. Dependencies use placeholder IDs that are resolved to real GitHub issue numbers after all issues are created (two-pass resolution). Labels are auto-created before batch creation.
Dry-Run
The --dry-run flag on odk task create, odk task create-story, and odk task create-batch validates input and shows what would be created without calling the API. Useful for checking batch YAML correctness before committing to issue creation.
Component Coverage
odk task component-coverage checks that every component manifest in .odk/components/ is referenced by at least one task's component_refs. Supports --exclude glob patterns (e.g., odk:page:*) and --strict mode (exit code 1 on uncovered components).
Coverage Exclusions
The task_management.coverage_exclude config field lists glob patterns for spec sections to skip during odk task coverage. Used to exclude reference docs (glossary, scope, etc.) that don't need story coverage.
Dependency Types
8 types of task dependencies: blocks, validates, caused-by, conditional-blocks, waits-for, discovered-from, supersedes, related. Only blocks, conditional-blocks, and waits-for create execution edges in the DAG.
Hash-Based Task IDs
Task IDs use format T-a1b2c3d4 (hash-based) instead of sequential T-001. Collision-free for parallel agent creation.
Complexity Score
LLM-scored value 1-10 for each task. Tasks scoring above threshold are flagged for splitting. Run via odk task analyze-complexity.
Buffer Zone
Sprint health tracking using critical chain buffer management. Shows green (on track), yellow (consuming buffer), red (buffer exhausted).
Compaction
Compressing completed task data to reduce context window usage. odk task archive-done compresses individual done tasks; --all-done compresses all completed tasks.
Verification Cache
Content-hash based caching of verification results. If code hasn't changed, verifications aren't re-run. Bypass with --no-cache, clear with odk verify clear-cache.
Auto-Repair Loop
odk verify run --retry N --repair automatically retries failed verifications, applying fixes between retries using structured error output.
Spec Evolution
OpenSpec-inspired delta spec system. odk change propose creates proposed modifications in docs/changes/. Completed changes archived to docs/changes/archive/.
Visual Companion
Browser-based mockup and annotation tool. odk visual start/stop/push/feedback/screenshot/list for UI design collaboration.
Quick Dev
Fast path for small changes: odk task quick "description" bypasses full brainstorming for trivial modifications.
Watch System
Background polling daemon that monitors GitHub PRs for new review comments. odk watch install creates a macOS launchd plist that runs odk watch poll every 30 seconds. When a new comment is detected, the watch reacts with 👀 and resumes a Claude Code session to address the feedback. Uses a lock file to prevent concurrent polls.
Session Tracking
Active agent sessions are recorded in .odk/sessions.yaml. Each entry maps a task ID to its branch, PR number, worktree path, and session state. The watch system uses this file to resume the correct session when new review comments arrive.
Agent Reply Marker
The HTML comment <!-- odk-agent-reply --> placed on the first line of every agent reply to a PR review comment. The watch system filters out comments starting with this marker so it does not re-trigger on the agent's own replies, preventing infinite feedback loops.
Scoring & Decay (Memory)
Memories are ranked by a 4-factor score: category weight (0.50), provenance (0.15), recency (0.25), access frequency (0.10). Recency decays with a 30-day half-life.
Hybrid Search (Memory)
Default search mode combining vector similarity, BM25 keyword matching, and Reciprocal Rank Fusion (RRF) for result merging.
Negative Knowledge
Memories with extraction type abandoned — approaches that were tried and rejected. Prevents future agents from repeating failed attempts.
Provenance
Source tracking on memories: source_type (user-stated, llm-extracted, agent-discovered, verified) + verified flag. Higher provenance = higher score.
Contradiction Detection
When a new memory contradicts an existing one, the old memory is auto-invalidated. Prevents stale knowledge from persisting.
Progressive Retrieval
Search with depth=index|summary|full controls how much detail is returned. Use get_memory_details(ids) for full content of specific memories.
Temporal Validity
Memories can have valid_from and valid_until timestamps. Expired memories are auto-filtered from search results.
Procedural Memory
Tracks which prompts and approaches were effective. odk memory audit includes procedural effectiveness analysis.
Catalog
A searchable registry of ignition packs, component schemas, verification plugins, and other reusable ODK components. Uses ChromaDB for semantic search. Local backend at ~/.odk/catalog/. Ships with 4 built-in items: odk-core-schemas, odk-default-reviewers, python-quality, hexagonal-architecture.
Ignition Pack
A catalog item that contains generators for producing a runnable project skeleton from component manifests. Installed via odk catalog install. Each pack defines which component types it can consume and what code it generates.
TODO (ODK-TODO-NNN)
A tracked placeholder registered during ignition for every NotImplementedError in generated code. Each TODO has a unique ODK-TODO-NNN ID. TODOs are assigned to tasks via odk todo assign and auto-checked for resolution by odk task done.
Ignition
The process of generating a runnable project skeleton from an installed ignition pack and component manifests. Run via odk ignite. Produces compilable/runnable code with NotImplementedError placeholders for business logic, registered as tracked TODOs.
Stage 1.5
The ignition stage between brainstorming (Stage 01) and task management (Stage 02). After specs are validated, odk ignite generates a runnable skeleton. Tasks in Stage 02 then focus exclusively on business logic — boilerplate is already generated.
Cross-Cutting Concerns
Apply across all stages. Read when relevant:
| Concern | File |
|---|
| Change management & spec evolution | docs/cross-cutting/change-management.md |
| Configuration reference | docs/cross-cutting/config.md |
| Research methodology | docs/cross-cutting/research-methodology.md |
| Brownfield pipeline | docs/cross-cutting/brownfield-pipeline.md |
| Testing strategy | docs/cross-cutting/testing-strategy.md |
Quick Start
- New project: Enter Stage 01 →
odk catalog search for packs → brainstorm specs + produce component manifests → run spec-check → PR
- Specs ready: Enter Stage 01.5 →
odk ignite → verify skeleton runs + app starts → review TODOs
- Skeleton ready: Enter Stage 02 → decompose with component_refs →
odk todo assign TODOs to tasks → validate DAG → plan sprint
- Task assigned: Enter Stage 03 → implement TODOs with TDD (guards auto-enforced) →
odk task done shows pass/fail per plugin → PR → review
- Sprint done: Enter Stage 04 → capture lessons → update ADRs/rules
- Quick fix:
odk task quick "description" → fast path for small changes
- Not sure:
odk doctor → check environment health and get next steps
Note: odk init auto-installs guard hooks in .claude/settings.json — TDD enforcement, stage gates, and code quality guards are active from the start. No opt-in required.
Generator Quality (v0.46+)
The python-fastapi-hexagonal pack generates 70% working code matching production-generator quality:
- Routes:
response_model=, typed params, DI injection via Depends(), service delegation, error handling. List endpoints use list[Response]. Only complex custom logic is TODO.
- Services: DI constructors with port injection, CRUD methods fully implemented (get/list/create/update/delete delegate to repo). Port services receive adapter injection.
- Schemas: Create/Update/Response per entity with
from_attributes=True.
- Models:
ForeignKey() + relationship() + back_populates from entity manifests.
- Adapters: External service adapters by technology (yfinance/, alpaca/, apscheduler/, etc.) with port interface inheritance.
- DI Wiring: Service factories inject repos and adapters. Port service factories inject the external adapter.
- Tests: Contract tests (Protocol conformance), unit test stubs, integration test stubs, fakes.
After ignition, the app MUST start (uvicorn app.main:app). This is verified by the publishing gate integration test.