generated from coulomb/repo-seed
Fixed and improved token tracking
This commit is contained in:
57
docs/token-evidence-model.md
Normal file
57
docs/token-evidence-model.md
Normal file
@@ -0,0 +1,57 @@
|
||||
# Token Evidence Model
|
||||
|
||||
State Hub token events distinguish source-backed measurements from inferred
|
||||
operational signals. Dashboards and reports should use structured fields for
|
||||
quality and provenance; `note` remains human context only.
|
||||
|
||||
## Measurement Kinds
|
||||
|
||||
| Kind | Meaning | Default confidence |
|
||||
| --- | --- | --- |
|
||||
| `measured` | Parsed from a source that reports usage metadata, such as Codex session logs or Claude transcript usage blocks. | `1.0` |
|
||||
| `allocated` | A share of a larger known total, assigned to a task/workstream by a documented allocation method. | `0.70` |
|
||||
| `estimated` | A fallback or operator-entered estimate without direct source evidence. | `0.35` |
|
||||
| `superseded` | Historical rows retained for audit but excluded from active totals. | `0.0` |
|
||||
|
||||
## Source Providers
|
||||
|
||||
| Provider | Source |
|
||||
| --- | --- |
|
||||
| `codex_session` | Codex Desktop `.codex/sessions/**` and `.codex/archived_sessions/**` JSONL token_count events. |
|
||||
| `claude_transcript` | Claude Code `.claude/projects/**/*.jsonl` usage metadata. Transcript text is never stored. |
|
||||
| `llm_connect` | Future llm-connect usage metadata. |
|
||||
| `manual` | Explicit operator/API input. |
|
||||
| `task_fallback` | Fixed task-completion fallback rows created when no source data is available. |
|
||||
|
||||
## Provenance Fields
|
||||
|
||||
Each source-backed row should include:
|
||||
|
||||
- `source_provider`, `source_id`, `source_path`, `source_created_at`
|
||||
- `parser_version`, `ingested_at`, `confidence`
|
||||
- `cached_input_tokens`, `reasoning_output_tokens`, `raw_total_tokens`
|
||||
- `raw_metadata` with parser and attribution metadata, never transcript content
|
||||
|
||||
`tokens_in + tokens_out` remains the default active total. Cached input and
|
||||
reasoning output are preserved separately so dashboards can show both default
|
||||
and provider-style totals without rewriting history.
|
||||
|
||||
## Idempotency
|
||||
|
||||
Measured sources must be written with a stable `source_id`. State Hub enforces
|
||||
one row for each `(measurement_kind, source_provider, source_id)` tuple and
|
||||
`POST /token-events/upsert` updates a growing live session rather than creating
|
||||
duplicates.
|
||||
|
||||
## Migration Playbook
|
||||
|
||||
1. Run the token-event provenance migration.
|
||||
2. Run `python3 scripts/token_reconcile.py --since 2026-05-19` and inspect the
|
||||
dry-run report.
|
||||
3. Run `python3 scripts/token_reconcile.py --since 2026-05-19 --apply` to
|
||||
upsert measured Codex/Claude source rows.
|
||||
4. Run the same command with `--zero-superseded-fallbacks` only after measured
|
||||
source rows cover the affected window.
|
||||
5. Check `/token-events/quality/` or the Token Cost dashboard for fallback,
|
||||
missing-provenance, duplicate-source, and unattributed measured signals.
|
||||
6. Keep historical fallback rows as `superseded`; do not delete them.
|
||||
Reference in New Issue
Block a user