The following are non-negotiable:
intentandconstraintsMUST be human-ownedplanandprogressMUST be agent-ownedprogressMUST be append-only and evidence-backed- Completed tasks in
plan.small.ymlMUST have corresponding progress entries handoff.small.ymlMUST include a validreplayId- Schema validation MUST pass
small_versionMUST equal"1.0.0"
Violations are hard errors.
| Artifact | Owner |
|---|---|
| intent | Human |
| constraints | Human |
| plan | Agent |
| progress | Agent |
| handoff | System |
Human-owned artifacts define the work and its boundaries. Agent-owned artifacts record proposed and executed work. System-owned artifacts capture state for resumption.
The progress.small.yml artifact is append-only.
- Entries may not be modified after creation
- Entries may not be deleted
- Each entry must include evidence of execution
Every progress entry timestamp must meet this contract:
- RFC3339Nano format
- Includes fractional seconds
- Strictly increasing within the file
Verification errors include the entry index and offending timestamp. If you have older logs, run:
small progress migrateAll artifacts must declare:
small_version: "1.0.0"Artifacts with missing or mismatched versions will fail validation.
All artifacts must validate against the authoritative schemas located at:
spec/small/v1.0.0/schemas/
Schema violations are hard errors and will block execution.
When a task in plan.small.yml is marked as status: completed, there MUST be a corresponding entry in progress.small.yml that:
- References the same
task_id - Includes a valid RFC3339Nano
timestampwith fractional seconds - Contains at least one evidence field (
evidence,verification,command,test,link, orcommit)
This ensures that completed tasks have auditable evidence of completion.
Strict mode is opt-in (--strict) and extends invariant enforcement with additional safety checks.
When plan.small.yml marks a task as completed or blocked, there must be at least one progress entry with:
- matching
task_id - non-empty
evidenceornotes
Failure messages include the task id, task title, and whether evidence is missing or empty.
Each replay-bound progress entry must reference a task id that exists in plan.small.yml, unless the id starts with meta/.
Bootstrap entries (for example meta/init and meta/accept-*) are valid without replay binding.
If handoff.small.yml sets resume.current_task_id, the referenced task id must exist in the plan.
Strict mode allows only canonical root files under .small/:
intent.small.ymlconstraints.small.ymlplan.small.ymlprogress.small.ymlhandoff.small.ymlworkspace.small.yml
Unexpected files or directories under .small/ fail strict checks.
Operational cache and generated telemetry belong under .small-cache/ instead.
Example failure:
# plan.small.yml
tasks:
- id: "my-task"
title: "Do something"
status: "completed" # Marked as completed
# progress.small.yml
entries: [] # No corresponding entry -> FAILS verifyFix: Add a progress entry before marking the task complete:
# progress.small.yml
entries:
- task_id: "my-task"
timestamp: "2026-01-12T12:00:00.000000000Z"
evidence: "Implemented feature X"The handoff.small.yml artifact MUST include a replayId field with:
value: A valid SHA256 hash (64 hex characters)source: Either"auto"or"manual"
This enables session replay and continuity tracking.
Example failure:
# handoff.small.yml - FAILS verify (missing replayId)
summary: "Work in progress"
resume:
next_steps: ["Continue task"]
links: []Fix: Run small handoff to generate a valid replayId:
small handoff --summary "Work in progress"Or manually add:
replayId:
value: "a1b2c3d4e5f6..." # 64 hex characters
source: "manual"The small verify command enforces all invariants and is designed for CI pipelines:
# In CI workflow
small verify --ci
# Exit codes:
# 0 - All artifacts valid
# 1 - Artifacts invalid (validation or invariant failures)
# 2 - System error (missing directory, read errors)Common CI failure scenarios:
- Forgot to update SMALL files - Completed tasks without progress entries
- Missing replayId - handoff.small.yml lacks session tracking
- Schema violations - Invalid artifact structure
- Owner mismatch - Wrong owner for artifact type