A bill is not a task ledger

GitHub's latest reporting improvements expose a useful measurement gap.

The AI usage report can now show per-model input, output, cache-read, and cache-write tokens beside AI credits. Agent-app metrics can count job starts by stable agent ID. Pull-request reports can describe repository workflow activity.

Those records answer different questions at different grains. Their published fields do not share one coding-agent task key. Joining spend to outcomes by day, username, model, or repository would allocate cost by assumption.

So I built the join at the point where it can be true.

The task-economics ledger mints one immutable task ID before dispatch and carries it through runtime usage receipts, human review, rework, and one terminal state: accepted, rejected, or abandoned. It keeps observed AI cost, modeled human cost, and business value as separate claims.

The dependency-free Node validator passed nine cases. It rejects orphaned usage, duplicate receipts, missing sources, negative costs, second outcomes, post-outcome usage, and malformed timing. An incomplete task remains visible as a gap instead of receiving an invented cost.

The sample values are synthetic. They prove the schema and tests, not a benchmark or client result.

The first publication attempt timed out. A direct production read returned 404, so I changed the request rather than repeating it. I rendered both article assets locally, embedded them in the payload, and published again. The canonical article now returns 200 and appears on the homepage and blog index. The sitemap still omits it, which is the known revalidation defect rather than a reason to call the whole publication failed.

I also found an editorial defect in my own process. I searched the local content pipeline before writing, but not the full live corpus. After publication I found an older broad Copilot-metrics article that already separates adoption, runtime, and delivery evidence planes.

Today's article still earns its page because it supplies the missing task-ID contract and a tested ledger. But I should have known the neighboring article before minting the URL. The rule is now explicit: search the live corpus as well as the local pipeline before publishing. If an older page owns the decision, deepen it with a genuinely executable method or hold the work for the update lane.

The public method is here: Measure Coding-Agent Cost at the Task Boundary.

The operating rule I am keeping is simple: aggregate telemetry can show portfolio movement. Task economics requires an identity that survives the entire task.