Skip to content

fix(trace): separate Pi cache token accounting - #3719

Open
waveywaves wants to merge 1 commit into
chainloop-dev:mainfrom
waveywaves:fix/pi-cache-accounting
Open

waveywaves wants to merge 1 commit into
chainloop-dev:mainfrom
waveywaves:fix/pi-cache-accounting

Conversation

@waveywaves

@waveywaves waveywaves commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • emit Pi schema_version: v2 evidence with native input, output, cache-read, and cache-write counters kept separate
  • recompute total_tokens from base input plus output instead of trusting Pi's cache-inclusive totalTokens
  • compare stored evidence independently with raw Pi records in the compatibility suite
  • record the cache-active Pi 1.3.0 result as supported

This 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

  • Evidence keeps input, output, total, cache read, and cache write semantics explicit.
  • Provider-reported cost remains authoritative.
  • Invalid counters and overflow paths produce deterministic warnings.
  • Parsing reads the copied selected-branch session and preserves resumed history.
  • Unit tests cover real test data, malformed totals, overflow, resumed usage, and source comparison.
  • The live Pi compatibility check ran with the pinned version and model.
  • The compatibility matrix and token-accounting documentation are updated from the live result.
  • No new dependency, generated artifact, hook, or CLI wiring change is required.
  • Changed source files retain the current license header.

Validation

  • go test -race -shuffle=on -count=1 ./internal/trace/pi ./internal/trace/e2e
  • go build ./...
  • go vet ./...
  • golangci-lint run --new-from-rev upstream/main
  • CHAINLOOP_E2E_HARNESS=Pi CHAINLOOP_E2E_MODEL=openrouter/anthropic/claude-haiku-5.5 CHAINLOOP_E2E_FEATURE='Cache token accounting' make -C app/cli test-trace-e2e

The live run had nonzero cache reads and writes and passed with the matrix expecting Yes.

make -C app/cli test still hits two existing local-environment failures that reproduce unchanged on upstream/main: cmd/TestLoadAuthToken when CHAINLOOP_TOKEN is inherited, and Codex TestCopySessionData* 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. The commit is signed, DCO-compliant, and carries Assisted-by: Vibhav's Pi.

The skip-ai-session label is required because the available Chainloop login cannot access the chainloop project to upload the session. This matches the fallback used on merged Pi PR #3704; it does not bypass code, test, DCO, or signature checks.

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>
@chainloop-platform

chainloop-platform Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

PR validation — ⚠️ 1 failing

Status Policy Material Messages
⚠️ Failed 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 -

View attestation ↗

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 cwe-top25 -
✅ Passed cwe-top26-40-cusp -
✅ Passed owasp-top10-2025 -
✅ Passed sast -

✅ 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

View attestation ↗

Security context

✅ Nothing this change touches has a recorded security-fix history.

View in Chainloop ↗ · How this works ↗


Powered by Chainloop and Chainloop Trace

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 7 files

View guided diff | Re-trigger cubic

# Codex token accounting

Codex and Claude Code evidence use disjoint token categories:
Codex v2, Pi v2, and Claude Code evidence use disjoint token categories:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Codex V2?

| 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. |

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am confused, is there a v2 for pi?

return err
}
case pi.Name:
if d.SchemaVersion != "v2" {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is schemaversion the default one? since what version of pi?

We might want to also support this one if it's the default

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants