stacktrace-cli 0.10.0__tar.gz → 0.12.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (949) hide show
  1. stacktrace_cli-0.12.0/.agents/skills/release-stacktrace/SKILL.md +249 -0
  2. stacktrace_cli-0.12.0/.github/workflows/guard-staging.yml +143 -0
  3. stacktrace_cli-0.12.0/.github/workflows/publish-pypi.yml +178 -0
  4. stacktrace_cli-0.12.0/.gitignore +15 -0
  5. stacktrace_cli-0.12.0/CLAUDE.md +453 -0
  6. stacktrace_cli-0.12.0/PKG-INFO +265 -0
  7. stacktrace_cli-0.12.0/README.md +237 -0
  8. stacktrace_cli-0.12.0/contracts/observations/v1/decision-request.example.json +23 -0
  9. stacktrace_cli-0.12.0/contracts/observations/v1/decision-request.schema.json +162 -0
  10. stacktrace_cli-0.12.0/contracts/observations/v1/decision-response.example.json +10 -0
  11. stacktrace_cli-0.12.0/contracts/observations/v1/decision-response.schema.json +66 -0
  12. stacktrace_cli-0.12.0/contracts/observations/v1/example.json +26 -0
  13. stacktrace_cli-0.12.0/contracts/observations/v1/schema.json +152 -0
  14. stacktrace_cli-0.12.0/docs/adrs/0001-session-telemetry-as-input.md +117 -0
  15. stacktrace_cli-0.12.0/docs/adrs/0004-three-stage-detector.md +159 -0
  16. stacktrace_cli-0.12.0/docs/adrs/0006-trust-boundary-and-detection-upload.md +179 -0
  17. stacktrace_cli-0.12.0/docs/adrs/0031-one-host-daemon-observes-native-session-logs.md +115 -0
  18. stacktrace_cli-0.12.0/docs/adrs/0061-the-drain-sends-findings-only.md +118 -0
  19. stacktrace_cli-0.12.0/docs/adrs/0070-package-the-cloud-agent-environment-bootstrap.md +162 -0
  20. stacktrace_cli-0.12.0/docs/adrs/0093-environment-cost-baselines-count-tokens-keyed-by-model.md +78 -0
  21. stacktrace_cli-0.12.0/docs/adrs/0096-cost-usage-may-leave-as-token-totals-and-work-identifiers.md +86 -0
  22. stacktrace_cli-0.12.0/docs/adrs/0099-cost-is-measured-in-tokens-and-relative-increases.md +85 -0
  23. stacktrace_cli-0.12.0/docs/adrs/0101-what-names-a-run-in-fleet.md +111 -0
  24. stacktrace_cli-0.12.0/docs/adrs/0104-usage-is-its-own-upload.md +92 -0
  25. stacktrace_cli-0.12.0/docs/adrs/0112-a-person-is-known-by-the-accounts-on-the-host.md +137 -0
  26. stacktrace_cli-0.12.0/docs/adrs/0118-observe-agents-through-adapters-and-a-shared-analyzer.md +165 -0
  27. stacktrace_cli-0.12.0/docs/adrs/0119-read-sessions-from-an-ai-gateway-and-block-inline.md +184 -0
  28. stacktrace_cli-0.12.0/docs/adrs/0120-own-the-adapter-event-envelope.md +49 -0
  29. stacktrace_cli-0.12.0/docs/adrs/0121-a-cloud-sessions-runs-are-its-persons-and-a-card-says-where-its-name-came-from.md +84 -0
  30. stacktrace_cli-0.12.0/docs/adrs/0122-use-stacktrace-as-the-python-package.md +45 -0
  31. stacktrace_cli-0.12.0/docs/adrs/0123-the-cloud-boot-hook-brings-the-client-up-to-the-latest-release.md +128 -0
  32. stacktrace_cli-0.12.0/docs/adrs/0124-fleet-imports-core-from-the-stacktrace-distribution.md +48 -0
  33. stacktrace_cli-0.12.0/docs/adrs/0127-the-monitor-shows-weighted-tokens-beside-raw-tokens.md +121 -0
  34. stacktrace_cli-0.12.0/docs/adrs/0128-usage-files-each-response-once-where-it-was-first-filed.md +118 -0
  35. stacktrace_cli-0.12.0/docs/adrs/0129-an-unfinished-response-counts-the-output-it-shows.md +130 -0
  36. stacktrace_cli-0.12.0/docs/adrs/0130-usage-carries-one-hour-cache-writes-and-each-responses-price-class.md +126 -0
  37. stacktrace_cli-0.12.0/docs/adrs/0132-every-usage-page-names-the-store-that-built-it.md +92 -0
  38. stacktrace_cli-0.12.0/docs/adrs/0133-a-clients-own-error-record-is-a-third-block-channel.md +68 -0
  39. stacktrace_cli-0.12.0/docs/adrs/0134-a-secret-sent-to-a-server-configured-as-remote-is-egress.md +61 -0
  40. stacktrace_cli-0.12.0/docs/adrs/INDEX.md +170 -0
  41. stacktrace_cli-0.12.0/docs/agent-support.html +501 -0
  42. stacktrace_cli-0.12.0/docs/agent-support.md +139 -0
  43. stacktrace_cli-0.12.0/docs/releases/v0.11.0.md +91 -0
  44. stacktrace_cli-0.12.0/docs/releases/v0.12.0.md +74 -0
  45. stacktrace_cli-0.12.0/docs/specs/agent-observability.md +324 -0
  46. stacktrace_cli-0.12.0/docs/specs/aidr.md +511 -0
  47. stacktrace_cli-0.12.0/docs/specs/codex-agent-kind.md +362 -0
  48. stacktrace_cli-0.12.0/docs/specs/cost-notifications.md +728 -0
  49. stacktrace_cli-0.12.0/docs/specs/cost-phase-1.md +518 -0
  50. stacktrace_cli-0.12.0/docs/specs/cost.md +283 -0
  51. stacktrace_cli-0.12.0/docs/specs/detector.md +1117 -0
  52. stacktrace_cli-0.12.0/docs/specs/monitor.md +916 -0
  53. stacktrace_cli-0.12.0/docs/specs/production-agent-observability.md +136 -0
  54. stacktrace_cli-0.12.0/docs/specs/reasoning-jev.md +463 -0
  55. stacktrace_cli-0.12.0/docs/specs/usage-upload.md +474 -0
  56. stacktrace_cli-0.12.0/examples/observations/custom_agent.py +50 -0
  57. stacktrace_cli-0.12.0/infra/README.md +30 -0
  58. stacktrace_cli-0.12.0/infra/bedrock-sandbox/.gitignore +5 -0
  59. stacktrace_cli-0.12.0/infra/bedrock-sandbox/ci.tf +63 -0
  60. stacktrace_cli-0.12.0/infra/bedrock-sandbox/main.tf +177 -0
  61. stacktrace_cli-0.12.0/infra/bedrock-sandbox/outputs.tf +24 -0
  62. stacktrace_cli-0.12.0/infra/bedrock-sandbox/variables.tf +63 -0
  63. stacktrace_cli-0.12.0/infra/guard-staging/.gitignore +5 -0
  64. stacktrace_cli-0.12.0/infra/guard-staging/README.md +207 -0
  65. stacktrace_cli-0.12.0/infra/guard-staging/check.sh +259 -0
  66. stacktrace_cli-0.12.0/infra/guard-staging/ci.tf +57 -0
  67. stacktrace_cli-0.12.0/infra/guard-staging/connect.sh +64 -0
  68. stacktrace_cli-0.12.0/infra/guard-staging/images/envoy/Dockerfile +36 -0
  69. stacktrace_cli-0.12.0/infra/guard-staging/images/envoy/entrypoint.sh +13 -0
  70. stacktrace_cli-0.12.0/infra/guard-staging/images/envoy/litellm.yaml +43 -0
  71. stacktrace_cli-0.12.0/infra/guard-staging/images/litellm/Dockerfile +30 -0
  72. stacktrace_cli-0.12.0/infra/guard-staging/images/litellm/config.subscription.yaml +44 -0
  73. stacktrace_cli-0.12.0/infra/guard-staging/images/litellm/config.yaml +49 -0
  74. stacktrace_cli-0.12.0/infra/guard-staging/images/litellm/entrypoint.sh +8 -0
  75. stacktrace_cli-0.12.0/infra/guard-staging/main.tf +184 -0
  76. stacktrace_cli-0.12.0/infra/guard-staging/moved.tf +32 -0
  77. stacktrace_cli-0.12.0/infra/guard-staging/outputs.tf +55 -0
  78. stacktrace_cli-0.12.0/infra/guard-staging/smoke.sh +95 -0
  79. stacktrace_cli-0.12.0/infra/guard-staging/user-key.sh +26 -0
  80. stacktrace_cli-0.12.0/infra/guard-staging/variables.tf +67 -0
  81. stacktrace_cli-0.12.0/infra/modules/express-gateway/main.tf +62 -0
  82. stacktrace_cli-0.12.0/infra/modules/express-gateway/outputs.tf +19 -0
  83. stacktrace_cli-0.12.0/infra/modules/express-gateway/variables.tf +63 -0
  84. stacktrace_cli-0.12.0/integrations/e2e/claude.sh +12 -0
  85. stacktrace_cli-0.12.0/integrations/e2e/scenarios.sh +20 -0
  86. stacktrace_cli-0.12.0/integrations/envoy/envoy.yaml +147 -0
  87. stacktrace_cli-0.12.0/integrations/envoy/run.sh +3 -0
  88. stacktrace_cli-0.12.0/integrations/litellm/README.md +104 -0
  89. stacktrace_cli-0.12.0/integrations/litellm/config.example.yaml +28 -0
  90. stacktrace_cli-0.12.0/integrations/litellm/config.subscription.yaml +30 -0
  91. stacktrace_cli-0.12.0/integrations/litellm/e2e/config.baseten.yaml +20 -0
  92. stacktrace_cli-0.12.0/integrations/litellm/e2e/config.mock.yaml +12 -0
  93. stacktrace_cli-0.12.0/integrations/litellm/e2e/mock_upstream.py +431 -0
  94. stacktrace_cli-0.12.0/integrations/litellm/e2e/parity.py +70 -0
  95. stacktrace_cli-0.12.0/integrations/litellm/stacktrace_keys.py +111 -0
  96. stacktrace_cli-0.12.0/integrations/litellm/stacktrace_litellm.py +454 -0
  97. stacktrace_cli-0.12.0/pyproject.toml +126 -0
  98. stacktrace_cli-0.12.0/scripts/cost_latency.py +85 -0
  99. stacktrace_cli-0.12.0/src/stacktrace/__init__.py +14 -0
  100. stacktrace_cli-0.12.0/src/stacktrace/__main__.py +14 -0
  101. stacktrace_cli-0.12.0/src/stacktrace/analysis.py +664 -0
  102. stacktrace_cli-0.12.0/src/stacktrace/cli.py +641 -0
  103. stacktrace_cli-0.12.0/src/stacktrace/cloud/__init__.py +60 -0
  104. stacktrace_cli-0.12.0/src/stacktrace/cloud/setup.sh +469 -0
  105. stacktrace_cli-0.12.0/src/stacktrace/core/__init__.py +27 -0
  106. stacktrace_cli-0.12.0/src/stacktrace/core/observations.py +222 -0
  107. stacktrace_cli-0.12.0/src/stacktrace/correlate/acquire.py +541 -0
  108. stacktrace_cli-0.12.0/src/stacktrace/correlate/join.py +381 -0
  109. stacktrace_cli-0.12.0/src/stacktrace/correlate/observed.py +1961 -0
  110. stacktrace_cli-0.12.0/src/stacktrace/correlate/orchestrate.py +534 -0
  111. stacktrace_cli-0.12.0/src/stacktrace/correlate/record.py +287 -0
  112. stacktrace_cli-0.12.0/src/stacktrace/correlate/render.py +768 -0
  113. stacktrace_cli-0.12.0/src/stacktrace/cost/baseline.py +563 -0
  114. stacktrace_cli-0.12.0/src/stacktrace/cost/component_usage.py +324 -0
  115. stacktrace_cli-0.12.0/src/stacktrace/cost/components.py +143 -0
  116. stacktrace_cli-0.12.0/src/stacktrace/cost/copies.py +90 -0
  117. stacktrace_cli-0.12.0/src/stacktrace/cost/ledger.py +64 -0
  118. stacktrace_cli-0.12.0/src/stacktrace/cost/measures.py +347 -0
  119. stacktrace_cli-0.12.0/src/stacktrace/cost/models.py +64 -0
  120. stacktrace_cli-0.12.0/src/stacktrace/cost/org_baselines.py +258 -0
  121. stacktrace_cli-0.12.0/src/stacktrace/cost/output.py +123 -0
  122. stacktrace_cli-0.12.0/src/stacktrace/cost/price_class.py +48 -0
  123. stacktrace_cli-0.12.0/src/stacktrace/cost/reasons.py +593 -0
  124. stacktrace_cli-0.12.0/src/stacktrace/cost/rules.py +663 -0
  125. stacktrace_cli-0.12.0/src/stacktrace/cost/runs.py +149 -0
  126. stacktrace_cli-0.12.0/src/stacktrace/cost/tokens.py +69 -0
  127. stacktrace_cli-0.12.0/src/stacktrace/cost/totals.py +62 -0
  128. stacktrace_cli-0.12.0/src/stacktrace/cost/usage.py +451 -0
  129. stacktrace_cli-0.12.0/src/stacktrace/cost/weights.py +125 -0
  130. stacktrace_cli-0.12.0/src/stacktrace/daemon/accounts.py +272 -0
  131. stacktrace_cli-0.12.0/src/stacktrace/daemon/activity_log.py +94 -0
  132. stacktrace_cli-0.12.0/src/stacktrace/daemon/bom.py +56 -0
  133. stacktrace_cli-0.12.0/src/stacktrace/daemon/cli.py +740 -0
  134. stacktrace_cli-0.12.0/src/stacktrace/daemon/client.py +396 -0
  135. stacktrace_cli-0.12.0/src/stacktrace/daemon/composition.py +294 -0
  136. stacktrace_cli-0.12.0/src/stacktrace/daemon/config.py +322 -0
  137. stacktrace_cli-0.12.0/src/stacktrace/daemon/costs.py +785 -0
  138. stacktrace_cli-0.12.0/src/stacktrace/daemon/db.py +1065 -0
  139. stacktrace_cli-0.12.0/src/stacktrace/daemon/fleet.py +729 -0
  140. stacktrace_cli-0.12.0/src/stacktrace/daemon/identity.py +99 -0
  141. stacktrace_cli-0.12.0/src/stacktrace/daemon/lifecycle.py +172 -0
  142. stacktrace_cli-0.12.0/src/stacktrace/daemon/observer.py +755 -0
  143. stacktrace_cli-0.12.0/src/stacktrace/daemon/paths.py +40 -0
  144. stacktrace_cli-0.12.0/src/stacktrace/daemon/presentation.py +204 -0
  145. stacktrace_cli-0.12.0/src/stacktrace/daemon/runtime.py +978 -0
  146. stacktrace_cli-0.12.0/src/stacktrace/daemon/scan.py +287 -0
  147. stacktrace_cli-0.12.0/src/stacktrace/daemon/server.py +317 -0
  148. stacktrace_cli-0.12.0/src/stacktrace/daemon/store.py +2569 -0
  149. stacktrace_cli-0.12.0/src/stacktrace/daemon/usage.py +1224 -0
  150. stacktrace_cli-0.12.0/src/stacktrace/daemon/webhook.py +529 -0
  151. stacktrace_cli-0.12.0/src/stacktrace/detector/analyzer.py +205 -0
  152. stacktrace_cli-0.12.0/src/stacktrace/detector/blocked.py +564 -0
  153. stacktrace_cli-0.12.0/src/stacktrace/detector/cache.py +723 -0
  154. stacktrace_cli-0.12.0/src/stacktrace/detector/deterministic.py +3011 -0
  155. stacktrace_cli-0.12.0/src/stacktrace/detector/finding.py +507 -0
  156. stacktrace_cli-0.12.0/src/stacktrace/detector/history.py +210 -0
  157. stacktrace_cli-0.12.0/src/stacktrace/detector/jev.py +213 -0
  158. stacktrace_cli-0.12.0/src/stacktrace/detector/priors.py +270 -0
  159. stacktrace_cli-0.12.0/src/stacktrace/detector/prompts/__init__.py +52 -0
  160. stacktrace_cli-0.12.0/src/stacktrace/detector/prompts/jev-v3/stacktrace-deceptive-completion.json +16 -0
  161. stacktrace_cli-0.12.0/src/stacktrace/detector/prompts/jev-v3/stacktrace-infra-unsafe-action.json +10 -0
  162. stacktrace_cli-0.12.0/src/stacktrace/detector/reasoning.py +1847 -0
  163. stacktrace_cli-0.12.0/src/stacktrace/detector/render.py +478 -0
  164. stacktrace_cli-0.12.0/src/stacktrace/detector/run.py +1188 -0
  165. stacktrace_cli-0.12.0/src/stacktrace/detector/secrets.py +519 -0
  166. stacktrace_cli-0.12.0/src/stacktrace/detector/verdict.py +266 -0
  167. stacktrace_cli-0.12.0/src/stacktrace/detector/windows.py +443 -0
  168. stacktrace_cli-0.12.0/src/stacktrace/gateway/__init__.py +1 -0
  169. stacktrace_cli-0.12.0/src/stacktrace/gateway/analyzer.py +392 -0
  170. stacktrace_cli-0.12.0/src/stacktrace/gateway/check.py +117 -0
  171. stacktrace_cli-0.12.0/src/stacktrace/gateway/cli.py +63 -0
  172. stacktrace_cli-0.12.0/src/stacktrace/gateway/exchange.py +77 -0
  173. stacktrace_cli-0.12.0/src/stacktrace/gateway/formats/__init__.py +179 -0
  174. stacktrace_cli-0.12.0/src/stacktrace/gateway/formats/_json.py +176 -0
  175. stacktrace_cli-0.12.0/src/stacktrace/gateway/formats/anthropic.py +158 -0
  176. stacktrace_cli-0.12.0/src/stacktrace/gateway/formats/bedrock.py +141 -0
  177. stacktrace_cli-0.12.0/src/stacktrace/gateway/formats/body.py +196 -0
  178. stacktrace_cli-0.12.0/src/stacktrace/gateway/formats/openai_chat.py +194 -0
  179. stacktrace_cli-0.12.0/src/stacktrace/gateway/formats/openai_responses.py +186 -0
  180. stacktrace_cli-0.12.0/src/stacktrace/gateway/service.py +117 -0
  181. stacktrace_cli-0.12.0/src/stacktrace/gateway/session.py +292 -0
  182. stacktrace_cli-0.12.0/src/stacktrace/gateway/sink.py +207 -0
  183. stacktrace_cli-0.12.0/src/stacktrace/monitor/__init__.py +12 -0
  184. stacktrace_cli-0.12.0/src/stacktrace/monitor/costs.py +751 -0
  185. stacktrace_cli-0.12.0/src/stacktrace/monitor/inventory.py +495 -0
  186. stacktrace_cli-0.12.0/src/stacktrace/monitor/offline.py +266 -0
  187. stacktrace_cli-0.12.0/src/stacktrace/monitor/reasoning.py +306 -0
  188. stacktrace_cli-0.12.0/src/stacktrace/monitor/render.py +856 -0
  189. stacktrace_cli-0.12.0/src/stacktrace/monitor/server.py +749 -0
  190. stacktrace_cli-0.12.0/src/stacktrace/monitor/site/app.js +3274 -0
  191. stacktrace_cli-0.12.0/src/stacktrace/monitor/site/cost.js +1144 -0
  192. stacktrace_cli-0.12.0/src/stacktrace/monitor/site/index.html +179 -0
  193. stacktrace_cli-0.12.0/src/stacktrace/monitor/site/styles.css +913 -0
  194. stacktrace_cli-0.12.0/src/stacktrace/monitor/verdicts.py +52 -0
  195. stacktrace_cli-0.12.0/src/stacktrace/monitor/watch.py +805 -0
  196. stacktrace_cli-0.12.0/src/stacktrace/options.py +107 -0
  197. stacktrace_cli-0.12.0/src/stacktrace/remote/cli.py +655 -0
  198. stacktrace_cli-0.12.0/src/stacktrace/remote/detect_payload.py +508 -0
  199. stacktrace_cli-0.12.0/src/stacktrace/remote/payload.py +443 -0
  200. stacktrace_cli-0.12.0/src/stacktrace/remote/policy.py +88 -0
  201. stacktrace_cli-0.12.0/src/stacktrace/remote/policy_service.py +1637 -0
  202. stacktrace_cli-0.12.0/src/stacktrace/remote/spool.py +449 -0
  203. stacktrace_cli-0.12.0/src/stacktrace/remote/sync.py +807 -0
  204. stacktrace_cli-0.12.0/src/stacktrace/remote/sync_detect.py +536 -0
  205. stacktrace_cli-0.12.0/src/stacktrace/remote/upload_contract.py +1147 -0
  206. stacktrace_cli-0.12.0/src/stacktrace/sdk.py +232 -0
  207. stacktrace_cli-0.12.0/src/stacktrace/sessions/access.py +222 -0
  208. stacktrace_cli-0.12.0/src/stacktrace/sessions/entrypoint.py +43 -0
  209. stacktrace_cli-0.12.0/src/stacktrace/sessions/outcome.py +65 -0
  210. stacktrace_cli-0.12.0/src/stacktrace/sessions/protocols.py +282 -0
  211. stacktrace_cli-0.12.0/src/stacktrace/sessions/render.py +301 -0
  212. stacktrace_cli-0.12.0/src/stacktrace/telemetry/events.py +500 -0
  213. stacktrace_cli-0.12.0/src/stacktrace/telemetry/state.py +219 -0
  214. stacktrace_cli-0.12.0/src/stacktrace/webhook/cli.py +200 -0
  215. stacktrace_cli-0.12.0/src/stacktrace/webhook/config.py +193 -0
  216. stacktrace_cli-0.12.0/tests/conftest.py +186 -0
  217. stacktrace_cli-0.12.0/tests/cost/fakes.py +63 -0
  218. stacktrace_cli-0.12.0/tests/cost/scenarios.py +313 -0
  219. stacktrace_cli-0.12.0/tests/cost/test_as_of_cuts_every_timed_collection.py +150 -0
  220. stacktrace_cli-0.12.0/tests/cost/test_baseline.py +276 -0
  221. stacktrace_cli-0.12.0/tests/cost/test_clock.py +61 -0
  222. stacktrace_cli-0.12.0/tests/cost/test_component_usage.py +307 -0
  223. stacktrace_cli-0.12.0/tests/cost/test_components.py +129 -0
  224. stacktrace_cli-0.12.0/tests/cost/test_copies.py +91 -0
  225. stacktrace_cli-0.12.0/tests/cost/test_cost_evidence_travels.py +135 -0
  226. stacktrace_cli-0.12.0/tests/cost/test_cost_findings_are_dated_by_their_citations.py +426 -0
  227. stacktrace_cli-0.12.0/tests/cost/test_cost_findings_carry_no_session_text.py +123 -0
  228. stacktrace_cli-0.12.0/tests/cost/test_cost_is_tokens.py +105 -0
  229. stacktrace_cli-0.12.0/tests/cost/test_cost_latency.py +82 -0
  230. stacktrace_cli-0.12.0/tests/cost/test_evidence.py +40 -0
  231. stacktrace_cli-0.12.0/tests/cost/test_ledger.py +44 -0
  232. stacktrace_cli-0.12.0/tests/cost/test_measures.py +260 -0
  233. stacktrace_cli-0.12.0/tests/cost/test_models.py +47 -0
  234. stacktrace_cli-0.12.0/tests/cost/test_org_baselines.py +333 -0
  235. stacktrace_cli-0.12.0/tests/cost/test_output.py +149 -0
  236. stacktrace_cli-0.12.0/tests/cost/test_price_class.py +113 -0
  237. stacktrace_cli-0.12.0/tests/cost/test_reasons.py +261 -0
  238. stacktrace_cli-0.12.0/tests/cost/test_rules_baseline.py +203 -0
  239. stacktrace_cli-0.12.0/tests/cost/test_rules_budget.py +189 -0
  240. stacktrace_cli-0.12.0/tests/cost/test_runs.py +43 -0
  241. stacktrace_cli-0.12.0/tests/cost/test_totals.py +55 -0
  242. stacktrace_cli-0.12.0/tests/cost/test_unfinished_output_counts_what_it_shows.py +330 -0
  243. stacktrace_cli-0.12.0/tests/cost/test_usage.py +315 -0
  244. stacktrace_cli-0.12.0/tests/cost/test_weights.py +153 -0
  245. stacktrace_cli-0.12.0/tests/daemon/observing.py +47 -0
  246. stacktrace_cli-0.12.0/tests/daemon/test_accounts.py +533 -0
  247. stacktrace_cli-0.12.0/tests/daemon/test_activity_log.py +350 -0
  248. stacktrace_cli-0.12.0/tests/daemon/test_cli.py +1440 -0
  249. stacktrace_cli-0.12.0/tests/daemon/test_client.py +396 -0
  250. stacktrace_cli-0.12.0/tests/daemon/test_composition.py +343 -0
  251. stacktrace_cli-0.12.0/tests/daemon/test_config.py +205 -0
  252. stacktrace_cli-0.12.0/tests/daemon/test_cost_guidance.py +23 -0
  253. stacktrace_cli-0.12.0/tests/daemon/test_costs.py +1350 -0
  254. stacktrace_cli-0.12.0/tests/daemon/test_db.py +1097 -0
  255. stacktrace_cli-0.12.0/tests/daemon/test_detection_needs_no_subscriber.py +117 -0
  256. stacktrace_cli-0.12.0/tests/daemon/test_fleet.py +889 -0
  257. stacktrace_cli-0.12.0/tests/daemon/test_identity.py +91 -0
  258. stacktrace_cli-0.12.0/tests/daemon/test_job_thread.py +63 -0
  259. stacktrace_cli-0.12.0/tests/daemon/test_jobs.py +465 -0
  260. stacktrace_cli-0.12.0/tests/daemon/test_lifecycle.py +115 -0
  261. stacktrace_cli-0.12.0/tests/daemon/test_observer.py +1485 -0
  262. stacktrace_cli-0.12.0/tests/daemon/test_queue_reader.py +200 -0
  263. stacktrace_cli-0.12.0/tests/daemon/test_runtime.py +1735 -0
  264. stacktrace_cli-0.12.0/tests/daemon/test_scan.py +517 -0
  265. stacktrace_cli-0.12.0/tests/daemon/test_service.py +198 -0
  266. stacktrace_cli-0.12.0/tests/daemon/test_session_cost_notices.py +117 -0
  267. stacktrace_cli-0.12.0/tests/daemon/test_socket.py +547 -0
  268. stacktrace_cli-0.12.0/tests/daemon/test_stage_times.py +80 -0
  269. stacktrace_cli-0.12.0/tests/daemon/test_store.py +800 -0
  270. stacktrace_cli-0.12.0/tests/daemon/test_subagent_routing.py +154 -0
  271. stacktrace_cli-0.12.0/tests/daemon/test_the_drained_payload_is_the_cold_one.py +288 -0
  272. stacktrace_cli-0.12.0/tests/daemon/test_the_stored_row_is_sufficient.py +247 -0
  273. stacktrace_cli-0.12.0/tests/daemon/test_usage.py +2304 -0
  274. stacktrace_cli-0.12.0/tests/daemon/test_usage_store.py +1229 -0
  275. stacktrace_cli-0.12.0/tests/daemon/test_webhook.py +1165 -0
  276. stacktrace_cli-0.12.0/tests/daemon/test_wire_frames_are_bounded.py +156 -0
  277. stacktrace_cli-0.12.0/tests/detector_session_fixture.py +152 -0
  278. stacktrace_cli-0.12.0/tests/gateway/fixtures/claude-code-2.1.296-suite/gateway-last-turn.json +259 -0
  279. stacktrace_cli-0.12.0/tests/gateway/fixtures/claude-code-2.1.296-suite/projects/run/b23c3bab-a677-4b5f-ac36-e132c7df29e5.jsonl +49 -0
  280. stacktrace_cli-0.12.0/tests/gateway/test_analyzer.py +400 -0
  281. stacktrace_cli-0.12.0/tests/gateway/test_bodies_and_logs.py +217 -0
  282. stacktrace_cli-0.12.0/tests/gateway/test_call_records.py +47 -0
  283. stacktrace_cli-0.12.0/tests/gateway/test_check.py +202 -0
  284. stacktrace_cli-0.12.0/tests/gateway/test_every_choice_is_read.py +37 -0
  285. stacktrace_cli-0.12.0/tests/gateway/test_every_read_field_is_validated.py +632 -0
  286. stacktrace_cli-0.12.0/tests/gateway/test_every_shortfall_is_a_recorded_fallback.py +350 -0
  287. stacktrace_cli-0.12.0/tests/gateway/test_gateway_keys.py +162 -0
  288. stacktrace_cli-0.12.0/tests/gateway/test_gateway_scripts.py +88 -0
  289. stacktrace_cli-0.12.0/tests/gateway/test_litellm_stream.py +283 -0
  290. stacktrace_cli-0.12.0/tests/gateway/test_litellm_subscription_config.py +48 -0
  291. stacktrace_cli-0.12.0/tests/gateway/test_parity_live_capture.py +103 -0
  292. stacktrace_cli-0.12.0/tests/gateway/test_service.py +291 -0
  293. stacktrace_cli-0.12.0/tests/gateway/test_session.py +479 -0
  294. stacktrace_cli-0.12.0/tests/gateway/test_unstated_outcomes.py +127 -0
  295. stacktrace_cli-0.12.0/tests/monitor/cost_harness.mjs +337 -0
  296. stacktrace_cli-0.12.0/tests/monitor/feed_harness.mjs +4056 -0
  297. stacktrace_cli-0.12.0/tests/monitor/inventory_harness.mjs +481 -0
  298. stacktrace_cli-0.12.0/tests/monitor/test_cost_page.py +684 -0
  299. stacktrace_cli-0.12.0/tests/monitor/test_cost_range_switch.py +143 -0
  300. stacktrace_cli-0.12.0/tests/monitor/test_feed_model.py +2189 -0
  301. stacktrace_cli-0.12.0/tests/monitor/test_inventory.py +866 -0
  302. stacktrace_cli-0.12.0/tests/monitor/test_offline.py +242 -0
  303. stacktrace_cli-0.12.0/tests/monitor/test_reasoning_gates.py +688 -0
  304. stacktrace_cli-0.12.0/tests/monitor/test_render.py +1150 -0
  305. stacktrace_cli-0.12.0/tests/monitor/test_render_cost.py +1383 -0
  306. stacktrace_cli-0.12.0/tests/monitor/test_server.py +828 -0
  307. stacktrace_cli-0.12.0/tests/monitor/test_site_assets.py +477 -0
  308. stacktrace_cli-0.12.0/tests/monitor/test_state.py +148 -0
  309. stacktrace_cli-0.12.0/tests/monitor/test_verdicts.py +136 -0
  310. stacktrace_cli-0.12.0/tests/monitor/test_watch.py +2134 -0
  311. stacktrace_cli-0.12.0/tests/observations/test_contract.py +245 -0
  312. stacktrace_cli-0.12.0/tests/observations/test_decisions.py +54 -0
  313. stacktrace_cli-0.12.0/tests/observations/test_event_envelope.py +126 -0
  314. stacktrace_cli-0.12.0/tests/remote/__init__.py +0 -0
  315. stacktrace_cli-0.12.0/tests/remote/helpers.py +127 -0
  316. stacktrace_cli-0.12.0/tests/remote/test_cli.py +1018 -0
  317. stacktrace_cli-0.12.0/tests/remote/test_client.py +575 -0
  318. stacktrace_cli-0.12.0/tests/remote/test_cloud_boot_updates_the_client.py +264 -0
  319. stacktrace_cli-0.12.0/tests/remote/test_cloud_setup_asset_id.py +56 -0
  320. stacktrace_cli-0.12.0/tests/remote/test_config.py +129 -0
  321. stacktrace_cli-0.12.0/tests/remote/test_detect_activity.py +220 -0
  322. stacktrace_cli-0.12.0/tests/remote/test_detect_cli.py +72 -0
  323. stacktrace_cli-0.12.0/tests/remote/test_detect_client.py +82 -0
  324. stacktrace_cli-0.12.0/tests/remote/test_detect_contract_is_exhaustive.py +927 -0
  325. stacktrace_cli-0.12.0/tests/remote/test_detect_gate_matches_the_cloud.py +351 -0
  326. stacktrace_cli-0.12.0/tests/remote/test_detect_layers_compose.py +162 -0
  327. stacktrace_cli-0.12.0/tests/remote/test_detect_payload_reaches_the_cloud_model.py +286 -0
  328. stacktrace_cli-0.12.0/tests/remote/test_detect_redaction.py +823 -0
  329. stacktrace_cli-0.12.0/tests/remote/test_detect_spool.py +329 -0
  330. stacktrace_cli-0.12.0/tests/remote/test_detect_upload_contract.py +180 -0
  331. stacktrace_cli-0.12.0/tests/remote/test_detect_wire_payload.py +185 -0
  332. stacktrace_cli-0.12.0/tests/remote/test_facade_contract.py +415 -0
  333. stacktrace_cli-0.12.0/tests/remote/test_identity.py +486 -0
  334. stacktrace_cli-0.12.0/tests/remote/test_no_local_path_survives_redaction.py +376 -0
  335. stacktrace_cli-0.12.0/tests/remote/test_payload.py +940 -0
  336. stacktrace_cli-0.12.0/tests/remote/test_policy.py +259 -0
  337. stacktrace_cli-0.12.0/tests/remote/test_policy_service.py +2432 -0
  338. stacktrace_cli-0.12.0/tests/remote/test_policy_service_cli.py +334 -0
  339. stacktrace_cli-0.12.0/tests/remote/test_redact_payload.py +1022 -0
  340. stacktrace_cli-0.12.0/tests/remote/test_seam.py +286 -0
  341. stacktrace_cli-0.12.0/tests/remote/test_spool.py +706 -0
  342. stacktrace_cli-0.12.0/tests/remote/test_sync.py +2215 -0
  343. stacktrace_cli-0.12.0/tests/remote/test_sync_detect.py +886 -0
  344. stacktrace_cli-0.12.0/tests/remote/test_upload_contract.py +853 -0
  345. stacktrace_cli-0.12.0/tests/remote/test_usage_client.py +111 -0
  346. stacktrace_cli-0.12.0/tests/remote/test_usage_contract.py +289 -0
  347. stacktrace_cli-0.12.0/tests/sdk/test_observation_client.py +278 -0
  348. stacktrace_cli-0.12.0/tests/telemetry/__init__.py +0 -0
  349. stacktrace_cli-0.12.0/tests/telemetry/test_activity_log.py +135 -0
  350. stacktrace_cli-0.12.0/tests/telemetry/test_cli.py +260 -0
  351. stacktrace_cli-0.12.0/tests/telemetry/test_events.py +655 -0
  352. stacktrace_cli-0.12.0/tests/telemetry/test_every_derived_site.py +222 -0
  353. stacktrace_cli-0.12.0/tests/telemetry/test_every_internal_save_is_reported.py +55 -0
  354. stacktrace_cli-0.12.0/tests/telemetry/test_hooks.py +591 -0
  355. stacktrace_cli-0.12.0/tests/telemetry/test_release_gate.py +14 -0
  356. stacktrace_cli-0.12.0/tests/telemetry/test_state.py +150 -0
  357. stacktrace_cli-0.12.0/tests/telemetry/test_uploader.py +190 -0
  358. stacktrace_cli-0.12.0/tests/test_acquire.py +818 -0
  359. stacktrace_cli-0.12.0/tests/test_agent_instance_id.py +207 -0
  360. stacktrace_cli-0.12.0/tests/test_agent_support_doc.py +81 -0
  361. stacktrace_cli-0.12.0/tests/test_analysis.py +636 -0
  362. stacktrace_cli-0.12.0/tests/test_bom_shape.py +196 -0
  363. stacktrace_cli-0.12.0/tests/test_build_commit.py +244 -0
  364. stacktrace_cli-0.12.0/tests/test_call_status_conventions.py +363 -0
  365. stacktrace_cli-0.12.0/tests/test_cli.py +717 -0
  366. stacktrace_cli-0.12.0/tests/test_composition.py +520 -0
  367. stacktrace_cli-0.12.0/tests/test_correlate_orchestrate.py +576 -0
  368. stacktrace_cli-0.12.0/tests/test_correlate_render.py +766 -0
  369. stacktrace_cli-0.12.0/tests/test_correlated_session.py +283 -0
  370. stacktrace_cli-0.12.0/tests/test_detection_components.py +194 -0
  371. stacktrace_cli-0.12.0/tests/test_detection_event_time.py +245 -0
  372. stacktrace_cli-0.12.0/tests/test_detection_subject.py +585 -0
  373. stacktrace_cli-0.12.0/tests/test_detector_analyzer_contract.py +243 -0
  374. stacktrace_cli-0.12.0/tests/test_detector_analyzer_live.py +178 -0
  375. stacktrace_cli-0.12.0/tests/test_detector_blocked.py +753 -0
  376. stacktrace_cli-0.12.0/tests/test_detector_cache.py +1109 -0
  377. stacktrace_cli-0.12.0/tests/test_detector_client_errors.py +125 -0
  378. stacktrace_cli-0.12.0/tests/test_detector_declared_egress.py +100 -0
  379. stacktrace_cli-0.12.0/tests/test_detector_deterministic.py +315 -0
  380. stacktrace_cli-0.12.0/tests/test_detector_end_to_end.py +290 -0
  381. stacktrace_cli-0.12.0/tests/test_detector_finding.py +321 -0
  382. stacktrace_cli-0.12.0/tests/test_detector_history.py +300 -0
  383. stacktrace_cli-0.12.0/tests/test_detector_infra_reasoning.py +564 -0
  384. stacktrace_cli-0.12.0/tests/test_detector_jev.py +306 -0
  385. stacktrace_cli-0.12.0/tests/test_detector_names_the_service.py +252 -0
  386. stacktrace_cli-0.12.0/tests/test_detector_new_deterministic.py +4657 -0
  387. stacktrace_cli-0.12.0/tests/test_detector_priors.py +466 -0
  388. stacktrace_cli-0.12.0/tests/test_detector_prompts.py +42 -0
  389. stacktrace_cli-0.12.0/tests/test_detector_reasoning.py +1803 -0
  390. stacktrace_cli-0.12.0/tests/test_detector_render.py +560 -0
  391. stacktrace_cli-0.12.0/tests/test_detector_run.py +1395 -0
  392. stacktrace_cli-0.12.0/tests/test_detector_secrets.py +668 -0
  393. stacktrace_cli-0.12.0/tests/test_detector_verdict.py +465 -0
  394. stacktrace_cli-0.12.0/tests/test_detector_vulnerable_dep_invoked.py +478 -0
  395. stacktrace_cli-0.12.0/tests/test_detector_why_it_stopped.py +427 -0
  396. stacktrace_cli-0.12.0/tests/test_detector_windows.py +547 -0
  397. stacktrace_cli-0.12.0/tests/test_entrypoint_conventions.py +110 -0
  398. stacktrace_cli-0.12.0/tests/test_evidence_is_dated_not_numbered.py +266 -0
  399. stacktrace_cli-0.12.0/tests/test_fingerprint_covers_what_the_analyzer_reads.py +405 -0
  400. stacktrace_cli-0.12.0/tests/test_help_sections.py +147 -0
  401. stacktrace_cli-0.12.0/tests/test_join.py +332 -0
  402. stacktrace_cli-0.12.0/tests/test_kind_conformance.py +203 -0
  403. stacktrace_cli-0.12.0/tests/test_monitor_cli.py +149 -0
  404. stacktrace_cli-0.12.0/tests/test_no_agent_kind_is_named.py +88 -0
  405. stacktrace_cli-0.12.0/tests/test_no_live_document_states_the_old_stage_three_default.py +171 -0
  406. stacktrace_cli-0.12.0/tests/test_observed.py +844 -0
  407. stacktrace_cli-0.12.0/tests/test_openaca_contract.py +79 -0
  408. stacktrace_cli-0.12.0/tests/test_openaidr_contract.py +474 -0
  409. stacktrace_cli-0.12.0/tests/test_option_arity_matches_the_binary.py +516 -0
  410. stacktrace_cli-0.12.0/tests/test_project_map.py +275 -0
  411. stacktrace_cli-0.12.0/tests/test_python_namespace.py +28 -0
  412. stacktrace_cli-0.12.0/tests/test_readme_examples_are_real_output.py +106 -0
  413. stacktrace_cli-0.12.0/tests/test_seam_boundary.py +110 -0
  414. stacktrace_cli-0.12.0/tests/test_session_identity_is_the_pair.py +400 -0
  415. stacktrace_cli-0.12.0/tests/test_sessions_access.py +268 -0
  416. stacktrace_cli-0.12.0/tests/test_sessions_protocol_typing.py +44 -0
  417. stacktrace_cli-0.12.0/tests/test_sessions_protocols.py +92 -0
  418. stacktrace_cli-0.12.0/tests/test_sessions_render.py +567 -0
  419. stacktrace_cli-0.12.0/tests/test_shell_separators_match_the_shell.py +1339 -0
  420. stacktrace_cli-0.12.0/tests/test_signed_in_asks_the_agent.py +93 -0
  421. stacktrace_cli-0.12.0/tests/test_stored_verdicts_are_never_gated_on_reasoning.py +74 -0
  422. stacktrace_cli-0.12.0/tests/test_the_detector_spec_lists_the_shipped_catalogue.py +144 -0
  423. stacktrace_cli-0.12.0/tests/test_the_jev_spec_states_the_shipped_thresholds.py +108 -0
  424. stacktrace_cli-0.12.0/tests/test_the_locality_claim_is_qualified_everywhere.py +67 -0
  425. stacktrace_cli-0.12.0/tests/test_title_disclosure_invariant.py +175 -0
  426. stacktrace_cli-0.12.0/tests/test_untrusted_content_never_travels.py +825 -0
  427. stacktrace_cli-0.12.0/tests/test_verification_subcommands_match_the_binary.py +185 -0
  428. stacktrace_cli-0.12.0/tests/test_what_jev_is_told_is_what_was_disclosed.py +318 -0
  429. stacktrace_cli-0.12.0/tests/webhook/test_cli.py +744 -0
  430. stacktrace_cli-0.12.0/uv.lock +960 -0
  431. stacktrace_cli-0.10.0/.agents/skills/release-stacktrace/SKILL.md +0 -249
  432. stacktrace_cli-0.10.0/.github/workflows/publish-pypi.yml +0 -178
  433. stacktrace_cli-0.10.0/.gitignore +0 -11
  434. stacktrace_cli-0.10.0/CLAUDE.md +0 -402
  435. stacktrace_cli-0.10.0/PKG-INFO +0 -246
  436. stacktrace_cli-0.10.0/README.md +0 -219
  437. stacktrace_cli-0.10.0/docs/adrs/0001-session-telemetry-as-input.md +0 -116
  438. stacktrace_cli-0.10.0/docs/adrs/0004-three-stage-detector.md +0 -159
  439. stacktrace_cli-0.10.0/docs/adrs/0006-trust-boundary-and-detection-upload.md +0 -179
  440. stacktrace_cli-0.10.0/docs/adrs/0031-one-host-daemon-observes-native-session-logs.md +0 -115
  441. stacktrace_cli-0.10.0/docs/adrs/0061-the-drain-sends-findings-only.md +0 -118
  442. stacktrace_cli-0.10.0/docs/adrs/0070-package-the-cloud-agent-environment-bootstrap.md +0 -162
  443. stacktrace_cli-0.10.0/docs/adrs/0093-environment-cost-baselines-count-tokens-keyed-by-model.md +0 -78
  444. stacktrace_cli-0.10.0/docs/adrs/0096-cost-usage-may-leave-as-token-totals-and-work-identifiers.md +0 -86
  445. stacktrace_cli-0.10.0/docs/adrs/0099-cost-is-measured-in-tokens-and-relative-increases.md +0 -85
  446. stacktrace_cli-0.10.0/docs/adrs/0101-what-names-a-run-in-fleet.md +0 -111
  447. stacktrace_cli-0.10.0/docs/adrs/0104-usage-is-its-own-upload.md +0 -92
  448. stacktrace_cli-0.10.0/docs/adrs/0112-a-person-is-known-by-the-accounts-on-the-host.md +0 -137
  449. stacktrace_cli-0.10.0/docs/adrs/INDEX.md +0 -149
  450. stacktrace_cli-0.10.0/docs/specs/aidr.md +0 -505
  451. stacktrace_cli-0.10.0/docs/specs/cost-notifications.md +0 -721
  452. stacktrace_cli-0.10.0/docs/specs/cost-phase-1.md +0 -508
  453. stacktrace_cli-0.10.0/docs/specs/cost.md +0 -274
  454. stacktrace_cli-0.10.0/docs/specs/detector.md +0 -1117
  455. stacktrace_cli-0.10.0/docs/specs/monitor.md +0 -878
  456. stacktrace_cli-0.10.0/docs/specs/reasoning-jev.md +0 -463
  457. stacktrace_cli-0.10.0/docs/specs/usage-upload.md +0 -401
  458. stacktrace_cli-0.10.0/pyproject.toml +0 -123
  459. stacktrace_cli-0.10.0/scripts/cost_latency.py +0 -85
  460. stacktrace_cli-0.10.0/src/stacktrace_cli/__init__.py +0 -10
  461. stacktrace_cli-0.10.0/src/stacktrace_cli/__main__.py +0 -16
  462. stacktrace_cli-0.10.0/src/stacktrace_cli/analysis.py +0 -664
  463. stacktrace_cli-0.10.0/src/stacktrace_cli/cli.py +0 -641
  464. stacktrace_cli-0.10.0/src/stacktrace_cli/cloud/__init__.py +0 -49
  465. stacktrace_cli-0.10.0/src/stacktrace_cli/cloud/setup.sh +0 -289
  466. stacktrace_cli-0.10.0/src/stacktrace_cli/correlate/acquire.py +0 -541
  467. stacktrace_cli-0.10.0/src/stacktrace_cli/correlate/join.py +0 -381
  468. stacktrace_cli-0.10.0/src/stacktrace_cli/correlate/observed.py +0 -1917
  469. stacktrace_cli-0.10.0/src/stacktrace_cli/correlate/orchestrate.py +0 -534
  470. stacktrace_cli-0.10.0/src/stacktrace_cli/correlate/record.py +0 -287
  471. stacktrace_cli-0.10.0/src/stacktrace_cli/correlate/render.py +0 -768
  472. stacktrace_cli-0.10.0/src/stacktrace_cli/cost/baseline.py +0 -555
  473. stacktrace_cli-0.10.0/src/stacktrace_cli/cost/component_usage.py +0 -324
  474. stacktrace_cli-0.10.0/src/stacktrace_cli/cost/components.py +0 -143
  475. stacktrace_cli-0.10.0/src/stacktrace_cli/cost/ledger.py +0 -58
  476. stacktrace_cli-0.10.0/src/stacktrace_cli/cost/measures.py +0 -354
  477. stacktrace_cli-0.10.0/src/stacktrace_cli/cost/models.py +0 -38
  478. stacktrace_cli-0.10.0/src/stacktrace_cli/cost/org_baselines.py +0 -258
  479. stacktrace_cli-0.10.0/src/stacktrace_cli/cost/reasons.py +0 -592
  480. stacktrace_cli-0.10.0/src/stacktrace_cli/cost/rules.py +0 -662
  481. stacktrace_cli-0.10.0/src/stacktrace_cli/cost/runs.py +0 -149
  482. stacktrace_cli-0.10.0/src/stacktrace_cli/cost/tokens.py +0 -69
  483. stacktrace_cli-0.10.0/src/stacktrace_cli/cost/totals.py +0 -62
  484. stacktrace_cli-0.10.0/src/stacktrace_cli/cost/usage.py +0 -293
  485. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/accounts.py +0 -269
  486. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/activity_log.py +0 -94
  487. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/bom.py +0 -56
  488. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/cli.py +0 -740
  489. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/client.py +0 -396
  490. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/composition.py +0 -294
  491. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/config.py +0 -322
  492. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/costs.py +0 -780
  493. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/db.py +0 -940
  494. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/fleet.py +0 -729
  495. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/identity.py +0 -99
  496. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/lifecycle.py +0 -172
  497. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/observer.py +0 -755
  498. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/paths.py +0 -40
  499. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/presentation.py +0 -180
  500. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/runtime.py +0 -969
  501. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/scan.py +0 -287
  502. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/server.py +0 -317
  503. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/store.py +0 -2440
  504. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/usage.py +0 -1126
  505. stacktrace_cli-0.10.0/src/stacktrace_cli/daemon/webhook.py +0 -529
  506. stacktrace_cli-0.10.0/src/stacktrace_cli/detector/analyzer.py +0 -205
  507. stacktrace_cli-0.10.0/src/stacktrace_cli/detector/blocked.py +0 -462
  508. stacktrace_cli-0.10.0/src/stacktrace_cli/detector/cache.py +0 -723
  509. stacktrace_cli-0.10.0/src/stacktrace_cli/detector/deterministic.py +0 -2908
  510. stacktrace_cli-0.10.0/src/stacktrace_cli/detector/finding.py +0 -507
  511. stacktrace_cli-0.10.0/src/stacktrace_cli/detector/history.py +0 -210
  512. stacktrace_cli-0.10.0/src/stacktrace_cli/detector/jev.py +0 -213
  513. stacktrace_cli-0.10.0/src/stacktrace_cli/detector/priors.py +0 -270
  514. stacktrace_cli-0.10.0/src/stacktrace_cli/detector/prompts/__init__.py +0 -51
  515. stacktrace_cli-0.10.0/src/stacktrace_cli/detector/reasoning.py +0 -1861
  516. stacktrace_cli-0.10.0/src/stacktrace_cli/detector/render.py +0 -478
  517. stacktrace_cli-0.10.0/src/stacktrace_cli/detector/run.py +0 -1185
  518. stacktrace_cli-0.10.0/src/stacktrace_cli/detector/secrets.py +0 -205
  519. stacktrace_cli-0.10.0/src/stacktrace_cli/detector/verdict.py +0 -266
  520. stacktrace_cli-0.10.0/src/stacktrace_cli/detector/windows.py +0 -443
  521. stacktrace_cli-0.10.0/src/stacktrace_cli/monitor/__init__.py +0 -12
  522. stacktrace_cli-0.10.0/src/stacktrace_cli/monitor/costs.py +0 -650
  523. stacktrace_cli-0.10.0/src/stacktrace_cli/monitor/inventory.py +0 -495
  524. stacktrace_cli-0.10.0/src/stacktrace_cli/monitor/offline.py +0 -266
  525. stacktrace_cli-0.10.0/src/stacktrace_cli/monitor/reasoning.py +0 -306
  526. stacktrace_cli-0.10.0/src/stacktrace_cli/monitor/render.py +0 -835
  527. stacktrace_cli-0.10.0/src/stacktrace_cli/monitor/server.py +0 -749
  528. stacktrace_cli-0.10.0/src/stacktrace_cli/monitor/site/app.js +0 -3269
  529. stacktrace_cli-0.10.0/src/stacktrace_cli/monitor/site/cost.js +0 -1008
  530. stacktrace_cli-0.10.0/src/stacktrace_cli/monitor/site/index.html +0 -179
  531. stacktrace_cli-0.10.0/src/stacktrace_cli/monitor/site/styles.css +0 -902
  532. stacktrace_cli-0.10.0/src/stacktrace_cli/monitor/verdicts.py +0 -52
  533. stacktrace_cli-0.10.0/src/stacktrace_cli/monitor/watch.py +0 -805
  534. stacktrace_cli-0.10.0/src/stacktrace_cli/options.py +0 -107
  535. stacktrace_cli-0.10.0/src/stacktrace_cli/remote/cli.py +0 -655
  536. stacktrace_cli-0.10.0/src/stacktrace_cli/remote/detect_payload.py +0 -508
  537. stacktrace_cli-0.10.0/src/stacktrace_cli/remote/payload.py +0 -443
  538. stacktrace_cli-0.10.0/src/stacktrace_cli/remote/policy.py +0 -88
  539. stacktrace_cli-0.10.0/src/stacktrace_cli/remote/policy_service.py +0 -1637
  540. stacktrace_cli-0.10.0/src/stacktrace_cli/remote/spool.py +0 -449
  541. stacktrace_cli-0.10.0/src/stacktrace_cli/remote/sync.py +0 -807
  542. stacktrace_cli-0.10.0/src/stacktrace_cli/remote/sync_detect.py +0 -536
  543. stacktrace_cli-0.10.0/src/stacktrace_cli/remote/upload_contract.py +0 -1142
  544. stacktrace_cli-0.10.0/src/stacktrace_cli/sessions/access.py +0 -199
  545. stacktrace_cli-0.10.0/src/stacktrace_cli/sessions/outcome.py +0 -65
  546. stacktrace_cli-0.10.0/src/stacktrace_cli/sessions/protocols.py +0 -316
  547. stacktrace_cli-0.10.0/src/stacktrace_cli/sessions/render.py +0 -301
  548. stacktrace_cli-0.10.0/src/stacktrace_cli/telemetry/events.py +0 -497
  549. stacktrace_cli-0.10.0/src/stacktrace_cli/telemetry/state.py +0 -219
  550. stacktrace_cli-0.10.0/src/stacktrace_cli/webhook/cli.py +0 -200
  551. stacktrace_cli-0.10.0/src/stacktrace_cli/webhook/config.py +0 -193
  552. stacktrace_cli-0.10.0/tests/conftest.py +0 -179
  553. stacktrace_cli-0.10.0/tests/cost/fakes.py +0 -57
  554. stacktrace_cli-0.10.0/tests/cost/scenarios.py +0 -313
  555. stacktrace_cli-0.10.0/tests/cost/test_as_of_cuts_every_timed_collection.py +0 -150
  556. stacktrace_cli-0.10.0/tests/cost/test_baseline.py +0 -261
  557. stacktrace_cli-0.10.0/tests/cost/test_clock.py +0 -61
  558. stacktrace_cli-0.10.0/tests/cost/test_component_usage.py +0 -307
  559. stacktrace_cli-0.10.0/tests/cost/test_components.py +0 -129
  560. stacktrace_cli-0.10.0/tests/cost/test_cost_evidence_travels.py +0 -135
  561. stacktrace_cli-0.10.0/tests/cost/test_cost_findings_are_dated_by_their_citations.py +0 -426
  562. stacktrace_cli-0.10.0/tests/cost/test_cost_findings_carry_no_session_text.py +0 -123
  563. stacktrace_cli-0.10.0/tests/cost/test_cost_is_tokens.py +0 -72
  564. stacktrace_cli-0.10.0/tests/cost/test_cost_latency.py +0 -82
  565. stacktrace_cli-0.10.0/tests/cost/test_evidence.py +0 -40
  566. stacktrace_cli-0.10.0/tests/cost/test_ledger.py +0 -44
  567. stacktrace_cli-0.10.0/tests/cost/test_measures.py +0 -251
  568. stacktrace_cli-0.10.0/tests/cost/test_models.py +0 -15
  569. stacktrace_cli-0.10.0/tests/cost/test_org_baselines.py +0 -333
  570. stacktrace_cli-0.10.0/tests/cost/test_reasons.py +0 -261
  571. stacktrace_cli-0.10.0/tests/cost/test_rules_baseline.py +0 -189
  572. stacktrace_cli-0.10.0/tests/cost/test_rules_budget.py +0 -189
  573. stacktrace_cli-0.10.0/tests/cost/test_runs.py +0 -43
  574. stacktrace_cli-0.10.0/tests/cost/test_totals.py +0 -55
  575. stacktrace_cli-0.10.0/tests/cost/test_usage.py +0 -255
  576. stacktrace_cli-0.10.0/tests/daemon/observing.py +0 -47
  577. stacktrace_cli-0.10.0/tests/daemon/test_accounts.py +0 -530
  578. stacktrace_cli-0.10.0/tests/daemon/test_activity_log.py +0 -350
  579. stacktrace_cli-0.10.0/tests/daemon/test_cli.py +0 -1444
  580. stacktrace_cli-0.10.0/tests/daemon/test_client.py +0 -396
  581. stacktrace_cli-0.10.0/tests/daemon/test_composition.py +0 -323
  582. stacktrace_cli-0.10.0/tests/daemon/test_config.py +0 -205
  583. stacktrace_cli-0.10.0/tests/daemon/test_cost_guidance.py +0 -23
  584. stacktrace_cli-0.10.0/tests/daemon/test_costs.py +0 -1350
  585. stacktrace_cli-0.10.0/tests/daemon/test_db.py +0 -871
  586. stacktrace_cli-0.10.0/tests/daemon/test_detection_needs_no_subscriber.py +0 -117
  587. stacktrace_cli-0.10.0/tests/daemon/test_fleet.py +0 -888
  588. stacktrace_cli-0.10.0/tests/daemon/test_identity.py +0 -91
  589. stacktrace_cli-0.10.0/tests/daemon/test_job_thread.py +0 -63
  590. stacktrace_cli-0.10.0/tests/daemon/test_jobs.py +0 -465
  591. stacktrace_cli-0.10.0/tests/daemon/test_lifecycle.py +0 -115
  592. stacktrace_cli-0.10.0/tests/daemon/test_observer.py +0 -1485
  593. stacktrace_cli-0.10.0/tests/daemon/test_queue_reader.py +0 -200
  594. stacktrace_cli-0.10.0/tests/daemon/test_runtime.py +0 -1735
  595. stacktrace_cli-0.10.0/tests/daemon/test_scan.py +0 -517
  596. stacktrace_cli-0.10.0/tests/daemon/test_service.py +0 -198
  597. stacktrace_cli-0.10.0/tests/daemon/test_session_cost_notices.py +0 -117
  598. stacktrace_cli-0.10.0/tests/daemon/test_socket.py +0 -547
  599. stacktrace_cli-0.10.0/tests/daemon/test_stage_times.py +0 -80
  600. stacktrace_cli-0.10.0/tests/daemon/test_store.py +0 -800
  601. stacktrace_cli-0.10.0/tests/daemon/test_subagent_routing.py +0 -154
  602. stacktrace_cli-0.10.0/tests/daemon/test_the_drained_payload_is_the_cold_one.py +0 -288
  603. stacktrace_cli-0.10.0/tests/daemon/test_the_stored_row_is_sufficient.py +0 -247
  604. stacktrace_cli-0.10.0/tests/daemon/test_usage.py +0 -1768
  605. stacktrace_cli-0.10.0/tests/daemon/test_usage_store.py +0 -973
  606. stacktrace_cli-0.10.0/tests/daemon/test_webhook.py +0 -1165
  607. stacktrace_cli-0.10.0/tests/daemon/test_wire_frames_are_bounded.py +0 -156
  608. stacktrace_cli-0.10.0/tests/detector_session_fixture.py +0 -156
  609. stacktrace_cli-0.10.0/tests/monitor/cost_harness.mjs +0 -288
  610. stacktrace_cli-0.10.0/tests/monitor/feed_harness.mjs +0 -4052
  611. stacktrace_cli-0.10.0/tests/monitor/inventory_harness.mjs +0 -481
  612. stacktrace_cli-0.10.0/tests/monitor/test_cost_page.py +0 -548
  613. stacktrace_cli-0.10.0/tests/monitor/test_cost_range_switch.py +0 -143
  614. stacktrace_cli-0.10.0/tests/monitor/test_feed_model.py +0 -2181
  615. stacktrace_cli-0.10.0/tests/monitor/test_inventory.py +0 -866
  616. stacktrace_cli-0.10.0/tests/monitor/test_offline.py +0 -242
  617. stacktrace_cli-0.10.0/tests/monitor/test_reasoning_gates.py +0 -688
  618. stacktrace_cli-0.10.0/tests/monitor/test_render.py +0 -1150
  619. stacktrace_cli-0.10.0/tests/monitor/test_render_cost.py +0 -937
  620. stacktrace_cli-0.10.0/tests/monitor/test_server.py +0 -830
  621. stacktrace_cli-0.10.0/tests/monitor/test_site_assets.py +0 -473
  622. stacktrace_cli-0.10.0/tests/monitor/test_state.py +0 -148
  623. stacktrace_cli-0.10.0/tests/monitor/test_verdicts.py +0 -136
  624. stacktrace_cli-0.10.0/tests/monitor/test_watch.py +0 -2134
  625. stacktrace_cli-0.10.0/tests/remote/helpers.py +0 -127
  626. stacktrace_cli-0.10.0/tests/remote/test_cli.py +0 -1028
  627. stacktrace_cli-0.10.0/tests/remote/test_client.py +0 -575
  628. stacktrace_cli-0.10.0/tests/remote/test_cloud_setup_asset_id.py +0 -56
  629. stacktrace_cli-0.10.0/tests/remote/test_config.py +0 -129
  630. stacktrace_cli-0.10.0/tests/remote/test_detect_activity.py +0 -220
  631. stacktrace_cli-0.10.0/tests/remote/test_detect_cli.py +0 -72
  632. stacktrace_cli-0.10.0/tests/remote/test_detect_client.py +0 -82
  633. stacktrace_cli-0.10.0/tests/remote/test_detect_contract_is_exhaustive.py +0 -926
  634. stacktrace_cli-0.10.0/tests/remote/test_detect_gate_matches_the_cloud.py +0 -351
  635. stacktrace_cli-0.10.0/tests/remote/test_detect_layers_compose.py +0 -162
  636. stacktrace_cli-0.10.0/tests/remote/test_detect_payload_reaches_the_cloud_model.py +0 -286
  637. stacktrace_cli-0.10.0/tests/remote/test_detect_redaction.py +0 -823
  638. stacktrace_cli-0.10.0/tests/remote/test_detect_spool.py +0 -329
  639. stacktrace_cli-0.10.0/tests/remote/test_detect_upload_contract.py +0 -180
  640. stacktrace_cli-0.10.0/tests/remote/test_detect_wire_payload.py +0 -185
  641. stacktrace_cli-0.10.0/tests/remote/test_facade_contract.py +0 -415
  642. stacktrace_cli-0.10.0/tests/remote/test_identity.py +0 -486
  643. stacktrace_cli-0.10.0/tests/remote/test_no_local_path_survives_redaction.py +0 -376
  644. stacktrace_cli-0.10.0/tests/remote/test_payload.py +0 -940
  645. stacktrace_cli-0.10.0/tests/remote/test_policy.py +0 -259
  646. stacktrace_cli-0.10.0/tests/remote/test_policy_service.py +0 -2432
  647. stacktrace_cli-0.10.0/tests/remote/test_policy_service_cli.py +0 -334
  648. stacktrace_cli-0.10.0/tests/remote/test_redact_payload.py +0 -1022
  649. stacktrace_cli-0.10.0/tests/remote/test_seam.py +0 -286
  650. stacktrace_cli-0.10.0/tests/remote/test_spool.py +0 -706
  651. stacktrace_cli-0.10.0/tests/remote/test_sync.py +0 -2217
  652. stacktrace_cli-0.10.0/tests/remote/test_sync_detect.py +0 -888
  653. stacktrace_cli-0.10.0/tests/remote/test_upload_contract.py +0 -853
  654. stacktrace_cli-0.10.0/tests/remote/test_usage_client.py +0 -111
  655. stacktrace_cli-0.10.0/tests/remote/test_usage_contract.py +0 -283
  656. stacktrace_cli-0.10.0/tests/telemetry/test_activity_log.py +0 -135
  657. stacktrace_cli-0.10.0/tests/telemetry/test_cli.py +0 -260
  658. stacktrace_cli-0.10.0/tests/telemetry/test_events.py +0 -673
  659. stacktrace_cli-0.10.0/tests/telemetry/test_every_derived_site.py +0 -222
  660. stacktrace_cli-0.10.0/tests/telemetry/test_every_internal_save_is_reported.py +0 -55
  661. stacktrace_cli-0.10.0/tests/telemetry/test_hooks.py +0 -591
  662. stacktrace_cli-0.10.0/tests/telemetry/test_release_gate.py +0 -14
  663. stacktrace_cli-0.10.0/tests/telemetry/test_state.py +0 -150
  664. stacktrace_cli-0.10.0/tests/telemetry/test_uploader.py +0 -190
  665. stacktrace_cli-0.10.0/tests/test_acquire.py +0 -818
  666. stacktrace_cli-0.10.0/tests/test_agent_instance_id.py +0 -207
  667. stacktrace_cli-0.10.0/tests/test_analysis.py +0 -646
  668. stacktrace_cli-0.10.0/tests/test_bom_shape.py +0 -196
  669. stacktrace_cli-0.10.0/tests/test_build_commit.py +0 -244
  670. stacktrace_cli-0.10.0/tests/test_call_status_conventions.py +0 -363
  671. stacktrace_cli-0.10.0/tests/test_cli.py +0 -717
  672. stacktrace_cli-0.10.0/tests/test_composition.py +0 -520
  673. stacktrace_cli-0.10.0/tests/test_correlate_orchestrate.py +0 -576
  674. stacktrace_cli-0.10.0/tests/test_correlate_render.py +0 -766
  675. stacktrace_cli-0.10.0/tests/test_correlated_session.py +0 -283
  676. stacktrace_cli-0.10.0/tests/test_detection_components.py +0 -194
  677. stacktrace_cli-0.10.0/tests/test_detection_event_time.py +0 -245
  678. stacktrace_cli-0.10.0/tests/test_detection_subject.py +0 -585
  679. stacktrace_cli-0.10.0/tests/test_detector_analyzer_contract.py +0 -243
  680. stacktrace_cli-0.10.0/tests/test_detector_analyzer_live.py +0 -178
  681. stacktrace_cli-0.10.0/tests/test_detector_blocked.py +0 -744
  682. stacktrace_cli-0.10.0/tests/test_detector_cache.py +0 -1109
  683. stacktrace_cli-0.10.0/tests/test_detector_deterministic.py +0 -315
  684. stacktrace_cli-0.10.0/tests/test_detector_end_to_end.py +0 -290
  685. stacktrace_cli-0.10.0/tests/test_detector_finding.py +0 -321
  686. stacktrace_cli-0.10.0/tests/test_detector_history.py +0 -291
  687. stacktrace_cli-0.10.0/tests/test_detector_infra_reasoning.py +0 -564
  688. stacktrace_cli-0.10.0/tests/test_detector_jev.py +0 -306
  689. stacktrace_cli-0.10.0/tests/test_detector_names_the_service.py +0 -252
  690. stacktrace_cli-0.10.0/tests/test_detector_new_deterministic.py +0 -4624
  691. stacktrace_cli-0.10.0/tests/test_detector_priors.py +0 -466
  692. stacktrace_cli-0.10.0/tests/test_detector_prompts.py +0 -42
  693. stacktrace_cli-0.10.0/tests/test_detector_reasoning.py +0 -1793
  694. stacktrace_cli-0.10.0/tests/test_detector_render.py +0 -560
  695. stacktrace_cli-0.10.0/tests/test_detector_run.py +0 -1395
  696. stacktrace_cli-0.10.0/tests/test_detector_secrets.py +0 -292
  697. stacktrace_cli-0.10.0/tests/test_detector_verdict.py +0 -465
  698. stacktrace_cli-0.10.0/tests/test_detector_vulnerable_dep_invoked.py +0 -478
  699. stacktrace_cli-0.10.0/tests/test_detector_why_it_stopped.py +0 -383
  700. stacktrace_cli-0.10.0/tests/test_detector_windows.py +0 -547
  701. stacktrace_cli-0.10.0/tests/test_evidence_is_dated_not_numbered.py +0 -266
  702. stacktrace_cli-0.10.0/tests/test_fingerprint_covers_what_the_analyzer_reads.py +0 -407
  703. stacktrace_cli-0.10.0/tests/test_help_sections.py +0 -147
  704. stacktrace_cli-0.10.0/tests/test_join.py +0 -333
  705. stacktrace_cli-0.10.0/tests/test_kind_conformance.py +0 -163
  706. stacktrace_cli-0.10.0/tests/test_monitor_cli.py +0 -149
  707. stacktrace_cli-0.10.0/tests/test_no_agent_kind_is_named.py +0 -83
  708. stacktrace_cli-0.10.0/tests/test_no_live_document_states_the_old_stage_three_default.py +0 -171
  709. stacktrace_cli-0.10.0/tests/test_observed.py +0 -752
  710. stacktrace_cli-0.10.0/tests/test_openaca_contract.py +0 -79
  711. stacktrace_cli-0.10.0/tests/test_openaidr_contract.py +0 -254
  712. stacktrace_cli-0.10.0/tests/test_option_arity_matches_the_binary.py +0 -519
  713. stacktrace_cli-0.10.0/tests/test_project_map.py +0 -275
  714. stacktrace_cli-0.10.0/tests/test_readme_examples_are_real_output.py +0 -106
  715. stacktrace_cli-0.10.0/tests/test_seam_boundary.py +0 -110
  716. stacktrace_cli-0.10.0/tests/test_session_identity_is_the_pair.py +0 -374
  717. stacktrace_cli-0.10.0/tests/test_sessions_access.py +0 -268
  718. stacktrace_cli-0.10.0/tests/test_sessions_protocol_typing.py +0 -44
  719. stacktrace_cli-0.10.0/tests/test_sessions_protocols.py +0 -92
  720. stacktrace_cli-0.10.0/tests/test_sessions_render.py +0 -567
  721. stacktrace_cli-0.10.0/tests/test_shell_separators_match_the_shell.py +0 -1339
  722. stacktrace_cli-0.10.0/tests/test_signed_in_asks_the_agent.py +0 -93
  723. stacktrace_cli-0.10.0/tests/test_stored_verdicts_are_never_gated_on_reasoning.py +0 -74
  724. stacktrace_cli-0.10.0/tests/test_the_detector_spec_lists_the_shipped_catalogue.py +0 -144
  725. stacktrace_cli-0.10.0/tests/test_the_jev_spec_states_the_shipped_thresholds.py +0 -108
  726. stacktrace_cli-0.10.0/tests/test_the_locality_claim_is_qualified_everywhere.py +0 -76
  727. stacktrace_cli-0.10.0/tests/test_title_disclosure_invariant.py +0 -166
  728. stacktrace_cli-0.10.0/tests/test_untrusted_content_never_travels.py +0 -813
  729. stacktrace_cli-0.10.0/tests/test_verification_subcommands_match_the_binary.py +0 -185
  730. stacktrace_cli-0.10.0/tests/test_what_jev_is_told_is_what_was_disclosed.py +0 -318
  731. stacktrace_cli-0.10.0/tests/webhook/test_cli.py +0 -744
  732. stacktrace_cli-0.10.0/uv.lock +0 -958
  733. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/.claude/settings.json +0 -0
  734. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/.claude/skills/release-stacktrace/SKILL.md +0 -0
  735. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/.codex/hooks.json +0 -0
  736. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/.github/managed-autofix.md +0 -0
  737. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/.github/pull_request_template.md +0 -0
  738. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/.github/workflows/bedrock-live.yml +0 -0
  739. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/.github/workflows/ci.yml +0 -0
  740. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/AGENTS.md +0 -0
  741. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0002-session-collection-in-openaidr.md +0 -0
  742. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0003-runtime-edges.md +0 -0
  743. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0005-detection-family-and-report-assembly.md +0 -0
  744. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0007-proprietary-package-on-open-dependencies.md +0 -0
  745. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0008-console-in-separate-demo-package.md +0 -0
  746. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0010-detection-severity-and-confidence-ladders.md +0 -0
  747. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0011-verdict-cache.md +0 -0
  748. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0012-observation-evidence-kinds-and-transport.md +0 -0
  749. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0013-rule-catalogue-triage-and-per-rule-context.md +0 -0
  750. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0014-declared-project-mapping.md +0 -0
  751. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0015-narrow-the-security-catalogue.md +0 -0
  752. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0016-stall-grouping-is-session-wide.md +0 -0
  753. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0017-a-declined-repeat-is-a-stall.md +0 -0
  754. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0018-remote-sync-config-and-facade-consumption.md +0 -0
  755. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0019-delegated-commands-are-openaca-objects.md +0 -0
  756. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0020-openaca-consumption-boundary.md +0 -0
  757. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0021-two-command-kinds.md +0 -0
  758. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0022-detection-scope-is-a-catalogue-column.md +0 -0
  759. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0023-sync-detect-collects-and-does-not-escalate.md +0 -0
  760. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0024-the-upload-carries-observations.md +0 -0
  761. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0025-a-denied-call-is-activity-never-an-invocation.md +0 -0
  762. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0026-the-console-becomes-a-product-surface.md +0 -0
  763. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0027-a-finding-may-name-what-it-could-not-place.md +0 -0
  764. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0028-the-console-shows-what-it-placed.md +0 -0
  765. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0029-stage-three-returns-to-opt-in.md +0 -0
  766. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0030-a-detection-is-dated-by-the-turns-it-cites.md +0 -0
  767. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0032-refresh-daemon-compositions-outside-detection.md +0 -0
  768. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0033-a-third-party-analyzer-only-by-a-flag-that-names-it.md +0 -0
  769. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0034-the-drift-grade-is-read-off-a-run-not-a-call.md +0 -0
  770. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0035-naming-an-analyzer-selects-stored-answers.md +0 -0
  771. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0036-deliver-eligible-findings-to-slack-from-the-daemon.md +0 -0
  772. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0037-reuse-openaidr-append-cursors-in-the-daemon.md +0 -0
  773. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0038-poll-normalized-sessions-for-supplemental-changes.md +0 -0
  774. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0039-send-usage-telemetry-by-default-with-an-opt-out.md +0 -0
  775. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0041-defer-native-windows-support.md +0 -0
  776. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0042-read-the-build-commit-from-the-install-record.md +0 -0
  777. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0043-name-the-session-agent-and-host-and-count-errors-by-class.md +0 -0
  778. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0044-send-the-build-as-version-prints-it.md +0 -0
  779. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0045-scan-every-session-and-outlive-them.md +0 -0
  780. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0046-the-finding-store-is-an-append-only-queue.md +0 -0
  781. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0047-capture-activity-during-correlation-or-lose-it.md +0 -0
  782. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0048-the-daemon-keeps-a-leveled-content-free-activity-log.md +0 -0
  783. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0056-stop-a-resident-daemon-by-record-and-signal.md +0 -0
  784. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0057-grow-the-queue-schema-additively-and-share-only-the-document.md +0 -0
  785. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0058-one-word-for-a-finding-columns-for-a-counter-and-a-push-that-does-not-wait.md +0 -0
  786. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0059-the-daemon-does-not-decide-whether-it-should-be-running.md +0 -0
  787. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0060-two-upload-postures-not-one-command-with-two-sources.md +0 -0
  788. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0062-hold-the-transition-lock-across-remote-side-effects.md +0 -0
  789. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0063-underbuilt-debt-does-not-hold-the-scan-watermark.md +0 -0
  790. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0064-a-redacted-value-has-one-path-span.md +0 -0
  791. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0065-asset-external-id-resolves-by-a-ladder.md +0 -0
  792. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0066-host-owned-daemon-supervision.md +0 -0
  793. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0067-a-webhook-is-an-independent-queue-subscriber.md +0 -0
  794. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0068-webhooks-retry-the-retained-backlog.md +0 -0
  795. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0069-webhooks-deliver-what-retention-holds.md +0 -0
  796. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0071-render-the-allowlisted-payload-per-destination.md +0 -0
  797. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0072-host-supervisors-own-daemon-restarts.md +0 -0
  798. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0073-name-what-fired-and-which-component.md +0 -0
  799. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0074-a-window-selects-findings-by-when-they-happened.md +0 -0
  800. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0076-two-phase-detection-pipeline.md +0 -0
  801. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0077-the-bom-job-wakes-once-at-startup-staggered.md +0 -0
  802. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0078-a-seeded-display-prefix-replaces-the-hostname-label.md +0 -0
  803. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0079-the-monitor-page-renders-findings-not-pipeline-health.md +0 -0
  804. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0080-enabling-reasoning-does-not-requeue-the-past.md +0 -0
  805. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0081-reasoning-activation-returns-to-explicit-opt-in.md +0 -0
  806. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0082-monitor-checks-every-installed-component-by-default.md +0 -0
  807. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0083-each-block-reason-is-its-own-rule.md +0 -0
  808. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0084-a-recursive-deletes-evidence-is-the-rm-that-ran.md +0 -0
  809. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0085-show-when-and-which-finding-slack-delivered.md +0 -0
  810. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0086-a-refusal-names-who-answered-the-call.md +0 -0
  811. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0087-deploy-compiled-policy-with-a-privileged-scheduled-job.md +0 -0
  812. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0088-slack-alerts-leave-out-confidence.md +0 -0
  813. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0089-infra-gate-reads-commands-not-shell-semantics.md +0 -0
  814. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0090-count-completed-commands-locate-by-ip-send-through-the-managed-proxy.md +0 -0
  815. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0091-mark-our-own-machines-and-name-what-failed.md +0 -0
  816. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0092-cost-is-its-own-rule-family.md +0 -0
  817. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0094-estimate-cost-from-tokens-the-agent-figure-is-a-cross-check.md +0 -0
  818. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0095-cost-findings-reach-fleet-each-rule-can-be-muted.md +0 -0
  819. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0097-the-daemon-makes-cost-findings-and-the-monitor-reads-them.md +0 -0
  820. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0098-a-run-is-its-main-session.md +0 -0
  821. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0100-the-monitor-runs-offline-for-the-website.md +0 -0
  822. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0102-token-use-is-never-compared-with-a-providers-usage-api.md +0 -0
  823. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0103-finished-runs-may-leave-as-numbers-for-org-baselines.md +0 -0
  824. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0105-an-asset-key-is-a-bare-uuid.md +0 -0
  825. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0106-boot-id-is-salted-with-the-pid-namespace.md +0 -0
  826. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0107-the-daemon-follows-every-kind-openaidr-reads.md +0 -0
  827. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0108-a-kind-renamed-before-any-release-read-it-keeps-no-alias.md +0 -0
  828. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0109-a-detection-carries-its-runs-title-and-the-persons-name.md +0 -0
  829. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0110-every-kinds-account-comes-from-openaidr.md +0 -0
  830. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0111-built-in-sub-agents-and-skills-come-from-the-bom.md +0 -0
  831. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0113-size-triggers-behaviour-explains-session-cost-carries-reasons.md +0 -0
  832. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0114-similar-sessions-are-the-same-agent-in-the-same-repo.md +0 -0
  833. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0115-usage-states-its-coverage-and-fleet-returns-expected-runs.md +0 -0
  834. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0116-a-component-row-carries-what-its-results-cost-under-one-closed-key.md +0 -0
  835. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/0117-a-component-row-on-the-day-of-a-switch-counts-from-the-switch.md +0 -0
  836. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/HOOK-PROMPT.md +0 -0
  837. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/adrs/TEMPLATE.md +0 -0
  838. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/cutover-openaca-remote.md +0 -0
  839. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/plans/002-session-input.md +0 -0
  840. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/plans/003-correlation.md +0 -0
  841. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/plans/004-detector.md +0 -0
  842. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/plans/005-remote-sync.md +0 -0
  843. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/plans/006-cli-composition.md +0 -0
  844. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/plans/007-detection-upload.md +0 -0
  845. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/plans/008-monitor.md +0 -0
  846. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/plans/009-reasoning-jev.md +0 -0
  847. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/plans/010-session-daemon.md +0 -0
  848. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/plans/011-daemon-store.md +0 -0
  849. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/plans/012-daemon-scanning.md +0 -0
  850. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/plans/013-daemon-uploads.md +0 -0
  851. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/plans/014-asset-identity.md +0 -0
  852. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/plans/015-managed-policy-deployment.md +0 -0
  853. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/plans/016-cost-phase-1.md +0 -0
  854. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/plans/017-cost-phase-2.md +0 -0
  855. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.0.1.md +0 -0
  856. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.1.0.md +0 -0
  857. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.10.0.md +0 -0
  858. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.2.0.md +0 -0
  859. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.2.1.md +0 -0
  860. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.2.2.md +0 -0
  861. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.2.3.md +0 -0
  862. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.3.0.md +0 -0
  863. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.3.1.md +0 -0
  864. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.4.0.md +0 -0
  865. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.4.1.md +0 -0
  866. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.5.0.md +0 -0
  867. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.5.1.md +0 -0
  868. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.5.2.md +0 -0
  869. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.5.3.md +0 -0
  870. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.6.0.md +0 -0
  871. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.6.1.md +0 -0
  872. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.7.0.md +0 -0
  873. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.7.1.md +0 -0
  874. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.8.0.md +0 -0
  875. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/releases/v0.9.0.md +0 -0
  876. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/research/001-intent-drift-metric.md +0 -0
  877. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/specs/cli-composition.md +0 -0
  878. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/specs/correlation.md +0 -0
  879. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/specs/cost-phase-2.md +0 -0
  880. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/specs/daemon-scanning.md +0 -0
  881. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/specs/daemon-store.md +0 -0
  882. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/specs/daemon-uploads.md +0 -0
  883. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/specs/detection-policies.md +0 -0
  884. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/specs/detection-upload.md +0 -0
  885. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/specs/event-time.md +0 -0
  886. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/specs/managed-policy-deployment.md +0 -0
  887. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/specs/monitor-inventory.md +0 -0
  888. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/specs/notification-delivery.md +0 -0
  889. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/specs/remote-sync.md +0 -0
  890. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/docs/specs/session-input.md +0 -0
  891. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/scripts/git-hooks/pre-push +0 -0
  892. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/scripts/install-hooks.sh +0 -0
  893. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/build.py +0 -0
  894. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/correlate/__init__.py +0 -0
  895. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/correlate/composition.py +0 -0
  896. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/correlate/project_map.py +0 -0
  897. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/cost/__init__.py +0 -0
  898. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/cost/clock.py +0 -0
  899. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/cost/evidence.py +0 -0
  900. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/daemon/__init__.py +0 -0
  901. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/daemon/jobs.py +0 -0
  902. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/daemon/protocol.py +0 -0
  903. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/daemon/service.py +0 -0
  904. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/detector/__init__.py +0 -0
  905. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/detector/prompts/jev-v1/stacktrace-deceptive-completion.json +0 -0
  906. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/detector/prompts/jev-v2/stacktrace-deceptive-completion.json +0 -0
  907. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/detector/prompts/jev-v2/stacktrace-infra-unsafe-action.json +0 -0
  908. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/detector/prompts/v1/exclusions.md +0 -0
  909. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/detector/prompts/v1/framing.md +0 -0
  910. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/detector/prompts/v1/stacktrace-deceptive-completion.md +0 -0
  911. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/detector/rules.py +0 -0
  912. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/monitor/site/apple-icon.png +0 -0
  913. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/monitor/site/favicon.ico +0 -0
  914. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/monitor/site/fonts/OFL.txt +0 -0
  915. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/monitor/site/fonts/dm-mono-400-latin.woff2 +0 -0
  916. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/monitor/site/fonts/dm-mono-500-latin.woff2 +0 -0
  917. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/monitor/site/fonts/dm-sans-latin.woff2 +0 -0
  918. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/monitor/site/fonts/playfair-display-600-italic-latin.woff2 +0 -0
  919. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/monitor/site/icon.svg +0 -0
  920. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/monitor/site/inventory.js +0 -0
  921. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/monitor/state.py +0 -0
  922. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/private_state.py +0 -0
  923. /stacktrace_cli-0.10.0/tests/__init__.py → /stacktrace_cli-0.12.0/src/stacktrace/py.typed +0 -0
  924. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/remote/__init__.py +0 -0
  925. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/remote/client.py +0 -0
  926. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/remote/config.py +0 -0
  927. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/remote/identity.py +0 -0
  928. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/remote/policy_worker.py +0 -0
  929. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/remote/redact.py +0 -0
  930. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/sessions/__init__.py +0 -0
  931. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/sessions/index.py +0 -0
  932. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/sessions/lineage.py +0 -0
  933. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/telemetry/__init__.py +0 -0
  934. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/telemetry/cli.py +0 -0
  935. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/telemetry/posthog.py +0 -0
  936. {stacktrace_cli-0.10.0/src/stacktrace_cli → stacktrace_cli-0.12.0/src/stacktrace}/webhook/__init__.py +0 -0
  937. {stacktrace_cli-0.10.0/tests/cost → stacktrace_cli-0.12.0/tests}/__init__.py +0 -0
  938. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/tests/agent_bom_fixture.py +0 -0
  939. {stacktrace_cli-0.10.0/tests/monitor → stacktrace_cli-0.12.0/tests/cost}/__init__.py +0 -0
  940. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/tests/daemon/__init__.py +0 -0
  941. {stacktrace_cli-0.10.0/tests/remote → stacktrace_cli-0.12.0/tests/gateway}/__init__.py +0 -0
  942. {stacktrace_cli-0.10.0/tests/telemetry → stacktrace_cli-0.12.0/tests/monitor}/__init__.py +0 -0
  943. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/tests/monitor/test_inventory_page.py +0 -0
  944. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/tests/test_adr_cross_references_are_reciprocal.py +0 -0
  945. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/tests/test_no_test_undoes_every_patch_at_once.py +0 -0
  946. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/tests/test_release_gate_coverage.py +0 -0
  947. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/tests/test_release_readiness.py +0 -0
  948. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/tests/test_sessions_end_to_end.py +0 -0
  949. {stacktrace_cli-0.10.0 → stacktrace_cli-0.12.0}/tests/tool_fields.py +0 -0
