How to scope
Size work in agent-hours: one agent actively working for 60 minutes. Size the briefs, scale for what nobody planned, add the lead, check against a project you’ve already built, and count nights. The numbers are mine, measured from 7,200 agent runs; they move when the models do.
The recipe
- List the lanes and their briefs. Size each brief by its kind’s mean, or against the S, M, L and XL examples.
- Multiply by 1.7 for the briefs nobody planned.
- Add 20% for the lead.
- Check against the closest reference class. More than 2× apart means one of them is wrong.
- Divide by 35 for nights.
project AH ≈ Σ(brief means) × 1.7 × 1.2 nights ≈ project AH ÷ 35
Brief kinds
Agent-hours per brief over the last 14 days. Plan by the mean: the tail is where the hours go.
| Kind | Median | p80 | Mean | Briefs |
|---|---|---|---|---|
| Media | 1.01 | 4.22 | 1.99 | 20 |
| Build | 0.72 | 2.60 | 1.81 | 252 |
| Fix | 0.90 | 2.55 | 1.59 | 35 |
| Asset | 0.87 | 2.12 | 1.32 | 63 |
| Plan | 0.34 | 0.63 | 0.40 | 10 |
| Writing | 0.25 | 0.60 | 0.32 | 27 |
| Research | 0.22 | 0.34 | 0.23 | 65 |
| Review | 0.12 | 0.22 | 0.16 | 26 |
Effort
Opus 5.5 subagents over the last 30 days, by the effort they ran at. Medium and high cost the same; xhigh buys hard problems at about twice the AH per brief.
| Effort | Briefs | Mean AH | Median min | Build lines per AH | Fix briefs |
|---|---|---|---|---|---|
| medium | 603 | 0.92 | 28 | 2,408 | 8% |
| high | 505 | 0.91 | 26 | 2,368 | 5% |
| xhigh | 232 | 1.80 | 56 | 1,110 | 3% |
Sizes
Size by resemblance to real briefs, AH measured.
S, under 0.5 AH
- Rollback netcode0.45
- AWS CDK stack0.43
- Drag-and-drop quote page0.16
M, 0.5 to 1.5 AH
- Robot Works new models0.95
- Ad landing pages0.89
- Read-aloud voice lines0.56
L, 1.5 to 4 AH
- Levels 31–100 for launch2.69
- Game audio pass2.56
- Solitaire, tiles and arrows engines2.09
XL, over 4 AH: split it
- Scope a shelf of four games10.06
- Fix card blockers8.37
- Play: session and controls5.79
Reference classes
Total agent-hours per project, every session included: lead, crew, research, re-dos.
- Tool or small app15–54 AHbx 16, ChirpTime 16, Drydock 35, handback 36, Personal agent 54
- One-night game or MVP27–43 AHOCHRE 27, HEAT CHECK 34, Hometeam 37, Genesis dev desk 37, Paint Paws 40, OurSonic editor 42, Lexemon 43
- Multi-night system70–138 AHStore Brand 71, Subpixel 73, SceneBeans 98, Jig 104, celworld 116, Duskbound 138
- Flagship product371–470 AHFacility platform rebuild 372, Game Creators Club 469
Nights
A saturated night runs 4–5 lanes and burns about 3 crew AH an hour: about 35 AH. Nights ≈ project AH ÷ 35. Nights are the only calendar unit; an agent-hour never converts into days or weeks. How much product a night ships depends on how good the plan was.
Scope with Claude
Paste this into Claude Code in the project’s repo. It writes one JSON report; paste that into the scope viewer.
Scope this project in agent-hours (AH), with the rubric at https://agent-hours.dested.com/how-to-scope. An agent-hour is one agent actively working for 60 minutes. Read the repo and its plans, then: 1. List the lanes and their briefs. Mark finished briefs done with the AH they took, if you can measure it. Size each open brief by its kind's mean AH: media 1.99, build 1.81, fix 1.59, asset 1.32, plan 0.40, writing 0.32, research 0.23, review 0.16. 2. Multiply the open sum by 1.7 for the briefs nobody planned. 3. Add 20% for the lead. 4. Check the total against the closest reference class (total AH): Tool or small app 15–54; One-night game or MVP 27–43; Multi-night system 70–138; Flagship product 371–470. If they're more than 2× apart, say why in risks. 5. Divide by 35 for nights. Never convert AH into days or weeks. Split any planned brief over 4 AH. Keep remaining.crewAH equal to the sum of open estimates, and remaining.p50AH equal to crewAH × 1.7 × 1.2. Output exactly one JSON document, with no prose around it, that validates against https://agent-hours.dested.com/scope-report.schema.json (kind "scope-report", version 1). Then tell me to paste it at https://agent-hours.dested.com/scope.
The format
One JSON document per report: the JSON Schema has every rule, and the example opens in the viewer.
- kind"scope-report"
- Always this string.
- version1
- The viewer reads version 1.
- projecttext
- The project’s name; the viewer’s heading.
- scopetext
- What’s being sized: “Rest of the build to launch”, “October rebuild, as built”.
- repotext, optional
- The repository it lives in.
- dateYYYY-MM-DD
- When the report was made.
- rubric{ asOf, multiplier, leadShare, ahPerNight }
- The constants it was sized with: today 1.7, 0.2, 35.
- spent{ leadAH, crewAH, from?, to?, source }, optional
- Work already done. source is transcripts (measured) or estimate.
- remaining{ crewAH, p50AH, p80AH, nights }, optional
- crewAH is the sum of open estimates; p50AH = crewAH × multiplier × (1 + leadShare); nights is [low, high], about p50AH ÷ ahPerNight. Required while any brief is open.
- referenceClass{ name, rangeAH, examples }, optional
- The closest class: rangeAH is [low, high], examples are [name, AH] pairs.
- lanes[{ name, model?, briefs }]
- At least one lane, each with at least one brief. model is like opus-high.
- briefs[].nametext
- What the brief builds.
- briefs[].kindone of the kinds
- build, fix, refactor, asset, media, writing, plan, research, review, ops, other
- briefs[].statusdone, active, planned
- done needs actualAH. active and planned need estimateAH: the AH still to spend.
- briefs[].actualAHAH, optional
- Spent so far, measured from transcripts when possible.
- briefs[].estimateAHAH, optional
- Still to spend: the whole brief when planned, what’s left when active.
- briefs[].countwhole number, optional
- One row standing for several briefs (“Waves 1–5”, 38). It skips the XL check.
- briefs[].notetext, optional
- Anything a reader needs.
- risks, questions[text]
- Lists; empty lists are left out of the viewer.
The viewer flags a report when:
- remaining.crewAH differs from the sum of open estimates by more than 10% (and 1 AH)
- remaining.p50AH differs from crewAH × multiplier × (1 + leadShare) the same way
- remaining.p80AH is below p50AH
- nights is more than half a night off p50AH ÷ ahPerNight
- open briefs with no remaining block
- a planned brief over 4 AH without a count: split it
Example report
{
"kind": "scope-report",
"version": 1,
"project": "Example: one-night creature game",
"scope": "Rest of the build to a playable launch",
"repo": "example-game",
"date": "2026-10-28",
"rubric": {
"asOf": "2026-10-28",
"multiplier": 1.7,
"leadShare": 0.2,
"ahPerNight": 35
},
"spent": {
"leadAH": 3.1,
"crewAH": 18.2,
"from": "2026-10-26",
"to": "2026-10-28",
"source": "transcripts"
},
"remaining": {
"crewAH": 12.2,
"p50AH": 25,
"p80AH": 35,
"nights": [
1,
1
]
},
"referenceClass": {
"name": "One-night game or MVP",
"rangeAH": [
25,
45
],
"examples": [
[
"HEAT CHECK",
34
],
[
"Lexemon",
43
]
]
},
"lanes": [
{
"name": "Engine",
"model": "opus-high",
"briefs": [
{
"name": "World engine",
"kind": "build",
"status": "done",
"actualAH": 4.9
},
{
"name": "Route maps",
"kind": "build",
"status": "done",
"actualAH": 4.7
},
{
"name": "Battle system",
"kind": "build",
"status": "active",
"actualAH": 2,
"estimateAH": 1.5
},
{
"name": "Save and load",
"kind": "build",
"status": "planned",
"estimateAH": 1.8
}
]
},
{
"name": "Content",
"model": "opus-high",
"briefs": [
{
"name": "Word list and dialogue",
"kind": "writing",
"status": "done",
"actualAH": 1
},
{
"name": "Lessons 1–12",
"kind": "build",
"status": "planned",
"estimateAH": 1.8
},
{
"name": "Lessons 13–24",
"kind": "build",
"status": "planned",
"estimateAH": 1.8
}
]
},
{
"name": "Art",
"model": "opus-xhigh",
"briefs": [
{
"name": "Creatures",
"kind": "asset",
"status": "done",
"actualAH": 2.6,
"count": 2
},
{
"name": "UI kit",
"kind": "asset",
"status": "done",
"actualAH": 0.3
},
{
"name": "Town and route art",
"kind": "asset",
"status": "planned",
"estimateAH": 1.35
}
]
},
{
"name": "Polish",
"model": "opus-high",
"briefs": [
{
"name": "Menus, HUD and fonts",
"kind": "build",
"status": "planned",
"estimateAH": 1.8
},
{
"name": "Fresh-eyes QA",
"kind": "review",
"status": "planned",
"estimateAH": 0.16
},
{
"name": "Launch film",
"kind": "media",
"status": "planned",
"estimateAH": 2
}
]
}
],
"risks": [
"Battle system is already over its estimate; balance passes tend to spawn fix briefs",
"Projected total lands just above the one-night class"
],
"questions": [
"Is the launch film in scope for this night, or the next?"
]
}