stacktrace-cli 0.13.0__tar.gz → 0.15.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 (734) hide show
  1. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.github/workflows/guard-staging.yml +13 -6
  2. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/CLAUDE.md +17 -0
  3. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/PKG-INFO +4 -4
  4. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/README.md +1 -1
  5. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0036-deliver-eligible-findings-to-slack-from-the-daemon.md +1 -1
  6. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0073-name-what-fired-and-which-component.md +1 -1
  7. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0083-each-block-reason-is-its-own-rule.md +1 -1
  8. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0086-a-refusal-names-who-answered-the-call.md +1 -1
  9. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0109-a-detection-carries-its-runs-title-and-the-persons-name.md +1 -1
  10. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0112-a-person-is-known-by-the-accounts-on-the-host.md +1 -1
  11. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0118-observe-agents-through-adapters-and-a-shared-analyzer.md +1 -1
  12. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0119-read-sessions-from-an-ai-gateway-and-block-inline.md +1 -1
  13. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0131-activate-hook-policy-without-a-privileged-runtime.md +1 -1
  14. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0133-a-clients-own-error-record-is-a-third-block-channel.md +1 -1
  15. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0135-enforce-policy-through-the-daemon-and-agent-hooks.md +1 -1
  16. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0136-bound-policy-evidence-collection-as-one-bundle.md +1 -1
  17. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0139-remediation-finding-contract.md +1 -1
  18. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0141-two-remediation-models-one-credential-identity-and-a-letters-only-fragment.md +1 -1
  19. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0143-the-plugin-owns-session-hooks-on-every-host.md +1 -1
  20. stacktrace_cli-0.15.0/docs/adrs/0146-eight-rules-send-remediation-targets.md +138 -0
  21. stacktrace_cli-0.15.0/docs/adrs/0147-the-webhook-names-the-run-and-the-person-and-an-egress-label-keeps-its-last-four.md +105 -0
  22. stacktrace_cli-0.15.0/docs/adrs/0148-credential-egress-notifies-at-medium-confidence-when-it-is-high.md +59 -0
  23. stacktrace_cli-0.15.0/docs/adrs/0149-a-credential-switch-replaces-the-mcp-sign-in-rule.md +94 -0
  24. stacktrace_cli-0.15.0/docs/adrs/0150-codex-hooks-use-the-shared-policy-runtime.md +93 -0
  25. stacktrace_cli-0.15.0/docs/adrs/0151-step-one-puts-the-daemon-beside-the-gateway.md +174 -0
  26. stacktrace_cli-0.15.0/docs/adrs/0153-a-gateway-person-reaches-fleet-as-an-account-card.md +62 -0
  27. stacktrace_cli-0.15.0/docs/adrs/0155-a-remote-mcp-servers-exact-url-reaches-fleet.md +69 -0
  28. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/INDEX.md +9 -0
  29. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/agent-support.html +3 -7
  30. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/agent-support.md +4 -6
  31. stacktrace_cli-0.15.0/docs/plans/018-remediation-rules.md +48 -0
  32. stacktrace_cli-0.15.0/docs/plans/019-credential-switch.md +44 -0
  33. stacktrace_cli-0.15.0/docs/releases/v0.14.0.md +66 -0
  34. stacktrace_cli-0.15.0/docs/releases/v0.15.0.md +53 -0
  35. stacktrace_cli-0.15.0/docs/specs/TEMPLATE.md +75 -0
  36. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/codex-agent-kind.md +8 -10
  37. stacktrace_cli-0.15.0/docs/specs/codex-hook-policy.md +182 -0
  38. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/cost-phase-1.md +4 -4
  39. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/detection-policies.md +61 -120
  40. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/detector.md +39 -28
  41. stacktrace_cli-0.15.0/docs/specs/gateway-daemon.md +440 -0
  42. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/notification-delivery.md +2 -1
  43. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/policy-enforcement.md +8 -0
  44. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/remote-sync.md +16 -0
  45. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/trust.md +3 -0
  46. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/README.md +39 -0
  47. stacktrace_cli-0.15.0/infra/guard-staging/images/daemon.sh +47 -0
  48. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/images/envoy/Dockerfile +6 -4
  49. stacktrace_cli-0.15.0/infra/guard-staging/images/envoy/entrypoint.sh +31 -0
  50. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/images/litellm/Dockerfile +1 -1
  51. stacktrace_cli-0.15.0/infra/guard-staging/images/litellm/entrypoint.sh +21 -0
  52. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/main.tf +35 -9
  53. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/outputs.tf +5 -0
  54. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/smoke.sh +33 -1
  55. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/variables.tf +12 -0
  56. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/envoy/envoy.yaml +31 -1
  57. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/e2e/mock_upstream.py +5 -3
  58. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/stacktrace_litellm.py +39 -6
  59. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/pyproject.toml +9 -5
  60. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/__init__.py +1 -1
  61. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/measures.py +2 -2
  62. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/rules.py +1 -1
  63. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/config.py +26 -0
  64. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/costs.py +4 -4
  65. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/fleet.py +29 -1
  66. stacktrace_cli-0.15.0/src/stacktrace/daemon/gateway.py +153 -0
  67. stacktrace_cli-0.15.0/src/stacktrace/daemon/gateway_policy.py +161 -0
  68. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/policy_collect.py +45 -5
  69. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/policy_runtime.py +93 -25
  70. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/presentation.py +8 -0
  71. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/runtime.py +34 -1
  72. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/store.py +46 -1
  73. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/webhook.py +231 -27
  74. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/deterministic.py +550 -525
  75. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/rules.py +14 -10
  76. stacktrace_cli-0.15.0/src/stacktrace/finding_contract.py +553 -0
  77. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/finding_titles.py +9 -20
  78. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/analyzer.py +117 -11
  79. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/check.py +4 -0
  80. stacktrace_cli-0.15.0/src/stacktrace/gateway/principal.py +88 -0
  81. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/service.py +29 -4
  82. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/sink.py +129 -15
  83. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/hooks/claude.py +13 -5
  84. stacktrace_cli-0.15.0/src/stacktrace/hooks/codex.py +84 -0
  85. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/render.py +1 -3
  86. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/app.js +29 -2
  87. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/styles.css +1 -0
  88. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/verdicts.py +26 -9
  89. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/detect_payload.py +34 -2
  90. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/hook_policy.py +52 -7
  91. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/policy_service.py +0 -21
  92. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/policy_show.py +11 -1
  93. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/redact.py +5 -1
  94. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/upload_contract.py +70 -1
  95. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_measures.py +1 -1
  96. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_claude_policy_conformance.py +5 -0
  97. stacktrace_cli-0.15.0/tests/daemon/test_codex_policy_collect_contract.py +86 -0
  98. stacktrace_cli-0.15.0/tests/daemon/test_codex_policy_conformance.py +564 -0
  99. stacktrace_cli-0.15.0/tests/daemon/test_codex_policy_hook.py +125 -0
  100. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_costs.py +7 -7
  101. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_fleet.py +58 -0
  102. stacktrace_cli-0.15.0/tests/daemon/test_gateway.py +375 -0
  103. stacktrace_cli-0.15.0/tests/daemon/test_gateway_fleet.py +131 -0
  104. stacktrace_cli-0.15.0/tests/daemon/test_gateway_person.py +140 -0
  105. stacktrace_cli-0.15.0/tests/daemon/test_gateway_policy.py +372 -0
  106. stacktrace_cli-0.15.0/tests/daemon/test_policy_agent_scopes.py +55 -0
  107. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_collect.py +68 -0
  108. stacktrace_cli-0.15.0/tests/daemon/test_policy_decide.py +94 -0
  109. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_reconcile.py +21 -0
  110. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_store.py +25 -0
  111. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_webhook.py +418 -7
  112. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/fixtures/claude-code-2.1.296-suite/gateway-last-turn.json +2 -2
  113. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/fixtures/claude-code-2.1.296-suite/projects/run/b23c3bab-a677-4b5f-ac36-e132c7df29e5.jsonl +2 -2
  114. stacktrace_cli-0.15.0/tests/gateway/test_envoy_principal.py +37 -0
  115. stacktrace_cli-0.15.0/tests/gateway/test_litellm_through_daemon.py +272 -0
  116. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_parity_live_capture.py +3 -2
  117. stacktrace_cli-0.15.0/tests/gateway/test_principal.py +249 -0
  118. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/feed_harness.mjs +9 -0
  119. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_feed_model.py +13 -0
  120. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_verdicts.py +49 -0
  121. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_contract_is_exhaustive.py +23 -5
  122. stacktrace_cli-0.15.0/tests/remote/test_exact_remote_mcp_url.py +185 -0
  123. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_hook_policy.py +29 -1
  124. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_identity.py +3 -0
  125. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_policy_show.py +9 -0
  126. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_call_status_conventions.py +1 -1
  127. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_blocked.py +9 -9
  128. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_client_errors.py +5 -2
  129. stacktrace_cli-0.15.0/tests/test_detector_credential_switched.py +254 -0
  130. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_names_the_service.py +39 -29
  131. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_new_deterministic.py +508 -1666
  132. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_render.py +2 -2
  133. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_why_it_stopped.py +24 -16
  134. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_evidence_is_dated_not_numbered.py +12 -6
  135. stacktrace_cli-0.15.0/tests/test_finding_contract.py +431 -0
  136. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_kind_conformance.py +3 -0
  137. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_no_agent_kind_is_named.py +9 -1
  138. stacktrace_cli-0.15.0/tests/test_rules_send_remediation_targets.py +201 -0
  139. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_session_identity_is_the_pair.py +22 -0
  140. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_untrusted_content_never_travels.py +32 -16
  141. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/uv.lock +9 -9
  142. stacktrace_cli-0.13.0/infra/guard-staging/images/envoy/entrypoint.sh +0 -13
  143. stacktrace_cli-0.13.0/infra/guard-staging/images/litellm/entrypoint.sh +0 -8
  144. stacktrace_cli-0.13.0/src/stacktrace/finding_contract.py +0 -236
  145. stacktrace_cli-0.13.0/tests/test_finding_contract.py +0 -168
  146. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.agents/skills/release-stacktrace/SKILL.md +0 -0
  147. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.claude/settings.json +0 -0
  148. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.claude/skills/release-stacktrace/SKILL.md +0 -0
  149. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.codex/hooks.json +0 -0
  150. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.github/managed-autofix.md +0 -0
  151. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.github/pull_request_template.md +0 -0
  152. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.github/workflows/bedrock-live.yml +0 -0
  153. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.github/workflows/ci.yml +0 -0
  154. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.github/workflows/publish-pypi.yml +0 -0
  155. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.gitignore +0 -0
  156. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/AGENTS.md +0 -0
  157. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/SECURITY.md +0 -0
  158. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/decision-request.example.json +0 -0
  159. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/decision-request.schema.json +0 -0
  160. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/decision-response.example.json +0 -0
  161. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/decision-response.schema.json +0 -0
  162. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/example.json +0 -0
  163. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/schema.json +0 -0
  164. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0001-session-telemetry-as-input.md +0 -0
  165. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0002-session-collection-in-openaidr.md +0 -0
  166. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0003-runtime-edges.md +0 -0
  167. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0004-three-stage-detector.md +0 -0
  168. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0005-detection-family-and-report-assembly.md +0 -0
  169. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0006-trust-boundary-and-detection-upload.md +0 -0
  170. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0007-proprietary-package-on-open-dependencies.md +0 -0
  171. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0008-console-in-separate-demo-package.md +0 -0
  172. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0010-detection-severity-and-confidence-ladders.md +0 -0
  173. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0011-verdict-cache.md +0 -0
  174. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0012-observation-evidence-kinds-and-transport.md +0 -0
  175. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0013-rule-catalogue-triage-and-per-rule-context.md +0 -0
  176. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0014-declared-project-mapping.md +0 -0
  177. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0015-narrow-the-security-catalogue.md +0 -0
  178. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0016-stall-grouping-is-session-wide.md +0 -0
  179. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0017-a-declined-repeat-is-a-stall.md +0 -0
  180. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0018-remote-sync-config-and-facade-consumption.md +0 -0
  181. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0019-delegated-commands-are-openaca-objects.md +0 -0
  182. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0020-openaca-consumption-boundary.md +0 -0
  183. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0021-two-command-kinds.md +0 -0
  184. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0022-detection-scope-is-a-catalogue-column.md +0 -0
  185. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0023-sync-detect-collects-and-does-not-escalate.md +0 -0
  186. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0024-the-upload-carries-observations.md +0 -0
  187. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0025-a-denied-call-is-activity-never-an-invocation.md +0 -0
  188. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0026-the-console-becomes-a-product-surface.md +0 -0
  189. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0027-a-finding-may-name-what-it-could-not-place.md +0 -0
  190. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0028-the-console-shows-what-it-placed.md +0 -0
  191. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0029-stage-three-returns-to-opt-in.md +0 -0
  192. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0030-a-detection-is-dated-by-the-turns-it-cites.md +0 -0
  193. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0031-one-host-daemon-observes-native-session-logs.md +0 -0
  194. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0032-refresh-daemon-compositions-outside-detection.md +0 -0
  195. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0033-a-third-party-analyzer-only-by-a-flag-that-names-it.md +0 -0
  196. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0034-the-drift-grade-is-read-off-a-run-not-a-call.md +0 -0
  197. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0035-naming-an-analyzer-selects-stored-answers.md +0 -0
  198. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0037-reuse-openaidr-append-cursors-in-the-daemon.md +0 -0
  199. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0038-poll-normalized-sessions-for-supplemental-changes.md +0 -0
  200. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0039-send-usage-telemetry-by-default-with-an-opt-out.md +0 -0
  201. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0041-defer-native-windows-support.md +0 -0
  202. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0042-read-the-build-commit-from-the-install-record.md +0 -0
  203. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0043-name-the-session-agent-and-host-and-count-errors-by-class.md +0 -0
  204. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0044-send-the-build-as-version-prints-it.md +0 -0
  205. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0045-scan-every-session-and-outlive-them.md +0 -0
  206. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0046-the-finding-store-is-an-append-only-queue.md +0 -0
  207. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0047-capture-activity-during-correlation-or-lose-it.md +0 -0
  208. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0048-the-daemon-keeps-a-leveled-content-free-activity-log.md +0 -0
  209. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0056-stop-a-resident-daemon-by-record-and-signal.md +0 -0
  210. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0057-grow-the-queue-schema-additively-and-share-only-the-document.md +0 -0
  211. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0058-one-word-for-a-finding-columns-for-a-counter-and-a-push-that-does-not-wait.md +0 -0
  212. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0059-the-daemon-does-not-decide-whether-it-should-be-running.md +0 -0
  213. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0060-two-upload-postures-not-one-command-with-two-sources.md +0 -0
  214. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0061-the-drain-sends-findings-only.md +0 -0
  215. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0062-hold-the-transition-lock-across-remote-side-effects.md +0 -0
  216. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0063-underbuilt-debt-does-not-hold-the-scan-watermark.md +0 -0
  217. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0064-a-redacted-value-has-one-path-span.md +0 -0
  218. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0065-asset-external-id-resolves-by-a-ladder.md +0 -0
  219. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0066-host-owned-daemon-supervision.md +0 -0
  220. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0067-a-webhook-is-an-independent-queue-subscriber.md +0 -0
  221. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0068-webhooks-retry-the-retained-backlog.md +0 -0
  222. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0069-webhooks-deliver-what-retention-holds.md +0 -0
  223. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0070-package-the-cloud-agent-environment-bootstrap.md +0 -0
  224. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0071-render-the-allowlisted-payload-per-destination.md +0 -0
  225. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0072-host-supervisors-own-daemon-restarts.md +0 -0
  226. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0074-a-window-selects-findings-by-when-they-happened.md +0 -0
  227. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0076-two-phase-detection-pipeline.md +0 -0
  228. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0077-the-bom-job-wakes-once-at-startup-staggered.md +0 -0
  229. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0078-a-seeded-display-prefix-replaces-the-hostname-label.md +0 -0
  230. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0079-the-monitor-page-renders-findings-not-pipeline-health.md +0 -0
  231. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0080-enabling-reasoning-does-not-requeue-the-past.md +0 -0
  232. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0081-reasoning-activation-returns-to-explicit-opt-in.md +0 -0
  233. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0082-monitor-checks-every-installed-component-by-default.md +0 -0
  234. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0084-a-recursive-deletes-evidence-is-the-rm-that-ran.md +0 -0
  235. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0085-show-when-and-which-finding-slack-delivered.md +0 -0
  236. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0087-deploy-compiled-policy-with-a-privileged-scheduled-job.md +0 -0
  237. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0088-slack-alerts-leave-out-confidence.md +0 -0
  238. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0089-infra-gate-reads-commands-not-shell-semantics.md +0 -0
  239. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0090-count-completed-commands-locate-by-ip-send-through-the-managed-proxy.md +0 -0
  240. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0091-mark-our-own-machines-and-name-what-failed.md +0 -0
  241. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0092-cost-is-its-own-rule-family.md +0 -0
  242. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0093-environment-cost-baselines-count-tokens-keyed-by-model.md +0 -0
  243. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0094-estimate-cost-from-tokens-the-agent-figure-is-a-cross-check.md +0 -0
  244. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0095-cost-findings-reach-fleet-each-rule-can-be-muted.md +0 -0
  245. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0096-cost-usage-may-leave-as-token-totals-and-work-identifiers.md +0 -0
  246. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0097-the-daemon-makes-cost-findings-and-the-monitor-reads-them.md +0 -0
  247. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0098-a-run-is-its-main-session.md +0 -0
  248. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0099-cost-is-measured-in-tokens-and-relative-increases.md +0 -0
  249. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0100-the-monitor-runs-offline-for-the-website.md +0 -0
  250. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0101-what-names-a-run-in-fleet.md +0 -0
  251. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0102-token-use-is-never-compared-with-a-providers-usage-api.md +0 -0
  252. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0103-finished-runs-may-leave-as-numbers-for-org-baselines.md +0 -0
  253. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0104-usage-is-its-own-upload.md +0 -0
  254. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0105-an-asset-key-is-a-bare-uuid.md +0 -0
  255. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0106-boot-id-is-salted-with-the-pid-namespace.md +0 -0
  256. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0107-the-daemon-follows-every-kind-openaidr-reads.md +0 -0
  257. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0108-a-kind-renamed-before-any-release-read-it-keeps-no-alias.md +0 -0
  258. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0110-every-kinds-account-comes-from-openaidr.md +0 -0
  259. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0111-built-in-sub-agents-and-skills-come-from-the-bom.md +0 -0
  260. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0113-size-triggers-behaviour-explains-session-cost-carries-reasons.md +0 -0
  261. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0114-similar-sessions-are-the-same-agent-in-the-same-repo.md +0 -0
  262. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0115-usage-states-its-coverage-and-fleet-returns-expected-runs.md +0 -0
  263. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0116-a-component-row-carries-what-its-results-cost-under-one-closed-key.md +0 -0
  264. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0117-a-component-row-on-the-day-of-a-switch-counts-from-the-switch.md +0 -0
  265. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0120-own-the-adapter-event-envelope.md +0 -0
  266. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0121-a-cloud-sessions-runs-are-its-persons-and-a-card-says-where-its-name-came-from.md +0 -0
  267. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0122-use-stacktrace-as-the-python-package.md +0 -0
  268. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0123-the-cloud-boot-hook-brings-the-client-up-to-the-latest-release.md +0 -0
  269. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0124-fleet-imports-core-from-the-stacktrace-distribution.md +0 -0
  270. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0127-the-monitor-shows-weighted-tokens-beside-raw-tokens.md +0 -0
  271. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0128-usage-files-each-response-once-where-it-was-first-filed.md +0 -0
  272. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0129-an-unfinished-response-counts-the-output-it-shows.md +0 -0
  273. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0130-usage-carries-one-hour-cache-writes-and-each-responses-price-class.md +0 -0
  274. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0132-every-usage-page-names-the-store-that-built-it.md +0 -0
  275. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0134-a-secret-sent-to-a-server-configured-as-remote-is-egress.md +0 -0
  276. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0137-a-rule-in-wording-reads-the-same-on-every-surface.md +0 -0
  277. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0138-a-credential-in-a-prompt-travels-as-a-mask-and-a-digest.md +0 -0
  278. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0140-an-untitled-run-names-itself-by-its-first-five-words.md +0 -0
  279. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0142-the-cli-has-no-machine-limit.md +0 -0
  280. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/HOOK-PROMPT.md +0 -0
  281. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/TEMPLATE.md +0 -0
  282. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/cutover-openaca-remote.md +0 -0
  283. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/002-session-input.md +0 -0
  284. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/003-correlation.md +0 -0
  285. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/004-detector.md +0 -0
  286. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/005-remote-sync.md +0 -0
  287. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/006-cli-composition.md +0 -0
  288. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/007-detection-upload.md +0 -0
  289. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/008-monitor.md +0 -0
  290. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/009-reasoning-jev.md +0 -0
  291. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/010-session-daemon.md +0 -0
  292. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/011-daemon-store.md +0 -0
  293. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/012-daemon-scanning.md +0 -0
  294. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/013-daemon-uploads.md +0 -0
  295. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/014-asset-identity.md +0 -0
  296. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/015-managed-policy-deployment.md +0 -0
  297. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/016-cost-phase-1.md +0 -0
  298. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/017-cost-phase-2.md +0 -0
  299. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.0.1.md +0 -0
  300. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.1.0.md +0 -0
  301. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.10.0.md +0 -0
  302. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.11.0.md +0 -0
  303. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.12.0.md +0 -0
  304. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.13.0.md +0 -0
  305. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.2.0.md +0 -0
  306. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.2.1.md +0 -0
  307. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.2.2.md +0 -0
  308. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.2.3.md +0 -0
  309. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.3.0.md +0 -0
  310. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.3.1.md +0 -0
  311. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.4.0.md +0 -0
  312. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.4.1.md +0 -0
  313. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.5.0.md +0 -0
  314. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.5.1.md +0 -0
  315. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.5.2.md +0 -0
  316. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.5.3.md +0 -0
  317. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.6.0.md +0 -0
  318. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.6.1.md +0 -0
  319. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.7.0.md +0 -0
  320. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.7.1.md +0 -0
  321. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.8.0.md +0 -0
  322. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.9.0.md +0 -0
  323. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/research/001-intent-drift-metric.md +0 -0
  324. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/agent-observability.md +0 -0
  325. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/aidr.md +0 -0
  326. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/cli-composition.md +0 -0
  327. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/correlation.md +0 -0
  328. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/cost-notifications.md +0 -0
  329. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/cost-phase-2.md +0 -0
  330. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/cost.md +0 -0
  331. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/daemon-scanning.md +0 -0
  332. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/daemon-store.md +0 -0
  333. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/daemon-uploads.md +0 -0
  334. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/detection-upload.md +0 -0
  335. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/event-time.md +0 -0
  336. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/hook-policy-rollout.md +0 -0
  337. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/managed-policy-deployment.md +0 -0
  338. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/monitor-inventory.md +0 -0
  339. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/monitor.md +0 -0
  340. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/plugin-installation.md +0 -0
  341. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/production-agent-observability.md +0 -0
  342. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/reasoning-jev.md +0 -0
  343. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/session-input.md +0 -0
  344. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/usage-upload.md +0 -0
  345. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/examples/observations/custom_agent.py +0 -0
  346. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/README.md +0 -0
  347. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/bedrock-sandbox/.gitignore +0 -0
  348. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/bedrock-sandbox/ci.tf +0 -0
  349. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/bedrock-sandbox/main.tf +0 -0
  350. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/bedrock-sandbox/outputs.tf +0 -0
  351. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/bedrock-sandbox/variables.tf +0 -0
  352. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/.gitignore +0 -0
  353. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/check.sh +0 -0
  354. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/ci.tf +0 -0
  355. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/connect.sh +0 -0
  356. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/images/envoy/litellm.yaml +0 -0
  357. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/images/litellm/config.subscription.yaml +0 -0
  358. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/images/litellm/config.yaml +0 -0
  359. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/moved.tf +0 -0
  360. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/user-key.sh +0 -0
  361. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/modules/express-gateway/main.tf +0 -0
  362. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/modules/express-gateway/outputs.tf +0 -0
  363. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/modules/express-gateway/variables.tf +0 -0
  364. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/e2e/claude.sh +0 -0
  365. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/e2e/scenarios.sh +0 -0
  366. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/envoy/run.sh +0 -0
  367. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/README.md +0 -0
  368. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/config.example.yaml +0 -0
  369. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/config.subscription.yaml +0 -0
  370. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/e2e/config.baseten.yaml +0 -0
  371. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/e2e/config.mock.yaml +0 -0
  372. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/e2e/parity.py +0 -0
  373. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/stacktrace_keys.py +0 -0
  374. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/scripts/cost_latency.py +0 -0
  375. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/scripts/git-hooks/pre-push +0 -0
  376. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/scripts/install-hooks.sh +0 -0
  377. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/__main__.py +0 -0
  378. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/analysis.py +0 -0
  379. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/build.py +0 -0
  380. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cli.py +0 -0
  381. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cloud/__init__.py +0 -0
  382. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cloud/boot.py +0 -0
  383. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cloud/profile.py +0 -0
  384. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cloud/setup.sh +0 -0
  385. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/core/__init__.py +0 -0
  386. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/core/observations.py +0 -0
  387. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/__init__.py +0 -0
  388. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/acquire.py +0 -0
  389. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/composition.py +0 -0
  390. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/join.py +0 -0
  391. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/observed.py +0 -0
  392. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/orchestrate.py +0 -0
  393. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/project_map.py +0 -0
  394. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/record.py +0 -0
  395. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/render.py +0 -0
  396. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/__init__.py +0 -0
  397. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/baseline.py +0 -0
  398. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/clock.py +0 -0
  399. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/component_usage.py +0 -0
  400. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/components.py +0 -0
  401. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/copies.py +0 -0
  402. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/evidence.py +0 -0
  403. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/ledger.py +0 -0
  404. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/models.py +0 -0
  405. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/org_baselines.py +0 -0
  406. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/output.py +0 -0
  407. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/price_class.py +0 -0
  408. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/reasons.py +0 -0
  409. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/runs.py +0 -0
  410. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/tokens.py +0 -0
  411. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/totals.py +0 -0
  412. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/usage.py +0 -0
  413. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/weights.py +0 -0
  414. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/__init__.py +0 -0
  415. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/accounts.py +0 -0
  416. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/activity_log.py +0 -0
  417. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/bom.py +0 -0
  418. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/cli.py +0 -0
  419. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/client.py +0 -0
  420. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/composition.py +0 -0
  421. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/db.py +0 -0
  422. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/identity.py +0 -0
  423. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/jobs.py +0 -0
  424. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/lifecycle.py +0 -0
  425. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/observer.py +0 -0
  426. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/paths.py +0 -0
  427. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/policy_inputs.py +0 -0
  428. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/protocol.py +0 -0
  429. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/scan.py +0 -0
  430. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/server.py +0 -0
  431. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/service.py +0 -0
  432. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/usage.py +0 -0
  433. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/__init__.py +0 -0
  434. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/analyzer.py +0 -0
  435. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/blocked.py +0 -0
  436. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/cache.py +0 -0
  437. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/finding.py +0 -0
  438. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/history.py +0 -0
  439. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/jev.py +0 -0
  440. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/personal_data.py +0 -0
  441. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/priors.py +0 -0
  442. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/__init__.py +0 -0
  443. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/jev-v1/stacktrace-deceptive-completion.json +0 -0
  444. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/jev-v2/stacktrace-deceptive-completion.json +0 -0
  445. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/jev-v2/stacktrace-infra-unsafe-action.json +0 -0
  446. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/jev-v3/stacktrace-deceptive-completion.json +0 -0
  447. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/jev-v3/stacktrace-infra-unsafe-action.json +0 -0
  448. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/v1/exclusions.md +0 -0
  449. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/v1/framing.md +0 -0
  450. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/v1/stacktrace-deceptive-completion.md +0 -0
  451. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/reasoning.py +0 -0
  452. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/render.py +0 -0
  453. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/run.py +0 -0
  454. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/secrets.py +0 -0
  455. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/verdict.py +0 -0
  456. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/windows.py +0 -0
  457. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/__init__.py +0 -0
  458. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/cli.py +0 -0
  459. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/exchange.py +0 -0
  460. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/__init__.py +0 -0
  461. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/_json.py +0 -0
  462. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/anthropic.py +0 -0
  463. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/bedrock.py +0 -0
  464. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/body.py +0 -0
  465. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/openai_chat.py +0 -0
  466. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/openai_responses.py +0 -0
  467. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/session.py +0 -0
  468. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/hooks/__init__.py +0 -0
  469. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/hooks/session.py +0 -0
  470. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/__init__.py +0 -0
  471. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/costs.py +0 -0
  472. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/inventory.py +0 -0
  473. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/offline.py +0 -0
  474. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/reasoning.py +0 -0
  475. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/server.py +0 -0
  476. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/apple-icon.png +0 -0
  477. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/cost.js +0 -0
  478. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/favicon.ico +0 -0
  479. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/fonts/OFL.txt +0 -0
  480. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/fonts/dm-mono-400-latin.woff2 +0 -0
  481. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/fonts/dm-mono-500-latin.woff2 +0 -0
  482. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/fonts/dm-sans-latin.woff2 +0 -0
  483. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/fonts/playfair-display-600-italic-latin.woff2 +0 -0
  484. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/icon.svg +0 -0
  485. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/index.html +0 -0
  486. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/inventory.js +0 -0
  487. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/state.py +0 -0
  488. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/watch.py +0 -0
  489. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/options.py +0 -0
  490. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/policy_display.py +0 -0
  491. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/private_state.py +0 -0
  492. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/py.typed +0 -0
  493. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/__init__.py +0 -0
  494. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/cli.py +0 -0
  495. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/client.py +0 -0
  496. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/config.py +0 -0
  497. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/identity.py +0 -0
  498. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/payload.py +0 -0
  499. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/policy.py +0 -0
  500. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/policy_worker.py +0 -0
  501. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/spool.py +0 -0
  502. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/sync.py +0 -0
  503. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/sync_detect.py +0 -0
  504. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sdk.py +0 -0
  505. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/__init__.py +0 -0
  506. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/access.py +0 -0
  507. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/entrypoint.py +0 -0
  508. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/index.py +0 -0
  509. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/lineage.py +0 -0
  510. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/outcome.py +0 -0
  511. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/protocols.py +0 -0
  512. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/render.py +0 -0
  513. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/telemetry/__init__.py +0 -0
  514. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/telemetry/cli.py +0 -0
  515. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/telemetry/events.py +0 -0
  516. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/telemetry/posthog.py +0 -0
  517. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/telemetry/state.py +0 -0
  518. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/webhook/__init__.py +0 -0
  519. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/webhook/cli.py +0 -0
  520. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/webhook/config.py +0 -0
  521. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/__init__.py +0 -0
  522. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/agent_bom_fixture.py +0 -0
  523. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/conftest.py +0 -0
  524. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/__init__.py +0 -0
  525. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/fakes.py +0 -0
  526. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/scenarios.py +0 -0
  527. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_as_of_cuts_every_timed_collection.py +0 -0
  528. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_baseline.py +0 -0
  529. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_clock.py +0 -0
  530. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_component_usage.py +0 -0
  531. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_components.py +0 -0
  532. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_copies.py +0 -0
  533. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_cost_evidence_travels.py +0 -0
  534. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_cost_findings_are_dated_by_their_citations.py +0 -0
  535. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_cost_findings_carry_no_session_text.py +0 -0
  536. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_cost_is_tokens.py +0 -0
  537. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_cost_latency.py +0 -0
  538. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_evidence.py +0 -0
  539. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_ledger.py +0 -0
  540. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_models.py +0 -0
  541. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_org_baselines.py +0 -0
  542. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_output.py +0 -0
  543. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_price_class.py +0 -0
  544. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_reasons.py +0 -0
  545. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_rules_baseline.py +0 -0
  546. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_runs.py +0 -0
  547. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_totals.py +0 -0
  548. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_unfinished_output_counts_what_it_shows.py +0 -0
  549. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_usage.py +0 -0
  550. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_weights.py +0 -0
  551. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/__init__.py +0 -0
  552. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/observing.py +0 -0
  553. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_accounts.py +0 -0
  554. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_activity_log.py +0 -0
  555. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_claude_policy_hook.py +0 -0
  556. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_cli.py +0 -0
  557. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_client.py +0 -0
  558. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_composition.py +0 -0
  559. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_config.py +0 -0
  560. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_cost_guidance.py +0 -0
  561. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_db.py +0 -0
  562. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_detection_needs_no_subscriber.py +0 -0
  563. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_identity.py +0 -0
  564. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_job_thread.py +0 -0
  565. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_jobs.py +0 -0
  566. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_lifecycle.py +0 -0
  567. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_observer.py +0 -0
  568. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_collect_contract.py +0 -0
  569. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_hook_transport.py +0 -0
  570. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_inputs.py +0 -0
  571. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_runtime.py +0 -0
  572. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_socket.py +0 -0
  573. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_queue_reader.py +0 -0
  574. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_runtime.py +0 -0
  575. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_scan.py +0 -0
  576. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_service.py +0 -0
  577. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_session_cost_notices.py +0 -0
  578. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_socket.py +0 -0
  579. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_stage_times.py +0 -0
  580. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_subagent_routing.py +0 -0
  581. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_the_drained_payload_is_the_cold_one.py +0 -0
  582. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_the_stored_row_is_sufficient.py +0 -0
  583. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_usage.py +0 -0
  584. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_usage_store.py +0 -0
  585. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_wire_frames_are_bounded.py +0 -0
  586. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/detector_session_fixture.py +0 -0
  587. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/__init__.py +0 -0
  588. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_analyzer.py +0 -0
  589. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_bodies_and_logs.py +0 -0
  590. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_call_records.py +0 -0
  591. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_check.py +0 -0
  592. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_every_choice_is_read.py +0 -0
  593. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_every_read_field_is_validated.py +0 -0
  594. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_every_shortfall_is_a_recorded_fallback.py +0 -0
  595. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_gateway_keys.py +0 -0
  596. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_gateway_scripts.py +0 -0
  597. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_litellm_stream.py +0 -0
  598. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_litellm_subscription_config.py +0 -0
  599. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_service.py +0 -0
  600. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_session.py +0 -0
  601. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_unstated_outcomes.py +0 -0
  602. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/__init__.py +0 -0
  603. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/cost_harness.mjs +0 -0
  604. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/inventory_harness.mjs +0 -0
  605. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_cost_page.py +0 -0
  606. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_cost_range_switch.py +0 -0
  607. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_inventory.py +0 -0
  608. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_inventory_page.py +0 -0
  609. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_offline.py +0 -0
  610. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_reasoning_gates.py +0 -0
  611. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_render.py +0 -0
  612. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_render_cost.py +0 -0
  613. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_server.py +0 -0
  614. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_site_assets.py +0 -0
  615. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_state.py +0 -0
  616. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_watch.py +0 -0
  617. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/observations/test_contract.py +0 -0
  618. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/observations/test_decisions.py +0 -0
  619. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/observations/test_event_envelope.py +0 -0
  620. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/__init__.py +0 -0
  621. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/helpers.py +0 -0
  622. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_cli.py +0 -0
  623. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_client.py +0 -0
  624. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_cloud_boot_updates_the_client.py +0 -0
  625. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_cloud_session.py +0 -0
  626. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_cloud_setup_asset_id.py +0 -0
  627. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_config.py +0 -0
  628. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_activity.py +0 -0
  629. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_cli.py +0 -0
  630. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_client.py +0 -0
  631. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_gate_matches_the_cloud.py +0 -0
  632. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_layers_compose.py +0 -0
  633. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_payload_reaches_the_cloud_model.py +0 -0
  634. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_redaction.py +0 -0
  635. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_spool.py +0 -0
  636. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_upload_contract.py +0 -0
  637. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_wire_payload.py +0 -0
  638. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_facade_contract.py +0 -0
  639. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_no_local_path_survives_redaction.py +0 -0
  640. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_payload.py +0 -0
  641. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_policy.py +0 -0
  642. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_policy_service.py +0 -0
  643. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_policy_service_cli.py +0 -0
  644. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_redact_payload.py +0 -0
  645. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_seam.py +0 -0
  646. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_session_registration.py +0 -0
  647. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_spool.py +0 -0
  648. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_sync.py +0 -0
  649. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_sync_detect.py +0 -0
  650. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_upload_contract.py +0 -0
  651. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_usage_client.py +0 -0
  652. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_usage_contract.py +0 -0
  653. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_user_install_profile.py +0 -0
  654. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/sdk/test_observation_client.py +0 -0
  655. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/__init__.py +0 -0
  656. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_activity_log.py +0 -0
  657. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_cli.py +0 -0
  658. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_events.py +0 -0
  659. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_every_derived_site.py +0 -0
  660. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_every_internal_save_is_reported.py +0 -0
  661. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_hooks.py +0 -0
  662. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_release_gate.py +0 -0
  663. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_state.py +0 -0
  664. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_uploader.py +0 -0
  665. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_acquire.py +0 -0
  666. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_adr_cross_references_are_reciprocal.py +0 -0
  667. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_agent_instance_id.py +0 -0
  668. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_agent_support_doc.py +0 -0
  669. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_analysis.py +0 -0
  670. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_bom_shape.py +0 -0
  671. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_build_commit.py +0 -0
  672. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_cli.py +0 -0
  673. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_composition.py +0 -0
  674. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_correlate_orchestrate.py +0 -0
  675. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_correlate_render.py +0 -0
  676. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_correlated_session.py +0 -0
  677. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detection_components.py +0 -0
  678. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detection_event_time.py +0 -0
  679. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detection_subject.py +0 -0
  680. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_analyzer_contract.py +0 -0
  681. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_analyzer_live.py +0 -0
  682. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_cache.py +0 -0
  683. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_credential_in_prompt.py +0 -0
  684. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_declared_egress.py +0 -0
  685. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_deterministic.py +0 -0
  686. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_end_to_end.py +0 -0
  687. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_finding.py +0 -0
  688. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_history.py +0 -0
  689. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_infra_reasoning.py +0 -0
  690. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_jev.py +0 -0
  691. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_personal_data.py +0 -0
  692. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_pii_in_prompt.py +0 -0
  693. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_priors.py +0 -0
  694. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_prompts.py +0 -0
  695. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_reasoning.py +0 -0
  696. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_run.py +0 -0
  697. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_secrets.py +0 -0
  698. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_verdict.py +0 -0
  699. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_vulnerable_dep_invoked.py +0 -0
  700. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_windows.py +0 -0
  701. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_entrypoint_conventions.py +0 -0
  702. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_fingerprint_covers_what_the_analyzer_reads.py +0 -0
  703. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_help_sections.py +0 -0
  704. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_join.py +0 -0
  705. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_monitor_cli.py +0 -0
  706. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_no_live_document_states_the_old_stage_three_default.py +0 -0
  707. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_no_test_undoes_every_patch_at_once.py +0 -0
  708. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_observed.py +0 -0
  709. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_one_wording_per_rule.py +0 -0
  710. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_openaca_contract.py +0 -0
  711. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_openaidr_contract.py +0 -0
  712. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_option_arity_matches_the_binary.py +0 -0
  713. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_project_map.py +0 -0
  714. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_python_namespace.py +0 -0
  715. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_readme_examples_are_real_output.py +0 -0
  716. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_release_gate_coverage.py +0 -0
  717. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_release_readiness.py +0 -0
  718. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_seam_boundary.py +0 -0
  719. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_sessions_access.py +0 -0
  720. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_sessions_end_to_end.py +0 -0
  721. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_sessions_protocol_typing.py +0 -0
  722. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_sessions_protocols.py +0 -0
  723. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_sessions_render.py +0 -0
  724. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_shell_separators_match_the_shell.py +0 -0
  725. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_signed_in_asks_the_agent.py +0 -0
  726. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_stored_verdicts_are_never_gated_on_reasoning.py +0 -0
  727. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_the_detector_spec_lists_the_shipped_catalogue.py +0 -0
  728. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_the_jev_spec_states_the_shipped_thresholds.py +0 -0
  729. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_the_locality_claim_is_qualified_everywhere.py +0 -0
  730. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_title_disclosure_invariant.py +0 -0
  731. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_verification_subcommands_match_the_binary.py +0 -0
  732. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_what_jev_is_told_is_what_was_disclosed.py +0 -0
  733. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/tool_fields.py +0 -0
  734. {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/webhook/test_cli.py +0 -0
@@ -9,7 +9,8 @@ name: guard-staging
9
9
  # litellm-staging environment: AWS_DEPLOY_ROLE_ARN, ECR_REPOSITORY_URL,
10
10
  # ENVOY_ECR_REPOSITORY_URL, SUBSCRIPTION_ECR_REPOSITORY_URL, ECS_CLUSTER,
11
11
  # ECS_SERVICE, ENVOY_SERVICE, SUBSCRIPTION_SERVICE, LOG_GROUP, MASTER_KEY_SECRET,
12
- # STAGING_ENDPOINT, ENVOY_ENDPOINT, SUBSCRIPTION_ENDPOINT, GUARD_MODE.
12
+ # STAGING_ENDPOINT, ENVOY_ENDPOINT, SUBSCRIPTION_ENDPOINT, GUARD_MODE, and
13
+ # GATEWAY_DAEMON=1 once tofu runs with fleet_enrollment = true (ADR-0151).
13
14
 
14
15
  on:
15
16
  workflow_dispatch:
@@ -128,16 +129,22 @@ jobs:
128
129
  env:
129
130
  MODE: ${{ vars.GUARD_MODE }}
130
131
  LOG_GROUP: ${{ vars.LOG_GROUP }}
132
+ # 1: each task runs the enrolled daemon, and the smoke test checks that
133
+ # the rm finding reached Fleet through it (infra/guard-staging/smoke.sh).
134
+ DAEMON: ${{ vars.GATEWAY_DAEMON }}
131
135
  run: |
132
136
  MASTER_KEY=$(aws secretsmanager get-secret-value --secret-id "${{ vars.MASTER_KEY_SECRET }}" \
133
137
  --query SecretString --output text)
134
138
  echo "::add-mask::$MASTER_KEY"
135
139
  fail=0
136
- for endpoint in "${{ vars.STAGING_ENDPOINT }}" "${{ vars.ENVOY_ENDPOINT }}"; do
137
- echo "== $endpoint"
138
- ENDPOINT="$endpoint" MASTER_KEY="$MASTER_KEY" infra/guard-staging/smoke.sh || fail=1
139
- done
140
+ # Each service logs under its own stream prefix (infra/guard-staging/main.tf).
141
+ echo "== ${{ vars.STAGING_ENDPOINT }}"
142
+ ENDPOINT="${{ vars.STAGING_ENDPOINT }}" MASTER_KEY="$MASTER_KEY" LOG_STREAM_PREFIX=litellm \
143
+ infra/guard-staging/smoke.sh || fail=1
144
+ echo "== ${{ vars.ENVOY_ENDPOINT }}"
145
+ ENDPOINT="${{ vars.ENVOY_ENDPOINT }}" MASTER_KEY="$MASTER_KEY" LOG_STREAM_PREFIX=envoy \
146
+ infra/guard-staging/smoke.sh || fail=1
140
147
  echo "== ${{ vars.SUBSCRIPTION_ENDPOINT }} (subscription)"
141
148
  ENDPOINT="${{ vars.SUBSCRIPTION_ENDPOINT }}" MASTER_KEY="$MASTER_KEY" SUBSCRIPTION=1 \
142
- infra/guard-staging/smoke.sh || fail=1
149
+ LOG_STREAM_PREFIX=subscription infra/guard-staging/smoke.sh || fail=1
143
150
  exit $fail
@@ -129,6 +129,23 @@ nothing about detection.
129
129
  `tests/monitor/test_render_cost.py`. When reviews keep re-arguing scope (a
130
130
  time boundary, which sessions a rule reads), write the answer into the spec,
131
131
  as `docs/specs/cost-phase-1.md` §1 "What a rule reads, and when" does.
132
+ - Write an ADR only in a `/kind feature` PR. Bug fixes, cleanups, wording changes
133
+ and UI changes get no ADR.
134
+ - A spec holds the design. An ADR holds one decision and its rejected alternatives.
135
+ Keep the Decision section of an ADR short. Write one paragraph, or a short
136
+ numbered list of choices. Put commands, flags, failure behavior and test plans
137
+ in the spec.
138
+ - The specs in `docs/specs/` describe components and change with them. A feature
139
+ that changes a component updates the spec of that component in the same PR. A
140
+ feature that adds a component adds a new spec. Start a new spec from
141
+ `docs/specs/TEMPLATE.md`.
142
+ - Write or update the spec first. Then write ADRs for the decisions whose rejected
143
+ alternative is plausible. List those ADRs in a "Decisions" table in the spec.
144
+ Link each ADR to the spec section that has the detail.
145
+ - Do not write "This spec implements ADR-NNNN". The spec is the source of the
146
+ design.
147
+ - Before a multi-step implementation plan, write the spec and its ADRs. The plan
148
+ references them. A plan is not a substitute for either.
132
149
 
133
150
  ## Adding a command
134
151
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: stacktrace-cli
3
- Version: 0.13.0
3
+ Version: 0.15.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>
@@ -20,8 +20,8 @@ Classifier: Topic :: Security
20
20
  Requires-Python: >=3.11
21
21
  Requires-Dist: click>=8.1
22
22
  Requires-Dist: httpx<1.0.dev0,>=0.28.1
23
- Requires-Dist: openaca==0.11.0
24
- Requires-Dist: openaidr==0.7.0
23
+ Requires-Dist: openaca==0.12.0
24
+ Requires-Dist: openaidr==0.7.1
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.13.0
55
+ stacktrace 0.15.0
56
56
  ```
57
57
 
58
58
  ## Python package namespace
@@ -24,7 +24,7 @@ Requires Python 3.11 or newer.
24
24
 
25
25
  ```console
26
26
  $ stacktrace --version
27
- stacktrace 0.13.0
27
+ stacktrace 0.15.0
28
28
  ```
29
29
 
30
30
  ## Python package namespace
@@ -6,7 +6,7 @@ date: 2026-09-20
6
6
  supersedes: null
7
7
  superseded-by: null
8
8
  amends: 0031
9
- amended-by: 0067
9
+ amended-by: 0067, 0148
10
10
  ---
11
11
 
12
12
  Subsystem: the daemon and its delivery sinks. The integration view across the
@@ -6,7 +6,7 @@ date: 2026-09-26
6
6
  supersedes: null
7
7
  superseded-by: null
8
8
  amends: 0067, 0071
9
- amended-by: 0084, 0085, 0138
9
+ amended-by: 0084, 0085, 0138, 0147, 0149
10
10
  ---
11
11
 
12
12
  ## Context
@@ -6,7 +6,7 @@ date: 2026-09-30
6
6
  supersedes: null
7
7
  superseded-by: null
8
8
  amends: 0039
9
- amended-by: null
9
+ amended-by: 0146
10
10
  ---
11
11
 
12
12
  ## Context
@@ -6,7 +6,7 @@ date: 2026-10-01
6
6
  supersedes: null
7
7
  superseded-by: null
8
8
  amends: 0006, 0027
9
- amended-by: null
9
+ amended-by: 0146, 0149
10
10
  ---
11
11
 
12
12
  ## Context
@@ -6,7 +6,7 @@ date: 2026-10-11
6
6
  supersedes: null
7
7
  superseded-by: null
8
8
  amends: 0006, 0096, 0101
9
- amended-by: 0110, 0112, 0140
9
+ amended-by: 0110, 0112, 0140, 0147
10
10
  ---
11
11
 
12
12
  ## Context
@@ -6,7 +6,7 @@ date: 2026-10-11
6
6
  supersedes: null
7
7
  superseded-by: null
8
8
  amends: 0101, 0109, 0110
9
- amended-by: 0121
9
+ amended-by: 0121, 0153
10
10
  ---
11
11
 
12
12
  ## Context
@@ -6,7 +6,7 @@ date: 2026-10-11
6
6
  supersedes: null
7
7
  superseded-by: null
8
8
  amends: 0001, 0004, 0006, 0031, 0061
9
- amended-by: 0135
9
+ amended-by: 0135, 0151
10
10
  ---
11
11
 
12
12
  ## Context
@@ -6,7 +6,7 @@ date: 2026-10-10
6
6
  supersedes: null
7
7
  superseded-by: null
8
8
  amends: null
9
- amended-by: null
9
+ amended-by: 0151
10
10
  ---
11
11
 
12
12
  ## Context
@@ -6,7 +6,7 @@ date: 2026-10-16
6
6
  supersedes: null
7
7
  superseded-by: null
8
8
  amends: 0018, 0090, 0135
9
- amended-by: 0143
9
+ amended-by: 0143, 0150
10
10
  ---
11
11
 
12
12
  ## Context
@@ -6,7 +6,7 @@ date: 2026-10-16
6
6
  supersedes: null
7
7
  superseded-by: null
8
8
  amends: null
9
- amended-by: null
9
+ amended-by: 0146
10
10
  ---
11
11
 
12
12
  ## Context
@@ -6,7 +6,7 @@ date: 2026-09-29
6
6
  supersedes: null
7
7
  superseded-by: null
8
8
  amends: 0031, 0118
9
- amended-by: 0136, 0131, 0143
9
+ amended-by: 0136, 0131, 0143, 0150
10
10
  ---
11
11
 
12
12
  ## Context
@@ -6,7 +6,7 @@ date: 2026-10-16
6
6
  supersedes: null
7
7
  superseded-by: null
8
8
  amends: 0020, 0135
9
- amended-by: 0143
9
+ amended-by: 0143, 0150
10
10
  ---
11
11
 
12
12
  ## Context
@@ -4,7 +4,7 @@ title: Rules declare remediation grouping and shared presentation
4
4
  status: proposed
5
5
  date: 2026-10-17
6
6
  amends: 0006, 0024
7
- amended-by: 0141
7
+ amended-by: 0141, 0146
8
8
  ---
9
9
 
10
10
  ## Context
@@ -6,7 +6,7 @@ date: 2026-10-18
6
6
  supersedes: null
7
7
  superseded-by: null
8
8
  amends: 0139, 0140
9
- amended-by: null
9
+ amended-by: 0146, 0147
10
10
  ---
11
11
 
12
12
  ## Context
@@ -6,7 +6,7 @@ date: 2026-10-18
6
6
  supersedes: null
7
7
  superseded-by: null
8
8
  amends: 0070, 0072, 0123, 0131, 0135, 0136
9
- amended-by: null
9
+ amended-by: 0150
10
10
  ---
11
11
 
12
12
  ## Context
@@ -0,0 +1,138 @@
1
+ ---
2
+ id: 0146
3
+ title: Eight more rules send remediation targets, one target kind for each rule
4
+ status: proposed
5
+ date: 2026-10-18
6
+ supersedes: null
7
+ superseded-by: null
8
+ amends: 0083, 0086, 0133, 0139, 0141
9
+ amended-by: 0149
10
+ ---
11
+
12
+ ## Context
13
+
14
+ ADR-0139 gave two rules a list of `finding_targets`: credential egress and
15
+ vulnerable packages. Fleet groups each by its target, and every channel shows
16
+ one title for it. ADR-0141 says to decide the model for any other rule in its
17
+ own ADR.
18
+
19
+ A customer could not read Fleet's finding page for the other rules. The
20
+ product owner reviewed a catalogue of every rule on 2026-10-18. It gave each
21
+ rule a title, an explanation, a fix, more detail and a grouping by its fix.
22
+ The product owner then gave these decisions:
23
+
24
+ - Move eight rules to the framework.
25
+ - Report a recursive delete only when it is `high`.
26
+ - Read `~` and `$HOME` in a delete.
27
+ - Remove the Publishing rule.
28
+ - Leave the infrastructure, completion and cost rules as they are.
29
+
30
+ ## Decision
31
+
32
+ 1. **Eight rules send `finding_targets`.** Each rule has one target kind of its
33
+ own. `KIND_RULES` in `finding_contract.py` maps each kind to its rule.
34
+ `KIND_FIELDS` names the fields that each kind carries. The contract refuses
35
+ a target that sets a field of another kind.
36
+
37
+ | Rule | Kind | Fields | Groups by | Title |
38
+ | --- | --- | --- | --- | --- |
39
+ | `credential-persisted` | `stored_credential` | fingerprint, mask, credential kind | kind, fingerprint | Credential written to a file: **{mask}** |
40
+ | `destructive-action` | `deleted_folder` | span, folder | kind, span | Recursive delete removed **{folder}** |
41
+ | `mcp-transient-failure` | `mcp_signin` | service | kind, service | MCP sign-in failed, then recovered: **{service}** |
42
+ | `blocked-quota` | `spend_limit` | account | kind, account | Spend limit reached |
43
+ | `blocked-policy` | `safety_check` | session id, service | kind, session id | **{service}** stopped the agent |
44
+ | `blocked-throttled` | `rate_limit` | service, status | kind, service, status | Rate limited by **{service}** |
45
+ | `blocked-upstream` | `access_denied` | service, status | kind, service, status | Access denied by **{service}** |
46
+ | `tool-retry-storm` | `retried_call` | service, attempts | kind, service | **{service}** retried without change |
47
+
48
+ 2. **A new key includes its kind.** A credential that is both sent and stored
49
+ then has two keys. Fleet finds a group's name by its key alone. The keys of
50
+ the first two kinds do not change, so their groups keep their history.
51
+
52
+ 3. **A target names no path and no session text.**
53
+ - `folder` is one of four fixed words: `root`, `workspace`, `system` and
54
+ `home`. The paths stay in the evidence `kind` (ADR-0084), and redaction
55
+ cleans them on upload.
56
+ - `service` is the call's `_outside_target` without the tool name. A
57
+ block that the client reports in a reply names `the model provider`. A
58
+ call with no target names `an unnamed service`. A retried call keeps the
59
+ tool name, as its citation does. A safety check names `A safety check`
60
+ or `An automatic approval reviewer`. This amends ADR-0086 for this field
61
+ only, with the same shape rules.
62
+ - `status` is `401`, `403`, `429`, `529` or empty.
63
+ - `account` is the run's `session.account` (ADR-0112). The upload adds it.
64
+ A run with no account sends no `spend_limit` target. Fleet never shows
65
+ the account.
66
+ - `session_id` is the finding's own session. `span` is a span that the
67
+ finding cites.
68
+
69
+ 4. **The explanation and the fix follow the status.** A 401 says that the
70
+ service rejected the sign-in, and the fix is to sign in again. A 403 says
71
+ that the service denied access, and the fix is to grant the permission.
72
+ A 529 says that the provider was overloaded, and there is no limit to raise.
73
+
74
+ 5. **A rule can have no fix.** A retried call has an empty remediation. Every
75
+ channel then leaves out the Remediation section.
76
+
77
+ 6. **A title counts several targets with the rule's own noun.** `title_for`
78
+ moves into `finding_contract.py`. Fleet's list, detail page and Slack then
79
+ use the client's title. This amends ADR-0141 clauses 4 and 6.
80
+
81
+ 7. **A block's remediation states the fix and nothing about one session.**
82
+ Fleet groups many sessions under one fix. The count of events, a repeated
83
+ reply, and whether the session ended on the block move to the target's
84
+ reasons. Each channel shows them under More Detail for that occurrence. The
85
+ title of a Codex approval reviewer comes from the target, not from the
86
+ notice. This amends ADR-0083 and ADR-0133.
87
+
88
+ 8. **`destructive-action` reports a `high` delete only.** A delete near the
89
+ workspace (`medium`) or deep in another tree (`low`) is not a finding. The
90
+ rule reads `~`, `~/...`, `$HOME` and `${HOME}` against the home folder
91
+ that the workspace path shows: `/Users/<name>`, `/home/<name>` or `/root`.
92
+ With no such home folder, the rule declines the target, as before.
93
+
94
+ 9. **`stacktrace-unrequested-publication` is removed.** No stage ran its gate.
95
+ It moves to `RETIRED_SCOPES` with the scope `call`.
96
+
97
+ ## Alternatives considered
98
+
99
+ - **Keep the `credential` kind for a stored credential.** Rejected. The rule
100
+ comes from the kind, and Fleet checks that each target belongs to its rule.
101
+ - **Put the deleted path in the target.** Rejected. The client builds the
102
+ title before redaction, and nothing redacts a target. Fleet would get a raw
103
+ path, and the Monitor and Fleet titles would differ.
104
+ - **Group a delete by host and path.** Rejected because the path does not
105
+ travel. A delete groups by its call. Each delete needs its own restore.
106
+ - **Name the account in the spend limit title.** Rejected. The account is an
107
+ opaque id (ADR-0112). Fleet shows the person in its Users section.
108
+ - **Name the session in the safety check title.** Rejected. ADR-0109 gates
109
+ the session title, and nothing gates a target.
110
+ - **Group a throttle by the service only.** Rejected. A 429 has a limit to
111
+ raise, and a 529 does not.
112
+ - **Keep the outcome sentence in the remediation.** Rejected. A sentence
113
+ about one session is false for a group of sessions.
114
+ - **Drop the outcome sentence.** Rejected. A reader decides whether to resume
115
+ a session from it.
116
+ - **Keep `medium` and `low` deletes.** Rejected by the product owner.
117
+ Readers skip a finding that is usually harmless (ADR-0013).
118
+ - **Expand `~` with the detector's own `HOME`.** Rejected. The detector need
119
+ not run as the session's user.
120
+ - **Move all fifteen rules.** Rejected by the product owner. The cost rules
121
+ have their own layout, and two security rules are not in use.
122
+
123
+ ## Consequences
124
+
125
+ - Fleet must accept the new kinds before a client sends them. An older Fleet
126
+ refuses the whole run.
127
+ - A Fleet row of these rules with no target keeps its old grouping.
128
+ - Monitor and the webhook show new titles for these rules.
129
+ - Nobody gets a finding for a `medium` or `low` delete. The gateway also
130
+ stops blocking them.
131
+ - Fleet must show a block's reasons on each session, not as one list for the
132
+ group.
133
+ - The contract file grows. Both copies must stay the same.
134
+
135
+ ## When to revisit
136
+
137
+ Revisit when a responder needs the deleted path in Fleet. Revisit when a rule
138
+ needs two target kinds.
@@ -0,0 +1,105 @@
1
+ ---
2
+ id: 0147
3
+ title: The webhook names the run and the person, links to Fleet, and an egress label keeps its last four
4
+ status: proposed
5
+ date: 2026-10-18
6
+ supersedes: null
7
+ superseded-by: null
8
+ amends: 0073, 0109, 0141
9
+ amended-by: null
10
+ ---
11
+
12
+ ## Context
13
+
14
+ The live policy suite's `credential-egress` case sends a classic OpenAI `sk-` key with `curl`.
15
+ The daemon's Slack webhook posted two messages for it:
16
+
17
+ - "OpenAI API key sk-…e8e2 sent to the model in a prompt"
18
+ - "Credential exposure for OpenAI API key"
19
+
20
+ The second one does not say which key to rotate.
21
+ ADR-0141 clause 3 lets an egress label show a mask only for four issuer prefixes.
22
+ Fleet's grammar takes a mask with no prefix (Fleet ADR-0094, `_SUFFIX_MASK`).
23
+ So the client dropped the last four characters when it only had to drop the prefix.
24
+
25
+ The Slack message from the webhook also has no session name and no person.
26
+ Fleet's own Slack message shows both (Fleet ADR-0093, ADR-0109).
27
+ ADR-0073 keeps out of the webhook any field written about one session.
28
+ A run's title is such a field, so the webhook did not send it.
29
+
30
+ The labels were also weak.
31
+ "Subject" for a credential sent by `curl` was "Bash (tool) (built-in)".
32
+ "Evidence" was the raw kind, such as `openai_key`.
33
+ The footer showed a finding ID to copy, and the message had no way to open the finding in Fleet.
34
+
35
+ ## Decision
36
+
37
+ 1. **An egress label keeps its last four.**
38
+ A credential that is not a private key gets its kind's name, then the issuer prefix if Fleet shows it, then `…` and the last four characters.
39
+ A prefix Fleet does not show is dropped, not the whole mask.
40
+ A classic OpenAI key reads "OpenAI API key …e8e2".
41
+ A private key still reads by its kind's name alone.
42
+ This amends ADR-0141 clause 3.
43
+ 2. **The webhook carries the run's names and the person.**
44
+ `session.title`, else `session.opening_words`, and `session.person`, join the projection.
45
+ They are the values the Fleet upload sends, read from the same store under the same gate (ADR-0101 clause 5, ADR-0140).
46
+ The person is named only when the run's account is the account signed in now (ADR-0109 clause 3).
47
+ Each is left out when there is none, bounded at 200 characters, and rendered as inert text.
48
+ This amends ADR-0073's rule that no field written about one session may be mapped, for these three fields only.
49
+ Evidence detail, spans, remediation and prompts still do not travel.
50
+ 3. **The Slack message names these fields for a reader.**
51
+ "Affected" lists the targets.
52
+ "Component" shows the subject, and only when the finding has no targets.
53
+ "Finding Detail" shows the evidence kinds, with a credential kind by its name.
54
+ "Session" shows the title, or the quoted opening words.
55
+ "User(s)" shows the person.
56
+ "Detected" stays in the footer with the time, so it is not a field label.
57
+ These are the words Fleet's own Slack message uses (Fleet ADR-0096), taken from the finding detail page.
58
+ 4. **The Slack message links to the finding in Fleet.**
59
+ A "View in Fleet" button sits under the fields.
60
+ The footer's finding ID is the link text for the same page.
61
+ The address is the origin of the `dashboard_url` in Fleet's last upload response, kept in `schema_meta`.
62
+ The path is the one Fleet's own button builds: the rule, the agent kind and the group key.
63
+ The group key is a target's key, after the upload adds a spend limit's account, or `target:` and a prompt credential's key.
64
+ Both come from `finding_contract.py`, which Fleet holds an identical copy of.
65
+ A finding keyed by an id only Fleet assigns opens Fleet's findings list.
66
+ Before any upload, there is no button, and the ID stays plain text.
67
+ The JSON format does not carry the link.
68
+
69
+ ## Alternatives considered
70
+
71
+ - **Keep the egress label to the kind's name for other prefixes**: rejected.
72
+ A responder cannot tell which key to rotate, and Fleet already takes the last four.
73
+ - **Show the `sk-` prefix too**: rejected.
74
+ Fleet refuses a prefix outside its four, and refuses the whole run with it.
75
+ - **Leave the names to Fleet's Slack message**: rejected.
76
+ A machine with a webhook and no Fleet Slack connection gets no names at all.
77
+ - **Send the person to the webhook without the account check**: rejected.
78
+ It names whoever is signed in today on any run (ADR-0109 clause 3).
79
+ - **Keep "Subject" beside "Affected"**: rejected.
80
+ For a finding with targets, the component is often the Bash tool, which a responder cannot act on.
81
+ - **Link by Fleet's detection id**: rejected.
82
+ Fleet assigns it after the upload, and the webhook sends before or beside the upload.
83
+ - **Derive the console address from `api_url`**: rejected.
84
+ The API and the console have different hosts in production and different ports locally.
85
+
86
+ ## Consequences
87
+
88
+ - The person's name now leaves the machine to the webhook URL, which the person configured.
89
+ That can be a third-party workspace, which is wider than the org's own Fleet that ADR-0109 named.
90
+ A destination that must not learn names should not be a webhook destination.
91
+ - A run's title and opening words now reach the webhook.
92
+ Both passed the upload contract's string rules, and opening words are letters only (ADR-0141 clause 5).
93
+ - The names are recorded only while Fleet is configured (`UsageRecorder.record`).
94
+ A machine with a webhook and no Fleet sends no Session and no User(s).
95
+ - A receiver that validates the JSON format with `additionalProperties: false` must accept three new `session` keys.
96
+ `version` stays `1`, as in ADR-0073.
97
+ - A link waits for the first upload after a restart only on a new store; the address persists.
98
+ A link can point at a group Fleet has not stored yet, when the webhook sends before the upload.
99
+ The page then shows no members until the upload lands.
100
+ - More egress labels carry four characters of a credential: AWS, Slack, Stripe, Google and classic OpenAI keys.
101
+ Four characters do not let anyone recover the key.
102
+
103
+ ## When to revisit
104
+
105
+ Revisit when the webhook gets names on a machine without Fleet, or when Fleet widens its label grammar.
@@ -0,0 +1,59 @@
1
+ ---
2
+ id: 0148
3
+ title: Credential egress notifies at medium confidence when its severity is high
4
+ status: proposed
5
+ date: 2026-10-18
6
+ supersedes: null
7
+ superseded-by: null
8
+ amends: 0036
9
+ amended-by: null
10
+ ---
11
+
12
+ ## Context
13
+
14
+ The notification gate notifies on `medium` severity and above, at `high` confidence only (`FindingStore._eligible`).
15
+ `stacktrace-credential-egress` is `high` severity on every finding.
16
+ Its confidence is the confidence of the egress it read.
17
+ A tool that is network access, such as `WebFetch`, or a recorded MCP transport, gives `high`.
18
+ A shell command such as `curl`, `gh` or `ssh` gives `medium`, because the network access is read from the command string.
19
+
20
+ So a credential sent with `curl` was uploaded to Fleet and never notified.
21
+ The live policy suite's `credential-egress` case showed it.
22
+ Slack received only `credential-in-prompt`, which is `high` confidence.
23
+ The egress finding, the more serious of the two, reached nobody until they opened Fleet.
24
+
25
+ ## Decision
26
+
27
+ 1. **Credential egress notifies at `medium` confidence when its severity is `high`.**
28
+ `FindingStore._MEDIUM_CONFIDENCE_WHEN_HIGH` names the rule.
29
+ `low` confidence still does not notify.
30
+ 2. **Every other rule keeps the high-confidence gate.**
31
+ A rule joins the set only by its own decision.
32
+ 3. **The finding keeps its own confidence.**
33
+ The notification and the webhook payload carry `medium`.
34
+ Nothing raises a grade to pass the gate.
35
+
36
+ ## Alternatives considered
37
+
38
+ - **Grade `curl` egress `high`**: rejected.
39
+ A command string can be misread, and `observed.py` keeps the two grades apart for that reason.
40
+ The grade would claim more than the detector saw.
41
+ - **Notify every rule at `medium` confidence**: rejected.
42
+ `mcp-transient-failure` is `medium` on every finding, by its spec, and would alert on each one.
43
+ - **Keep the gate and test egress with `WebFetch`**: rejected.
44
+ Claude Code's `WebFetch` refuses loopback hosts and sends no headers, so no test can show a credential leaving through it.
45
+ The gate would still hide every `curl` egress in real use.
46
+
47
+ ## Consequences
48
+
49
+ - A credential sent by `curl`, `gh`, `ssh` or another shell command now alerts in Slack and in the plugin.
50
+ - A misread command string can now alert.
51
+ The finding says `medium` confidence, so a reader can tell.
52
+ - ADR-0036 reads a missing `confidence` as `high`, because older records were all `high`.
53
+ That reading stays true for those records.
54
+ Records from now on always carry their own `confidence`.
55
+ - `docs/specs/notification-delivery.md` names the exception.
56
+
57
+ ## When to revisit
58
+
59
+ Revisit when the detector reads shell egress with `high` confidence, or when another rule's severity alone should decide.
@@ -0,0 +1,94 @@
1
+ ---
2
+ id: 0149
3
+ title: A credential switch after a refusal replaces the MCP sign-in rule, and the retry storm is removed
4
+ status: proposed
5
+ date: 2026-10-19
6
+ supersedes: null
7
+ superseded-by: null
8
+ amends: 0073, 0086, 0146
9
+ amended-by: null
10
+ ---
11
+
12
+ ## Context
13
+
14
+ ADR-0146 moved `stacktrace-mcp-transient-failure` and
15
+ `stacktrace-tool-retry-storm` to the remediation framework. The product owner
16
+ then asked of each rule whether a person can act on it.
17
+
18
+ The MCP sign-in rule fires when an MCP call fails with an auth error and a
19
+ later call to the same tool succeeds. The record does not say which credential
20
+ a call used. So the rule cannot tell a token refresh from an agent that used a
21
+ credential it found. Its fix asked a person to check something that had
22
+ already recovered. The case that matters is the second one: the agent got past
23
+ a refusal with a credential that nobody gave it.
24
+
25
+ The retry storm fires on three identical failing calls. It has no fix. A
26
+ refusal, a throttle or a spend limit behind the failures is already a block
27
+ finding with its own fix.
28
+
29
+ `stacktrace-scavenged-credential` caught part of the credential case until
30
+ 0.4.0. It fired on no session of the measured corpus and was removed. The
31
+ product owner accepts a rule that seldom fires when each finding is useful.
32
+
33
+ ## Decision
34
+
35
+ 1. **`stacktrace-credential-switched` replaces the MCP sign-in rule.** It is a
36
+ security rule, graded `high`. It fires when a service refuses a call with
37
+ an auth error, and a later call to the same service succeeds with a
38
+ credential that the refused call did not carry. The credential is in the
39
+ successful call's arguments, and the agent read it first in the result of
40
+ an earlier call. Or the agent wrote it into an agent config file between
41
+ the two calls. A credential-shaped string in the arguments can be the
42
+ content of a document, so a credential that the agent did not read does
43
+ not count.
44
+ 2. **It never fires when a person or the client acted.** A person's turn
45
+ between the two calls closes the episode. With no new credential in sight,
46
+ such as a token the client refreshed, there is no finding.
47
+ 3. **Its confidence says where the credential came from.** It is `high` when
48
+ the agent read each new credential in an earlier result. It is `medium`
49
+ when the agent wrote a credential into a config file and did not read it
50
+ first.
51
+ 4. **Its target is the new credential.** The kind is `switched_credential`.
52
+ It carries the credential's digest, mask and kind, as credential exposure
53
+ does, and Fleet groups by the digest. It also carries the mask of the
54
+ refused credential (`previous_label`, empty when the call carried none),
55
+ the service and the refusal's status. Every channel shows both
56
+ credentials. The webhook adds a `before` field to its JSON, one line for
57
+ each refused credential and its service. Its Slack message shows the line
58
+ as Before, as Fleet's message does.
59
+ 5. **The fix is to revoke the new credential and take it out of reach.**
60
+ "Revoke or rotate this {credential}. Then remove it from where the agent can
61
+ read it. If the agent needs this access, grant it to the agent's own
62
+ credential."
63
+ 6. **The retry storm is removed.** Its kind, `retried_call`, and the
64
+ `attempts` field leave the contract.
65
+ 7. **Both old ids move to `RETIRED_SCOPES`** with the scope `call`, so a
66
+ stored finding still uploads.
67
+ 8. **The filter stays.** An auth refusal that the same MCP tool later
68
+ answered is still not an "Access denied" finding.
69
+ 9. **The citations name the service**, on ADR-0086's terms.
70
+
71
+ ## Alternatives considered
72
+
73
+ - **Keep the MCP sign-in rule.** Rejected. Most of its findings are token
74
+ refreshes, and it has no fix.
75
+ - **Bring back `scavenged-credential` as it was.** Rejected. It saw only a
76
+ credential in the call's arguments. Most MCP servers sign in through their
77
+ config, so the config write is the likely path.
78
+ - **Fire on any credential the agent read after a refusal.** Rejected. Reading
79
+ a credential is not using it. Credential exposure and credential in a file
80
+ already report a credential that goes somewhere.
81
+ - **Keep the retry storm without a fix.** Rejected. A person cannot act on it.
82
+
83
+ ## Consequences
84
+
85
+ - The rule fires rarely. A finding means that the agent got past an access
86
+ control.
87
+ - A credential that the agent passes without its value in the record, such
88
+ as `export TOKEN=$(cat .env)`, is not seen.
89
+ - Three identical failing calls with no block reason are no longer reported.
90
+
91
+ ## When to revisit
92
+
93
+ Revisit when the record says which credential each call used. Revisit when a
94
+ measured corpus shows findings that a person could not act on.