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.
Files changed (735) hide show
  1. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/PKG-INFO +8 -7
  2. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/README.md +6 -5
  3. stacktrace_cli-0.16.0/docs/adrs/0156-the-client-localizes-fleet-policy-targets.md +67 -0
  4. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/INDEX.md +1 -0
  5. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/agent-support.html +106 -50
  6. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/agent-support.md +86 -56
  7. stacktrace_cli-0.16.0/docs/releases/v0.16.0.md +46 -0
  8. stacktrace_cli-0.16.0/docs/specs/cursor-agent-kind.md +378 -0
  9. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/managed-policy-deployment.md +5 -0
  10. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/policy-enforcement.md +77 -4
  11. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/remote-sync.md +6 -0
  12. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/pyproject.toml +4 -3
  13. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/__init__.py +1 -1
  14. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/composition.py +9 -0
  15. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/evidence.py +0 -10
  16. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/cli.py +17 -4
  17. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/config.py +12 -0
  18. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/policy_collect.py +90 -5
  19. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/policy_runtime.py +55 -7
  20. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/runtime.py +6 -1
  21. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/jev-v3/stacktrace-infra-unsafe-action.json +1 -1
  22. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/hooks/claude.py +1 -1
  23. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/policy.py +17 -1
  24. stacktrace_cli-0.16.0/src/stacktrace/remote/policy_localize.py +211 -0
  25. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/policy_worker.py +14 -1
  26. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/entrypoint.py +8 -6
  27. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/conftest.py +13 -0
  28. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_evidence.py +1 -8
  29. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_cli.py +37 -5
  30. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_codex_policy_collect_contract.py +15 -0
  31. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_config.py +23 -0
  32. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_agent_scopes.py +27 -0
  33. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_collect.py +39 -1
  34. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_collect_contract.py +57 -0
  35. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_hook_transport.py +12 -0
  36. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_reconcile.py +141 -2
  37. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_runtime.py +75 -1
  38. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_runtime.py +16 -1
  39. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_facade_contract.py +21 -0
  40. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_policy.py +45 -0
  41. stacktrace_cli-0.16.0/tests/remote/test_policy_localize.py +379 -0
  42. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_events.py +1 -1
  43. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_every_derived_site.py +1 -1
  44. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_hooks.py +1 -1
  45. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_agent_support_doc.py +1 -0
  46. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_cli.py +1 -1
  47. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_entrypoint_conventions.py +4 -2
  48. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_kind_conformance.py +33 -0
  49. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_no_agent_kind_is_named.py +4 -0
  50. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_openaidr_contract.py +231 -0
  51. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/uv.lock +6 -6
  52. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.agents/skills/release-stacktrace/SKILL.md +0 -0
  53. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.claude/settings.json +0 -0
  54. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.claude/skills/release-stacktrace/SKILL.md +0 -0
  55. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.codex/hooks.json +0 -0
  56. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.github/managed-autofix.md +0 -0
  57. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.github/pull_request_template.md +0 -0
  58. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.github/workflows/bedrock-live.yml +0 -0
  59. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.github/workflows/ci.yml +0 -0
  60. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.github/workflows/guard-staging.yml +0 -0
  61. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.github/workflows/publish-pypi.yml +0 -0
  62. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/.gitignore +0 -0
  63. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/AGENTS.md +0 -0
  64. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/CLAUDE.md +0 -0
  65. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/SECURITY.md +0 -0
  66. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/decision-request.example.json +0 -0
  67. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/decision-request.schema.json +0 -0
  68. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/decision-response.example.json +0 -0
  69. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/decision-response.schema.json +0 -0
  70. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/example.json +0 -0
  71. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/schema.json +0 -0
  72. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0001-session-telemetry-as-input.md +0 -0
  73. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0002-session-collection-in-openaidr.md +0 -0
  74. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0003-runtime-edges.md +0 -0
  75. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0004-three-stage-detector.md +0 -0
  76. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0005-detection-family-and-report-assembly.md +0 -0
  77. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0006-trust-boundary-and-detection-upload.md +0 -0
  78. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0007-proprietary-package-on-open-dependencies.md +0 -0
  79. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0008-console-in-separate-demo-package.md +0 -0
  80. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0010-detection-severity-and-confidence-ladders.md +0 -0
  81. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0011-verdict-cache.md +0 -0
  82. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0012-observation-evidence-kinds-and-transport.md +0 -0
  83. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0013-rule-catalogue-triage-and-per-rule-context.md +0 -0
  84. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0014-declared-project-mapping.md +0 -0
  85. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0015-narrow-the-security-catalogue.md +0 -0
  86. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0016-stall-grouping-is-session-wide.md +0 -0
  87. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0017-a-declined-repeat-is-a-stall.md +0 -0
  88. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0018-remote-sync-config-and-facade-consumption.md +0 -0
  89. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0019-delegated-commands-are-openaca-objects.md +0 -0
  90. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0020-openaca-consumption-boundary.md +0 -0
  91. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0021-two-command-kinds.md +0 -0
  92. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0022-detection-scope-is-a-catalogue-column.md +0 -0
  93. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0023-sync-detect-collects-and-does-not-escalate.md +0 -0
  94. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0024-the-upload-carries-observations.md +0 -0
  95. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0025-a-denied-call-is-activity-never-an-invocation.md +0 -0
  96. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0026-the-console-becomes-a-product-surface.md +0 -0
  97. {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
  98. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0028-the-console-shows-what-it-placed.md +0 -0
  99. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0029-stage-three-returns-to-opt-in.md +0 -0
  100. {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
  101. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0031-one-host-daemon-observes-native-session-logs.md +0 -0
  102. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0032-refresh-daemon-compositions-outside-detection.md +0 -0
  103. {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
  104. {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
  105. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0035-naming-an-analyzer-selects-stored-answers.md +0 -0
  106. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0036-deliver-eligible-findings-to-slack-from-the-daemon.md +0 -0
  107. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0037-reuse-openaidr-append-cursors-in-the-daemon.md +0 -0
  108. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0038-poll-normalized-sessions-for-supplemental-changes.md +0 -0
  109. {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
  110. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0041-defer-native-windows-support.md +0 -0
  111. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0042-read-the-build-commit-from-the-install-record.md +0 -0
  112. {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
  113. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0044-send-the-build-as-version-prints-it.md +0 -0
  114. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0045-scan-every-session-and-outlive-them.md +0 -0
  115. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0046-the-finding-store-is-an-append-only-queue.md +0 -0
  116. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0047-capture-activity-during-correlation-or-lose-it.md +0 -0
  117. {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
  118. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0056-stop-a-resident-daemon-by-record-and-signal.md +0 -0
  119. {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
  120. {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
  121. {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
  122. {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
  123. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0061-the-drain-sends-findings-only.md +0 -0
  124. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0062-hold-the-transition-lock-across-remote-side-effects.md +0 -0
  125. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0063-underbuilt-debt-does-not-hold-the-scan-watermark.md +0 -0
  126. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0064-a-redacted-value-has-one-path-span.md +0 -0
  127. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0065-asset-external-id-resolves-by-a-ladder.md +0 -0
  128. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0066-host-owned-daemon-supervision.md +0 -0
  129. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0067-a-webhook-is-an-independent-queue-subscriber.md +0 -0
  130. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0068-webhooks-retry-the-retained-backlog.md +0 -0
  131. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0069-webhooks-deliver-what-retention-holds.md +0 -0
  132. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0070-package-the-cloud-agent-environment-bootstrap.md +0 -0
  133. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0071-render-the-allowlisted-payload-per-destination.md +0 -0
  134. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0072-host-supervisors-own-daemon-restarts.md +0 -0
  135. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0073-name-what-fired-and-which-component.md +0 -0
  136. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0074-a-window-selects-findings-by-when-they-happened.md +0 -0
  137. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0076-two-phase-detection-pipeline.md +0 -0
  138. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0077-the-bom-job-wakes-once-at-startup-staggered.md +0 -0
  139. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0078-a-seeded-display-prefix-replaces-the-hostname-label.md +0 -0
  140. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0079-the-monitor-page-renders-findings-not-pipeline-health.md +0 -0
  141. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0080-enabling-reasoning-does-not-requeue-the-past.md +0 -0
  142. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0081-reasoning-activation-returns-to-explicit-opt-in.md +0 -0
  143. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0082-monitor-checks-every-installed-component-by-default.md +0 -0
  144. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0083-each-block-reason-is-its-own-rule.md +0 -0
  145. {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
  146. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0085-show-when-and-which-finding-slack-delivered.md +0 -0
  147. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0086-a-refusal-names-who-answered-the-call.md +0 -0
  148. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0087-deploy-compiled-policy-with-a-privileged-scheduled-job.md +0 -0
  149. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0088-slack-alerts-leave-out-confidence.md +0 -0
  150. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0089-infra-gate-reads-commands-not-shell-semantics.md +0 -0
  151. {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
  152. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0091-mark-our-own-machines-and-name-what-failed.md +0 -0
  153. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0092-cost-is-its-own-rule-family.md +0 -0
  154. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0093-environment-cost-baselines-count-tokens-keyed-by-model.md +0 -0
  155. {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
  156. {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
  157. {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
  158. {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
  159. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0098-a-run-is-its-main-session.md +0 -0
  160. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0099-cost-is-measured-in-tokens-and-relative-increases.md +0 -0
  161. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0100-the-monitor-runs-offline-for-the-website.md +0 -0
  162. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0101-what-names-a-run-in-fleet.md +0 -0
  163. {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
  164. {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
  165. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0104-usage-is-its-own-upload.md +0 -0
  166. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0105-an-asset-key-is-a-bare-uuid.md +0 -0
  167. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0106-boot-id-is-salted-with-the-pid-namespace.md +0 -0
  168. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0107-the-daemon-follows-every-kind-openaidr-reads.md +0 -0
  169. {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
  170. {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
  171. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0110-every-kinds-account-comes-from-openaidr.md +0 -0
  172. {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
  173. {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
  174. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0113-size-triggers-behaviour-explains-session-cost-carries-reasons.md +0 -0
  175. {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
  176. {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
  177. {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
  178. {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
  179. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0118-observe-agents-through-adapters-and-a-shared-analyzer.md +0 -0
  180. {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
  181. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0120-own-the-adapter-event-envelope.md +0 -0
  182. {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
  183. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0122-use-stacktrace-as-the-python-package.md +0 -0
  184. {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
  185. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0124-fleet-imports-core-from-the-stacktrace-distribution.md +0 -0
  186. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0127-the-monitor-shows-weighted-tokens-beside-raw-tokens.md +0 -0
  187. {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
  188. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0129-an-unfinished-response-counts-the-output-it-shows.md +0 -0
  189. {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
  190. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0131-activate-hook-policy-without-a-privileged-runtime.md +0 -0
  191. {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
  192. {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
  193. {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
  194. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0135-enforce-policy-through-the-daemon-and-agent-hooks.md +0 -0
  195. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0136-bound-policy-evidence-collection-as-one-bundle.md +0 -0
  196. {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
  197. {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
  198. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0139-remediation-finding-contract.md +0 -0
  199. {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
  200. {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
  201. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0142-the-cli-has-no-machine-limit.md +0 -0
  202. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0143-the-plugin-owns-session-hooks-on-every-host.md +0 -0
  203. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0146-eight-rules-send-remediation-targets.md +0 -0
  204. {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
  205. {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
  206. {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
  207. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0150-codex-hooks-use-the-shared-policy-runtime.md +0 -0
  208. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0151-step-one-puts-the-daemon-beside-the-gateway.md +0 -0
  209. {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
  210. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/0155-a-remote-mcp-servers-exact-url-reaches-fleet.md +0 -0
  211. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/HOOK-PROMPT.md +0 -0
  212. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/adrs/TEMPLATE.md +0 -0
  213. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/cutover-openaca-remote.md +0 -0
  214. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/002-session-input.md +0 -0
  215. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/003-correlation.md +0 -0
  216. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/004-detector.md +0 -0
  217. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/005-remote-sync.md +0 -0
  218. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/006-cli-composition.md +0 -0
  219. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/007-detection-upload.md +0 -0
  220. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/008-monitor.md +0 -0
  221. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/009-reasoning-jev.md +0 -0
  222. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/010-session-daemon.md +0 -0
  223. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/011-daemon-store.md +0 -0
  224. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/012-daemon-scanning.md +0 -0
  225. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/013-daemon-uploads.md +0 -0
  226. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/014-asset-identity.md +0 -0
  227. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/015-managed-policy-deployment.md +0 -0
  228. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/016-cost-phase-1.md +0 -0
  229. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/017-cost-phase-2.md +0 -0
  230. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/018-remediation-rules.md +0 -0
  231. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/plans/019-credential-switch.md +0 -0
  232. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.0.1.md +0 -0
  233. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.1.0.md +0 -0
  234. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.10.0.md +0 -0
  235. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.11.0.md +0 -0
  236. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.12.0.md +0 -0
  237. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.13.0.md +0 -0
  238. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.14.0.md +0 -0
  239. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.15.0.md +0 -0
  240. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.2.0.md +0 -0
  241. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.2.1.md +0 -0
  242. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.2.2.md +0 -0
  243. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.2.3.md +0 -0
  244. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.3.0.md +0 -0
  245. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.3.1.md +0 -0
  246. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.4.0.md +0 -0
  247. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.4.1.md +0 -0
  248. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.5.0.md +0 -0
  249. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.5.1.md +0 -0
  250. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.5.2.md +0 -0
  251. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.5.3.md +0 -0
  252. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.6.0.md +0 -0
  253. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.6.1.md +0 -0
  254. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.7.0.md +0 -0
  255. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.7.1.md +0 -0
  256. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.8.0.md +0 -0
  257. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/releases/v0.9.0.md +0 -0
  258. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/research/001-intent-drift-metric.md +0 -0
  259. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/TEMPLATE.md +0 -0
  260. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/agent-observability.md +0 -0
  261. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/aidr.md +0 -0
  262. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/cli-composition.md +0 -0
  263. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/codex-agent-kind.md +0 -0
  264. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/codex-hook-policy.md +0 -0
  265. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/correlation.md +0 -0
  266. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/cost-notifications.md +0 -0
  267. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/cost-phase-1.md +0 -0
  268. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/cost-phase-2.md +0 -0
  269. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/cost.md +0 -0
  270. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/daemon-scanning.md +0 -0
  271. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/daemon-store.md +0 -0
  272. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/daemon-uploads.md +0 -0
  273. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/detection-policies.md +0 -0
  274. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/detection-upload.md +0 -0
  275. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/detector.md +0 -0
  276. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/event-time.md +0 -0
  277. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/gateway-daemon.md +0 -0
  278. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/hook-policy-rollout.md +0 -0
  279. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/monitor-inventory.md +0 -0
  280. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/monitor.md +0 -0
  281. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/notification-delivery.md +0 -0
  282. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/plugin-installation.md +0 -0
  283. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/production-agent-observability.md +0 -0
  284. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/reasoning-jev.md +0 -0
  285. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/session-input.md +0 -0
  286. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/specs/usage-upload.md +0 -0
  287. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/docs/trust.md +0 -0
  288. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/examples/observations/custom_agent.py +0 -0
  289. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/README.md +0 -0
  290. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/bedrock-sandbox/.gitignore +0 -0
  291. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/bedrock-sandbox/ci.tf +0 -0
  292. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/bedrock-sandbox/main.tf +0 -0
  293. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/bedrock-sandbox/outputs.tf +0 -0
  294. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/bedrock-sandbox/variables.tf +0 -0
  295. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/.gitignore +0 -0
  296. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/README.md +0 -0
  297. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/check.sh +0 -0
  298. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/ci.tf +0 -0
  299. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/connect.sh +0 -0
  300. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/daemon.sh +0 -0
  301. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/envoy/Dockerfile +0 -0
  302. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/envoy/entrypoint.sh +0 -0
  303. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/envoy/litellm.yaml +0 -0
  304. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/litellm/Dockerfile +0 -0
  305. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/litellm/config.subscription.yaml +0 -0
  306. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/litellm/config.yaml +0 -0
  307. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/litellm/entrypoint.sh +0 -0
  308. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/main.tf +0 -0
  309. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/moved.tf +0 -0
  310. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/outputs.tf +0 -0
  311. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/smoke.sh +0 -0
  312. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/user-key.sh +0 -0
  313. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/guard-staging/variables.tf +0 -0
  314. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/modules/express-gateway/main.tf +0 -0
  315. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/modules/express-gateway/outputs.tf +0 -0
  316. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/infra/modules/express-gateway/variables.tf +0 -0
  317. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/e2e/claude.sh +0 -0
  318. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/e2e/scenarios.sh +0 -0
  319. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/envoy/envoy.yaml +0 -0
  320. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/envoy/run.sh +0 -0
  321. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/README.md +0 -0
  322. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/config.example.yaml +0 -0
  323. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/config.subscription.yaml +0 -0
  324. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/e2e/config.baseten.yaml +0 -0
  325. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/e2e/config.mock.yaml +0 -0
  326. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/e2e/mock_upstream.py +0 -0
  327. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/e2e/parity.py +0 -0
  328. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/stacktrace_keys.py +0 -0
  329. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/integrations/litellm/stacktrace_litellm.py +0 -0
  330. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/scripts/cost_latency.py +0 -0
  331. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/scripts/git-hooks/pre-push +0 -0
  332. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/scripts/install-hooks.sh +0 -0
  333. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/__main__.py +0 -0
  334. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/analysis.py +0 -0
  335. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/build.py +0 -0
  336. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cli.py +0 -0
  337. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cloud/__init__.py +0 -0
  338. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cloud/boot.py +0 -0
  339. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cloud/profile.py +0 -0
  340. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cloud/setup.sh +0 -0
  341. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/core/__init__.py +0 -0
  342. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/core/observations.py +0 -0
  343. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/__init__.py +0 -0
  344. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/acquire.py +0 -0
  345. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/join.py +0 -0
  346. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/observed.py +0 -0
  347. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/orchestrate.py +0 -0
  348. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/project_map.py +0 -0
  349. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/record.py +0 -0
  350. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/render.py +0 -0
  351. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/__init__.py +0 -0
  352. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/baseline.py +0 -0
  353. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/clock.py +0 -0
  354. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/component_usage.py +0 -0
  355. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/components.py +0 -0
  356. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/copies.py +0 -0
  357. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/ledger.py +0 -0
  358. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/measures.py +0 -0
  359. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/models.py +0 -0
  360. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/org_baselines.py +0 -0
  361. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/output.py +0 -0
  362. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/price_class.py +0 -0
  363. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/reasons.py +0 -0
  364. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/rules.py +0 -0
  365. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/runs.py +0 -0
  366. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/tokens.py +0 -0
  367. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/totals.py +0 -0
  368. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/usage.py +0 -0
  369. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/weights.py +0 -0
  370. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/__init__.py +0 -0
  371. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/accounts.py +0 -0
  372. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/activity_log.py +0 -0
  373. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/bom.py +0 -0
  374. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/client.py +0 -0
  375. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/composition.py +0 -0
  376. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/costs.py +0 -0
  377. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/db.py +0 -0
  378. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/fleet.py +0 -0
  379. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/gateway.py +0 -0
  380. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/gateway_policy.py +0 -0
  381. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/identity.py +0 -0
  382. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/jobs.py +0 -0
  383. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/lifecycle.py +0 -0
  384. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/observer.py +0 -0
  385. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/paths.py +0 -0
  386. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/policy_inputs.py +0 -0
  387. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/presentation.py +0 -0
  388. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/protocol.py +0 -0
  389. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/scan.py +0 -0
  390. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/server.py +0 -0
  391. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/service.py +0 -0
  392. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/store.py +0 -0
  393. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/usage.py +0 -0
  394. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/webhook.py +0 -0
  395. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/__init__.py +0 -0
  396. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/analyzer.py +0 -0
  397. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/blocked.py +0 -0
  398. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/cache.py +0 -0
  399. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/deterministic.py +0 -0
  400. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/finding.py +0 -0
  401. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/history.py +0 -0
  402. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/jev.py +0 -0
  403. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/personal_data.py +0 -0
  404. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/priors.py +0 -0
  405. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/__init__.py +0 -0
  406. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/jev-v1/stacktrace-deceptive-completion.json +0 -0
  407. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/jev-v2/stacktrace-deceptive-completion.json +0 -0
  408. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/jev-v2/stacktrace-infra-unsafe-action.json +0 -0
  409. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/jev-v3/stacktrace-deceptive-completion.json +0 -0
  410. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/v1/exclusions.md +0 -0
  411. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/v1/framing.md +0 -0
  412. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/v1/stacktrace-deceptive-completion.md +0 -0
  413. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/reasoning.py +0 -0
  414. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/render.py +0 -0
  415. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/rules.py +0 -0
  416. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/run.py +0 -0
  417. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/secrets.py +0 -0
  418. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/verdict.py +0 -0
  419. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/windows.py +0 -0
  420. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/finding_contract.py +0 -0
  421. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/finding_titles.py +0 -0
  422. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/__init__.py +0 -0
  423. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/analyzer.py +0 -0
  424. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/check.py +0 -0
  425. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/cli.py +0 -0
  426. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/exchange.py +0 -0
  427. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/__init__.py +0 -0
  428. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/_json.py +0 -0
  429. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/anthropic.py +0 -0
  430. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/bedrock.py +0 -0
  431. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/body.py +0 -0
  432. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/openai_chat.py +0 -0
  433. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/openai_responses.py +0 -0
  434. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/principal.py +0 -0
  435. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/service.py +0 -0
  436. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/session.py +0 -0
  437. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/sink.py +0 -0
  438. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/hooks/__init__.py +0 -0
  439. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/hooks/codex.py +0 -0
  440. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/hooks/session.py +0 -0
  441. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/__init__.py +0 -0
  442. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/costs.py +0 -0
  443. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/inventory.py +0 -0
  444. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/offline.py +0 -0
  445. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/reasoning.py +0 -0
  446. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/render.py +0 -0
  447. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/server.py +0 -0
  448. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/app.js +0 -0
  449. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/apple-icon.png +0 -0
  450. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/cost.js +0 -0
  451. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/favicon.ico +0 -0
  452. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/fonts/OFL.txt +0 -0
  453. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/fonts/dm-mono-400-latin.woff2 +0 -0
  454. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/fonts/dm-mono-500-latin.woff2 +0 -0
  455. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/fonts/dm-sans-latin.woff2 +0 -0
  456. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/fonts/playfair-display-600-italic-latin.woff2 +0 -0
  457. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/icon.svg +0 -0
  458. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/index.html +0 -0
  459. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/inventory.js +0 -0
  460. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/styles.css +0 -0
  461. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/state.py +0 -0
  462. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/verdicts.py +0 -0
  463. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/watch.py +0 -0
  464. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/options.py +0 -0
  465. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/policy_display.py +0 -0
  466. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/private_state.py +0 -0
  467. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/py.typed +0 -0
  468. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/__init__.py +0 -0
  469. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/cli.py +0 -0
  470. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/client.py +0 -0
  471. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/config.py +0 -0
  472. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/detect_payload.py +0 -0
  473. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/hook_policy.py +0 -0
  474. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/identity.py +0 -0
  475. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/payload.py +0 -0
  476. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/policy_service.py +0 -0
  477. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/policy_show.py +0 -0
  478. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/redact.py +0 -0
  479. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/spool.py +0 -0
  480. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/sync.py +0 -0
  481. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/sync_detect.py +0 -0
  482. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/upload_contract.py +0 -0
  483. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sdk.py +0 -0
  484. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/__init__.py +0 -0
  485. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/access.py +0 -0
  486. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/index.py +0 -0
  487. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/lineage.py +0 -0
  488. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/outcome.py +0 -0
  489. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/protocols.py +0 -0
  490. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/render.py +0 -0
  491. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/telemetry/__init__.py +0 -0
  492. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/telemetry/cli.py +0 -0
  493. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/telemetry/events.py +0 -0
  494. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/telemetry/posthog.py +0 -0
  495. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/telemetry/state.py +0 -0
  496. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/webhook/__init__.py +0 -0
  497. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/webhook/cli.py +0 -0
  498. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/src/stacktrace/webhook/config.py +0 -0
  499. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/__init__.py +0 -0
  500. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/agent_bom_fixture.py +0 -0
  501. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/__init__.py +0 -0
  502. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/fakes.py +0 -0
  503. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/scenarios.py +0 -0
  504. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_as_of_cuts_every_timed_collection.py +0 -0
  505. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_baseline.py +0 -0
  506. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_clock.py +0 -0
  507. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_component_usage.py +0 -0
  508. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_components.py +0 -0
  509. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_copies.py +0 -0
  510. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_cost_evidence_travels.py +0 -0
  511. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_cost_findings_are_dated_by_their_citations.py +0 -0
  512. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_cost_findings_carry_no_session_text.py +0 -0
  513. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_cost_is_tokens.py +0 -0
  514. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_cost_latency.py +0 -0
  515. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_ledger.py +0 -0
  516. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_measures.py +0 -0
  517. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_models.py +0 -0
  518. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_org_baselines.py +0 -0
  519. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_output.py +0 -0
  520. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_price_class.py +0 -0
  521. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_reasons.py +0 -0
  522. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_rules_baseline.py +0 -0
  523. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_runs.py +0 -0
  524. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_totals.py +0 -0
  525. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_unfinished_output_counts_what_it_shows.py +0 -0
  526. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_usage.py +0 -0
  527. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/cost/test_weights.py +0 -0
  528. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/__init__.py +0 -0
  529. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/observing.py +0 -0
  530. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_accounts.py +0 -0
  531. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_activity_log.py +0 -0
  532. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_claude_policy_conformance.py +0 -0
  533. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_claude_policy_hook.py +0 -0
  534. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_client.py +0 -0
  535. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_codex_policy_conformance.py +0 -0
  536. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_codex_policy_hook.py +0 -0
  537. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_composition.py +0 -0
  538. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_cost_guidance.py +0 -0
  539. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_costs.py +0 -0
  540. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_db.py +0 -0
  541. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_detection_needs_no_subscriber.py +0 -0
  542. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_fleet.py +0 -0
  543. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_gateway.py +0 -0
  544. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_gateway_fleet.py +0 -0
  545. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_gateway_person.py +0 -0
  546. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_gateway_policy.py +0 -0
  547. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_identity.py +0 -0
  548. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_job_thread.py +0 -0
  549. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_jobs.py +0 -0
  550. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_lifecycle.py +0 -0
  551. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_observer.py +0 -0
  552. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_decide.py +0 -0
  553. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_inputs.py +0 -0
  554. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_socket.py +0 -0
  555. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_queue_reader.py +0 -0
  556. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_scan.py +0 -0
  557. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_service.py +0 -0
  558. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_session_cost_notices.py +0 -0
  559. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_socket.py +0 -0
  560. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_stage_times.py +0 -0
  561. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_store.py +0 -0
  562. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_subagent_routing.py +0 -0
  563. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_the_drained_payload_is_the_cold_one.py +0 -0
  564. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_the_stored_row_is_sufficient.py +0 -0
  565. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_usage.py +0 -0
  566. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_usage_store.py +0 -0
  567. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_webhook.py +0 -0
  568. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/daemon/test_wire_frames_are_bounded.py +0 -0
  569. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/detector_session_fixture.py +0 -0
  570. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/__init__.py +0 -0
  571. {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
  572. {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
  573. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_analyzer.py +0 -0
  574. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_bodies_and_logs.py +0 -0
  575. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_call_records.py +0 -0
  576. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_check.py +0 -0
  577. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_envoy_principal.py +0 -0
  578. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_every_choice_is_read.py +0 -0
  579. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_every_read_field_is_validated.py +0 -0
  580. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_every_shortfall_is_a_recorded_fallback.py +0 -0
  581. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_gateway_keys.py +0 -0
  582. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_gateway_scripts.py +0 -0
  583. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_litellm_stream.py +0 -0
  584. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_litellm_subscription_config.py +0 -0
  585. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_litellm_through_daemon.py +0 -0
  586. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_parity_live_capture.py +0 -0
  587. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_principal.py +0 -0
  588. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_service.py +0 -0
  589. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_session.py +0 -0
  590. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/gateway/test_unstated_outcomes.py +0 -0
  591. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/__init__.py +0 -0
  592. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/cost_harness.mjs +0 -0
  593. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/feed_harness.mjs +0 -0
  594. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/inventory_harness.mjs +0 -0
  595. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_cost_page.py +0 -0
  596. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_cost_range_switch.py +0 -0
  597. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_feed_model.py +0 -0
  598. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_inventory.py +0 -0
  599. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_inventory_page.py +0 -0
  600. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_offline.py +0 -0
  601. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_reasoning_gates.py +0 -0
  602. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_render.py +0 -0
  603. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_render_cost.py +0 -0
  604. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_server.py +0 -0
  605. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_site_assets.py +0 -0
  606. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_state.py +0 -0
  607. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_verdicts.py +0 -0
  608. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/monitor/test_watch.py +0 -0
  609. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/observations/test_contract.py +0 -0
  610. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/observations/test_decisions.py +0 -0
  611. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/observations/test_event_envelope.py +0 -0
  612. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/__init__.py +0 -0
  613. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/helpers.py +0 -0
  614. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_cli.py +0 -0
  615. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_client.py +0 -0
  616. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_cloud_boot_updates_the_client.py +0 -0
  617. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_cloud_session.py +0 -0
  618. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_cloud_setup_asset_id.py +0 -0
  619. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_config.py +0 -0
  620. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_activity.py +0 -0
  621. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_cli.py +0 -0
  622. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_client.py +0 -0
  623. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_contract_is_exhaustive.py +0 -0
  624. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_gate_matches_the_cloud.py +0 -0
  625. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_layers_compose.py +0 -0
  626. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_payload_reaches_the_cloud_model.py +0 -0
  627. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_redaction.py +0 -0
  628. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_spool.py +0 -0
  629. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_upload_contract.py +0 -0
  630. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_wire_payload.py +0 -0
  631. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_exact_remote_mcp_url.py +0 -0
  632. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_hook_policy.py +0 -0
  633. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_identity.py +0 -0
  634. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_no_local_path_survives_redaction.py +0 -0
  635. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_payload.py +0 -0
  636. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_policy_service.py +0 -0
  637. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_policy_service_cli.py +0 -0
  638. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_policy_show.py +0 -0
  639. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_redact_payload.py +0 -0
  640. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_seam.py +0 -0
  641. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_session_registration.py +0 -0
  642. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_spool.py +0 -0
  643. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_sync.py +0 -0
  644. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_sync_detect.py +0 -0
  645. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_upload_contract.py +0 -0
  646. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_usage_client.py +0 -0
  647. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_usage_contract.py +0 -0
  648. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/remote/test_user_install_profile.py +0 -0
  649. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/sdk/test_observation_client.py +0 -0
  650. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/__init__.py +0 -0
  651. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_activity_log.py +0 -0
  652. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_cli.py +0 -0
  653. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_every_internal_save_is_reported.py +0 -0
  654. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_release_gate.py +0 -0
  655. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_state.py +0 -0
  656. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_uploader.py +0 -0
  657. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_acquire.py +0 -0
  658. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_adr_cross_references_are_reciprocal.py +0 -0
  659. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_agent_instance_id.py +0 -0
  660. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_analysis.py +0 -0
  661. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_bom_shape.py +0 -0
  662. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_build_commit.py +0 -0
  663. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_call_status_conventions.py +0 -0
  664. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_composition.py +0 -0
  665. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_correlate_orchestrate.py +0 -0
  666. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_correlate_render.py +0 -0
  667. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_correlated_session.py +0 -0
  668. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detection_components.py +0 -0
  669. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detection_event_time.py +0 -0
  670. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detection_subject.py +0 -0
  671. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_analyzer_contract.py +0 -0
  672. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_analyzer_live.py +0 -0
  673. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_blocked.py +0 -0
  674. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_cache.py +0 -0
  675. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_client_errors.py +0 -0
  676. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_credential_in_prompt.py +0 -0
  677. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_credential_switched.py +0 -0
  678. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_declared_egress.py +0 -0
  679. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_deterministic.py +0 -0
  680. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_end_to_end.py +0 -0
  681. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_finding.py +0 -0
  682. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_history.py +0 -0
  683. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_infra_reasoning.py +0 -0
  684. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_jev.py +0 -0
  685. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_names_the_service.py +0 -0
  686. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_new_deterministic.py +0 -0
  687. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_personal_data.py +0 -0
  688. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_pii_in_prompt.py +0 -0
  689. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_priors.py +0 -0
  690. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_prompts.py +0 -0
  691. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_reasoning.py +0 -0
  692. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_render.py +0 -0
  693. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_run.py +0 -0
  694. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_secrets.py +0 -0
  695. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_verdict.py +0 -0
  696. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_vulnerable_dep_invoked.py +0 -0
  697. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_why_it_stopped.py +0 -0
  698. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_detector_windows.py +0 -0
  699. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_evidence_is_dated_not_numbered.py +0 -0
  700. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_finding_contract.py +0 -0
  701. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_fingerprint_covers_what_the_analyzer_reads.py +0 -0
  702. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_help_sections.py +0 -0
  703. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_join.py +0 -0
  704. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_monitor_cli.py +0 -0
  705. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_no_live_document_states_the_old_stage_three_default.py +0 -0
  706. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_no_test_undoes_every_patch_at_once.py +0 -0
  707. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_observed.py +0 -0
  708. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_one_wording_per_rule.py +0 -0
  709. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_openaca_contract.py +0 -0
  710. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_option_arity_matches_the_binary.py +0 -0
  711. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_project_map.py +0 -0
  712. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_python_namespace.py +0 -0
  713. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_readme_examples_are_real_output.py +0 -0
  714. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_release_gate_coverage.py +0 -0
  715. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_release_readiness.py +0 -0
  716. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_rules_send_remediation_targets.py +0 -0
  717. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_seam_boundary.py +0 -0
  718. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_session_identity_is_the_pair.py +0 -0
  719. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_sessions_access.py +0 -0
  720. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_sessions_end_to_end.py +0 -0
  721. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_sessions_protocol_typing.py +0 -0
  722. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_sessions_protocols.py +0 -0
  723. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_sessions_render.py +0 -0
  724. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_shell_separators_match_the_shell.py +0 -0
  725. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_signed_in_asks_the_agent.py +0 -0
  726. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_stored_verdicts_are_never_gated_on_reasoning.py +0 -0
  727. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_the_detector_spec_lists_the_shipped_catalogue.py +0 -0
  728. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_the_jev_spec_states_the_shipped_thresholds.py +0 -0
  729. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_the_locality_claim_is_qualified_everywhere.py +0 -0
  730. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_title_disclosure_invariant.py +0 -0
  731. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_untrusted_content_never_travels.py +0 -0
  732. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_verification_subcommands_match_the_binary.py +0 -0
  733. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/test_what_jev_is_told_is_what_was_disclosed.py +0 -0
  734. {stacktrace_cli-0.15.0 → stacktrace_cli-0.16.0}/tests/tool_fields.py +0 -0
  735. {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.15.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.7.1
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.15.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 and
255
- Devin sessions alike (Devin CLI and Devin Desktop's local agent). Session collection is
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. Codex is next
260
- ([spec](docs/specs/codex-agent-kind.md)).
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.15.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 and
227
- Devin sessions alike (Devin CLI and Devin Desktop's local agent). Session collection is
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. Codex is next
232
- ([spec](docs/specs/codex-agent-kind.md)).
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(3, minmax(0, 1fr)); gap: 14px; }
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 &middot; 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 Codex today, and what cannot be supported for each agent and why. Codex is read by OpenAIDR 0.7.0's Codex reader.</p>
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.12.0</span>
177
- <span class="chip">OpenAIDR 0.7.0</span>
178
- <span class="chip">OpenACA 0.10.1</span>
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">Updated 2026-10-18</span>
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">&dagger; 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">&dagger; 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 reader design is <code>docs/specs/codex.md</code> in open-agent-security/openaidr.</p>
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
- { f: "Daemon follows live sessions", claude: ["yes"], devin: ["yes"], codex: ["yes"] },
279
- { f: "Sub-agent sessions in a run", claude: ["yes"], devin: ["yes", "Unconfirmed in a signed-in session."], codex: ["yes"] },
280
- { f: "MCP connection evidence", claude: ["yes"], devin: ["partial", "No advertised name or version."], codex: ["partial", "None under codex exec; no endpoint."] },
281
- { f: "Reasoning stage (opt-in)", claude: ["yes"], devin: ["yes"], codex: ["yes"] },
282
- { f: "Findings to Slack and webhooks", claude: ["yes"], devin: ["yes"], codex: ["yes"] },
283
- { f: "Findings to Fleet", claude: ["yes"], devin: ["yes"], codex: ["yes", "Not yet run against a live Fleet."] },
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
- { f: "Cache writes", claude: ["yes"], devin: ["partial", "Provider-dependent."], codex: ["no", "OpenAI reports none."] },
287
- { f: "Reasoning tokens", claude: ["yes"], devin: ["no"], codex: ["yes"] },
288
- { f: "Context window per response", claude: ["yes", "From a model table."], devin: ["partial", "Known for Claude models only."], codex: ["yes", "Recorded by Codex."] },
289
- { f: "Cost findings", claude: ["yes"], devin: ["partial"], codex: ["partial"] },
290
- { f: "Usage to Fleet and org baselines", claude: ["yes"], devin: ["yes"], codex: ["yes"] },
291
- { 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."] },
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
- { f: "Posture findings in Fleet", claude: ["yes"], devin: ["partial", "command-policy-allow held back."], codex: ["partial", "command-policy-allow and project-trust held back."] },
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
- { f: "Usage tab", claude: ["yes"], devin: ["yes"], codex: ["yes"] },
300
- { f: "Refreshes when the agent's configuration changes", claude: ["yes"], devin: ["no"], codex: ["no", "Refreshes on session changes; configuration needs a reload."] },
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
- { f: "Classifies its calls and refusals", claude: ["yes"], devin: ["no"], codex: ["yes"] },
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
- { f: "Playground (stacktrace.ai/playground)", claude: ["yes"], devin: ["no"], codex: ["out", "Out of scope."] },
307
- { f: "Managed policy deployment", claude: ["yes"], devin: ["no"], codex: ["notplanned", "Not planned."] },
308
- { f: "Cloud bootstrap", claude: ["yes", "Claude Code on the web."], devin: ["no"], codex: ["notplanned", "Codex Cloud is not read."] }
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-18, against stacktrace 0.12.0, with the Codex work in
8
- [Codex as an agent kind](specs/codex-agent-kind.md), OpenAIDR 0.7.0 and
9
- OpenACA 0.10.1.*
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.