@@ -0,0 +1,249 @@
1
+ ---
2
+ name: release-stacktrace
3
+ description: Use when cutting a new stacktrace-cli PyPI release. Walks through version bump, release-notes drafting, pre-flight checks, tag, and push — enforces the publish-pypi.yml notes-file gate so the GitHub Releases page can't silently drift from PyPI.
4
+ ---
5
+
6
+ # release-stacktrace
7
+
8
+ End-to-end release procedure for the `stacktrace-cli` distribution.
9
+ `.github/workflows/publish-pypi.yml` enforces the machine-checkable gates
10
+ (tag on main, tag matches both version strings, notes file present, four
11
+ CI gates green). This skill is the human-side counterpart: it drafts the
12
+ notes with judgment, runs the pre-flight checks, and pushes the tag.
13
+
14
+ **Announce at start:** "I'm using the release-stacktrace skill to cut a new
15
+ stacktrace-cli release."
16
+
17
+ ## When to invoke
18
+
19
+ User says any of: "cut a release", "ship 0.0.N", "release stacktrace",
20
+ "tag a new version", or starts editing `pyproject.toml`'s version field
21
+ in this repo.
22
+
23
+ ## Inputs
24
+
25
+ 1. **Target version** (e.g. `0.1.0`). Inferred from `pyproject.toml` if
26
+ the user already bumped it; otherwise ask.
27
+ 2. **Theme** — the H1 line of the notes file. Ask the user; a commit log
28
+ can't infer it.
29
+
30
+ ## Procedure
31
+
32
+ ### Step 1. Pre-flight checks
33
+
34
+ Run from the repo root. Stop and ask if any fails — do not "fix" a dirty
35
+ tree or out-of-sync main automatically, those signal in-flight work.
36
+
37
+ ```bash
38
+ git rev-parse --abbrev-ref HEAD # must be main
39
+ git status --porcelain # must be empty
40
+ git fetch --tags origin
41
+ git rev-parse --verify "v<version>" 2>/dev/null # MUST FAIL — tag must not exist
42
+ test "$(git rev-parse HEAD)" = "$(git rev-parse origin/main)"
43
+ ```
44
+
45
+ The `release_gate` marker is **not** run here: `test_release_readiness.py`'s
46
+ share of it requires `openaca`/`openaidr` pinned exactly, which is not true of
47
+ a normal checkout (both float on `>=` between releases) and is only made true
48
+ by Step 4. Running it against an unpinned tree would fail on every release,
49
+ not just a broken one. It runs at the end of Step 4, once its precondition
50
+ holds.
51
+
52
+ PyPI versions are immutable, including yanked ones. If `<version>` is
53
+ already on PyPI, the only path forward is a new version number:
54
+
55
+ ```bash
56
+ curl -s https://pypi.org/pypi/stacktrace-cli/json | python3 -c 'import json,sys; print(sorted(json.load(sys.stdin)["releases"]))'
57
+ ```
58
+
59
+ ### Step 2. Gather the commit log
60
+
61
+ ```bash
62
+ prev_tag=$(git describe --tags --abbrev=0) # empty on the first release
63
+ git log --oneline "${prev_tag}..HEAD"
64
+ ```
65
+
66
+ Raw material only — do not dump it into the notes file verbatim.
67
+
68
+ ### Step 3. Draft `docs/releases/v<version>.md`
69
+
70
+ Follow the shape of the existing files in `docs/releases/`:
71
+
72
+ ```markdown
73
+ # <version> — <theme>
74
+
75
+ ## Highlights
76
+
77
+ - **<Theme A>.** 1-3 sentences pitched at someone who installs the CLI.
78
+ Reference ADRs by number when a design doc backs the change.
79
+ - **Bug fixes.** Combine small fixes into one bullet, comma-separated.
80
+
81
+ ## Install
82
+
83
+ `uv tool install stacktrace-cli==<version>` or `pip install stacktrace-cli==<version>`.
84
+
85
+ ## Compatibility
86
+
87
+ <Behavior changes existing users will notice. Say "pre-alpha, no
88
+ back-compat hedging" while that's still true.>
89
+ ```
90
+
91
+ **Judgment guidelines (apply ruthlessly):**
92
+
93
+ - **Group by theme, not by commit.** Five commits adding one capability
94
+ are one bullet.
95
+ - **Lead with user-visible impact**, not implementation.
96
+ - **Cut chore/format/docs-only and release-machinery commits.** They
97
+ aren't release-visible.
98
+ - **Acknowledge breaking changes explicitly** under `## Compatibility` —
99
+ a renamed subcommand or changed output shape goes there.
100
+
101
+ Show the draft to the user and iterate until they agree it captures what
102
+ shipped.
103
+
104
+ ### Step 4. Bump the version, pin workspace dependencies, and gate
105
+
106
+ `pyproject.toml`'s `version`, `src/stacktrace/__init__.py`'s
107
+ `__version__` and the `--version` console block in `README.md` are three
108
+ separate copies of the version string. The workflow fails the build if the
109
+ first two disagree with the tag. Move them together:
110
+
111
+ ```bash
112
+ sed -i.bak 's/^version = ".*"/version = "<version>"/' pyproject.toml && rm pyproject.toml.bak
113
+ sed -i.bak 's/^__version__ = ".*"/__version__ = "<version>"/' src/stacktrace/__init__.py && rm src/stacktrace/__init__.py.bak
114
+ ```
115
+
116
+ `openaca` and `openaidr` are developed alongside this package and float on
117
+ `>=` during normal development, but a prior release will have left them
118
+ pinned exactly with `==` (see below), which would stop `uv lock` from ever
119
+ resolving a newer release. Loosen both back to a floor first — the
120
+ replacement matches either operator, so this is safe to run whether the tree
121
+ is currently floating or still pinned from last time:
122
+
123
+ ```bash
124
+ sed -i.bak -E 's/^ "openaca(>=|==)[^"]*"/ "openaca>=0"/' pyproject.toml && rm pyproject.toml.bak
125
+ sed -i.bak -E 's/^ "openaidr(>=|==)[^"]*"/ "openaidr>=0"/' pyproject.toml && rm pyproject.toml.bak
126
+ uv lock # refresh uv.lock, now free to pick the newest release
127
+ uv run stacktrace --version # sanity: prints <version>
128
+ ```
129
+
130
+ Paste that exact output over the console block under `## Installation` in
131
+ `README.md`. `readme = "README.md"` makes that file the PyPI long description,
132
+ and a description is baked into the artifact at upload — releases being
133
+ immutable, a stale line there is only ever corrected by burning the next
134
+ version number, which is what 0.3.1 was for. The block sat at `0.2.1` through
135
+ three releases before anything checked it;
136
+ `tests/test_readme_examples_are_real_output.py` now fails the build when it
137
+ drifts, so this is a step you are reminded of rather than one you must
138
+ remember.
139
+
140
+ Now pin both to whatever `uv lock` just resolved — the one point in the
141
+ procedure where the lockfile has just picked the newest available versions
142
+ and a release is actually being cut:
143
+
144
+ ```bash
145
+ openaca_version=$(grep -A1 '^name = "openaca"' uv.lock | grep version | cut -d'"' -f2)
146
+ openaidr_version=$(grep -A1 '^name = "openaidr"' uv.lock | grep version | cut -d'"' -f2)
147
+ sed -i.bak -E "s/^ \"openaca(>=|==)[^\"]*\"/ \"openaca==${openaca_version}\"/" pyproject.toml && rm pyproject.toml.bak
148
+ sed -i.bak -E "s/^ \"openaidr(>=|==)[^\"]*\"/ \"openaidr==${openaidr_version}\"/" pyproject.toml && rm pyproject.toml.bak
149
+ uv lock # refresh uv.lock for the exact pin
150
+ uv run pytest -m release_gate
151
+ ```
152
+
153
+ By marker, not by file: a second `release_gate` test can be added anywhere
154
+ under `tests/` (as `tests/telemetry/test_release_gate.py` was, checking that
155
+ PostHog's project key is set) and this command picks it up without the skill
156
+ needing to name it. The gate is not covered by `.github/workflows/publish-pypi.yml`,
157
+ which runs the default `uv run pytest -q` — and `pyproject.toml`'s `addopts`
158
+ excludes `release_gate` from that default run on purpose (it fails throughout
159
+ normal development, before this step pins the floors and, for the PostHog key,
160
+ before Micheal fills it in). This skill is the only place any `release_gate`
161
+ test runs before a tag is pushed, so skipping it here, or naming only one file
162
+ here, is the one way an unpinned `openaidr`/`openaca` requirement or an unset
163
+ PostHog key reaches PyPI. Stop and ask if it fails.
164
+
165
+ ### Step 5. Release-prep commit + PR
166
+
167
+ If the user's original request did not explicitly ask to cut, ship, or
168
+ publish a release, stop before the push and ask. Editing the version
169
+ field is enough to invoke this skill; it is not permission to publish.
170
+
171
+ ```bash
172
+ git checkout -b release/<version>
173
+ git add pyproject.toml uv.lock src/stacktrace/__init__.py docs/releases/v<version>.md
174
+ git status --porcelain # inspect anything still unstaged; stage intentionally or stop
175
+ git commit -m "release: <version> — <theme>"
176
+ git push -u origin release/<version>
177
+ ```
178
+
179
+ Opening the PR needs its own explicit ask. Then:
180
+
181
+ ```bash
182
+ gh pr create --title "release: <version>" --body "Release prep for <version>.
183
+
184
+ - Bumps \`pyproject.toml\` and \`__version__\` to <version>
185
+ - Adds release notes at \`docs/releases/v<version>.md\`
186
+ - After merge: tag \`v<version>\` on main and push to trigger PyPI publish + GitHub Release"
187
+ ```
188
+
189
+ Surface the PR URL. **Stop here.** The user reviews and merges.
190
+
191
+ ### Step 6. After merge: tag + push
192
+
193
+ After the user confirms the PR merged, on a clean main:
194
+
195
+ ```bash
196
+ git checkout main
197
+ git pull --ff-only
198
+ git tag v<version>
199
+ git push origin v<version>
200
+ ```
201
+
202
+ The tag-triggered run registers asynchronously, so `--limit 1` can grab a
203
+ stale earlier run. Poll for the run tied to the tagged commit:
204
+
205
+ ```bash
206
+ tag_sha=$(git rev-parse "v<version>^{commit}")
207
+ run_id=""
208
+ until [ -n "$run_id" ]; do
209
+ run_id=$(gh run list --repo stacktrace-ai/stacktrace \
210
+ --workflow publish-pypi.yml --commit "$tag_sha" \
211
+ --json databaseId --jq '.[0].databaseId // empty')
212
+ [ -z "$run_id" ] && sleep 5
213
+ done
214
+ gh run watch --repo stacktrace-ai/stacktrace "$run_id"
215
+ ```
216
+
217
+ ### Step 7. Verify
218
+
219
+ ```bash
220
+ curl -s https://pypi.org/pypi/stacktrace-cli/json | python3 -c 'import json,sys; print(sorted(json.load(sys.stdin)["releases"]))'
221
+ gh release view v<version> --repo stacktrace-ai/stacktrace --json name,body
222
+ uvx --from stacktrace-cli==<version> stacktrace --version # installs from PyPI, must print <version>
223
+ ```
224
+
225
+ All three must succeed. If any fails, surface the workflow run URL rather
226
+ than guessing.
227
+
228
+ ## Failure modes this prevents
229
+
230
+ 1. **On PyPI but not on GitHub Releases.** The workflow's notes-file gate
231
+ runs before publish: no notes file at the tag → no PyPI upload.
232
+ 2. **Notes file is a raw commit dump.** Step 3's judgment guidelines.
233
+ 3. **Tagging a non-main commit.** The workflow's "Verify tag is on main".
234
+ 4. **Tag ≠ `pyproject.toml` version, or `__version__` drift.** Two
235
+ separate workflow steps; Step 4 keeps them moving together.
236
+ 5. **Forgetting to refresh `uv.lock`.** `uv sync --frozen` fails in the
237
+ build job; Step 4 bumps the lock to avoid the round-trip.
238
+
239
+ ## What this skill does NOT do
240
+
241
+ - **Doesn't publish to PyPI directly.** The workflow does, via Trusted
242
+ Publishing (OIDC). There is no PyPI token anywhere in this repo, and
243
+ none should be added.
244
+ - **Doesn't create the GitHub Release directly.** The workflow's
245
+ `release-github` job does, from the notes file.
246
+ - **Doesn't write a CHANGELOG.md.** The convention is per-release files
247
+ under `docs/releases/`.
248
+ - **Doesn't yank.** PyPI versions are immutable; a broken release is
249
+ fixed by shipping the next version, not by re-uploading.
@@ -0,0 +1,143 @@
1
+ name: guard-staging
2
+
3
+ # Build the LiteLLM and Envoy staging images (each with Stacktrace Guard),
4
+ # deploy them to their ECS Express services in the sandbox account, and
5
+ # smoke-test all three: LiteLLM, Envoy, and the subscription service, which
6
+ # runs the LiteLLM image with its subscription config. Manual only.
7
+ # Infrastructure: infra/guard-staging.
8
+ # Credentials come from GitHub OIDC; no AWS key is stored. Variables live on the
9
+ # litellm-staging environment: AWS_DEPLOY_ROLE_ARN, ECR_REPOSITORY_URL,
10
+ # ENVOY_ECR_REPOSITORY_URL, SUBSCRIPTION_ECR_REPOSITORY_URL, ECS_CLUSTER,
11
+ # ECS_SERVICE, ENVOY_SERVICE, SUBSCRIPTION_SERVICE, LOG_GROUP, MASTER_KEY_SECRET,
12
+ # STAGING_ENDPOINT, ENVOY_ENDPOINT, SUBSCRIPTION_ENDPOINT, GUARD_MODE.
13
+
14
+ on:
15
+ workflow_dispatch:
16
+ inputs:
17
+ ref:
18
+ description: Branch, tag or commit to deploy
19
+ required: true
20
+ default: main
21
+
22
+ permissions:
23
+ id-token: write
24
+ contents: read
25
+
26
+ concurrency:
27
+ group: guard-staging
28
+ cancel-in-progress: false
29
+
30
+ jobs:
31
+ deploy:
32
+ runs-on: ubuntu-latest
33
+ environment: litellm-staging
34
+ timeout-minutes: 45
35
+ steps:
36
+ - uses: actions/checkout@v4
37
+ with:
38
+ ref: ${{ inputs.ref }}
39
+
40
+ - uses: aws-actions/configure-aws-credentials@v4
41
+ with:
42
+ role-to-assume: ${{ vars.AWS_DEPLOY_ROLE_ARN }}
43
+ aws-region: us-east-1
44
+
45
+ - uses: docker/setup-buildx-action@v3
46
+
47
+ - name: Build and push
48
+ env:
49
+ REPO: ${{ vars.ECR_REPOSITORY_URL }}
50
+ ENVOY_REPO: ${{ vars.ENVOY_ECR_REPOSITORY_URL }}
51
+ SUB_REPO: ${{ vars.SUBSCRIPTION_ECR_REPOSITORY_URL }}
52
+ run: |
53
+ aws ecr get-login-password | docker login --username AWS --password-stdin "${REPO%%/*}"
54
+ sha=$(git rev-parse --short HEAD)
55
+ # Layers are cached in each image's own ECR repository under the
56
+ # buildcache tag, so a fresh runner reuses the LiteLLM install. A
57
+ # missing or unreadable cache only makes the build slower.
58
+ cache() { echo "--cache-from type=registry,ref=$1:buildcache" \
59
+ "--cache-to type=registry,ref=$1:buildcache,mode=max,image-manifest=true,oci-mediatypes=true"; }
60
+ # shellcheck disable=SC2046
61
+ docker buildx build --push $(cache "$REPO") -f infra/guard-staging/images/litellm/Dockerfile \
62
+ -t "$REPO:$sha" -t "$REPO:staging" -t "$SUB_REPO:$sha" -t "$SUB_REPO:staging" .
63
+ # shellcheck disable=SC2046
64
+ docker buildx build --push $(cache "$ENVOY_REPO") -f infra/guard-staging/images/envoy/Dockerfile \
65
+ -t "$ENVOY_REPO:$sha" -t "$ENVOY_REPO:staging" .
66
+
67
+ - name: Roll all three services onto the new images
68
+ run: |
69
+ # Inline, not a script in the checkout: the checkout is the deploy ref,
70
+ # which may predate any helper. Each update's own deployment id is
71
+ # kept, and that deployment must be the service's only one, with every
72
+ # task running and rolloutState COMPLETED (or none, as services-stable
73
+ # allows). Express Mode rolls a failed canary back to the old revision,
74
+ # which then looks stable too; ours being gone from the list, or
75
+ # FAILED, fails the step. aws ecs wait services-stable allows only 10
76
+ # minutes and the first rollout took 9.5, so this waits up to 25, and
77
+ # on any failure prints each service's latest ECS events.
78
+ cluster="${{ vars.ECS_CLUSTER }}"
79
+ services=("${{ vars.ECS_SERVICE }}" "${{ vars.ENVOY_SERVICE }}" "${{ vars.SUBSCRIPTION_SERVICE }}")
80
+ declare -A ours
81
+ for s in "${services[@]}"; do
82
+ ours[$s]=$(aws ecs update-service --cluster "$cluster" --service "$s" \
83
+ --force-new-deployment --output text \
84
+ --query "service.deployments[?status=='PRIMARY'] | [0].id")
85
+ if [ -z "${ours[$s]}" ] || [ "${ours[$s]}" = None ]; then
86
+ # Without it a rollback to the old revision would pass as stable.
87
+ echo "::error::$s: update-service named no PRIMARY deployment, so a rollback can't be told apart"
88
+ exit 1
89
+ fi
90
+ echo "$s: deployment ${ours[$s]}"
91
+ done
92
+ events() {
93
+ for s in "${services[@]}"; do
94
+ echo "--- $s: latest events"
95
+ aws ecs describe-services --cluster "$cluster" --services "$s" \
96
+ --query 'services[0].events[:10].[createdAt,message]' --output text
97
+ done
98
+ }
99
+ deadline=$(( $(date +%s) + 1500 ))
100
+ while :; do
101
+ pending=0
102
+ for s in "${services[@]}"; do
103
+ read -r deployments primary state running desired <<< "$(aws ecs describe-services \
104
+ --cluster "$cluster" --services "$s" --output text \
105
+ --query 'services[0].[length(deployments), deployments[0].id, deployments[0].rolloutState, runningCount, desiredCount]')"
106
+ if [ "$primary" != "${ours[$s]}" ]; then
107
+ echo "::error::$s: our deployment ${ours[$s]} is gone; $primary is primary (rolled back)"
108
+ events; exit 1
109
+ fi
110
+ if [ "$state" = FAILED ]; then
111
+ echo "::error::$s: rollout FAILED"; events; exit 1
112
+ fi
113
+ if [ "$deployments" = 1 ] && [ "$running" = "$desired" ] \
114
+ && { [ "$state" = COMPLETED ] || [ "$state" = None ]; }; then
115
+ continue
116
+ fi
117
+ pending=1
118
+ echo "wait $s: $deployments deployment(s), $state, $running/$desired running"
119
+ done
120
+ [ "$pending" = 0 ] && { echo "all stable on this run's deployments"; break; }
121
+ if [ "$(date +%s)" -ge "$deadline" ]; then
122
+ echo "::error::not stable after 25 minutes"; events; exit 1
123
+ fi
124
+ sleep 20
125
+ done
126
+
127
+ - name: Smoke test all three
128
+ env:
129
+ MODE: ${{ vars.GUARD_MODE }}
130
+ LOG_GROUP: ${{ vars.LOG_GROUP }}
131
+ run: |
132
+ MASTER_KEY=$(aws secretsmanager get-secret-value --secret-id "${{ vars.MASTER_KEY_SECRET }}" \
133
+ --query SecretString --output text)
134
+ echo "::add-mask::$MASTER_KEY"
135
+ 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
+ echo "== ${{ vars.SUBSCRIPTION_ENDPOINT }} (subscription)"
141
+ ENDPOINT="${{ vars.SUBSCRIPTION_ENDPOINT }}" MASTER_KEY="$MASTER_KEY" SUBSCRIPTION=1 \
142
+ infra/guard-staging/smoke.sh || fail=1
143
+ exit $fail
@@ -0,0 +1,178 @@
1
+ name: Publish PyPI
2
+
3
+ # Publishes the `stacktrace-cli` distribution to PyPI from version Git tags.
4
+ #
5
+ # One-time PyPI setup (done once, by a human, before the first tag):
6
+ # 1. On https://pypi.org/manage/account/publishing/, add a *pending*
7
+ # Trusted Publisher (pending, because the project does not exist on
8
+ # PyPI until the first successful upload):
9
+ # - PyPI Project Name: stacktrace-cli
10
+ # - Owner: stacktrace-ai
11
+ # - Repository name: stacktrace
12
+ # - Workflow name: publish-pypi.yml
13
+ # - Environment name: pypi
14
+ # 2. Create the `pypi` environment on this repo (the name must match the
15
+ # publisher config exactly, or the OIDC exchange is rejected).
16
+ # 3. Publish by pushing a tag whose name matches pyproject.toml's version,
17
+ # e.g. `git tag v0.0.1 && git push origin v0.0.1`.
18
+ #
19
+ # No PyPI token is needed, and none should be added. `pypa/gh-action-pypi-publish`
20
+ # exchanges the GitHub OIDC token for a short-lived, scope-limited PyPI publish
21
+ # token — nothing long-lived sits in repo secrets waiting to leak.
22
+ #
23
+ # Workflow-injection safety: no step consumes user/PR-controlled input.
24
+ # GITHUB_REF_NAME is GitHub-injected (the tag name) and can only contain
25
+ # git-ref-safe characters.
26
+
27
+ on:
28
+ push:
29
+ tags:
30
+ - "v*"
31
+
32
+ permissions:
33
+ contents: read
34
+
35
+ jobs:
36
+ build:
37
+ runs-on: ubuntu-latest
38
+ steps:
39
+ - uses: actions/checkout@v4
40
+
41
+ - name: Verify tag is on main
42
+ run: |
43
+ git fetch --no-tags origin +refs/heads/main:refs/remotes/origin/main
44
+ if ! git merge-base --is-ancestor HEAD refs/remotes/origin/main; then
45
+ echo "::error::Tagged commit $(git rev-parse --short HEAD) is not reachable from origin/main. Release tags must be cut from main."
46
+ exit 1
47
+ fi
48
+
49
+ - uses: astral-sh/setup-uv@v6
50
+ with:
51
+ enable-cache: true
52
+ # Match pyproject.toml `requires-python` and ci.yml.
53
+ python-version: "3.11"
54
+
55
+ - name: Sync deps
56
+ run: uv sync --frozen
57
+
58
+ - name: Verify tag matches package version
59
+ run: |
60
+ package_version="$(uv run python -c 'import tomllib; print(tomllib.load(open("pyproject.toml", "rb"))["project"]["version"])')"
61
+ tag_version="${GITHUB_REF_NAME#v}"
62
+ if [ "$package_version" != "$tag_version" ]; then
63
+ echo "::error::tag $GITHUB_REF_NAME does not match pyproject.toml version $package_version"
64
+ exit 1
65
+ fi
66
+
67
+ - name: Verify __version__ matches package version
68
+ # `--version` output comes from src/stacktrace/__init__.py, not
69
+ # pyproject.toml. If the two drift, PyPI ships a wheel whose CLI
70
+ # reports a version that doesn't exist — and PyPI versions are
71
+ # immutable, so the only fix is burning another version number.
72
+ run: |
73
+ dunder_version="$(uv run python -c 'import stacktrace; print(stacktrace.__version__)')"
74
+ tag_version="${GITHUB_REF_NAME#v}"
75
+ if [ "$dunder_version" != "$tag_version" ]; then
76
+ echo "::error::stacktrace.__version__ is $dunder_version but the tag is $GITHUB_REF_NAME. Bump both together."
77
+ exit 1
78
+ fi
79
+
80
+ - name: Verify release notes file exists
81
+ # Fail BEFORE PyPI publish if no notes file is committed. PyPI
82
+ # publishes are immutable — a missing notes file caught after
83
+ # publish would mean shipping to PyPI while leaving the GitHub
84
+ # Releases page silently inconsistent. The release-stacktrace
85
+ # skill writes this file during the release prep PR.
86
+ run: |
87
+ notes_path="docs/releases/${GITHUB_REF_NAME}.md"
88
+ if [ ! -f "$notes_path" ]; then
89
+ echo "::error::missing release notes file at $notes_path. The release-stacktrace skill drafts this file from the commit log; run it before tagging."
90
+ exit 1
91
+ fi
92
+
93
+ - name: Ruff check
94
+ run: uv run ruff check .
95
+
96
+ - name: Ruff format check
97
+ run: uv run ruff format --check .
98
+
99
+ - name: Pyright
100
+ run: uv run pyright
101
+
102
+ - name: Pytest
103
+ run: uv run pytest -q
104
+
105
+ - name: Build package
106
+ run: uv build
107
+
108
+ - name: Check package metadata
109
+ # twine >=7 required: hatchling emits `Metadata-Version: 2.5` (PEP 794),
110
+ # and twine 6.2.0 and earlier hard-cap recognized metadata versions at
111
+ # 2.4, so they reject a perfectly valid wheel. Unpinned `uvx twine` can
112
+ # resolve an older cached twine from the uv cache this workflow warms.
113
+ run: uvx --from 'twine>=7' twine check dist/*
114
+
115
+ - name: Upload package artifact
116
+ uses: actions/upload-artifact@v4
117
+ with:
118
+ name: python-package
119
+ path: dist/*
120
+ retention-days: 7
121
+
122
+ publish:
123
+ needs: build
124
+ runs-on: ubuntu-latest
125
+ environment:
126
+ name: pypi
127
+ url: https://pypi.org/project/stacktrace-cli/
128
+ permissions:
129
+ contents: read
130
+ id-token: write # required for Trusted Publishing (OIDC)
131
+ steps:
132
+ - name: Download package artifact
133
+ uses: actions/download-artifact@v4
134
+ with:
135
+ name: python-package
136
+ path: dist
137
+
138
+ - name: Publish to PyPI
139
+ uses: pypa/gh-action-pypi-publish@release/v1
140
+
141
+ release-github:
142
+ # Create the GitHub Release object so the Releases page reflects what
143
+ # actually shipped. Runs only after PyPI publish succeeds — if PyPI
144
+ # failed there's no reason to advertise the release on GitHub. The
145
+ # notes file's presence was verified in the build job, so the only
146
+ # failure modes here are gh/API errors.
147
+ needs: publish
148
+ runs-on: ubuntu-latest
149
+ permissions:
150
+ contents: write # gh release create writes the release
151
+ steps:
152
+ - uses: actions/checkout@v4
153
+ with:
154
+ ref: ${{ github.ref }}
155
+ fetch-depth: 1
156
+
157
+ - name: Create GitHub Release
158
+ env:
159
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
160
+ TAG: ${{ github.ref_name }}
161
+ run: |
162
+ notes_path="docs/releases/${TAG}.md"
163
+ # The first H1 line in the notes file becomes the Release title.
164
+ title="$(grep -m1 '^# ' "$notes_path" | sed 's/^# //' || true)"
165
+ if [ -z "$title" ]; then
166
+ title="$TAG"
167
+ fi
168
+ # Mark PEP 440 pre-releases (aN/bN/rcN suffix) as GitHub prereleases.
169
+ # `gh release create` defaults to "latest stable" otherwise.
170
+ prerelease_flag=""
171
+ if [[ "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(a|b|rc)[0-9]+$ ]]; then
172
+ prerelease_flag="--prerelease"
173
+ fi
174
+ gh release create "$TAG" \
175
+ --title "$title" \
176
+ --notes-file "$notes_path" \
177
+ --verify-tag \
178
+ $prerelease_flag
@@ -0,0 +1,15 @@
1
+ dist/
2
+ build/
3
+ *.egg-info/
4
+ __pycache__/
5
+ .venv/
6
+
7
+ # Local git worktrees
8
+ .worktrees/
9
+
10
+ # Local research handoffs, kept on disk and out of the repo.
11
+ HANDOFF-*.md
12
+
13
+ # Observation adapter workspace
14
+ node_modules/
15
+ *.tgz