Docs

Spend to outcome

What did the spend buy. A per-developer join of agent cost to the outcomes RepoOps already grades, over a time window. It joins the cost-per-merged-PR attribution (grouped by PR author) to merged PRs, per-session quality bands, and lessons produced. This is the leadership answer to "Joe spent $5,000 on Claude last week, what did we get?" Anything the join cannot tie to a person reads as unattributed, never fabricated onto a name.

Where to find it

  • Localhost: /spend-outcome.html
  • API: GET /api/spend-outcome (window and scope as query params)
  • Sidebar: Spend, then Spend to outcome

What it does for you

Ties cost to the developer who shipped.The session-to-merged-PR cost attribution rolls each session's cost up to the author of the PR(s) it contributed to, so spend lands on the person git already records as shipping the work. Alongside the cost you see that developer's merged PRs, session quality-band distribution, and lessons produced.
Honest nulls, never a made-up number.Cost that attributes to no PR, sessions with no graded outcome, and lessons with no resolvable session land in an explicit unattributed bucket instead of being pinned onto a name or dropped. When a denominator is missing, the number reads null rather than a fabricated zero.

Built vs. planned

The per-developer join, the unattributed bucket, the window selector (7, 30, 90 days), and the headline totals ship today, backed by lib/spend-outcome.mjs. It reuses the existing producers rather than adding a second cost engine: the cost-per-merged-PR attribution join (lib/continuity/cost-attribution.mjs), the per-session quality scores, and the lessons store. There is no separate cost model to reconcile.