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.