stacktrace-cli 0.15.0__tar.gz → 0.16.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.15.0 → stacktrace_cli-0.16.0}/PKG-INFO +8 -7
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/README.md +6 -5
- stacktrace_cli-0.16.0/docs/adrs/0156-the-client-localizes-fleet-policy-targets.md +67 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/INDEX.md +1 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/agent-support.html +106 -50
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/agent-support.md +86 -56
- stacktrace_cli-0.16.0/docs/releases/v0.16.0.md +46 -0
- stacktrace_cli-0.16.0/docs/specs/cursor-agent-kind.md +378 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/managed-policy-deployment.md +5 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/policy-enforcement.md +77 -4
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/remote-sync.md +6 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/pyproject.toml +4 -3
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/__init__.py +1 -1
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/composition.py +9 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/evidence.py +0 -10
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/cli.py +17 -4
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/config.py +12 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/policy_collect.py +90 -5
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/policy_runtime.py +55 -7
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/runtime.py +6 -1
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/jev-v3/stacktrace-infra-unsafe-action.json +1 -1
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/hooks/claude.py +1 -1
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/policy.py +17 -1
- stacktrace_cli-0.16.0/src/stacktrace/remote/policy_localize.py +211 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/policy_worker.py +14 -1
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/entrypoint.py +8 -6
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/conftest.py +13 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_evidence.py +1 -8
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_cli.py +37 -5
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_codex_policy_collect_contract.py +15 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_config.py +23 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_agent_scopes.py +27 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_collect.py +39 -1
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_collect_contract.py +57 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_hook_transport.py +12 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_reconcile.py +141 -2
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_runtime.py +75 -1
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_runtime.py +16 -1
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_facade_contract.py +21 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_policy.py +45 -0
- stacktrace_cli-0.16.0/tests/remote/test_policy_localize.py +379 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_events.py +1 -1
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_every_derived_site.py +1 -1
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_hooks.py +1 -1
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_agent_support_doc.py +1 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_cli.py +1 -1
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_entrypoint_conventions.py +4 -2
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_kind_conformance.py +33 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_no_agent_kind_is_named.py +4 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_openaidr_contract.py +231 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/uv.lock +6 -6
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.agents/skills/release-stacktrace/SKILL.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.claude/settings.json +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.claude/skills/release-stacktrace/SKILL.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.codex/hooks.json +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.github/managed-autofix.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.github/pull_request_template.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.github/workflows/bedrock-live.yml +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.github/workflows/ci.yml +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.github/workflows/guard-staging.yml +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.github/workflows/publish-pypi.yml +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.gitignore +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/AGENTS.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/CLAUDE.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/SECURITY.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/decision-request.example.json +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/decision-request.schema.json +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/decision-response.example.json +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/decision-response.schema.json +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/example.json +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/schema.json +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0001-session-telemetry-as-input.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0002-session-collection-in-openaidr.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0003-runtime-edges.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0004-three-stage-detector.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0005-detection-family-and-report-assembly.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0006-trust-boundary-and-detection-upload.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0007-proprietary-package-on-open-dependencies.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0008-console-in-separate-demo-package.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0010-detection-severity-and-confidence-ladders.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0011-verdict-cache.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0012-observation-evidence-kinds-and-transport.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0013-rule-catalogue-triage-and-per-rule-context.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0014-declared-project-mapping.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0015-narrow-the-security-catalogue.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0016-stall-grouping-is-session-wide.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0017-a-declined-repeat-is-a-stall.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0018-remote-sync-config-and-facade-consumption.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0019-delegated-commands-are-openaca-objects.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0020-openaca-consumption-boundary.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0021-two-command-kinds.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0022-detection-scope-is-a-catalogue-column.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0023-sync-detect-collects-and-does-not-escalate.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0024-the-upload-carries-observations.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0025-a-denied-call-is-activity-never-an-invocation.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0026-the-console-becomes-a-product-surface.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0027-a-finding-may-name-what-it-could-not-place.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0028-the-console-shows-what-it-placed.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0029-stage-three-returns-to-opt-in.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0030-a-detection-is-dated-by-the-turns-it-cites.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0031-one-host-daemon-observes-native-session-logs.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0032-refresh-daemon-compositions-outside-detection.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0033-a-third-party-analyzer-only-by-a-flag-that-names-it.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0034-the-drift-grade-is-read-off-a-run-not-a-call.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0035-naming-an-analyzer-selects-stored-answers.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0036-deliver-eligible-findings-to-slack-from-the-daemon.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0037-reuse-openaidr-append-cursors-in-the-daemon.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0038-poll-normalized-sessions-for-supplemental-changes.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0039-send-usage-telemetry-by-default-with-an-opt-out.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0041-defer-native-windows-support.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0042-read-the-build-commit-from-the-install-record.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0043-name-the-session-agent-and-host-and-count-errors-by-class.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0044-send-the-build-as-version-prints-it.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0045-scan-every-session-and-outlive-them.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0046-the-finding-store-is-an-append-only-queue.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0047-capture-activity-during-correlation-or-lose-it.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0048-the-daemon-keeps-a-leveled-content-free-activity-log.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0056-stop-a-resident-daemon-by-record-and-signal.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0057-grow-the-queue-schema-additively-and-share-only-the-document.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.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.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0059-the-daemon-does-not-decide-whether-it-should-be-running.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0060-two-upload-postures-not-one-command-with-two-sources.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0061-the-drain-sends-findings-only.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0062-hold-the-transition-lock-across-remote-side-effects.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0063-underbuilt-debt-does-not-hold-the-scan-watermark.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0064-a-redacted-value-has-one-path-span.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0065-asset-external-id-resolves-by-a-ladder.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0066-host-owned-daemon-supervision.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0067-a-webhook-is-an-independent-queue-subscriber.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0068-webhooks-retry-the-retained-backlog.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0069-webhooks-deliver-what-retention-holds.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0070-package-the-cloud-agent-environment-bootstrap.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0071-render-the-allowlisted-payload-per-destination.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0072-host-supervisors-own-daemon-restarts.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0073-name-what-fired-and-which-component.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0074-a-window-selects-findings-by-when-they-happened.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0076-two-phase-detection-pipeline.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0077-the-bom-job-wakes-once-at-startup-staggered.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0078-a-seeded-display-prefix-replaces-the-hostname-label.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0079-the-monitor-page-renders-findings-not-pipeline-health.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0080-enabling-reasoning-does-not-requeue-the-past.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0081-reasoning-activation-returns-to-explicit-opt-in.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0082-monitor-checks-every-installed-component-by-default.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0083-each-block-reason-is-its-own-rule.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0084-a-recursive-deletes-evidence-is-the-rm-that-ran.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0085-show-when-and-which-finding-slack-delivered.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0086-a-refusal-names-who-answered-the-call.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0087-deploy-compiled-policy-with-a-privileged-scheduled-job.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0088-slack-alerts-leave-out-confidence.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0089-infra-gate-reads-commands-not-shell-semantics.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0090-count-completed-commands-locate-by-ip-send-through-the-managed-proxy.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0091-mark-our-own-machines-and-name-what-failed.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0092-cost-is-its-own-rule-family.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0093-environment-cost-baselines-count-tokens-keyed-by-model.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0094-estimate-cost-from-tokens-the-agent-figure-is-a-cross-check.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0095-cost-findings-reach-fleet-each-rule-can-be-muted.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0096-cost-usage-may-leave-as-token-totals-and-work-identifiers.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0097-the-daemon-makes-cost-findings-and-the-monitor-reads-them.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0098-a-run-is-its-main-session.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0099-cost-is-measured-in-tokens-and-relative-increases.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0100-the-monitor-runs-offline-for-the-website.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0101-what-names-a-run-in-fleet.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0102-token-use-is-never-compared-with-a-providers-usage-api.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0103-finished-runs-may-leave-as-numbers-for-org-baselines.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0104-usage-is-its-own-upload.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0105-an-asset-key-is-a-bare-uuid.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0106-boot-id-is-salted-with-the-pid-namespace.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0107-the-daemon-follows-every-kind-openaidr-reads.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0108-a-kind-renamed-before-any-release-read-it-keeps-no-alias.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0109-a-detection-carries-its-runs-title-and-the-persons-name.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0110-every-kinds-account-comes-from-openaidr.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0111-built-in-sub-agents-and-skills-come-from-the-bom.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0112-a-person-is-known-by-the-accounts-on-the-host.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0113-size-triggers-behaviour-explains-session-cost-carries-reasons.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0114-similar-sessions-are-the-same-agent-in-the-same-repo.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0115-usage-states-its-coverage-and-fleet-returns-expected-runs.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0116-a-component-row-carries-what-its-results-cost-under-one-closed-key.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0117-a-component-row-on-the-day-of-a-switch-counts-from-the-switch.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0118-observe-agents-through-adapters-and-a-shared-analyzer.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0119-read-sessions-from-an-ai-gateway-and-block-inline.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0120-own-the-adapter-event-envelope.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.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.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0122-use-stacktrace-as-the-python-package.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0123-the-cloud-boot-hook-brings-the-client-up-to-the-latest-release.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0124-fleet-imports-core-from-the-stacktrace-distribution.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0127-the-monitor-shows-weighted-tokens-beside-raw-tokens.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0128-usage-files-each-response-once-where-it-was-first-filed.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0129-an-unfinished-response-counts-the-output-it-shows.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0130-usage-carries-one-hour-cache-writes-and-each-responses-price-class.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0131-activate-hook-policy-without-a-privileged-runtime.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0132-every-usage-page-names-the-store-that-built-it.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0133-a-clients-own-error-record-is-a-third-block-channel.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0134-a-secret-sent-to-a-server-configured-as-remote-is-egress.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0135-enforce-policy-through-the-daemon-and-agent-hooks.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0136-bound-policy-evidence-collection-as-one-bundle.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0137-a-rule-in-wording-reads-the-same-on-every-surface.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0138-a-credential-in-a-prompt-travels-as-a-mask-and-a-digest.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0139-remediation-finding-contract.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0140-an-untitled-run-names-itself-by-its-first-five-words.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0141-two-remediation-models-one-credential-identity-and-a-letters-only-fragment.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0142-the-cli-has-no-machine-limit.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0143-the-plugin-owns-session-hooks-on-every-host.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0146-eight-rules-send-remediation-targets.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0147-the-webhook-names-the-run-and-the-person-and-an-egress-label-keeps-its-last-four.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0148-credential-egress-notifies-at-medium-confidence-when-it-is-high.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0149-a-credential-switch-replaces-the-mcp-sign-in-rule.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0150-codex-hooks-use-the-shared-policy-runtime.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0151-step-one-puts-the-daemon-beside-the-gateway.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0153-a-gateway-person-reaches-fleet-as-an-account-card.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0155-a-remote-mcp-servers-exact-url-reaches-fleet.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/HOOK-PROMPT.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/TEMPLATE.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/cutover-openaca-remote.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/002-session-input.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/003-correlation.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/004-detector.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/005-remote-sync.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/006-cli-composition.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/007-detection-upload.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/008-monitor.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/009-reasoning-jev.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/010-session-daemon.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/011-daemon-store.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/012-daemon-scanning.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/013-daemon-uploads.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/014-asset-identity.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/015-managed-policy-deployment.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/016-cost-phase-1.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/017-cost-phase-2.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/018-remediation-rules.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/019-credential-switch.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.0.1.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.1.0.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.10.0.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.11.0.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.12.0.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.13.0.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.14.0.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.15.0.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.2.0.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.2.1.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.2.2.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.2.3.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.3.0.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.3.1.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.4.0.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.4.1.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.5.0.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.5.1.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.5.2.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.5.3.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.6.0.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.6.1.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.7.0.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.7.1.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.8.0.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.9.0.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/research/001-intent-drift-metric.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/TEMPLATE.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/agent-observability.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/aidr.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/cli-composition.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/codex-agent-kind.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/codex-hook-policy.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/correlation.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/cost-notifications.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/cost-phase-1.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/cost-phase-2.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/cost.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/daemon-scanning.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/daemon-store.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/daemon-uploads.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/detection-policies.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/detection-upload.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/detector.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/event-time.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/gateway-daemon.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/hook-policy-rollout.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/monitor-inventory.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/monitor.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/notification-delivery.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/plugin-installation.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/production-agent-observability.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/reasoning-jev.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/session-input.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/usage-upload.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/trust.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/examples/observations/custom_agent.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/README.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/bedrock-sandbox/.gitignore +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/bedrock-sandbox/ci.tf +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/bedrock-sandbox/main.tf +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/bedrock-sandbox/outputs.tf +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/bedrock-sandbox/variables.tf +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/.gitignore +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/README.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/check.sh +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/ci.tf +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/connect.sh +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/daemon.sh +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/envoy/Dockerfile +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/envoy/entrypoint.sh +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/envoy/litellm.yaml +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/litellm/Dockerfile +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/litellm/config.subscription.yaml +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/litellm/config.yaml +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/litellm/entrypoint.sh +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/main.tf +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/moved.tf +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/outputs.tf +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/smoke.sh +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/user-key.sh +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/variables.tf +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/modules/express-gateway/main.tf +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/modules/express-gateway/outputs.tf +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/modules/express-gateway/variables.tf +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/e2e/claude.sh +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/e2e/scenarios.sh +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/envoy/envoy.yaml +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/envoy/run.sh +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/README.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/config.example.yaml +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/config.subscription.yaml +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/e2e/config.baseten.yaml +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/e2e/config.mock.yaml +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/e2e/mock_upstream.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/e2e/parity.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/stacktrace_keys.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/stacktrace_litellm.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/scripts/cost_latency.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/scripts/git-hooks/pre-push +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/scripts/install-hooks.sh +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/__main__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/analysis.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/build.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cli.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cloud/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cloud/boot.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cloud/profile.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cloud/setup.sh +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/core/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/core/observations.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/acquire.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/join.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/observed.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/orchestrate.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/project_map.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/record.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/render.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/baseline.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/clock.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/component_usage.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/components.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/copies.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/ledger.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/measures.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/models.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/org_baselines.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/output.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/price_class.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/reasons.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/rules.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/runs.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/tokens.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/totals.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/usage.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/weights.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/accounts.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/activity_log.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/bom.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/client.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/composition.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/costs.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/db.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/fleet.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/gateway.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/gateway_policy.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/identity.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/jobs.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/lifecycle.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/observer.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/paths.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/policy_inputs.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/presentation.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/protocol.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/scan.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/server.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/service.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/store.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/usage.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/webhook.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/analyzer.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/blocked.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/cache.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/deterministic.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/finding.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/history.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/jev.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/personal_data.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/priors.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/jev-v1/stacktrace-deceptive-completion.json +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/jev-v2/stacktrace-deceptive-completion.json +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/jev-v2/stacktrace-infra-unsafe-action.json +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/jev-v3/stacktrace-deceptive-completion.json +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/v1/exclusions.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/v1/framing.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/v1/stacktrace-deceptive-completion.md +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/reasoning.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/render.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/rules.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/run.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/secrets.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/verdict.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/windows.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/finding_contract.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/finding_titles.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/analyzer.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/check.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/cli.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/exchange.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/_json.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/anthropic.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/bedrock.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/body.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/openai_chat.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/openai_responses.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/principal.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/service.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/session.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/sink.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/hooks/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/hooks/codex.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/hooks/session.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/costs.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/inventory.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/offline.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/reasoning.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/render.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/server.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/app.js +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/apple-icon.png +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/cost.js +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/favicon.ico +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/fonts/OFL.txt +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/fonts/dm-mono-400-latin.woff2 +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/fonts/dm-mono-500-latin.woff2 +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/fonts/dm-sans-latin.woff2 +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/fonts/playfair-display-600-italic-latin.woff2 +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/icon.svg +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/index.html +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/inventory.js +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/styles.css +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/state.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/verdicts.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/watch.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/options.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/policy_display.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/private_state.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/py.typed +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/cli.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/client.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/config.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/detect_payload.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/hook_policy.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/identity.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/payload.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/policy_service.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/policy_show.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/redact.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/spool.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/sync.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/sync_detect.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/upload_contract.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sdk.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/access.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/index.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/lineage.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/outcome.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/protocols.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/render.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/telemetry/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/telemetry/cli.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/telemetry/events.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/telemetry/posthog.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/telemetry/state.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/webhook/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/webhook/cli.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/webhook/config.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/agent_bom_fixture.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/fakes.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/scenarios.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_as_of_cuts_every_timed_collection.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_baseline.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_clock.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_component_usage.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_components.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_copies.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_cost_evidence_travels.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_cost_findings_are_dated_by_their_citations.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_cost_findings_carry_no_session_text.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_cost_is_tokens.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_cost_latency.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_ledger.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_measures.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_models.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_org_baselines.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_output.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_price_class.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_reasons.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_rules_baseline.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_runs.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_totals.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_unfinished_output_counts_what_it_shows.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_usage.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_weights.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/observing.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_accounts.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_activity_log.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_claude_policy_conformance.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_claude_policy_hook.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_client.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_codex_policy_conformance.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_codex_policy_hook.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_composition.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_cost_guidance.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_costs.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_db.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_detection_needs_no_subscriber.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_fleet.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_gateway.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_gateway_fleet.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_gateway_person.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_gateway_policy.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_identity.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_job_thread.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_jobs.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_lifecycle.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_observer.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_decide.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_inputs.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_socket.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_queue_reader.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_scan.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_service.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_session_cost_notices.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_socket.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_stage_times.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_store.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_subagent_routing.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_the_drained_payload_is_the_cold_one.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_the_stored_row_is_sufficient.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_usage.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_usage_store.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_webhook.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_wire_frames_are_bounded.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/detector_session_fixture.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/fixtures/claude-code-2.1.296-suite/gateway-last-turn.json +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/fixtures/claude-code-2.1.296-suite/projects/run/b23c3bab-a677-4b5f-ac36-e132c7df29e5.jsonl +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_analyzer.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_bodies_and_logs.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_call_records.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_check.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_envoy_principal.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_every_choice_is_read.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_every_read_field_is_validated.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_every_shortfall_is_a_recorded_fallback.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_gateway_keys.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_gateway_scripts.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_litellm_stream.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_litellm_subscription_config.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_litellm_through_daemon.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_parity_live_capture.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_principal.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_service.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_session.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_unstated_outcomes.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/cost_harness.mjs +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/feed_harness.mjs +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/inventory_harness.mjs +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_cost_page.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_cost_range_switch.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_feed_model.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_inventory.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_inventory_page.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_offline.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_reasoning_gates.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_render.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_render_cost.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_server.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_site_assets.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_state.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_verdicts.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_watch.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/observations/test_contract.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/observations/test_decisions.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/observations/test_event_envelope.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/helpers.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_cli.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_client.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_cloud_boot_updates_the_client.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_cloud_session.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_cloud_setup_asset_id.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_config.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_activity.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_cli.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_client.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_contract_is_exhaustive.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_gate_matches_the_cloud.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_layers_compose.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_payload_reaches_the_cloud_model.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_redaction.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_spool.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_upload_contract.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_wire_payload.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_exact_remote_mcp_url.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_hook_policy.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_identity.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_no_local_path_survives_redaction.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_payload.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_policy_service.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_policy_service_cli.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_policy_show.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_redact_payload.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_seam.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_session_registration.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_spool.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_sync.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_sync_detect.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_upload_contract.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_usage_client.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_usage_contract.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_user_install_profile.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/sdk/test_observation_client.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/__init__.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_activity_log.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_cli.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_every_internal_save_is_reported.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_release_gate.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_state.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_uploader.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_acquire.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_adr_cross_references_are_reciprocal.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_agent_instance_id.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_analysis.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_bom_shape.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_build_commit.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_call_status_conventions.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_composition.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_correlate_orchestrate.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_correlate_render.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_correlated_session.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detection_components.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detection_event_time.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detection_subject.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_analyzer_contract.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_analyzer_live.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_blocked.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_cache.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_client_errors.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_credential_in_prompt.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_credential_switched.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_declared_egress.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_deterministic.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_end_to_end.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_finding.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_history.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_infra_reasoning.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_jev.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_names_the_service.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_new_deterministic.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_personal_data.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_pii_in_prompt.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_priors.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_prompts.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_reasoning.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_render.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_run.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_secrets.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_verdict.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_vulnerable_dep_invoked.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_why_it_stopped.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_windows.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_evidence_is_dated_not_numbered.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_finding_contract.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_fingerprint_covers_what_the_analyzer_reads.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_help_sections.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_join.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_monitor_cli.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_no_live_document_states_the_old_stage_three_default.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_no_test_undoes_every_patch_at_once.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_observed.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_one_wording_per_rule.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_openaca_contract.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_option_arity_matches_the_binary.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_project_map.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_python_namespace.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_readme_examples_are_real_output.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_release_gate_coverage.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_release_readiness.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_rules_send_remediation_targets.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_seam_boundary.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_session_identity_is_the_pair.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_sessions_access.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_sessions_end_to_end.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_sessions_protocol_typing.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_sessions_protocols.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_sessions_render.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_shell_separators_match_the_shell.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_signed_in_asks_the_agent.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_stored_verdicts_are_never_gated_on_reasoning.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_the_detector_spec_lists_the_shipped_catalogue.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_the_jev_spec_states_the_shipped_thresholds.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_the_locality_claim_is_qualified_everywhere.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_title_disclosure_invariant.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_untrusted_content_never_travels.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_verification_subcommands_match_the_binary.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_what_jev_is_told_is_what_was_disclosed.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/tool_fields.py +0 -0
- {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/webhook/test_cli.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: stacktrace-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.16.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.12.0
|
|
24
|
-
Requires-Dist: openaidr==0.
|
|
24
|
+
Requires-Dist: openaidr==0.8.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.16.0
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
## Python package namespace
|
|
@@ -251,13 +251,14 @@ enables telemetry again under a new identity (ADR-0039, ADR-0090).
|
|
|
251
251
|
|
|
252
252
|
Beta, and under active development.
|
|
253
253
|
|
|
254
|
-
`sessions`, `detect` and `monitor` work end to end today, for Claude Code
|
|
255
|
-
Devin
|
|
254
|
+
`sessions`, `detect` and `monitor` work end to end today, for Claude Code,
|
|
255
|
+
Devin (Devin CLI and Devin Desktop's local agent), Codex and Cursor (the Cursor
|
|
256
|
+
CLI) sessions. Session collection is
|
|
256
257
|
[OpenAIDR](https://github.com/open-agent-security/openaidr)'s, and further agent
|
|
257
258
|
kinds arrive with it. The daemon observes every kind it reads, sub-agents included.
|
|
258
259
|
[Agent support](docs/agent-support.md) lists what works for each agent, rule by
|
|
259
|
-
rule, and what cannot.
|
|
260
|
-
([spec](docs/specs/
|
|
260
|
+
rule, and what cannot. Cursor arrives with OpenAIDR 0.8.0
|
|
261
|
+
([spec](docs/specs/cursor-agent-kind.md)).
|
|
261
262
|
|
|
262
263
|
## Built on
|
|
263
264
|
|
|
@@ -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.16.0
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
## Python package namespace
|
|
@@ -223,13 +223,14 @@ enables telemetry again under a new identity (ADR-0039, ADR-0090).
|
|
|
223
223
|
|
|
224
224
|
Beta, and under active development.
|
|
225
225
|
|
|
226
|
-
`sessions`, `detect` and `monitor` work end to end today, for Claude Code
|
|
227
|
-
Devin
|
|
226
|
+
`sessions`, `detect` and `monitor` work end to end today, for Claude Code,
|
|
227
|
+
Devin (Devin CLI and Devin Desktop's local agent), Codex and Cursor (the Cursor
|
|
228
|
+
CLI) sessions. Session collection is
|
|
228
229
|
[OpenAIDR](https://github.com/open-agent-security/openaidr)'s, and further agent
|
|
229
230
|
kinds arrive with it. The daemon observes every kind it reads, sub-agents included.
|
|
230
231
|
[Agent support](docs/agent-support.md) lists what works for each agent, rule by
|
|
231
|
-
rule, and what cannot.
|
|
232
|
-
([spec](docs/specs/
|
|
232
|
+
rule, and what cannot. Cursor arrives with OpenAIDR 0.8.0
|
|
233
|
+
([spec](docs/specs/cursor-agent-kind.md)).
|
|
233
234
|
|
|
234
235
|
## Built on
|
|
235
236
|
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: 0156
|
|
3
|
+
title: The client localizes Fleet's policy targets before it evaluates or compiles them
|
|
4
|
+
status: accepted
|
|
5
|
+
date: 2026-10-21
|
|
6
|
+
supersedes: null
|
|
7
|
+
superseded-by: null
|
|
8
|
+
amends: null
|
|
9
|
+
amended-by: null
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
Fleet's catalog (Fleet ADR-0102 and ADR-0104) writes an exact policy target
|
|
15
|
+
for each MCP server that an administrator approves or blocks. Fleet derives
|
|
16
|
+
the target from the uploaded Agent BOM. The upload is redacted: a launch
|
|
17
|
+
command loses its flags, such as `-y`. So Fleet writes
|
|
18
|
+
`{"command": ["npx", "@acme/jira-mcp@1.4.2"]}`. On the machine, OpenACA's
|
|
19
|
+
matcher compares exact targets with `npx -y @acme/jira-mcp@1.4.2`, and
|
|
20
|
+
matches nothing. A simulation with the real client and Fleet showed that a
|
|
21
|
+
decision made in Fleet did not block the server on the machine.
|
|
22
|
+
|
|
23
|
+
A URL is uploaded whole only when it normalizes to the server's identity
|
|
24
|
+
(ADR-0155). Any other URL is uploaded as `scheme://host`. Fleet writes a URL
|
|
25
|
+
target only when the uploaded URL has a path (Fleet ADR-0101). An
|
|
26
|
+
administrator can still type a host-only URL target.
|
|
27
|
+
|
|
28
|
+
## Decision
|
|
29
|
+
|
|
30
|
+
Before the client evaluates or compiles a fetched policy, it localizes the
|
|
31
|
+
`admission.mcps` lists against the local components. For each local MCP
|
|
32
|
+
server, the client computes the upload form with the same functions that
|
|
33
|
+
prepare the upload. When a list target equals that upload form, the client
|
|
34
|
+
adds the server's exact local target to the same list. The hook path, the
|
|
35
|
+
`remote policy compile` command and the privileged apply worker all localize.
|
|
36
|
+
No new data goes up. Plugins need no step: their `name@marketplace` is not
|
|
37
|
+
redacted.
|
|
38
|
+
|
|
39
|
+
## Alternatives considered
|
|
40
|
+
|
|
41
|
+
- **Upload the exact launch command, so Fleet can write exact targets**:
|
|
42
|
+
rejected because flags can carry user paths, tenant names and secrets. An
|
|
43
|
+
exact URL is uploaded only because the identity already states its path
|
|
44
|
+
(ADR-0155). A command has no such identity.
|
|
45
|
+
- **Change OpenACA's matcher to compare redacted forms**: rejected because
|
|
46
|
+
the matcher is a shared library whose exact semantics other callers
|
|
47
|
+
depend on, and a client step fixes the defect without a new OpenACA
|
|
48
|
+
release.
|
|
49
|
+
- **Have Fleet guess the exact form, for example add `-y`**: rejected
|
|
50
|
+
because flags vary, and a guess matches only some machines.
|
|
51
|
+
|
|
52
|
+
## Consequences
|
|
53
|
+
|
|
54
|
+
- A Fleet decision on a launch command now acts on the machine, in the hooks
|
|
55
|
+
and in Claude's managed settings.
|
|
56
|
+
- A decision on an upload form covers every local variant with the same
|
|
57
|
+
upload form. An approval covers each flag variant of the same command.
|
|
58
|
+
- An exact URL target already equals the local target, so the join adds
|
|
59
|
+
nothing for it. A host-only URL target joins each local server whose
|
|
60
|
+
upload shows only that host: a URL with userinfo, a query or a fragment.
|
|
61
|
+
- The localization must use the upload's own functions. A change to the
|
|
62
|
+
redaction must keep the two in step; the tests drive both.
|
|
63
|
+
|
|
64
|
+
## When to revisit
|
|
65
|
+
|
|
66
|
+
Revisit when Fleet can carry an exact, privacy-safe command target, for
|
|
67
|
+
example a hash that the OpenACA policy language can match.
|
|
@@ -187,3 +187,4 @@ supersedes anything yet.
|
|
|
187
187
|
- [0151](0151-step-one-puts-the-daemon-beside-the-gateway.md) — **Step one puts the daemon beside the gateway, names the person, and enforces Fleet policy there; Core is step two** (proposed). With `STACKTRACE_GATEWAY_LISTEN` set, the enrolled daemon on the gateway host serves ADR-0119's `/v1/evaluate` on loopback, runs `BLOCKING_RULES` and Fleet policy (MCP servers, skills, plugin agents, matched by name through the hooks' shared decision function), and uploads findings and verdicts with `actor` and `action`. The `principal` comes only from the gateway's own auth. The hook protocol (ADR-0135) is unchanged. The contract is the seam to Core: adapters move by URL. Amends ADR-0118 decision 2 and ADR-0119 for step one. Rejected: a guard service feeding Core, Core first, the hook socket as is, a header-named person, laptop-only policy, stripping tools, Envoy `ext_authz`. Read before routing a gateway to the daemon or to Core, or enforcing policy at a gateway.
|
|
188
188
|
- [0153](0153-a-gateway-person-reaches-fleet-as-an-account-card.md) — **A gateway person reaches Fleet as an account and its card** (proposed). A gateway finding's `session.account` is a digest of the verified principal, and the payload carries an `accounts[]` card for it. An email principal keeps ADR-0112's email digest, so its person key matches a laptop run under that email; any other principal gets a card with no key and no name. `actor` stays local. Amends ADR-0112. Rejected: an `actor` field, the client's `metadata.user_id`, the principal as the account, no person. Read before changing how a gateway names its person in Fleet.
|
|
189
189
|
- [0155](0155-a-remote-mcp-servers-exact-url-reaches-fleet.md) — **A remote MCP server's exact URL reaches Fleet** (proposed). The redaction pass keeps `openaca:url` and `openaca:install_source` whole on an `mcp_server` when the URL normalizes to the component's own `mcp-remote` identity, so it has no userinfo, query or fragment; the upload contract admits the same values. Every other URL is still reduced to `scheme://host`. Pairs with Fleet ADR-0101; release after that Fleet deploys. Rejected: building the URL from the identity, a URL hash, keeping every path, stripping only the query. Read before changing how a URL is redacted for upload.
|
|
190
|
+
- [0156: The client localizes Fleet's policy targets before it evaluates or compiles them](0156-the-client-localizes-fleet-policy-targets.md). Fleet writes upload-form targets, such as a launch command without its flags; the client adds each matching local server's exact target. An exact URL target (ADR-0155) adds nothing. Rejected: uploading exact commands, changing OpenACA's matcher, guessing flags in Fleet.
|
|
@@ -77,7 +77,8 @@ h1 em { font-family: var(--serif); font-style: italic; font-weight: 600; color:
|
|
|
77
77
|
font: 500 11px/1 var(--mono); color: var(--ink-muted); background: var(--surface);
|
|
78
78
|
border: 1px solid var(--line); border-radius: 999px; padding: 6px 10px;
|
|
79
79
|
}
|
|
80
|
-
.cards { display: grid; grid-template-columns: repeat(
|
|
80
|
+
.cards { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px; }
|
|
81
|
+
@media (max-width: 1000px) { .cards { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
|
|
81
82
|
@media (max-width: 820px) { .cards { grid-template-columns: 1fr; } }
|
|
82
83
|
.card {
|
|
83
84
|
background: var(--surface); border: 1px solid var(--line); border-radius: 10px;
|
|
@@ -171,13 +172,14 @@ tr.group td {
|
|
|
171
172
|
<header>
|
|
172
173
|
<p class="eyebrow">Stacktrace · runtime detection</p>
|
|
173
174
|
<h1>Agent support, <em>by rule and by feature</em></h1>
|
|
174
|
-
<p class="lede">What Stacktrace detects and measures for Claude Code, Devin and
|
|
175
|
+
<p class="lede">What Stacktrace detects and measures for Claude Code, Devin, Codex and Cursor today, and what cannot be supported for each agent and why. Cursor is read by OpenAIDR 0.8.0's Cursor reader.</p>
|
|
175
176
|
<div class="versions">
|
|
176
|
-
<span class="chip">stacktrace 0.
|
|
177
|
-
<span class="chip">OpenAIDR 0.
|
|
178
|
-
<span class="chip">OpenACA 0.
|
|
177
|
+
<span class="chip">stacktrace 0.15.0</span>
|
|
178
|
+
<span class="chip">OpenAIDR 0.8.0</span>
|
|
179
|
+
<span class="chip">OpenACA 0.12.0</span>
|
|
179
180
|
<span class="chip">Codex CLI 0.163.0 probed</span>
|
|
180
|
-
<span class="chip">
|
|
181
|
+
<span class="chip">Cursor CLI 2026.10.19 probed</span>
|
|
182
|
+
<span class="chip">Updated 2026-10-21</span>
|
|
181
183
|
</div>
|
|
182
184
|
</header>
|
|
183
185
|
|
|
@@ -196,7 +198,7 @@ tr.group td {
|
|
|
196
198
|
<label class="toggle"><input type="checkbox" id="diff-only"> Only rules where agents differ</label>
|
|
197
199
|
</div>
|
|
198
200
|
<div class="scroll"><table id="detections"></table></div>
|
|
199
|
-
<p class="footnote">† waits on a field not yet confirmed in a real session. <code>cost-personal-anomaly</code> runs in Fleet on uploaded usage, so it works wherever the usage upload does. Codex grades are the built code's, verified end to end over synthetic Codex homes.</p>
|
|
201
|
+
<p class="footnote">† waits on a field not yet confirmed in a real session. <code>cost-personal-anomaly</code> runs in Fleet on uploaded usage, so it works wherever the usage upload does. Codex grades are the built code's, verified end to end over synthetic Codex homes. Cursor grades come from the stacktrace-demo policy suite, run through the real Cursor CLI and a stand-in model: 13 of 17 cases passed. Both rm -rf cases were refused by Cursor's Delete protection, which that build always turns on.</p>
|
|
200
202
|
</div>
|
|
201
203
|
|
|
202
204
|
<div class="panel" role="tabpanel" id="panel-features" aria-labelledby="tab-features" hidden>
|
|
@@ -209,7 +211,7 @@ tr.group td {
|
|
|
209
211
|
</div>
|
|
210
212
|
</section>
|
|
211
213
|
|
|
212
|
-
<p class="footnote">Source of truth: <code>docs/agent-support.md</code> in stacktrace-ai/stacktrace. The Codex evidence is Codex CLI 0.163.0 run against a mock model and its source at <code>rust-v0.163.0</code>, and a live run on <code>gpt-6.1-sol</code> against a local Fleet. The
|
|
214
|
+
<p class="footnote">Source of truth: <code>docs/agent-support.md</code> in stacktrace-ai/stacktrace. The Codex evidence is Codex CLI 0.163.0 run against a mock model and its source at <code>rust-v0.163.0</code>, and a live run on <code>gpt-6.1-sol</code> against a local Fleet. The Cursor evidence is the Cursor CLI <code>2026.10.19-6bbf2c4</code> run against a mock model and a stand-in model, and its shipped bundle. The reader designs are <code>docs/specs/codex.md</code> and <code>docs/specs/cursor.md</code> in open-agent-security/openaidr.</p>
|
|
213
215
|
</div>
|
|
214
216
|
|
|
215
217
|
<script>
|
|
@@ -224,7 +226,10 @@ tr.group td {
|
|
|
224
226
|
notCovered: "Devin Cloud (remote), Cascade (encrypted store)" },
|
|
225
227
|
{ key: "codex", name: "Codex", kind: "codex", status: "Supported", shipped: true,
|
|
226
228
|
covers: "Codex CLI, codex exec, the IDE extension and Codex app through app-server",
|
|
227
|
-
notCovered: "Codex Cloud (remote)" }
|
|
229
|
+
notCovered: "Codex Cloud (remote)" },
|
|
230
|
+
{ key: "cursor", name: "Cursor", kind: "cursor", status: "Next release", shipped: true,
|
|
231
|
+
covers: "Cursor CLI (agent, cursor-agent) in the terminal, in print mode and over ACP",
|
|
232
|
+
notCovered: "The desktop app's own chats (not read yet), Cloud agents (remote)" }
|
|
228
233
|
];
|
|
229
234
|
|
|
230
235
|
// grade: full | partial | none | notshipped ; d: dagger ; n: note
|
|
@@ -232,80 +237,120 @@ tr.group td {
|
|
|
232
237
|
{ family: "Security" },
|
|
233
238
|
{ id: "credential-egress", what: "A secret in an outbound call's arguments", stage: "det",
|
|
234
239
|
claude: { g: "full" }, devin: { g: "full", d: 1 },
|
|
235
|
-
codex: { g: "full", n: "Shell script and remote MCP calls. With no recorded transport, the configured one decides, at medium confidence." }
|
|
240
|
+
codex: { g: "full", n: "Shell script and remote MCP calls. With no recorded transport, the configured one decides, at medium confidence." },
|
|
241
|
+
cursor: { g: "full", n: "Shell and remote MCP calls. A remote server's call is read from its configuration, at medium confidence." } },
|
|
236
242
|
{ id: "credential-persisted", what: "A secret written to a file by the agent", stage: "det",
|
|
237
243
|
claude: { g: "full" }, devin: { g: "partial", n: "apply_patch is not read." },
|
|
238
|
-
codex: { g: "full", n: "apply_patch through the canonical edits key, one file at a time." }
|
|
244
|
+
codex: { g: "full", n: "apply_patch through the canonical edits key, one file at a time." },
|
|
245
|
+
cursor: { g: "full", n: "Write, StrReplace and ApplyPatch." } },
|
|
239
246
|
{ id: "credential-in-prompt", what: "A secret sent to the model in a prompt", stage: "det",
|
|
240
|
-
claude: { g: "full" }, devin: { g: "full", d: 1 }, codex: { g: "full" }
|
|
247
|
+
claude: { g: "full" }, devin: { g: "full", d: 1 }, codex: { g: "full" },
|
|
248
|
+
cursor: { g: "full" } },
|
|
241
249
|
{ id: "pii-in-prompt", what: "Personal data sent to the model in a prompt", stage: "det",
|
|
242
|
-
claude: { g: "full" }, devin: { g: "full", d: 1 }, codex: { g: "full" }
|
|
250
|
+
claude: { g: "full" }, devin: { g: "full", d: 1 }, codex: { g: "full" },
|
|
251
|
+
cursor: { g: "full" } },
|
|
243
252
|
{ id: "destructive-action", what: "A recursive delete that escaped the workspace", stage: "det",
|
|
244
253
|
claude: { g: "full" }, devin: { g: "full", d: 1 },
|
|
245
|
-
codex: { g: "full", n: "Exit code and per-call directory are recorded." }
|
|
254
|
+
codex: { g: "full", n: "Exit code and per-call directory are recorded." },
|
|
255
|
+
cursor: { g: "full", n: "A refused call never fires. Cursor's Delete protection, a team setting, refuses every rm." } },
|
|
246
256
|
{ id: "deceptive-completion", what: "Claimed done while its own check said otherwise", stage: "reasoning",
|
|
247
|
-
claude: { g: "full" }, devin: { g: "full", d: 1 }, codex: { g: "full" }
|
|
257
|
+
claude: { g: "full" }, devin: { g: "full", d: 1 }, codex: { g: "full" },
|
|
258
|
+
cursor: { g: "full" } },
|
|
248
259
|
{ id: "infra-unsafe-action", what: "An unrequested change to deployed infrastructure", stage: "det + reasoning",
|
|
249
260
|
claude: { g: "full" }, devin: { g: "partial", n: "No entrypoint when the run log is not placed." },
|
|
250
|
-
codex: { g: "full", n: "cli and vscode read as interactive, exec and mcp as programmatic, in cost and in Jev's question." }
|
|
261
|
+
codex: { g: "full", n: "cli and vscode read as interactive, exec and mcp as programmatic, in cost and in Jev's question." },
|
|
262
|
+
cursor: { g: "full", n: "interactive and acp read as interactive, headless as programmatic." } },
|
|
251
263
|
{ id: "vulnerable-dep-invoked", what: "Used a component with a known vulnerability", stage: "det",
|
|
252
264
|
claude: { g: "full" }, devin: { g: "full" },
|
|
253
|
-
codex: { g: "partial", n: "MCP servers and sub-agents resolve. Skills are read with the shell, so they are never a call." }
|
|
265
|
+
codex: { g: "partial", n: "MCP servers and sub-agents resolve. Skills are read with the shell, so they are never a call." },
|
|
266
|
+
cursor: { g: "partial", n: "MCP servers and sub-agents resolve. Skills are read with a file tool, so they are never a call." } },
|
|
254
267
|
{ id: "credential-switched", what: "Got past a refusal with a credential nobody gave it", stage: "det",
|
|
255
|
-
claude: { g: "full" }, devin: { g: "partial", n: "apply_patch writes are not read." }, codex: { g: "full" }
|
|
268
|
+
claude: { g: "full" }, devin: { g: "partial", n: "apply_patch writes are not read." }, codex: { g: "full" },
|
|
269
|
+
cursor: { g: "full" } },
|
|
256
270
|
{ family: "Reliability" },
|
|
257
271
|
{ id: "blocked-quota", what: "The account's limit stopped model calls", stage: "det",
|
|
258
272
|
claude: { g: "full" }, devin: { g: "none", n: "Devin's quota wording is not read." },
|
|
259
|
-
codex: { g: "full", n: "Read from Codex's own error record: usage limit, quota, credits, spend cap." }
|
|
273
|
+
codex: { g: "full", n: "Read from Codex's own error record: usage limit, quota, credits, spend cap." },
|
|
274
|
+
cursor: { g: "none", d: 1, n: "Cursor's own usage-limit wording is not read." } },
|
|
260
275
|
{ id: "blocked-policy", what: "A safety check refused the action", stage: "det",
|
|
261
276
|
claude: { g: "full" }, devin: { g: "none", n: "No counterpart." },
|
|
262
|
-
codex: { g: "partial", d: 1, n: "The Guardian reviewer stops a turn, not the session. Its finding has its own title." }
|
|
277
|
+
codex: { g: "partial", d: 1, n: "The Guardian reviewer stops a turn, not the session. Its finding has its own title." },
|
|
278
|
+
cursor: { g: "none", d: 1, n: "No counterpart confirmed." } },
|
|
263
279
|
{ id: "blocked-throttled", what: "The provider throttled the requests", stage: "det",
|
|
264
280
|
claude: { g: "full" }, devin: { g: "partial", n: "Failed-call bodies only." },
|
|
265
|
-
codex: { g: "full", d: 1, n: "rate_limit_exceeded and server_overloaded error turns." }
|
|
281
|
+
codex: { g: "full", d: 1, n: "rate_limit_exceeded and server_overloaded error turns." },
|
|
282
|
+
cursor: { g: "partial", n: "Failed-call bodies only." } },
|
|
266
283
|
{ id: "blocked-upstream", what: "A service refused the request", stage: "det",
|
|
267
|
-
claude: { g: "full" }, devin: { g: "full", d: 1 }, codex: { g: "full" }
|
|
284
|
+
claude: { g: "full" }, devin: { g: "full", d: 1 }, codex: { g: "full" },
|
|
285
|
+
cursor: { g: "full" } },
|
|
268
286
|
{ family: "Cost" },
|
|
269
287
|
{ id: "cost-runaway-session", what: "A session used far more tokens than similar ones", stage: "det",
|
|
270
288
|
claude: { g: "full" }, devin: { g: "partial", n: "No cache writes on some providers; no context windows." },
|
|
271
|
-
codex: { g: "partial", n: "Fires. No re-write, hook, fast-mode or refetch reasons." }
|
|
289
|
+
codex: { g: "partial", n: "Fires. No re-write, hook, fast-mode or refetch reasons." },
|
|
290
|
+
cursor: { g: "partial", n: "Fires while the debug log is kept. No usage from the terminal UI. No thinking, fast-mode or hook-cause reasons." } }
|
|
272
291
|
];
|
|
273
292
|
|
|
274
293
|
// v: yes | partial | no | planned | plannedpartial | out | notplanned
|
|
275
294
|
var FEATURES = [
|
|
276
295
|
{ group: "Sessions and detection" },
|
|
277
|
-
{ f: "Sessions read (stacktrace sessions, detect)", claude: ["yes"], devin: ["yes"], codex: ["yes"]
|
|
278
|
-
|
|
279
|
-
{ f: "
|
|
280
|
-
|
|
281
|
-
{ f: "
|
|
282
|
-
|
|
283
|
-
{ f: "
|
|
296
|
+
{ f: "Sessions read (stacktrace sessions, detect)", claude: ["yes"], devin: ["yes"], codex: ["yes"],
|
|
297
|
+
cursor: ["yes", "The CLI only."] },
|
|
298
|
+
{ f: "Daemon follows live sessions", claude: ["yes"], devin: ["yes"], codex: ["yes"],
|
|
299
|
+
cursor: ["yes"] },
|
|
300
|
+
{ f: "Sub-agent sessions in a run", claude: ["yes"], devin: ["yes", "Unconfirmed in a signed-in session."], codex: ["yes"],
|
|
301
|
+
cursor: ["yes"] },
|
|
302
|
+
{ f: "MCP connection evidence", claude: ["yes"], devin: ["partial", "No advertised name or version."], codex: ["partial", "None under codex exec; no endpoint."],
|
|
303
|
+
cursor: ["partial", "Failed connections only."] },
|
|
304
|
+
{ f: "Reasoning stage (opt-in)", claude: ["yes"], devin: ["yes"], codex: ["yes"],
|
|
305
|
+
cursor: ["yes"] },
|
|
306
|
+
{ f: "Findings to Slack and webhooks", claude: ["yes"], devin: ["yes"], codex: ["yes"],
|
|
307
|
+
cursor: ["yes"] },
|
|
308
|
+
{ f: "Findings to Fleet", claude: ["yes"], devin: ["yes"], codex: ["yes", "Not yet run against a live Fleet."],
|
|
309
|
+
cursor: ["yes", "Run against a local Fleet."] },
|
|
284
310
|
{ group: "Cost" },
|
|
285
|
-
{ f: "Tokens per model response", claude: ["yes"], devin: ["yes"], codex: ["yes", "Cached input separated from fresh input."]
|
|
286
|
-
|
|
287
|
-
{ f: "
|
|
288
|
-
|
|
289
|
-
{ f: "
|
|
290
|
-
|
|
291
|
-
{ f: "
|
|
311
|
+
{ f: "Tokens per model response", claude: ["yes"], devin: ["yes"], codex: ["yes", "Cached input separated from fresh input."],
|
|
312
|
+
cursor: ["partial", "Per turn in print mode, none in the terminal UI, per response in the local-inference build. From Cursor's debug log while it is kept."] },
|
|
313
|
+
{ f: "Cache writes", claude: ["yes"], devin: ["partial", "Provider-dependent."], codex: ["no", "OpenAI reports none."],
|
|
314
|
+
cursor: ["yes"] },
|
|
315
|
+
{ f: "Reasoning tokens", claude: ["yes"], devin: ["no"], codex: ["yes"],
|
|
316
|
+
cursor: ["no"] },
|
|
317
|
+
{ f: "Context window per response", claude: ["yes", "From a model table."], devin: ["partial", "Known for Claude models only."], codex: ["yes", "Recorded by Codex."],
|
|
318
|
+
cursor: ["partial", "Recorded when Cursor states it, else a model table."] },
|
|
319
|
+
{ f: "Cost findings", claude: ["yes"], devin: ["partial"], codex: ["partial"],
|
|
320
|
+
cursor: ["partial"] },
|
|
321
|
+
{ f: "Usage to Fleet and org baselines", claude: ["yes"], devin: ["yes"], codex: ["yes"],
|
|
322
|
+
cursor: ["yes", "Run against a local Fleet."] },
|
|
323
|
+
{ f: "Fleet price rows", claude: ["yes"], devin: ["partial", "Estimated: no per-token price published."], codex: ["partial", "gpt-5 to gpt-5.6 priced; gpt-6 and later unpriced until stacktrace-fleet adds their rows. Codex 0.163.0 defaults to gpt-6.1-sol."],
|
|
324
|
+
cursor: ["partial", "Fleet's agents.cursor rule adds Cursor's fee to claude-* and gpt-* rows; Cursor's own models are unpriced."] },
|
|
292
325
|
{ group: "Who" },
|
|
293
|
-
{ f: "Signed-in account and person", claude: ["yes"], devin: ["yes", "Through devin auth status."], codex: ["yes", "ChatGPT sign-in. An API key names no one."]
|
|
326
|
+
{ f: "Signed-in account and person", claude: ["yes"], devin: ["yes", "Through devin auth status."], codex: ["yes", "ChatGPT sign-in. An API key names no one."],
|
|
327
|
+
cursor: ["partial", "From cli-config.json, with no plan. A finding from a session with no usage names no one."] },
|
|
294
328
|
{ group: "Composition" },
|
|
295
|
-
{ f: "BOM, Inventory and Vulnerabilities tabs", claude: ["yes"], devin: ["yes"], codex: ["yes", "OpenACA 0.10.1 already composes Codex."]
|
|
296
|
-
|
|
329
|
+
{ f: "BOM, Inventory and Vulnerabilities tabs", claude: ["yes"], devin: ["yes"], codex: ["yes", "OpenACA 0.10.1 already composes Codex."],
|
|
330
|
+
cursor: ["yes", "OpenACA already composes Cursor."] },
|
|
331
|
+
{ f: "Posture findings in Fleet", claude: ["yes"], devin: ["partial", "command-policy-allow held back."], codex: ["partial", "command-policy-allow and project-trust held back."],
|
|
332
|
+
cursor: ["partial", "A rule that attaches to no component is held back."] },
|
|
297
333
|
{ group: "Local monitor" },
|
|
298
|
-
{ f: "Live tab", claude: ["yes"], devin: ["yes"], codex: ["yes"]
|
|
299
|
-
|
|
300
|
-
{ f: "
|
|
334
|
+
{ f: "Live tab", claude: ["yes"], devin: ["yes"], codex: ["yes"],
|
|
335
|
+
cursor: ["yes"] },
|
|
336
|
+
{ f: "Usage tab", claude: ["yes"], devin: ["yes"], codex: ["yes"],
|
|
337
|
+
cursor: ["yes"] },
|
|
338
|
+
{ f: "Refreshes when the agent's configuration changes", claude: ["yes"], devin: ["no"], codex: ["no", "Refreshes on session changes; configuration needs a reload."],
|
|
339
|
+
cursor: ["no", "As for Codex."] },
|
|
301
340
|
{ group: "Gateway (Guard)" },
|
|
302
|
-
{ f: "Recognises the agent's traffic", claude: ["yes"], devin: ["partial", "Named devin-cli, so calls go unclassified."], codex: ["yes"]
|
|
303
|
-
|
|
341
|
+
{ f: "Recognises the agent's traffic", claude: ["yes"], devin: ["partial", "Named devin-cli, so calls go unclassified."], codex: ["yes"],
|
|
342
|
+
cursor: ["no", "Cursor's model calls go through Cursor's servers."] },
|
|
343
|
+
{ f: "Classifies its calls and refusals", claude: ["yes"], devin: ["no"], codex: ["yes"],
|
|
344
|
+
cursor: ["no"] },
|
|
304
345
|
{ group: "Claude-only" },
|
|
305
|
-
{ f: "Claude Code plugin: in-session alerts", claude: ["yes"], devin: ["no"], codex: ["out", "Out of scope."]
|
|
306
|
-
|
|
307
|
-
{ f: "
|
|
308
|
-
|
|
346
|
+
{ f: "Claude Code plugin: in-session alerts", claude: ["yes"], devin: ["no"], codex: ["out", "Out of scope."],
|
|
347
|
+
cursor: ["out", "Out of scope."] },
|
|
348
|
+
{ f: "Playground (stacktrace.ai/playground)", claude: ["yes"], devin: ["no"], codex: ["out", "Out of scope."],
|
|
349
|
+
cursor: ["out", "Out of scope."] },
|
|
350
|
+
{ f: "Managed policy deployment", claude: ["yes"], devin: ["no"], codex: ["notplanned", "Not planned."],
|
|
351
|
+
cursor: ["notplanned", "Not planned."] },
|
|
352
|
+
{ f: "Cloud bootstrap", claude: ["yes", "Claude Code on the web."], devin: ["no"], codex: ["notplanned", "Codex Cloud is not read."],
|
|
353
|
+
cursor: ["notplanned", "Cloud agents are not read."] }
|
|
309
354
|
];
|
|
310
355
|
|
|
311
356
|
var GAPS = {
|
|
@@ -326,6 +371,17 @@ tr.group td {
|
|
|
326
371
|
["Rollouts from before paginated history", "Exit codes are read from Codex's output header."],
|
|
327
372
|
["Compressed (.jsonl.zst) rollouts", "Reported, not read. Off by default in Codex 0.163.0."],
|
|
328
373
|
["Codex Cloud", "Not read."]
|
|
374
|
+
],
|
|
375
|
+
cursor: [
|
|
376
|
+
["The desktop app's chats are not read", "A session in the Cursor desktop app has no findings or usage yet. Its composition is read."],
|
|
377
|
+
["Usage is only in Cursor's debug log", "Kept for 7 days or the 50 newest files, and off with CURSOR_AGENT_DISABLE_DEBUG_LOG. A session read after its log is pruned has no usage. The daemon files usage as the session runs."],
|
|
378
|
+
["The standard CLI writes usage per turn in print mode, and none in its terminal UI", "A terminal UI session has no usage and no cost findings. Print mode has one response per turn, so a minute's pace is coarser."],
|
|
379
|
+
["The daemon names a run only beside its usage", "A finding from a session with no usage reaches Fleet with no person, account or opening words. This includes every terminal UI session."],
|
|
380
|
+
["No thinking tokens, speed tier or hook output", "cost-runaway-session cannot give its thinking, fast-mode or hook-cause reasons."],
|
|
381
|
+
["Skills are read with a file tool", "vulnerable-dep-invoked cannot tie a vulnerable skill to a session."],
|
|
382
|
+
["Cursor's usage-limit and content-policy wording comes from its server", "blocked-quota and blocked-policy cannot fire until a real session shows it."],
|
|
383
|
+
["Only a failed MCP connection is logged", "No advertised identity or transport per call. Egress over MCP uses the configured transport."],
|
|
384
|
+
["Cloud agents", "Not read."]
|
|
329
385
|
]
|
|
330
386
|
};
|
|
331
387
|
|
|
@@ -457,7 +513,7 @@ tr.group td {
|
|
|
457
513
|
|
|
458
514
|
function renderGaps() {
|
|
459
515
|
var box = document.getElementById("gaps");
|
|
460
|
-
[["devin", "Devin"], ["codex", "Codex"]].forEach(function (p) {
|
|
516
|
+
[["devin", "Devin"], ["codex", "Codex"], ["cursor", "Cursor"]].forEach(function (p) {
|
|
461
517
|
var list = el("ul");
|
|
462
518
|
GAPS[p[0]].forEach(function (g) {
|
|
463
519
|
list.appendChild(el("li", null, [el("strong", { text: g[0] }), el("span", { text: g[1] })]));
|
|
@@ -4,9 +4,9 @@ What Stacktrace supports for each agent kind, rule by rule and feature by
|
|
|
4
4
|
feature, and what cannot be supported and why.
|
|
5
5
|
|
|
6
6
|
*Living document. Change a grade in the PR that changes the support. Last
|
|
7
|
-
updated 2026-10-
|
|
8
|
-
[
|
|
9
|
-
OpenACA 0.
|
|
7
|
+
updated 2026-10-21, against stacktrace 0.15.0, with the Cursor work in
|
|
8
|
+
[Cursor as an agent kind](specs/cursor-agent-kind.md), OpenAIDR 0.8.0 and
|
|
9
|
+
OpenACA 0.12.0.*
|
|
10
10
|
|
|
11
11
|
**Interactive version:** [`agent-support.html`](agent-support.html) in this
|
|
12
12
|
directory, also published at <https://claude.ai/artifact/BfRR9drQ7D9WqVqGkBBkno>
|
|
@@ -20,6 +20,7 @@ both together.
|
|
|
20
20
|
| `claude-code` | Claude Code CLI, IDE extensions, the Agent SDK, Claude Code on the web | — | Supported |
|
|
21
21
|
| `devin` | Devin CLI, Devin Local (Devin Desktop's default agent), editors driving it over ACP | Devin Cloud (remote); Cascade (encrypted store) | Supported |
|
|
22
22
|
| `codex` | Codex CLI, `codex exec`, the IDE extension and Codex app (through `codex app-server`) | Codex Cloud (remote) | Supported from stacktrace 0.12.0 |
|
|
23
|
+
| `cursor` | Cursor CLI (`agent`, `cursor-agent`) in the terminal, in print mode and over ACP | The desktop app's own chats (not read yet); Cloud agents (remote) | Supported from the release that pins OpenAIDR 0.8.0 |
|
|
23
24
|
|
|
24
25
|
## Detections
|
|
25
26
|
|
|
@@ -28,31 +29,32 @@ both together.
|
|
|
28
29
|
- **None**: the evidence does not exist.
|
|
29
30
|
- **†**: waits on a field not yet confirmed in a real session.
|
|
30
31
|
|
|
31
|
-
| Rule | Claude Code | Devin | Codex |
|
|
32
|
-
|
|
33
|
-
| **Security** | | | |
|
|
34
|
-
| `credential-egress` | Full | Full† | Full. A remote server's call with no recorded transport is read from its configuration, at medium confidence |
|
|
35
|
-
| `credential-persisted` | Full | Partial: `apply_patch` is not read | Full |
|
|
36
|
-
| `credential-in-prompt` | Full | Full† | Full |
|
|
37
|
-
| `pii-in-prompt` | Full | Full† | Full |
|
|
38
|
-
| `destructive-action` | Full | Full† | Full |
|
|
39
|
-
| `deceptive-completion` (reasoning, opt-in) | Full | Full† | Full |
|
|
40
|
-
| `infra-unsafe-action` | Full | Partial: no entrypoint when the run log is not placed | Full |
|
|
41
|
-
| `vulnerable-dep-invoked` | Full | Full | Partial: skills are never a call |
|
|
42
|
-
| `credential-switched` | Full | Partial: `apply_patch` writes are not read | Full |
|
|
43
|
-
| **Reliability** | | | |
|
|
44
|
-
| `blocked-quota` | Full | None: Devin's wording is not read | Full |
|
|
45
|
-
| `blocked-policy` | Full | None: no counterpart | Partial†: stops a turn, not a session |
|
|
46
|
-
| `blocked-throttled` | Full | Partial: failed-call bodies only | Full† |
|
|
47
|
-
| `blocked-upstream` | Full | Full† | Full |
|
|
48
|
-
| **Cost** | | | |
|
|
49
|
-
| `cost-runaway-session` | Full | Partial: see below | Partial: see below |
|
|
32
|
+
| Rule | Claude Code | Devin | Codex | Cursor |
|
|
33
|
+
|---|---|---|---|---|
|
|
34
|
+
| **Security** | | | | |
|
|
35
|
+
| `credential-egress` | Full | Full† | Full. A remote server's call with no recorded transport is read from its configuration, at medium confidence | Full. A remote MCP server's call is read from its configuration, at medium confidence |
|
|
36
|
+
| `credential-persisted` | Full | Partial: `apply_patch` is not read | Full | Full: `Write`, `StrReplace` and `ApplyPatch` |
|
|
37
|
+
| `credential-in-prompt` | Full | Full† | Full | Full |
|
|
38
|
+
| `pii-in-prompt` | Full | Full† | Full | Full |
|
|
39
|
+
| `destructive-action` | Full | Full† | Full | Full. A refused call never fires. Cursor's Delete protection, a team setting, refuses every `rm` |
|
|
40
|
+
| `deceptive-completion` (reasoning, opt-in) | Full | Full† | Full | Full |
|
|
41
|
+
| `infra-unsafe-action` | Full | Partial: no entrypoint when the run log is not placed | Full | Full |
|
|
42
|
+
| `vulnerable-dep-invoked` | Full | Full | Partial: skills are never a call | Partial: skills are never a call |
|
|
43
|
+
| `credential-switched` | Full | Partial: `apply_patch` writes are not read | Full | Full |
|
|
44
|
+
| **Reliability** | | | | |
|
|
45
|
+
| `blocked-quota` | Full | None: Devin's wording is not read | Full | None†: Cursor's own usage-limit wording is not read |
|
|
46
|
+
| `blocked-policy` | Full | None: no counterpart | Partial†: stops a turn, not a session | None†: no counterpart confirmed |
|
|
47
|
+
| `blocked-throttled` | Full | Partial: failed-call bodies only | Full† | Partial: failed-call bodies only |
|
|
48
|
+
| `blocked-upstream` | Full | Full† | Full | Full |
|
|
49
|
+
| **Cost** | | | | | |
|
|
50
|
+
| `cost-runaway-session` | Full | Partial: see below | Partial: see below | Partial: see below |
|
|
50
51
|
|
|
51
52
|
| | Full | Partial | None | Not shipped |
|
|
52
53
|
|---|---|---|---|---|
|
|
53
54
|
| Claude Code | 14 | 0 | 0 | 1 |
|
|
54
55
|
| Devin | 7 (6 †) | 5 | 2 | 1 |
|
|
55
56
|
| Codex | 11 (1 †) | 3 | 0 | 1 |
|
|
57
|
+
| Cursor | 9 | 3 | 2 (2 †) | 1 |
|
|
56
58
|
|
|
57
59
|
`cost-personal-anomaly` runs in Fleet on uploaded usage, so it works wherever
|
|
58
60
|
the usage upload does (see Features).
|
|
@@ -83,43 +85,57 @@ the usage upload does (see Features).
|
|
|
83
85
|
| Compressed (`.jsonl.zst`) rollouts | Reported, not read. Off by default in Codex 0.163.0 |
|
|
84
86
|
| Codex Cloud | Not read |
|
|
85
87
|
|
|
88
|
+
### Cursor
|
|
89
|
+
|
|
90
|
+
| Gap | Effect |
|
|
91
|
+
|---|---|
|
|
92
|
+
| The desktop app's chats are not read | A session in the Cursor desktop app has no findings or usage yet. Its composition is read |
|
|
93
|
+
| Usage is only in Cursor's debug log, kept for 7 days or the 50 newest files, and off with `CURSOR_AGENT_DISABLE_DEBUG_LOG` | A session read after its log is pruned has no usage. The daemon files usage as the session runs |
|
|
94
|
+
| The standard CLI writes usage per turn in print mode, and none in its terminal UI | A terminal UI session has no usage and no cost findings. Print mode has one response per turn, so a minute's pace is coarser |
|
|
95
|
+
| The daemon names a run only beside its usage | A finding from a session with no usage reaches Fleet with no person, account or opening words. This includes every terminal UI session |
|
|
96
|
+
| No thinking tokens, speed tier or hook output | `cost-runaway-session` cannot give its thinking, fast-mode or hook-cause reasons |
|
|
97
|
+
| Skills are read with a file tool; no record names one | `vulnerable-dep-invoked` cannot tie a vulnerable skill to a session |
|
|
98
|
+
| Cursor's usage-limit and content-policy wording comes from its server | `blocked-quota` and `blocked-policy` cannot fire until a real session shows it |
|
|
99
|
+
| Only a failed MCP connection is logged | No advertised identity or transport per call. Egress over MCP uses the configured transport |
|
|
100
|
+
| Cloud agents | Not read |
|
|
101
|
+
|
|
86
102
|
## Features
|
|
87
103
|
|
|
88
|
-
| Feature | Claude Code | Devin | Codex |
|
|
89
|
-
|
|
90
|
-
| **Sessions and detection** | | | |
|
|
91
|
-
| Sessions read (`stacktrace sessions`, `detect`) | Yes | Yes | Yes |
|
|
92
|
-
| Daemon follows live sessions | Yes | Yes | Yes |
|
|
93
|
-
| Sub-agent sessions in a run | Yes | Yes† | Yes |
|
|
94
|
-
| MCP connection evidence | Yes | Partial: no advertised identity | Partial: none under `codex exec`; no endpoint |
|
|
95
|
-
| Reasoning stage (opt-in) | Yes | Yes | Yes |
|
|
96
|
-
| Findings to Slack and webhooks | Yes | Yes | Yes |
|
|
97
|
-
| Findings to Fleet | Yes | Yes | Yes. Not yet run against a live Fleet |
|
|
104
|
+
| Feature | Claude Code | Devin | Codex | Cursor |
|
|
105
|
+
|---|---|---|---|---|
|
|
106
|
+
| **Sessions and detection** | | | | |
|
|
107
|
+
| Sessions read (`stacktrace sessions`, `detect`) | Yes | Yes | Yes | Yes. The CLI only |
|
|
108
|
+
| Daemon follows live sessions | Yes | Yes | Yes | Yes |
|
|
109
|
+
| Sub-agent sessions in a run | Yes | Yes† | Yes | Yes |
|
|
110
|
+
| MCP connection evidence | Yes | Partial: no advertised identity | Partial: none under `codex exec`; no endpoint | Partial: failed connections only |
|
|
111
|
+
| Reasoning stage (opt-in) | Yes | Yes | Yes | Yes |
|
|
112
|
+
| Findings to Slack and webhooks | Yes | Yes | Yes | Yes |
|
|
113
|
+
| Findings to Fleet | Yes | Yes | Yes. Not yet run against a live Fleet | Yes. Run against a local Fleet |
|
|
98
114
|
| **Cost** | | | |
|
|
99
|
-
| Tokens per model response | Yes | Yes | Yes. Cached input separated |
|
|
100
|
-
| Cache writes | Yes | Provider-dependent | No: OpenAI reports none |
|
|
101
|
-
| Reasoning tokens | Yes | No | Yes |
|
|
102
|
-
| Context window per response | From a model table | Partial: known for Claude models only | Recorded by Codex |
|
|
103
|
-
| Cost findings | Yes | Partial | Partial |
|
|
104
|
-
| Usage to Fleet and org baselines | Yes | Yes | Yes |
|
|
105
|
-
| Fleet price rows | Yes | Estimated: no per-token price published | Partial: `gpt-5` to `gpt-5.6` priced; `gpt-6` and later unpriced until stacktrace-fleet adds their rows. Codex 0.163.0 defaults to `gpt-6.1-sol` |
|
|
106
|
-
| **Who** | | | |
|
|
107
|
-
| Signed-in account and person | Yes | Yes, through `devin auth status` | Yes. ChatGPT sign-in; an API key names no one |
|
|
108
|
-
| **Composition** | | | |
|
|
109
|
-
| BOM, Inventory and Vulnerabilities tabs | Yes | Yes | Yes |
|
|
110
|
-
| Posture findings in Fleet | Yes | Partial: `command-policy-allow` is held back, since it attaches to no component | Partial: `command-policy-allow` and `project-trust` are held back, for the same reason |
|
|
111
|
-
| **Local monitor** | | | |
|
|
112
|
-
| Live tab | Yes | Yes | Yes |
|
|
113
|
-
| Usage tab | Yes | Yes | Yes |
|
|
114
|
-
| Refreshes when the agent's configuration changes | Yes | No | No. The page refreshes on session changes; configuration needs a reload |
|
|
115
|
-
| **Gateway (Guard)** | | | |
|
|
116
|
-
| Recognises the agent's traffic | Yes | Partial: named `devin-cli`, so calls go unclassified | Yes |
|
|
117
|
-
| Classifies its calls and refusals | Yes | No | Yes |
|
|
118
|
-
| **Claude-only** | | | |
|
|
119
|
-
| Claude Code plugin: in-session alerts, `/stacktrace:findings` | Yes | No | Out of scope |
|
|
120
|
-
| Playground (stacktrace.ai/playground) | Yes | No | Out of scope |
|
|
121
|
-
| Managed policy deployment | Yes | No | Not planned |
|
|
122
|
-
| Cloud bootstrap (Claude Code on the web) | Yes | No | Not planned: Codex Cloud is not read |
|
|
115
|
+
| Tokens per model response | Yes | Yes | Yes. Cached input separated | Partial: per turn in print mode, none in the terminal UI, per response in the local-inference build. From Cursor's debug log while it is kept. Cached input separated |
|
|
116
|
+
| Cache writes | Yes | Provider-dependent | No: OpenAI reports none | Yes |
|
|
117
|
+
| Reasoning tokens | Yes | No | Yes | No |
|
|
118
|
+
| Context window per response | From a model table | Partial: known for Claude models only | Recorded by Codex | Partial: recorded when Cursor states it, else a model table |
|
|
119
|
+
| Cost findings | Yes | Partial | Partial | Partial |
|
|
120
|
+
| Usage to Fleet and org baselines | Yes | Yes | Yes | Yes. Run against a local Fleet |
|
|
121
|
+
| Fleet price rows | Yes | Estimated: no per-token price published | Partial: `gpt-5` to `gpt-5.6` priced; `gpt-6` and later unpriced until stacktrace-fleet adds their rows. Codex 0.163.0 defaults to `gpt-6.1-sol` | Partial: Fleet's `agents.cursor` rule adds Cursor's fee to `claude-*` and `gpt-*` rows; Cursor's own models are unpriced |
|
|
122
|
+
| **Who** | | | | |
|
|
123
|
+
| Signed-in account and person | Yes | Yes, through `devin auth status` | Yes. ChatGPT sign-in; an API key names no one | Partial: from `cli-config.json`, with no plan. A finding from a session with no usage names no one |
|
|
124
|
+
| **Composition** | | | | |
|
|
125
|
+
| BOM, Inventory and Vulnerabilities tabs | Yes | Yes | Yes | Yes |
|
|
126
|
+
| Posture findings in Fleet | Yes | Partial: `command-policy-allow` is held back, since it attaches to no component | Partial: `command-policy-allow` and `project-trust` are held back, for the same reason | Partial: a rule that attaches to no component is held back, for the same reason |
|
|
127
|
+
| **Local monitor** | | | | |
|
|
128
|
+
| Live tab | Yes | Yes | Yes | Yes |
|
|
129
|
+
| Usage tab | Yes | Yes | Yes | Yes |
|
|
130
|
+
| Refreshes when the agent's configuration changes | Yes | No | No. The page refreshes on session changes; configuration needs a reload | No, as for Codex |
|
|
131
|
+
| **Gateway (Guard)** | | | | |
|
|
132
|
+
| Recognises the agent's traffic | Yes | Partial: named `devin-cli`, so calls go unclassified | Yes | No. Cursor's model calls go through Cursor's servers |
|
|
133
|
+
| Classifies its calls and refusals | Yes | No | Yes | No |
|
|
134
|
+
| **Claude-only** | | | | |
|
|
135
|
+
| Claude Code plugin: in-session alerts, `/stacktrace:findings` | Yes | No | Out of scope | Out of scope |
|
|
136
|
+
| Playground (stacktrace.ai/playground) | Yes | No | Out of scope | Out of scope |
|
|
137
|
+
| Managed policy deployment | Yes | No | Not planned | Not planned |
|
|
138
|
+
| Cloud bootstrap (Claude Code on the web) | Yes | No | Not planned: Codex Cloud is not read | Not planned: Cloud agents are not read |
|
|
123
139
|
|
|
124
140
|
## Where each grade comes from
|
|
125
141
|
|
|
@@ -135,4 +151,18 @@ the usage upload does (see Features).
|
|
|
135
151
|
`gpt-6.1-sol` sent its usage to a local Fleet, which held it unpriced: the
|
|
136
152
|
Fleet price rows grade comes from that run.
|
|
137
153
|
|
|
154
|
+
- **Cursor:** this branch's code and tests (`tests/test_kind_conformance.py`,
|
|
155
|
+
`tests/test_openaidr_contract.py`), [Cursor as an agent
|
|
156
|
+
kind](specs/cursor-agent-kind.md), and OpenAIDR's `docs/specs/cursor.md`.
|
|
157
|
+
Both rest on the Cursor CLI `2026.10.19-6bbf2c4` (its local-inference build)
|
|
158
|
+
run against a mock model, and on its shipped bundle. On 2026-10-21 the
|
|
159
|
+
stacktrace-demo policy suite ran all 17 cases through that CLI and a daemon
|
|
160
|
+
from this branch, with a stand-in model that makes the calls each case asks
|
|
161
|
+
for: 13 passed. Both `rm -rf` cases ended `AGENT_REFUSED`, because that build
|
|
162
|
+
always turns on Cursor's Delete protection. `blocked-quota`
|
|
163
|
+
and `blocked-policy` ended `MISSING_FINDING`, as on every kind. The cost
|
|
164
|
+
suite's machine cases ran on generated Cursor sessions; see the spec. An
|
|
165
|
+
isolated daemon also synced two real Cursor sessions to a local Fleet, which
|
|
166
|
+
stored the agent, the signed-in account, the usage and a detection.
|
|
167
|
+
|
|
138
168
|
A new rule adds a row here. A new kind adds a column.
|