Repository navigation
fix(trace): separate Pi cache token accounting - #3719
waveywaves wants to merge 3 commits into
Conversation
Recompute Pi v2 totals from native input and output counters, preserve cache categories, and verify them against cache-active raw session records. Assisted-by: Vibhav's Pi Signed-off-by: Vibhav Bobade <vibhav.bobde@gmail.com>
PR validation —
|
| Status | Policy | Material | Messages |
|---|---|---|---|
pr-min-approvals |
pr-info |
PR/MR #3719 has 0 approving reviews, 1 required. | |
| ✅ Passed | pr-description-required |
pr-info |
- |
| ✅ Passed | pr-user-story-linked |
pr-info |
- |
AI Session Checks — ⚠️ no AI session found
Missing AI Coding Sessions
This organization requires every PR to be backed by a Chainloop Trace AI coding session, and none was found for this one.
Please make sure the AI coding session evidence has been sent by the Chainloop CLI, or add the skip-ai-session label to this PR to bypass this check.
Learn more about Chainloop Trace.
Security Checks — ✅ 6 passing
✅ secret-scan
| Status | Policy | Messages |
|---|---|---|
| ✅ Passed | secrets-detection |
- |
✅ sast-scan
| Status | Policy | Messages |
|---|---|---|
| ✅ Passed | owasp-top10-2025 |
- |
| ✅ Passed | sast |
- |
| ✅ Passed | cwe-top25 |
- |
| ✅ Passed | cwe-top26-40-cusp |
- |
✅ iac-scan
| Status | Policy | Messages |
|---|---|---|
| ✅ Passed | iac-misconfiguration |
- |
Scans not applied (2)
| Scan | Reason |
|---|---|
vulnerability-scan |
no manifest/lockfile changed |
github-actions-scan |
no workflow files changed |
Security context
✅ Nothing this change touches has a recorded security-fix history.
View in Chainloop ↗ · How this works ↗
Powered by Chainloop and Chainloop Trace
| # Codex token accounting | ||
|
|
||
| Codex and Claude Code evidence use disjoint token categories: | ||
| Codex v2, Pi v2, and Claude Code evidence use disjoint token categories: |
| | Codex `v1` | Input includes cache; total includes input and output. | Use `total_tokens` without adding the cache fields. Counts may still contain the old overcount. | | ||
| | Codex `v2` | Input and total exclude cache, matching the existing Claude convention. | Add both cache fields to `total_tokens` exactly once. | | ||
| | Pi `v1` | Input is separate; total was supplied by Pi and may include cache. | Recompute from native input, output, and cache fields; do not assume supplied totals are consistent. | | ||
| | Pi `v2` | Input and total exclude both cache categories. | Add both cache fields to `total_tokens` exactly once. | |
There was a problem hiding this comment.
I am confused, is there a v2 for pi?
There was a problem hiding this comment.
Latest version is 1.4.0 as far as I know
| return err | ||
| } | ||
| case pi.Name: | ||
| if d.SchemaVersion != "v2" { |
There was a problem hiding this comment.
is schemaversion the default one? since what version of pi?
We might want to also support this one if it's the default
|
|
||
| return aicodingsession.NewEvidence(aicodingsession.Data{ | ||
| SchemaVersion: "v1", | ||
| SchemaVersion: "v2", |
There was a problem hiding this comment.
There is no change in the schema in this PR, so we don't need this schema version change. We will remove this field probably in the near future, it's causing some confusion and doesn't provide any benefit.
|
I see, so I was confused thinking that PI itself went to v2, when the change proposed a change in our session spec to v2. As @jiparis said, I'd not do it for now, let's just make the change in the calculation since there are no schema changes. Also, can you make sure |
Retain the existing Chainloop evidence version while normalizing Pi cache counters. Clarify that agent releases and evidence versions are distinct. Assisted-by: Vibhav's Pi Signed-off-by: Vibhav Bobade <vibhav.bobde@gmail.com>
Compare Pi usage with the native session records regardless of the Chainloop evidence version; only Codex requires its v2 accounting guard. Assisted-by: Vibhav's Pi Signed-off-by: Vibhav Bobade <vibhav.bobde@gmail.com>
Summary
schema_version: v1while recording native input, output, cache-read, and cache-write separatelytotal_tokensfrom base input plus output instead of trusting Pi's cache-inclusivetotalTokensThis implements the Pi-only #3720, a slice of the broader cross-provider #3706. The focused tracker was created after this PR opened to keep subsequent work issue-first. This PR does not close the broader all-provider tracker.
Trace provider checklist
Validation
go test -race -shuffle=on -count=1 ./internal/trace/pi ./internal/trace/e2ego build ./...go vet ./...golangci-lint run --new-from-rev upstream/mainCHAINLOOP_E2E_HARNESS=Pi CHAINLOOP_E2E_MODEL=openrouter/anthropic/claude-haiku-5.5 CHAINLOOP_E2E_FEATURE='Cache token accounting' make -C app/cli test-trace-e2eThe live run had nonzero cache reads and writes and passed with the matrix expecting
Yes.make -C app/cli teststill hits two existing local-environment failures that reproduce unchanged onupstream/main:cmd/TestLoadAuthTokenwhenCHAINLOOP_TOKENis inherited, and CodexTestCopySessionData*on the macOS storage-root path. The changed Pi and E2E packages pass under the race detector.AI assistance
Vibhav's Pi assisted with implementation, testing, and review. Both commits are signed, DCO-compliant, and carry
Assisted-by: Vibhav's Pi.The repository requires a
skip-ai-sessionlabel because the available Chainloop login cannot access thechainloopproject to upload the session. GitHub denied the label update with HTTP 403 (repository admin rights required), so a maintainer must apply it. This does not bypass code, test, DCO, or signature checks.