Task Sizing Guide¶
Official router: effort-scales.yaml (wall_clock_tshirt).
Use these definitions consistently across gap analyses and remediation plans. Effort is wall-clock time for one developer, including testing and PR review.
For active WIP progress tracking under AI-assisted delivery, use the separate Fibonacci scale — see plan-effort-estimate and the handoff rules in the taxonomy.
Effort Scale¶
| Effort | Wall Clock | Characteristics | Examples |
|---|---|---|---|
| Trivial | < 1 hour | Config change, single file, no design decision, no tests needed | Add .dockerignore, toggle a flag, add a dependency to pyproject.toml |
| Small | Half day – 1 day | Single file or small module, clear pattern to follow, tests needed but straightforward | Create a Dockerfile, add coverage threshold to CI, wire a health endpoint, add a pre-commit hook |
| Medium | 1–3 days | Multiple files, some design decisions, may need coordination, tests + docs | Implement OIDC auth, create a storage adapter, write a Terraform module, create an integration test suite |
| Large | 3–5 days | Cross-cutting change, new infrastructure, external approvals, significant testing | Full CI/CD pipeline with environment promotion, database migration with parity tests, security audit + remediation |
| Decision | Variable | Blocked on a choice that affects downstream work. Not effort — it's a gate. | GitHub vs Azure DevOps, database backend choice, container topology |
Sizing Rules¶
- Size includes writing tests. If a task says "Small" but needs 20 tests, it's Medium.
- Size includes PR review time. A 1-hour code change with a 2-hour review cycle is Small, not Trivial.
- External dependencies (Azure subscription provisioning, Entra ID registration, security review) add lead time but not effort. Note lead time separately.
- If a task requires a decision that hasn't been made, mark the decision as a separate item and note the dependency.
- Phase effort totals (days/weeks) are judgement-based ranges — do not sum T-shirt labels into fake day counts.
Task Description Rules¶
Each task in the plan should be:
- Action-oriented — starts with a verb: Create, Implement, Add, Replace, Configure, Wire, Remove
- Specific — names the file, module, tool, or endpoint affected
- Bounded — a reader knows when it's done
- Independent — completable without needing other tasks in the same phase (within-phase parallelism)
Good: "Create storage/postgresql/adapter.py implementing the 3 storage protocols (GatewayDecisionLog, JournalAndLedger, SnapshotStore) with PostgreSQL types (JSONB, SERIAL, TIMESTAMPTZ)."
Bad: "Set up the database layer."
Status Tracking¶
See plan-status.yaml for the official crosswalk.
| Symbol | Status | Meaning |
|---|---|---|
| ⬜ | Not started | Work has not begun |
| 🔶 | In progress | Actively being worked on (optionally: branch name, PR number) |
| ✅ | Complete | Merged and validated (optionally: commit SHA, PR number, Jira ticket) |
| ❌ | Blocked | Cannot proceed — state the blocker |
| 🚫 | Cancelled | No longer needed — state why |
Table Format¶
| # | Task | Effort | Jira | Status |
|---|---|---|---|---|
| X.Y | Action verb + specific target — Detail about scope, files affected, approach. | Small | ⬜ Not started |
WIP handoff¶
When this plan becomes active execution, add a *.effort.json sidecar beside the plan
markdown (e.g. docs/wip/<plan-slug>.effort.json). Re-size with the Fibonacci scale per
effort-scales.yaml — do not copy T-shirt labels
literally.