stacktrace-cli 0.11.0__tar.gz → 0.12.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/CLAUDE.md +59 -5
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/PKG-INFO +6 -3
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/README.md +4 -1
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0093-environment-cost-baselines-count-tokens-keyed-by-model.md +1 -1
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0096-cost-usage-may-leave-as-token-totals-and-work-identifiers.md +1 -1
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0099-cost-is-measured-in-tokens-and-relative-increases.md +1 -1
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0104-usage-is-its-own-upload.md +1 -1
- stacktrace_cli-0.12.0/docs/adrs/0127-the-monitor-shows-weighted-tokens-beside-raw-tokens.md +121 -0
- stacktrace_cli-0.12.0/docs/adrs/0128-usage-files-each-response-once-where-it-was-first-filed.md +118 -0
- stacktrace_cli-0.12.0/docs/adrs/0129-an-unfinished-response-counts-the-output-it-shows.md +130 -0
- stacktrace_cli-0.12.0/docs/adrs/0130-usage-carries-one-hour-cache-writes-and-each-responses-price-class.md +126 -0
- stacktrace_cli-0.12.0/docs/adrs/0132-every-usage-page-names-the-store-that-built-it.md +92 -0
- stacktrace_cli-0.12.0/docs/adrs/0133-a-clients-own-error-record-is-a-third-block-channel.md +68 -0
- stacktrace_cli-0.12.0/docs/adrs/0134-a-secret-sent-to-a-server-configured-as-remote-is-egress.md +61 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/INDEX.md +12 -2
- stacktrace_cli-0.12.0/docs/agent-support.html +501 -0
- stacktrace_cli-0.12.0/docs/agent-support.md +139 -0
- stacktrace_cli-0.12.0/docs/releases/v0.12.0.md +74 -0
- stacktrace_cli-0.12.0/docs/specs/codex-agent-kind.md +362 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/cost-notifications.md +12 -5
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/cost-phase-1.md +18 -8
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/cost.md +11 -2
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/detector.md +3 -3
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/monitor.md +53 -15
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/usage-upload.md +79 -7
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/pyproject.toml +5 -3
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/__init__.py +1 -1
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cli.py +0 -2
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/correlate/observed.py +49 -5
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cost/baseline.py +16 -1
- stacktrace_cli-0.12.0/src/stacktrace/cost/copies.py +90 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cost/ledger.py +8 -2
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cost/measures.py +3 -2
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cost/models.py +29 -3
- stacktrace_cli-0.12.0/src/stacktrace/cost/output.py +123 -0
- stacktrace_cli-0.12.0/src/stacktrace/cost/price_class.py +48 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cost/reasons.py +3 -2
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cost/rules.py +2 -1
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cost/usage.py +169 -16
- stacktrace_cli-0.12.0/src/stacktrace/cost/weights.py +125 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/costs.py +6 -1
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/db.py +123 -15
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/presentation.py +26 -2
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/store.py +140 -25
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/usage.py +72 -18
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/blocked.py +102 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/deterministic.py +138 -35
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/prompts/__init__.py +3 -2
- stacktrace_cli-0.12.0/src/stacktrace/detector/prompts/jev-v3/stacktrace-deceptive-completion.json +16 -0
- stacktrace_cli-0.12.0/src/stacktrace/detector/prompts/jev-v3/stacktrace-infra-unsafe-action.json +10 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/reasoning.py +5 -19
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/run.py +3 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/gateway/formats/_json.py +1 -5
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/gateway/session.py +20 -2
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/costs.py +113 -12
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/render.py +23 -2
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/site/app.js +14 -9
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/site/cost.js +152 -16
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/site/index.html +1 -1
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/site/styles.css +13 -2
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/remote/upload_contract.py +4 -0
- stacktrace_cli-0.12.0/src/stacktrace/sessions/entrypoint.py +43 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/sessions/protocols.py +5 -39
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/conftest.py +9 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/fakes.py +6 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_baseline.py +15 -0
- stacktrace_cli-0.12.0/tests/cost/test_copies.py +91 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_cost_is_tokens.py +10 -1
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_measures.py +9 -0
- stacktrace_cli-0.12.0/tests/cost/test_models.py +47 -0
- stacktrace_cli-0.12.0/tests/cost/test_output.py +149 -0
- stacktrace_cli-0.12.0/tests/cost/test_price_class.py +113 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_rules_baseline.py +16 -2
- stacktrace_cli-0.12.0/tests/cost/test_unfinished_output_counts_what_it_shows.py +330 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_usage.py +62 -2
- stacktrace_cli-0.12.0/tests/cost/test_weights.py +153 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_accounts.py +4 -3
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_db.py +197 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_runtime.py +1 -1
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_usage.py +426 -6
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_usage_store.py +242 -1
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/detector_session_fixture.py +0 -4
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/test_session.py +108 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/cost_harness.mjs +64 -15
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/feed_harness.mjs +4 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/test_cost_page.py +144 -8
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/test_feed_model.py +8 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/test_render_cost.py +447 -1
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/test_site_assets.py +11 -7
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_usage_contract.py +5 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/telemetry/test_every_derived_site.py +1 -1
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/telemetry/test_hooks.py +1 -1
- stacktrace_cli-0.12.0/tests/test_agent_support_doc.py +81 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_blocked.py +18 -9
- stacktrace_cli-0.12.0/tests/test_detector_client_errors.py +125 -0
- stacktrace_cli-0.12.0/tests/test_detector_declared_egress.py +100 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_history.py +17 -8
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_new_deterministic.py +33 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_prompts.py +1 -1
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_reasoning.py +16 -6
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_why_it_stopped.py +44 -0
- stacktrace_cli-0.12.0/tests/test_entrypoint_conventions.py +110 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_fingerprint_covers_what_the_analyzer_reads.py +0 -2
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_join.py +0 -1
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_kind_conformance.py +40 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_observed.py +93 -1
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_openaidr_contract.py +220 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_session_identity_is_the_pair.py +10 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_the_locality_claim_is_qualified_everywhere.py +0 -9
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_title_disclosure_invariant.py +23 -14
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_untrusted_content_never_travels.py +13 -1
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/uv.lock +6 -6
- stacktrace_cli-0.11.0/tests/cost/test_models.py +0 -15
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/.agents/skills/release-stacktrace/SKILL.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/.claude/settings.json +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/.claude/skills/release-stacktrace/SKILL.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/.codex/hooks.json +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/.github/managed-autofix.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/.github/pull_request_template.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/.github/workflows/bedrock-live.yml +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/.github/workflows/ci.yml +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/.github/workflows/guard-staging.yml +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/.github/workflows/publish-pypi.yml +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/.gitignore +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/AGENTS.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/contracts/observations/v1/decision-request.example.json +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/contracts/observations/v1/decision-request.schema.json +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/contracts/observations/v1/decision-response.example.json +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/contracts/observations/v1/decision-response.schema.json +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/contracts/observations/v1/example.json +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/contracts/observations/v1/schema.json +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0001-session-telemetry-as-input.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0002-session-collection-in-openaidr.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0003-runtime-edges.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0004-three-stage-detector.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0005-detection-family-and-report-assembly.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0006-trust-boundary-and-detection-upload.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0007-proprietary-package-on-open-dependencies.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0008-console-in-separate-demo-package.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0010-detection-severity-and-confidence-ladders.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0011-verdict-cache.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0012-observation-evidence-kinds-and-transport.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0013-rule-catalogue-triage-and-per-rule-context.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0014-declared-project-mapping.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0015-narrow-the-security-catalogue.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0016-stall-grouping-is-session-wide.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0017-a-declined-repeat-is-a-stall.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0018-remote-sync-config-and-facade-consumption.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0019-delegated-commands-are-openaca-objects.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0020-openaca-consumption-boundary.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0021-two-command-kinds.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0022-detection-scope-is-a-catalogue-column.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0023-sync-detect-collects-and-does-not-escalate.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0024-the-upload-carries-observations.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0025-a-denied-call-is-activity-never-an-invocation.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0026-the-console-becomes-a-product-surface.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0027-a-finding-may-name-what-it-could-not-place.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0028-the-console-shows-what-it-placed.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0029-stage-three-returns-to-opt-in.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0030-a-detection-is-dated-by-the-turns-it-cites.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0031-one-host-daemon-observes-native-session-logs.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0032-refresh-daemon-compositions-outside-detection.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0033-a-third-party-analyzer-only-by-a-flag-that-names-it.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0034-the-drift-grade-is-read-off-a-run-not-a-call.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0035-naming-an-analyzer-selects-stored-answers.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0036-deliver-eligible-findings-to-slack-from-the-daemon.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0037-reuse-openaidr-append-cursors-in-the-daemon.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0038-poll-normalized-sessions-for-supplemental-changes.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0039-send-usage-telemetry-by-default-with-an-opt-out.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0041-defer-native-windows-support.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0042-read-the-build-commit-from-the-install-record.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0043-name-the-session-agent-and-host-and-count-errors-by-class.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0044-send-the-build-as-version-prints-it.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0045-scan-every-session-and-outlive-them.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0046-the-finding-store-is-an-append-only-queue.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0047-capture-activity-during-correlation-or-lose-it.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0048-the-daemon-keeps-a-leveled-content-free-activity-log.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0056-stop-a-resident-daemon-by-record-and-signal.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0057-grow-the-queue-schema-additively-and-share-only-the-document.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0058-one-word-for-a-finding-columns-for-a-counter-and-a-push-that-does-not-wait.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0059-the-daemon-does-not-decide-whether-it-should-be-running.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0060-two-upload-postures-not-one-command-with-two-sources.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0061-the-drain-sends-findings-only.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0062-hold-the-transition-lock-across-remote-side-effects.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0063-underbuilt-debt-does-not-hold-the-scan-watermark.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0064-a-redacted-value-has-one-path-span.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0065-asset-external-id-resolves-by-a-ladder.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0066-host-owned-daemon-supervision.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0067-a-webhook-is-an-independent-queue-subscriber.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0068-webhooks-retry-the-retained-backlog.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0069-webhooks-deliver-what-retention-holds.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0070-package-the-cloud-agent-environment-bootstrap.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0071-render-the-allowlisted-payload-per-destination.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0072-host-supervisors-own-daemon-restarts.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0073-name-what-fired-and-which-component.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0074-a-window-selects-findings-by-when-they-happened.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0076-two-phase-detection-pipeline.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0077-the-bom-job-wakes-once-at-startup-staggered.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0078-a-seeded-display-prefix-replaces-the-hostname-label.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0079-the-monitor-page-renders-findings-not-pipeline-health.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0080-enabling-reasoning-does-not-requeue-the-past.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0081-reasoning-activation-returns-to-explicit-opt-in.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0082-monitor-checks-every-installed-component-by-default.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0083-each-block-reason-is-its-own-rule.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0084-a-recursive-deletes-evidence-is-the-rm-that-ran.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0085-show-when-and-which-finding-slack-delivered.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0086-a-refusal-names-who-answered-the-call.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0087-deploy-compiled-policy-with-a-privileged-scheduled-job.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0088-slack-alerts-leave-out-confidence.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0089-infra-gate-reads-commands-not-shell-semantics.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0090-count-completed-commands-locate-by-ip-send-through-the-managed-proxy.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0091-mark-our-own-machines-and-name-what-failed.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0092-cost-is-its-own-rule-family.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0094-estimate-cost-from-tokens-the-agent-figure-is-a-cross-check.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0095-cost-findings-reach-fleet-each-rule-can-be-muted.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0097-the-daemon-makes-cost-findings-and-the-monitor-reads-them.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0098-a-run-is-its-main-session.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0100-the-monitor-runs-offline-for-the-website.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0101-what-names-a-run-in-fleet.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0102-token-use-is-never-compared-with-a-providers-usage-api.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0103-finished-runs-may-leave-as-numbers-for-org-baselines.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0105-an-asset-key-is-a-bare-uuid.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0106-boot-id-is-salted-with-the-pid-namespace.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0107-the-daemon-follows-every-kind-openaidr-reads.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0108-a-kind-renamed-before-any-release-read-it-keeps-no-alias.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0109-a-detection-carries-its-runs-title-and-the-persons-name.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0110-every-kinds-account-comes-from-openaidr.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0111-built-in-sub-agents-and-skills-come-from-the-bom.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0112-a-person-is-known-by-the-accounts-on-the-host.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0113-size-triggers-behaviour-explains-session-cost-carries-reasons.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0114-similar-sessions-are-the-same-agent-in-the-same-repo.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0115-usage-states-its-coverage-and-fleet-returns-expected-runs.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0116-a-component-row-carries-what-its-results-cost-under-one-closed-key.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0117-a-component-row-on-the-day-of-a-switch-counts-from-the-switch.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0118-observe-agents-through-adapters-and-a-shared-analyzer.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0119-read-sessions-from-an-ai-gateway-and-block-inline.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0120-own-the-adapter-event-envelope.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0121-a-cloud-sessions-runs-are-its-persons-and-a-card-says-where-its-name-came-from.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0122-use-stacktrace-as-the-python-package.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0123-the-cloud-boot-hook-brings-the-client-up-to-the-latest-release.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/0124-fleet-imports-core-from-the-stacktrace-distribution.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/HOOK-PROMPT.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/adrs/TEMPLATE.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/cutover-openaca-remote.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/plans/002-session-input.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/plans/003-correlation.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/plans/004-detector.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/plans/005-remote-sync.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/plans/006-cli-composition.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/plans/007-detection-upload.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/plans/008-monitor.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/plans/009-reasoning-jev.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/plans/010-session-daemon.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/plans/011-daemon-store.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/plans/012-daemon-scanning.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/plans/013-daemon-uploads.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/plans/014-asset-identity.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/plans/015-managed-policy-deployment.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/plans/016-cost-phase-1.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/plans/017-cost-phase-2.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.0.1.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.1.0.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.10.0.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.11.0.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.2.0.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.2.1.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.2.2.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.2.3.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.3.0.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.3.1.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.4.0.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.4.1.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.5.0.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.5.1.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.5.2.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.5.3.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.6.0.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.6.1.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.7.0.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.7.1.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.8.0.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/releases/v0.9.0.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/research/001-intent-drift-metric.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/agent-observability.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/aidr.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/cli-composition.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/correlation.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/cost-phase-2.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/daemon-scanning.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/daemon-store.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/daemon-uploads.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/detection-policies.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/detection-upload.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/event-time.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/managed-policy-deployment.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/monitor-inventory.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/notification-delivery.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/production-agent-observability.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/reasoning-jev.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/remote-sync.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/docs/specs/session-input.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/examples/observations/custom_agent.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/README.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/bedrock-sandbox/.gitignore +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/bedrock-sandbox/ci.tf +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/bedrock-sandbox/main.tf +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/bedrock-sandbox/outputs.tf +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/bedrock-sandbox/variables.tf +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/.gitignore +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/README.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/check.sh +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/ci.tf +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/connect.sh +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/images/envoy/Dockerfile +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/images/envoy/entrypoint.sh +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/images/envoy/litellm.yaml +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/images/litellm/Dockerfile +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/images/litellm/config.subscription.yaml +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/images/litellm/config.yaml +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/images/litellm/entrypoint.sh +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/main.tf +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/moved.tf +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/outputs.tf +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/smoke.sh +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/user-key.sh +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/guard-staging/variables.tf +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/modules/express-gateway/main.tf +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/modules/express-gateway/outputs.tf +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/infra/modules/express-gateway/variables.tf +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/integrations/e2e/claude.sh +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/integrations/e2e/scenarios.sh +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/integrations/envoy/envoy.yaml +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/integrations/envoy/run.sh +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/integrations/litellm/README.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/integrations/litellm/config.example.yaml +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/integrations/litellm/config.subscription.yaml +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/integrations/litellm/e2e/config.baseten.yaml +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/integrations/litellm/e2e/config.mock.yaml +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/integrations/litellm/e2e/mock_upstream.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/integrations/litellm/e2e/parity.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/integrations/litellm/stacktrace_keys.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/integrations/litellm/stacktrace_litellm.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/scripts/cost_latency.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/scripts/git-hooks/pre-push +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/scripts/install-hooks.sh +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/__main__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/analysis.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/build.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cloud/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cloud/setup.sh +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/core/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/core/observations.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/correlate/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/correlate/acquire.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/correlate/composition.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/correlate/join.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/correlate/orchestrate.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/correlate/project_map.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/correlate/record.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/correlate/render.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cost/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cost/clock.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cost/component_usage.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cost/components.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cost/evidence.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cost/org_baselines.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cost/runs.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cost/tokens.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/cost/totals.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/accounts.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/activity_log.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/bom.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/cli.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/client.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/composition.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/config.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/fleet.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/identity.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/jobs.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/lifecycle.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/observer.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/paths.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/protocol.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/runtime.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/scan.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/server.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/service.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/daemon/webhook.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/analyzer.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/cache.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/finding.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/history.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/jev.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/priors.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/prompts/jev-v1/stacktrace-deceptive-completion.json +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/prompts/jev-v2/stacktrace-deceptive-completion.json +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/prompts/jev-v2/stacktrace-infra-unsafe-action.json +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/prompts/v1/exclusions.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/prompts/v1/framing.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/prompts/v1/stacktrace-deceptive-completion.md +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/render.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/rules.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/secrets.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/verdict.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/detector/windows.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/gateway/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/gateway/analyzer.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/gateway/check.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/gateway/cli.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/gateway/exchange.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/gateway/formats/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/gateway/formats/anthropic.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/gateway/formats/bedrock.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/gateway/formats/body.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/gateway/formats/openai_chat.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/gateway/formats/openai_responses.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/gateway/service.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/gateway/sink.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/inventory.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/offline.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/reasoning.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/server.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/site/apple-icon.png +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/site/favicon.ico +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/site/fonts/OFL.txt +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/site/fonts/dm-mono-400-latin.woff2 +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/site/fonts/dm-mono-500-latin.woff2 +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/site/fonts/dm-sans-latin.woff2 +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/site/fonts/playfair-display-600-italic-latin.woff2 +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/site/icon.svg +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/site/inventory.js +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/state.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/verdicts.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/monitor/watch.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/options.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/private_state.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/py.typed +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/remote/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/remote/cli.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/remote/client.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/remote/config.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/remote/detect_payload.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/remote/identity.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/remote/payload.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/remote/policy.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/remote/policy_service.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/remote/policy_worker.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/remote/redact.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/remote/spool.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/remote/sync.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/remote/sync_detect.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/sdk.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/sessions/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/sessions/access.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/sessions/index.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/sessions/lineage.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/sessions/outcome.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/sessions/render.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/telemetry/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/telemetry/cli.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/telemetry/events.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/telemetry/posthog.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/telemetry/state.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/webhook/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/webhook/cli.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/src/stacktrace/webhook/config.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/agent_bom_fixture.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/scenarios.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_as_of_cuts_every_timed_collection.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_clock.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_component_usage.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_components.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_cost_evidence_travels.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_cost_findings_are_dated_by_their_citations.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_cost_findings_carry_no_session_text.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_cost_latency.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_evidence.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_ledger.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_org_baselines.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_reasons.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_rules_budget.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_runs.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/cost/test_totals.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/observing.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_activity_log.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_cli.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_client.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_composition.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_config.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_cost_guidance.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_costs.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_detection_needs_no_subscriber.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_fleet.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_identity.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_job_thread.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_jobs.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_lifecycle.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_observer.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_queue_reader.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_scan.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_service.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_session_cost_notices.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_socket.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_stage_times.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_store.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_subagent_routing.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_the_drained_payload_is_the_cold_one.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_the_stored_row_is_sufficient.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_webhook.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/daemon/test_wire_frames_are_bounded.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/fixtures/claude-code-2.1.296-suite/gateway-last-turn.json +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/fixtures/claude-code-2.1.296-suite/projects/run/b23c3bab-a677-4b5f-ac36-e132c7df29e5.jsonl +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/test_analyzer.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/test_bodies_and_logs.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/test_call_records.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/test_check.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/test_every_choice_is_read.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/test_every_read_field_is_validated.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/test_every_shortfall_is_a_recorded_fallback.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/test_gateway_keys.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/test_gateway_scripts.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/test_litellm_stream.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/test_litellm_subscription_config.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/test_parity_live_capture.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/test_service.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/gateway/test_unstated_outcomes.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/inventory_harness.mjs +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/test_cost_range_switch.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/test_inventory.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/test_inventory_page.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/test_offline.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/test_reasoning_gates.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/test_render.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/test_server.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/test_state.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/test_verdicts.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/monitor/test_watch.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/observations/test_contract.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/observations/test_decisions.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/observations/test_event_envelope.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/helpers.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_cli.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_client.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_cloud_boot_updates_the_client.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_cloud_setup_asset_id.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_config.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_detect_activity.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_detect_cli.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_detect_client.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_detect_contract_is_exhaustive.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_detect_gate_matches_the_cloud.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_detect_layers_compose.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_detect_payload_reaches_the_cloud_model.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_detect_redaction.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_detect_spool.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_detect_upload_contract.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_detect_wire_payload.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_facade_contract.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_identity.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_no_local_path_survives_redaction.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_payload.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_policy.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_policy_service.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_policy_service_cli.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_redact_payload.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_seam.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_spool.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_sync.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_sync_detect.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_upload_contract.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/remote/test_usage_client.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/sdk/test_observation_client.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/telemetry/__init__.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/telemetry/test_activity_log.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/telemetry/test_cli.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/telemetry/test_events.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/telemetry/test_every_internal_save_is_reported.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/telemetry/test_release_gate.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/telemetry/test_state.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/telemetry/test_uploader.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_acquire.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_adr_cross_references_are_reciprocal.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_agent_instance_id.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_analysis.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_bom_shape.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_build_commit.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_call_status_conventions.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_cli.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_composition.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_correlate_orchestrate.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_correlate_render.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_correlated_session.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detection_components.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detection_event_time.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detection_subject.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_analyzer_contract.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_analyzer_live.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_cache.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_deterministic.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_end_to_end.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_finding.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_infra_reasoning.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_jev.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_names_the_service.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_priors.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_render.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_run.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_secrets.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_verdict.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_vulnerable_dep_invoked.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_detector_windows.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_evidence_is_dated_not_numbered.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_help_sections.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_monitor_cli.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_no_agent_kind_is_named.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_no_live_document_states_the_old_stage_three_default.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_no_test_undoes_every_patch_at_once.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_openaca_contract.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_option_arity_matches_the_binary.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_project_map.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_python_namespace.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_readme_examples_are_real_output.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_release_gate_coverage.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_release_readiness.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_seam_boundary.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_sessions_access.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_sessions_end_to_end.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_sessions_protocol_typing.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_sessions_protocols.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_sessions_render.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_shell_separators_match_the_shell.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_signed_in_asks_the_agent.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_stored_verdicts_are_never_gated_on_reasoning.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_the_detector_spec_lists_the_shipped_catalogue.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_the_jev_spec_states_the_shipped_thresholds.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_verification_subcommands_match_the_binary.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/test_what_jev_is_told_is_what_was_disclosed.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/tool_fields.py +0 -0
- {stacktrace_cli-0.11.0 → stacktrace_cli-0.12.0}/tests/webhook/test_cli.py +0 -0
|
@@ -264,12 +264,55 @@ silently editing an accepted ADR breaks that contract.
|
|
|
264
264
|
the user explicitly says "merge locally," "keep as branch," or
|
|
265
265
|
"discard."
|
|
266
266
|
|
|
267
|
+
## Writing documents
|
|
268
|
+
|
|
269
|
+
Write all Markdown documents in ASD-STE100 Simplified Technical English.
|
|
270
|
+
This includes specs, ADRs, READMEs, plans and release notes. The rule
|
|
271
|
+
applies to every author, human or agent.
|
|
272
|
+
|
|
273
|
+
- Write one idea in each sentence.
|
|
274
|
+
- Use a maximum of 20 words in an instruction and 25 words in a
|
|
275
|
+
description.
|
|
276
|
+
- Use a maximum of six sentences in a paragraph.
|
|
277
|
+
- Use the active voice and the present tense.
|
|
278
|
+
- Start an instruction with a verb, for example "Run the tests."
|
|
279
|
+
- Use "a", "an" and "the". Do not remove them to make the text shorter.
|
|
280
|
+
- Use one term for one thing, and use it the same way in all of the
|
|
281
|
+
document.
|
|
282
|
+
- Use simple, common words. Do not use filler, such as "in order to" or
|
|
283
|
+
"utilize".
|
|
284
|
+
- Do not use em-dash asides. Write a new sentence.
|
|
285
|
+
- Do not change technical names, commands or code. Code blocks, tables and
|
|
286
|
+
quoted text do not have to obey these rules.
|
|
287
|
+
|
|
288
|
+
Apply these rules to the text that you write or change. Do not rewrite an
|
|
289
|
+
existing document only to change its style. Do not edit an accepted ADR to
|
|
290
|
+
change its style.
|
|
291
|
+
|
|
292
|
+
These rules are for authors. They are not a code review topic. Reviewers
|
|
293
|
+
do not report style findings.
|
|
294
|
+
|
|
267
295
|
## Code Review Rules
|
|
268
296
|
|
|
297
|
+
**The goal of review is to converge.** The reviewer and the fixer both work
|
|
298
|
+
toward a PR that can merge in few rounds. Each round costs a full CI run and
|
|
299
|
+
a review, and a finding on text that was already reviewed starts another
|
|
300
|
+
round. Converging does not mean letting a serious defect through. The first
|
|
301
|
+
review catches the glaring issues, and later reviews check only what changed.
|
|
302
|
+
|
|
269
303
|
### Reviewer
|
|
270
304
|
|
|
271
|
-
-
|
|
272
|
-
|
|
305
|
+
- **The first review of a PR is the complete one.** Review the full PR
|
|
306
|
+
against its base branch. Report every qualifying finding together. Do not
|
|
307
|
+
reserve findings for later rounds.
|
|
308
|
+
- **A later review covers only what changed since the previous reviewed
|
|
309
|
+
head.** That is the PR's new commits, plus existing code whose behavior
|
|
310
|
+
those commits change, such as a caller or dependency of changed code.
|
|
311
|
+
Changes that a merge or rebase brings in from the base branch are not part
|
|
312
|
+
of it.
|
|
313
|
+
- **Do not report a defect that existed at the previous reviewed head**,
|
|
314
|
+
unless the new commits change its behavior. Exception: report a P0 or P1
|
|
315
|
+
even if it existed before, and label it a late discovery.
|
|
273
316
|
- Report concrete, actionable defects with supported failure scenarios.
|
|
274
317
|
Respect explicit scope decisions and accepted tradeoffs. Do not present
|
|
275
318
|
speculative hardening or optional improvements as correctness defects.
|
|
@@ -280,12 +323,16 @@ silently editing an accepted ADR breaks that contract.
|
|
|
280
323
|
- P3: low-priority suggestion.
|
|
281
324
|
- Report only P0 and P1 findings. Do not post P2 or P3 findings, inline or
|
|
282
325
|
in the review summary. Do not inflate priority to get a finding reported.
|
|
283
|
-
-
|
|
284
|
-
|
|
326
|
+
- A missing detail or an optional improvement is never P1. This applies to
|
|
327
|
+
code and to documentation. A P1 is something wrong: a defect, or a false
|
|
328
|
+
statement.
|
|
329
|
+
- On later reviews, verify that the earlier fixes work. Check their effects on
|
|
330
|
+
callers and dependencies.
|
|
285
331
|
- When review history supports it, identify a finding as:
|
|
286
332
|
- Regression: introduced since the previous reviewed head.
|
|
287
|
-
- Late discovery: present at a previously reviewed head but not reported.
|
|
288
333
|
- Unresolved: a previously reported defect remains.
|
|
334
|
+
- Late discovery: present at a previously reviewed head but not reported.
|
|
335
|
+
Only a P0 or P1 may be a late discovery.
|
|
289
336
|
If the history is unavailable or ambiguous, say so rather than guessing.
|
|
290
337
|
- Deduplicate by underlying defect and remedy, not by title. Refer to an
|
|
291
338
|
existing thread for an unresolved defect instead of opening another one.
|
|
@@ -301,6 +348,13 @@ silently editing an accepted ADR breaks that contract.
|
|
|
301
348
|
If its reasoning or priority is wrong, explain why rather than applying
|
|
302
349
|
it solely because a reviewer requested it. Surface unresolved disputes
|
|
303
350
|
for human judgment.
|
|
351
|
+
- Decline a late discovery that is not P0 or P1. If the defect existed at the
|
|
352
|
+
previous reviewed head and the new commits do not change its behavior,
|
|
353
|
+
reply that the review rules exclude it, and do not fix it. A declined
|
|
354
|
+
finding does not count as a fix round.
|
|
355
|
+
- Keep each fix to what its finding needs. Do not rewrite or extend nearby
|
|
356
|
+
code or text. A change beyond the finding gives the next review new
|
|
357
|
+
material to report, and the PR does not converge.
|
|
304
358
|
- Fix the underlying invariant across relevant call sites. Test the
|
|
305
359
|
failure class rather than only the reported example.
|
|
306
360
|
- Preserve accepted fixes and regression tests when reviewing a rebased PR or
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: stacktrace-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.12.0
|
|
4
4
|
Summary: CLI for Stacktrace — Detection and Response platform for AI Agents.
|
|
5
5
|
Project-URL: Homepage, https://stacktrace.ai
|
|
6
6
|
Author-email: "Stacktrace AI, Inc" <founders@stacktrace.ai>
|
|
@@ -21,7 +21,7 @@ Requires-Python: >=3.11
|
|
|
21
21
|
Requires-Dist: click>=8.1
|
|
22
22
|
Requires-Dist: httpx<1.0.dev0,>=0.28.1
|
|
23
23
|
Requires-Dist: openaca==0.10.1
|
|
24
|
-
Requires-Dist: openaidr==0.
|
|
24
|
+
Requires-Dist: openaidr==0.7.0
|
|
25
25
|
Requires-Dist: posthog<8,>=7.0
|
|
26
26
|
Requires-Dist: pydantic<3,>=2.10
|
|
27
27
|
Description-Content-Type: text/markdown
|
|
@@ -52,7 +52,7 @@ Requires Python 3.11 or newer.
|
|
|
52
52
|
|
|
53
53
|
```console
|
|
54
54
|
$ stacktrace --version
|
|
55
|
-
stacktrace 0.
|
|
55
|
+
stacktrace 0.12.0 (openaca 0.10.1)
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
## Python package namespace
|
|
@@ -250,6 +250,9 @@ Beta, and under active development.
|
|
|
250
250
|
Devin sessions alike (Devin CLI and Devin Desktop's local agent). Session collection is
|
|
251
251
|
[OpenAIDR](https://github.com/open-agent-security/openaidr)'s, and further agent
|
|
252
252
|
kinds arrive with it. The daemon observes every kind it reads, sub-agents included.
|
|
253
|
+
[Agent support](docs/agent-support.md) lists what works for each agent, rule by
|
|
254
|
+
rule, and what cannot. Codex is next
|
|
255
|
+
([spec](docs/specs/codex-agent-kind.md)).
|
|
253
256
|
|
|
254
257
|
## Built on
|
|
255
258
|
|
|
@@ -24,7 +24,7 @@ Requires Python 3.11 or newer.
|
|
|
24
24
|
|
|
25
25
|
```console
|
|
26
26
|
$ stacktrace --version
|
|
27
|
-
stacktrace 0.
|
|
27
|
+
stacktrace 0.12.0 (openaca 0.10.1)
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
## Python package namespace
|
|
@@ -222,6 +222,9 @@ Beta, and under active development.
|
|
|
222
222
|
Devin sessions alike (Devin CLI and Devin Desktop's local agent). Session collection is
|
|
223
223
|
[OpenAIDR](https://github.com/open-agent-security/openaidr)'s, and further agent
|
|
224
224
|
kinds arrive with it. The daemon observes every kind it reads, sub-agents included.
|
|
225
|
+
[Agent support](docs/agent-support.md) lists what works for each agent, rule by
|
|
226
|
+
rule, and what cannot. Codex is next
|
|
227
|
+
([spec](docs/specs/codex-agent-kind.md)).
|
|
225
228
|
|
|
226
229
|
## Built on
|
|
227
230
|
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: 0127
|
|
3
|
+
title: The monitor shows weighted tokens beside raw tokens
|
|
4
|
+
status: proposed
|
|
5
|
+
date: 2026-10-15
|
|
6
|
+
supersedes: null
|
|
7
|
+
superseded-by: null
|
|
8
|
+
amends: 0099
|
|
9
|
+
amended-by: null
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
The monitor's Usage tab adds fresh input, cache reads, cache writes and output
|
|
15
|
+
one to one. On the measured machine 98% of those tokens were cache reads
|
|
16
|
+
(ADR-0099). A cache read is billed at a tenth of a fresh input token on most
|
|
17
|
+
Claude models, and at less on the newest. So the raw total mostly says how
|
|
18
|
+
often a context was re-read. A long session that re-reads a large cache looks
|
|
19
|
+
heavy. A session that sends the same context uncached on every call looks
|
|
20
|
+
light.
|
|
21
|
+
|
|
22
|
+
Fleet now judges and shows cost in dollars (Fleet ADR-0087). A developer who
|
|
23
|
+
opens the monitor sees a raw count that moves differently from Fleet's figure.
|
|
24
|
+
Nothing on the page says why.
|
|
25
|
+
|
|
26
|
+
The product owner asked the monitor to show each kind of token on its own, and
|
|
27
|
+
what each kind weighs, beside the raw count.
|
|
28
|
+
|
|
29
|
+
ADR-0099 rejected tokens weighted by kind: "that is a price table by another
|
|
30
|
+
name." Its concern was a table kept current for every model, and a figure read
|
|
31
|
+
against an invoice it never matches. That conclusion does not hold for this
|
|
32
|
+
use:
|
|
33
|
+
|
|
34
|
+
- The table holds ratios between the kinds of one model, as the provider's
|
|
35
|
+
pricing page states them. It holds no price. The ratios change rarely: every
|
|
36
|
+
Claude model shares the same cache write and output ratios, and only four
|
|
37
|
+
models have cheaper cache reads.
|
|
38
|
+
- A model the table does not list still gets a figure, at Anthropic's usual
|
|
39
|
+
ratios, marked estimated. ADR-0099's "a new model works on day one" holds.
|
|
40
|
+
- A weighted token is still a token: one fresh input token of the model that
|
|
41
|
+
served it. It names no money and makes no claim about any invoice.
|
|
42
|
+
- Rules, thresholds, baselines, evidence and the usual stay in raw tokens.
|
|
43
|
+
Only what the monitor shows changes.
|
|
44
|
+
|
|
45
|
+
## Decision
|
|
46
|
+
|
|
47
|
+
1. **The monitor shows weighted tokens beside raw tokens.** The Usage tab's
|
|
48
|
+
head states the range's weighted total under its raw total. A card lists each
|
|
49
|
+
kind of token with its raw count, the ratio it was weighed at, its weighted
|
|
50
|
+
count and its share of the weighted total. Each row of the table by model and
|
|
51
|
+
by agent carries its weighted count. The Live tab's session line carries the
|
|
52
|
+
session's weighted count beside its tokens.
|
|
53
|
+
2. **One weighted token is one fresh input token of the model that served it.**
|
|
54
|
+
Each kind is multiplied by that model's published ratio to its own fresh
|
|
55
|
+
input, model by model, and then summed. On every Anthropic model: fresh input
|
|
56
|
+
×1, 5-minute cache write ×1.25, 1-hour cache write ×2, output ×5. Cache reads
|
|
57
|
+
×0.1, except ×0.05 on Opus 5.5 and Sonnet 5.5 and ×0.025 on Fable 5.1 and
|
|
58
|
+
Mythos 5.1. A cache write recorded without its lifetime weighs as a 5-minute
|
|
59
|
+
write.
|
|
60
|
+
3. **The table lives in the client, as ratios** (`cost/weights.py`). A model is
|
|
61
|
+
looked up by the name `cost.models` gives it, without its snapshot date, and
|
|
62
|
+
without the effort suffix Devin records (`claude-opus-5-5-medium`).
|
|
63
|
+
4. **A figure weighed by defaults is marked estimated.** A `claude-*` model the
|
|
64
|
+
table does not list, any other model (Devin's `swe-1-6`) and a response with
|
|
65
|
+
no model weigh at Anthropic's usual ratios, cache reads at ×0.1. No token is
|
|
66
|
+
dropped. The page says "estimated" and names the models.
|
|
67
|
+
5. **Three charges are not weighted:** fast mode, US-only inference, and Haiku
|
|
68
|
+
5.5's tier for prompts over 100K tokens. Each is billed higher, so each
|
|
69
|
+
leaves a weighted figure under the bill, never over. The page says so.
|
|
70
|
+
6. **Nothing else changes unit.** The chart, the runs, the components, the
|
|
71
|
+
usual, Session cost and its reasons, and every figure that leaves the
|
|
72
|
+
machine stay in raw tokens.
|
|
73
|
+
|
|
74
|
+
What this amends: ADR-0099's rejection of "tokens weighted by kind", for what
|
|
75
|
+
the monitor shows. ADR-0099's decision stands. Every cost figure is tokens, and
|
|
76
|
+
a weighted token is a token. There is still no price table: this table holds
|
|
77
|
+
ratios.
|
|
78
|
+
|
|
79
|
+
## Alternatives considered
|
|
80
|
+
|
|
81
|
+
- **Dollars on the machine.** Rejected by ADR-0099 and by this repo's rule that
|
|
82
|
+
cost is tokens, never dollars. It needs prices kept current, and invites a
|
|
83
|
+
comparison with an invoice that subscriptions and discounts never match.
|
|
84
|
+
- **One reference model for every model.** Weigh each model's tokens against a
|
|
85
|
+
single model's fresh input, so Opus and Haiku add up on one scale. Rejected:
|
|
86
|
+
the ratio between two models is a ratio of their prices, so this is dollars in
|
|
87
|
+
disguise, with a reference price to keep current.
|
|
88
|
+
- **Weigh only in Fleet**, as cost-notifications §6 proposed. Rejected: the
|
|
89
|
+
product owner asked for it on the machine. Fleet now shows dollars (Fleet
|
|
90
|
+
ADR-0087), so a monitor with raw tokens alone disagrees with Fleet by a factor
|
|
91
|
+
that moves with the mix of kinds, and nothing explains it.
|
|
92
|
+
- **Show weighted tokens instead of raw ones.** Rejected: the rules, the usual
|
|
93
|
+
and Session cost read raw tokens, and the page must show the figure they
|
|
94
|
+
judge.
|
|
95
|
+
- **Fold cache writes without a lifetime into 5-minute writes.** Rejected: that
|
|
96
|
+
changes the raw 5-minute figure. They get their own row when there are any.
|
|
97
|
+
|
|
98
|
+
## Consequences
|
|
99
|
+
|
|
100
|
+
- A reader sees why a large raw total can weigh little: cache reads count a
|
|
101
|
+
tenth or less.
|
|
102
|
+
- The table is one more thing to keep current. A changed ratio needs a client
|
|
103
|
+
release. Until it ships, a listed model's figure is off, and a new model's
|
|
104
|
+
figure says estimated.
|
|
105
|
+
- The machine's weighted tokens and Fleet's dollars are different scales. Within
|
|
106
|
+
one model they move together. Across models they do not, because each
|
|
107
|
+
model's weighted token is its own fresh input token.
|
|
108
|
+
- The monitor weighs 1-hour writes at ×2, because transcripts split the two
|
|
109
|
+
lifetimes. cost-notifications §6 had Fleet weigh both at ×1.25.
|
|
110
|
+
- `tests/cost/test_weights.py` holds each listed model's cache-read ratio,
|
|
111
|
+
checks that no kind of token is dropped, and checks that every model with a
|
|
112
|
+
known context window has ratios of its own.
|
|
113
|
+
|
|
114
|
+
## When to revisit
|
|
115
|
+
|
|
116
|
+
- When Anthropic changes a ratio, or a new model's cache reads differ from
|
|
117
|
+
×0.1.
|
|
118
|
+
- When OpenAIDR reads an agent whose provider publishes different ratios, such
|
|
119
|
+
as Codex.
|
|
120
|
+
- If Session cost or the usual should judge weighted tokens. That changes the
|
|
121
|
+
rules, and needs its own ADR.
|
stacktrace_cli-0.12.0/docs/adrs/0128-usage-files-each-response-once-where-it-was-first-filed.md
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: 0128
|
|
3
|
+
title: Usage files each response once, where it was first filed
|
|
4
|
+
status: proposed
|
|
5
|
+
date: 2026-10-15
|
|
6
|
+
supersedes: null
|
|
7
|
+
superseded-by: null
|
|
8
|
+
amends: 0104
|
|
9
|
+
amended-by: 0130, 0132
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
An audit of the cost pipeline on 2026-10-15 found two ways one response reached
|
|
15
|
+
Fleet twice. Both were reproduced through the real reader.
|
|
16
|
+
|
|
17
|
+
- **Branches.** Claude Code 2.1.300's `/branch` writes a new session file
|
|
18
|
+
holding the conversation so far. Each record is copied whole under the new
|
|
19
|
+
session id, with its message id, usage and time, plus a `forkedFrom` field.
|
|
20
|
+
`--fork-session` likely does the same. OpenAIDR keys a response by its session
|
|
21
|
+
(its ADR-0014), and its token-usage spec leaves cross-session duplicates to
|
|
22
|
+
the consumer. One branch counted 1.66 times the tokens billed and raised a
|
|
23
|
+
false budget breach.
|
|
24
|
+
- **A response read while it is written.** Claude Code writes a response a
|
|
25
|
+
block at a time, each record repeating its usage. The reader dates a response
|
|
26
|
+
by its newest record. A pass between two records files it a minute earlier
|
|
27
|
+
than the next pass does. Buckets merge by max and never move (ADR-0104), so
|
|
28
|
+
each minute kept a full copy. On this machine's transcripts that came to
|
|
29
|
+
about 2.4% of all tokens. One test response reached Fleet three times.
|
|
30
|
+
|
|
31
|
+
## Decision
|
|
32
|
+
|
|
33
|
+
A response is dated by its first turn: the first record of it that makes a
|
|
34
|
+
turn, whose time never moves once written. A record of thinking alone makes no
|
|
35
|
+
turn, so a response still being written with no turn yet waits for one. A
|
|
36
|
+
final response, or one quiet for 10 minutes, is dated by its own time. The
|
|
37
|
+
pass offers a session holding a waiting response again until it is filed.
|
|
38
|
+
Every read dates a finished transcript the same way, so a store rebuilt from it
|
|
39
|
+
sends Fleet the same bucket keys.
|
|
40
|
+
|
|
41
|
+
The store records, per response, the session that first carried it and the
|
|
42
|
+
minute it was dated in (`usage_responses`). `put_usage` files each response
|
|
43
|
+
there, in the same transaction as the bucket merge. A later read files it in
|
|
44
|
+
the same place, at its newest counts. A read of the same response from another
|
|
45
|
+
session adds nothing.
|
|
46
|
+
|
|
47
|
+
A response that no session has filed goes to the session that began first,
|
|
48
|
+
with equal starts going by session id. A branch holds a subset of its
|
|
49
|
+
original's records plus its own later ones, so it never began before the
|
|
50
|
+
original. The machine's own figures use the same rank without a store: the
|
|
51
|
+
cost rules through the ledger, the baseline's history of finished runs, the
|
|
52
|
+
backfill's run names and components, and the monitor (`cost.copies.distinct`).
|
|
53
|
+
|
|
54
|
+
Rows go at 30 days and on a switch to another Fleet, as buckets do.
|
|
55
|
+
|
|
56
|
+
A database a build before this one wrote already has coverage, in
|
|
57
|
+
`usage_buckets`, with nothing in `usage_responses` -- the table is additive
|
|
58
|
+
(ADR-0057) and opens empty. Left alone, a branch read before its original is
|
|
59
|
+
read again under this build would find nothing filed for the responses it
|
|
60
|
+
copied and claim them as new. The first open under this build resets every
|
|
61
|
+
covered kind's coverage once (`db.py`'s `_reclaim_usage_responses`), so the
|
|
62
|
+
next backfill reads that history again and files it properly before any
|
|
63
|
+
branch can; the buckets already merged are kept; the reread only adds to
|
|
64
|
+
them. Guarded by `usage_responses` being empty, so it runs exactly once per
|
|
65
|
+
database, ending for good at the first response the reread files.
|
|
66
|
+
|
|
67
|
+
## Alternatives considered
|
|
68
|
+
|
|
69
|
+
- **Skip records that carry `forkedFrom`, in OpenAIDR.** This is the exact
|
|
70
|
+
signal. It is rejected for now because OpenAIDR does not expose the field,
|
|
71
|
+
and changing that needs an upstream release and a new pin. Collection is not
|
|
72
|
+
ours to parse (ADR-0002). When OpenAIDR exposes it, the rank becomes a
|
|
73
|
+
fallback rather than the rule.
|
|
74
|
+
- **Date a response by its first record.** That time is stable, but OpenAIDR
|
|
75
|
+
exposes only the newest record's. The first turn is the nearest stable time
|
|
76
|
+
it exposes; waiting for it costs a few seconds of upload latency.
|
|
77
|
+
- **Date a response by the minute it was first read.** It is stable on one
|
|
78
|
+
machine, but a store rebuilt from the finished transcript would date it
|
|
79
|
+
differently, and Fleet could not match the resend to what it holds.
|
|
80
|
+
- **Move buckets: send the old minute lowered, or zero.** Fleet applies a
|
|
81
|
+
lower revision as a negative change, so this would work on the wire. It is
|
|
82
|
+
rejected because it gives up the max merge. With the max merge, the backfill
|
|
83
|
+
and the pass commute, and an older read landing late cannot lower a count.
|
|
84
|
+
- **Deduplicate only against the ledger's 36 hours.** That misses a branch of a
|
|
85
|
+
conversation older than the ledger, which is the likely
|
|
86
|
+
`--resume … --fork-session` case. It also re-ranks after every restart.
|
|
87
|
+
|
|
88
|
+
## Consequences
|
|
89
|
+
|
|
90
|
+
- Each response is sent to Fleet once. Branches no longer inflate totals,
|
|
91
|
+
budgets or runs on the machine or in Fleet.
|
|
92
|
+
- A branch's own run no longer includes the conversation it inherited. Its run
|
|
93
|
+
and Live figures show only its own work.
|
|
94
|
+
- The store holds one row per response for 30 days. A heavy machine makes a
|
|
95
|
+
few thousand responses a day.
|
|
96
|
+
- Filing holds one object per response until its transaction ends. The
|
|
97
|
+
backfill files its history a slice of sessions at a time, at least 5,000
|
|
98
|
+
responses each, in rank order, and names runs after the last slice. On a
|
|
99
|
+
measured month of 60,000 responses its peak was 3.2 MiB, below the
|
|
100
|
+
13.5 MiB of filing the month's buckets at once. Nothing stays in memory:
|
|
101
|
+
the filings live in the store, and the daemon keeps only the ids of
|
|
102
|
+
sessions waiting for a response's first turn.
|
|
103
|
+
- A response that straddled a minute and is read again just after upgrading may
|
|
104
|
+
still be counted in its old minute once. That is the stored state before this
|
|
105
|
+
change, not a new error.
|
|
106
|
+
- A store that is lost and rebuilt has no filings. It dates each response the
|
|
107
|
+
same way, so its minute buckets match what Fleet holds. Its rows older than
|
|
108
|
+
seven days roll into hours, which Fleet cannot match to the minutes it
|
|
109
|
+
holds; that resend still counts twice until the upload says which store sent
|
|
110
|
+
a row.
|
|
111
|
+
- A response read before its first turn waits up to 10 minutes. A response
|
|
112
|
+
that never gets a turn is filed late, never lost.
|
|
113
|
+
|
|
114
|
+
## When to revisit
|
|
115
|
+
|
|
116
|
+
When OpenAIDR exposes `forkedFrom`, or the first record's time of a response.
|
|
117
|
+
Also when another agent kind's reader turns out to repeat a response id across
|
|
118
|
+
distinct responses: the key assumes an id is unique within its kind.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: 0129
|
|
3
|
+
title: An unfinished response counts at least the output it shows
|
|
4
|
+
status: proposed
|
|
5
|
+
date: 2026-10-16
|
|
6
|
+
supersedes: null
|
|
7
|
+
superseded-by: null
|
|
8
|
+
amends: 0093
|
|
9
|
+
amended-by: null
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
Claude Code writes a response one content block per record. Each record repeats
|
|
15
|
+
the response's id and usage. Only the last record carries a stop reason, and
|
|
16
|
+
only it states the whole output. The records before it state a small part.
|
|
17
|
+
OpenAIDR marks a response `final` when it read that last record. It calls output
|
|
18
|
+
on any other response a lower bound (its ADR-0014).
|
|
19
|
+
|
|
20
|
+
Sub-agent transcripts mostly never get that last record. ADR-0093 counts what
|
|
21
|
+
the transcripts record, on both sides of every comparison, and accepted that a
|
|
22
|
+
run with many sub-agents counts its output low. Measured on one machine's
|
|
23
|
+
transcripts on 2026-10-16:
|
|
24
|
+
|
|
25
|
+
- 874 sub-agent responses were not final. They recorded 9,907 output tokens.
|
|
26
|
+
- Their text and tool-call arguments came to 177,024 tokens at four characters
|
|
27
|
+
a token, read from the raw files.
|
|
28
|
+
- Read through OpenAIDR they came to 105,802. The reader abridges any tool
|
|
29
|
+
argument over 1,000 characters to its first and last 400 (adr-sensor's
|
|
30
|
+
`truncate_middle`). The same cut applied to the raw files gives 105,802
|
|
31
|
+
exactly, on the same 874 responses.
|
|
32
|
+
- So the recorded output was 9% of what those responses visibly wrote.
|
|
33
|
+
|
|
34
|
+
Output is the kind the monitor's weighted tokens count heaviest, at five times
|
|
35
|
+
fresh input (ADR-0127). Every cost figure on the machine, and every usage
|
|
36
|
+
bucket sent to Fleet, undercounted each run that used sub-agents.
|
|
37
|
+
|
|
38
|
+
## Decision
|
|
39
|
+
|
|
40
|
+
A response that is not final counts the greater of its recorded output and
|
|
41
|
+
what its turns show, at four characters a token.
|
|
42
|
+
|
|
43
|
+
What a response shows is read from the assistant turns that carry its id in its
|
|
44
|
+
own session:
|
|
45
|
+
|
|
46
|
+
- A turn with no tool calls shows its text.
|
|
47
|
+
- A turn that issued tool calls shows each call's arguments as JSON, and not its
|
|
48
|
+
text. The reader stands the placeholder `[Assistant used tools]` in for the
|
|
49
|
+
text of a record that holds only calls, and the model wrote none of it.
|
|
50
|
+
- JSON keeps a character outside ASCII as written, so it counts once.
|
|
51
|
+
|
|
52
|
+
A final response counts as recorded. Every other count of every response is
|
|
53
|
+
unchanged.
|
|
54
|
+
|
|
55
|
+
`cost.output.floored` applies the rule wherever sessions enter cost:
|
|
56
|
+
|
|
57
|
+
- the ledger that the cost rules and the live baseline summaries read
|
|
58
|
+
(`Ledger.update`, once per change);
|
|
59
|
+
- the usage recorder (`UsageRecorder.record`);
|
|
60
|
+
- the usage backfill, on each slice it files;
|
|
61
|
+
- the baseline backfill (`Baseline.backfill`);
|
|
62
|
+
- the monitor's deduplicated view, which its range figures and Live cards read
|
|
63
|
+
(`snapshot_from`).
|
|
64
|
+
|
|
65
|
+
A response's turns are its own session's, so the floor gives the same count
|
|
66
|
+
before or after `cost.copies.distinct`. The floor keeps one integer per
|
|
67
|
+
response and no text. `tests/cost/test_unfinished_output_counts_what_it_shows.py`
|
|
68
|
+
asks every entry point through the real reader, and fails when a new module
|
|
69
|
+
reads sessions cold or removes copies without being asked.
|
|
70
|
+
|
|
71
|
+
A figure built from a response that is not final stays a lower bound, and the
|
|
72
|
+
monitor still writes "at least". The usage recorder still waits up to 10
|
|
73
|
+
minutes for a response with no turn yet (ADR-0128). Such a response shows
|
|
74
|
+
nothing, so it files as recorded.
|
|
75
|
+
|
|
76
|
+
This amends ADR-0093's "Recorded tokens on both sides". Baselines and rules
|
|
77
|
+
count what the transcripts record, except that a response that is not final
|
|
78
|
+
counts at least the output it shows.
|
|
79
|
+
|
|
80
|
+
## Alternatives considered
|
|
81
|
+
|
|
82
|
+
- **Count only final responses.** Rejected: a sub-agent whose responses never
|
|
83
|
+
finish would count no output at all. That is further from the truth than the
|
|
84
|
+
recorded fragment.
|
|
85
|
+
- **Read the sub-agent's totals from the parent's Task tool result.** Rejected:
|
|
86
|
+
Claude Code's result for a sub-agent carries `isAsync`, `status`, `agentId`,
|
|
87
|
+
`description`, `resolvedModel`, `prompt`, `outputFile`, `canReadOutputFile`
|
|
88
|
+
and `canContinueAgent`, and no token count (13 results measured). Reading it
|
|
89
|
+
would also parse an agent format here, which ADR-0002 forbids.
|
|
90
|
+
- **Three characters a token.** Rejected: on 425 final responses, whose output
|
|
91
|
+
is exact, three characters a token came out above the recorded output once,
|
|
92
|
+
at 1.07×. Four came out above it on none. A count above the true output
|
|
93
|
+
would stay in Fleet, because buckets merge by the greater (ADR-0104).
|
|
94
|
+
- **Count the placeholder as text.** Rejected: the reader wrote it. It came to
|
|
95
|
+
23,276 characters on the measured responses, about 5% of the floor.
|
|
96
|
+
- **Floor output in `Tokens.of`, where every reader counts.** Rejected: a
|
|
97
|
+
response alone carries no turns. The floor needs its session.
|
|
98
|
+
- **Floor in the seam, `sessions/access.py`.** Rejected: the seam passes
|
|
99
|
+
OpenAIDR's sessions on as they are. `stacktrace sessions` shows what the
|
|
100
|
+
transcript recorded.
|
|
101
|
+
- **Parse the transcript again for the content blocks.** Rejected by ADR-0002.
|
|
102
|
+
|
|
103
|
+
## Consequences
|
|
104
|
+
|
|
105
|
+
- Sub-agent output counts. On the measured machine the 874 unfinished
|
|
106
|
+
responses count 105,410 output tokens instead of 9,907.
|
|
107
|
+
- The count is still a lower bound. Thinking does not show, and the reader
|
|
108
|
+
abridges long arguments. Through the real reader, on 388 final responses,
|
|
109
|
+
the floor came to a median of 0.25 of the recorded output and at most 0.79.
|
|
110
|
+
- A count above a response's true output would stay in Fleet under the max
|
|
111
|
+
merge. Nothing measured did. A response made of long runs of one repeated
|
|
112
|
+
character could.
|
|
113
|
+
- The floor rises as a response's records land, and its bucket rises with it.
|
|
114
|
+
A final record that arrives later replaces the floor when it is larger, and
|
|
115
|
+
whichever read lands last, the bucket keeps the larger.
|
|
116
|
+
- Stored baseline rows catch up at the next daemon start: the backfill
|
|
117
|
+
summarizes every finished run again and replaces a row whose summary changed.
|
|
118
|
+
- Usage Fleet already holds rises only when a read files that response again.
|
|
119
|
+
A store first opened by ADR-0128's build reads its covered history again
|
|
120
|
+
once (`db.py`'s `_reclaim_usage_responses`). Shipped in one release with this
|
|
121
|
+
change, that read refiles the last 30 days with the floor.
|
|
122
|
+
- The ledger and each backfill slice walk the turns of unfinished responses
|
|
123
|
+
once. On a synthetic month of 60,000 responses, half of them unfinished, the
|
|
124
|
+
backfill's peak went from 3.0 MiB to 3.1 MiB.
|
|
125
|
+
|
|
126
|
+
## When to revisit
|
|
127
|
+
|
|
128
|
+
When Claude Code writes the last record of a sub-agent's responses, or OpenAIDR
|
|
129
|
+
exposes a sub-agent's own totals. Also when another kind's reader marks
|
|
130
|
+
responses not final and its turns can hold text the model did not write.
|