For Projects & PMO

Sprint reviews where the AI spend already reconciles.

Every commit knows which task it was for. The task knows which initiative. The initiative knows which budget. By the time the meeting starts, the number is already on the slide.

A Wednesday before sprint review

Priya runs the PMO. She used to start prep on Sunday.

Old world

Eight Slack threads, four spreadsheets.

Engineering estimates AI usage by memory. Finance has a CSV with no task IDs. Priya pieces it together and labels half of it “Other.”

After Visionality

One filter. Five seconds.

task:PROJ-128: 184 commits, $4,812 spent, 47% Anthropic, 38% OpenAI. Each row links to its PR. Reviewable on a phone.

In the meeting

The question doesn't derail it.

When eng asks “was that the redesign sprint or the migration?” the answer is already on the table. Priya gets her Sunday back.

What becomes true

Project attribution stops being a project.

Sprint retro: "How much did the migration sprint cost in tokens?" — a search box, not a guess.

Capital project review: per-feature AI spend rolls up to the initiative, joinable to your roadmap tool.

Engineer on-call asks: "Was this run for PROJ-219?" — the row says yes, with a PR link.

Finance asks the PMO: "Reconcile this $14K against the Q2 plan." — the join works, first try.

How it actually works

Three flags. Every commit reconciles.

When the engineer issues their key for the session, they tag it with what they're working on. Every gateway commit denormalizes those tags onto the row — searchable, exportable, joinable to your project tracker.

# At session start — engineer picks the task they're working on
eval $(vis-issue alice proj-alpha \
  --task PROJ-128 \
  --memo 'fix login redirect bug' \
  --url 'https://github.com/acme/web/pull/91')

# Every commit Alice generates with this key is now:
#   task:  PROJ-128
#   memo:  fix login redirect bug
#   url:   https://github.com/acme/web/pull/91
#   spend: $0.0142
#   person: [email protected]  (signed in the envelope)
#   project: proj-alpha     (budget binding)
claude  # or codex, gemini, opencode — same rule

Your tracker stays source of truth.

We don't replace Jira or Linear. We just make sure the ledger references it correctly.

GitHub Issues

PR / issue # as the task attribution

Jira

Epic + story key bound to the key issuance

Linear

Cycle + assignee feed into the commit row

Asana

Project + task ID rides the memo field

Notion

Database row URL as the source-of-truth link

Productboard

Roadmap initiative ↔ budget rollup

Three other people are asking different questions.

The same row in our ledger answers all four. Pick the door that matches the meeting you're in.