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

  1. List the lanes and their briefs. Size each brief by its kind’s mean, or against the S, M, L and XL examples.
  2. Multiply by 1.7 for the briefs nobody planned.
  3. Add 20% for the lead.
  4. Check against the closest reference class. More than 2× apart means one of them is wrong.
  5. 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.

KindMedianp80MeanBriefs
Media1.014.221.9920
Build0.722.601.81252
Fix0.902.551.5935
Asset0.872.121.3263
Plan0.340.630.4010
Writing0.250.600.3227
Research0.220.340.2365
Review0.120.220.1626

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.

EffortBriefsMean AHMedian minBuild lines per AHFix briefs
medium6030.92282,4088%
high5050.91262,3685%
xhigh2321.80561,1103%

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 AH
    bx 16, ChirpTime 16, Drydock 35, handback 36, Personal agent 54
  • One-night game or MVP27–43 AH
    OCHRE 27, HEAT CHECK 34, Hometeam 37, Genesis dev desk 37, Paint Paws 40, OurSonic editor 42, Lexemon 43
  • Multi-night system70–138 AH
    Store Brand 71, Subpixel 73, SceneBeans 98, Jig 104, celworld 116, Duskbound 138
  • Flagship product371–470 AH
    Facility 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?"
  ]
}