stacktrace-cli 0.6.1__tar.gz → 0.7.1__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 (406) hide show
  1. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/PKG-INFO +3 -3
  2. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/README.md +1 -1
  3. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0006-trust-boundary-and-detection-upload.md +1 -1
  4. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0018-remote-sync-config-and-facade-consumption.md +2 -0
  5. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0027-a-finding-may-name-what-it-could-not-place.md +1 -0
  6. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0071-render-the-allowlisted-payload-per-destination.md +1 -1
  7. stacktrace_cli-0.7.1/docs/adrs/0086-a-refusal-names-who-answered-the-call.md +110 -0
  8. stacktrace_cli-0.7.1/docs/adrs/0087-deploy-compiled-policy-with-a-privileged-scheduled-job.md +195 -0
  9. stacktrace_cli-0.7.1/docs/adrs/0088-slack-alerts-leave-out-confidence.md +44 -0
  10. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/INDEX.md +5 -1
  11. stacktrace_cli-0.7.1/docs/plans/015-managed-policy-deployment.md +47 -0
  12. stacktrace_cli-0.7.1/docs/releases/v0.7.0.md +87 -0
  13. stacktrace_cli-0.7.1/docs/releases/v0.7.1.md +76 -0
  14. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/daemon-scanning.md +7 -2
  15. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/daemon-uploads.md +1 -1
  16. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/detection-policies.md +13 -0
  17. stacktrace_cli-0.7.1/docs/specs/managed-policy-deployment.md +553 -0
  18. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/monitor-inventory.md +15 -11
  19. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/monitor.md +6 -3
  20. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/remote-sync.md +18 -3
  21. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/pyproject.toml +2 -2
  22. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/__init__.py +1 -1
  23. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/cli.py +13 -9
  24. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/webhook.py +2 -1
  25. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/deterministic.py +147 -10
  26. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/finding.py +3 -0
  27. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/server.py +7 -0
  28. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/site/app.js +14 -8
  29. stacktrace_cli-0.7.1/src/stacktrace_cli/monitor/site/apple-icon.png +0 -0
  30. stacktrace_cli-0.7.1/src/stacktrace_cli/monitor/site/favicon.ico +0 -0
  31. stacktrace_cli-0.7.1/src/stacktrace_cli/monitor/site/icon.svg +7 -0
  32. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/site/index.html +3 -6
  33. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/site/inventory.js +19 -15
  34. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/site/styles.css +3 -13
  35. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/cli.py +183 -21
  36. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/client.py +18 -84
  37. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/config.py +5 -1
  38. stacktrace_cli-0.7.1/src/stacktrace_cli/remote/policy_service.py +1622 -0
  39. stacktrace_cli-0.7.1/src/stacktrace_cli/remote/policy_worker.py +64 -0
  40. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/sync.py +7 -1
  41. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_cli.py +41 -9
  42. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_webhook.py +2 -1
  43. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/feed_harness.mjs +25 -3
  44. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/inventory_harness.mjs +53 -1
  45. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_feed_model.py +20 -7
  46. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_inventory_page.py +24 -1
  47. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_server.py +13 -0
  48. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_site_assets.py +2 -2
  49. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_cli.py +250 -81
  50. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_client.py +85 -106
  51. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_config.py +11 -0
  52. stacktrace_cli-0.7.1/tests/remote/test_policy_service.py +2385 -0
  53. stacktrace_cli-0.7.1/tests/remote/test_policy_service_cli.py +334 -0
  54. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_seam.py +5 -0
  55. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_sync.py +29 -0
  56. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_call_status_conventions.py +41 -0
  57. stacktrace_cli-0.7.1/tests/test_detector_names_the_service.py +252 -0
  58. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_why_it_stopped.py +24 -0
  59. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_untrusted_content_never_travels.py +101 -9
  60. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/uv.lock +5 -5
  61. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.agents/skills/release-stacktrace/SKILL.md +0 -0
  62. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.claude/settings.json +0 -0
  63. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.claude/skills/pr-review-loop/SKILL.md +0 -0
  64. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.claude/skills/release-stacktrace/SKILL.md +0 -0
  65. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.codex/hooks.json +0 -0
  66. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.github/managed-autofix.md +0 -0
  67. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.github/workflows/autofix.yml +0 -0
  68. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.github/workflows/ci.yml +0 -0
  69. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.github/workflows/claude.yml +0 -0
  70. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.github/workflows/publish-pypi.yml +0 -0
  71. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.gitignore +0 -0
  72. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/AGENTS.md +0 -0
  73. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/CLAUDE.md +0 -0
  74. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0001-session-telemetry-as-input.md +0 -0
  75. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0002-session-collection-in-openaidr.md +0 -0
  76. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0003-runtime-edges.md +0 -0
  77. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0004-three-stage-detector.md +0 -0
  78. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0005-detection-family-and-report-assembly.md +0 -0
  79. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0007-proprietary-package-on-open-dependencies.md +0 -0
  80. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0008-console-in-separate-demo-package.md +0 -0
  81. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0010-detection-severity-and-confidence-ladders.md +0 -0
  82. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0011-verdict-cache.md +0 -0
  83. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0012-observation-evidence-kinds-and-transport.md +0 -0
  84. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0013-rule-catalogue-triage-and-per-rule-context.md +0 -0
  85. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0014-declared-project-mapping.md +0 -0
  86. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0015-narrow-the-security-catalogue.md +0 -0
  87. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0016-stall-grouping-is-session-wide.md +0 -0
  88. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0017-a-declined-repeat-is-a-stall.md +0 -0
  89. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0019-delegated-commands-are-openaca-objects.md +0 -0
  90. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0020-openaca-consumption-boundary.md +0 -0
  91. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0021-two-command-kinds.md +0 -0
  92. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0022-detection-scope-is-a-catalogue-column.md +0 -0
  93. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0023-sync-detect-collects-and-does-not-escalate.md +0 -0
  94. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0024-the-upload-carries-observations.md +0 -0
  95. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0025-a-denied-call-is-activity-never-an-invocation.md +0 -0
  96. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0026-the-console-becomes-a-product-surface.md +0 -0
  97. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0028-the-console-shows-what-it-placed.md +0 -0
  98. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0029-stage-three-returns-to-opt-in.md +0 -0
  99. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0030-a-detection-is-dated-by-the-turns-it-cites.md +0 -0
  100. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0031-one-host-daemon-observes-native-session-logs.md +0 -0
  101. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0032-refresh-daemon-compositions-outside-detection.md +0 -0
  102. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0033-a-third-party-analyzer-only-by-a-flag-that-names-it.md +0 -0
  103. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0034-the-drift-grade-is-read-off-a-run-not-a-call.md +0 -0
  104. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0035-naming-an-analyzer-selects-stored-answers.md +0 -0
  105. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0036-deliver-eligible-findings-to-slack-from-the-daemon.md +0 -0
  106. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0037-reuse-openaidr-append-cursors-in-the-daemon.md +0 -0
  107. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0038-poll-normalized-sessions-for-supplemental-changes.md +0 -0
  108. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0039-send-usage-telemetry-by-default-with-an-opt-out.md +0 -0
  109. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0041-defer-native-windows-support.md +0 -0
  110. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0042-read-the-build-commit-from-the-install-record.md +0 -0
  111. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0043-name-the-session-agent-and-host-and-count-errors-by-class.md +0 -0
  112. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0044-send-the-build-as-version-prints-it.md +0 -0
  113. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0045-scan-every-session-and-outlive-them.md +0 -0
  114. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0046-the-finding-store-is-an-append-only-queue.md +0 -0
  115. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0047-capture-activity-during-correlation-or-lose-it.md +0 -0
  116. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0048-the-daemon-keeps-a-leveled-content-free-activity-log.md +0 -0
  117. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0056-stop-a-resident-daemon-by-record-and-signal.md +0 -0
  118. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0057-grow-the-queue-schema-additively-and-share-only-the-document.md +0 -0
  119. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0058-one-word-for-a-finding-columns-for-a-counter-and-a-push-that-does-not-wait.md +0 -0
  120. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0059-the-daemon-does-not-decide-whether-it-should-be-running.md +0 -0
  121. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0060-two-upload-postures-not-one-command-with-two-sources.md +0 -0
  122. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0061-the-drain-sends-findings-only.md +0 -0
  123. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0062-hold-the-transition-lock-across-remote-side-effects.md +0 -0
  124. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0063-underbuilt-debt-does-not-hold-the-scan-watermark.md +0 -0
  125. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0064-a-redacted-value-has-one-path-span.md +0 -0
  126. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0065-asset-external-id-resolves-by-a-ladder.md +0 -0
  127. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0066-host-owned-daemon-supervision.md +0 -0
  128. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0067-a-webhook-is-an-independent-queue-subscriber.md +0 -0
  129. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0068-webhooks-retry-the-retained-backlog.md +0 -0
  130. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0069-webhooks-deliver-what-retention-holds.md +0 -0
  131. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0070-package-the-cloud-agent-environment-bootstrap.md +0 -0
  132. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0072-host-supervisors-own-daemon-restarts.md +0 -0
  133. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0073-name-what-fired-and-which-component.md +0 -0
  134. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0074-a-window-selects-findings-by-when-they-happened.md +0 -0
  135. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0076-two-phase-detection-pipeline.md +0 -0
  136. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0077-the-bom-job-wakes-once-at-startup-staggered.md +0 -0
  137. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0078-a-seeded-display-prefix-replaces-the-hostname-label.md +0 -0
  138. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0079-the-monitor-page-renders-findings-not-pipeline-health.md +0 -0
  139. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0080-enabling-reasoning-does-not-requeue-the-past.md +0 -0
  140. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0081-reasoning-activation-returns-to-explicit-opt-in.md +0 -0
  141. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0082-monitor-checks-every-installed-component-by-default.md +0 -0
  142. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0083-each-block-reason-is-its-own-rule.md +0 -0
  143. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0084-a-recursive-deletes-evidence-is-the-rm-that-ran.md +0 -0
  144. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0085-show-when-and-which-finding-slack-delivered.md +0 -0
  145. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/HOOK-PROMPT.md +0 -0
  146. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/TEMPLATE.md +0 -0
  147. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/cutover-openaca-remote.md +0 -0
  148. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/002-session-input.md +0 -0
  149. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/003-correlation.md +0 -0
  150. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/004-detector.md +0 -0
  151. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/005-remote-sync.md +0 -0
  152. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/006-cli-composition.md +0 -0
  153. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/007-detection-upload.md +0 -0
  154. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/008-monitor.md +0 -0
  155. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/009-reasoning-jev.md +0 -0
  156. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/010-session-daemon.md +0 -0
  157. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/011-daemon-store.md +0 -0
  158. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/012-daemon-scanning.md +0 -0
  159. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/013-daemon-uploads.md +0 -0
  160. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/014-asset-identity.md +0 -0
  161. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.0.1.md +0 -0
  162. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.1.0.md +0 -0
  163. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.2.0.md +0 -0
  164. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.2.1.md +0 -0
  165. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.2.2.md +0 -0
  166. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.2.3.md +0 -0
  167. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.3.0.md +0 -0
  168. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.3.1.md +0 -0
  169. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.4.0.md +0 -0
  170. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.4.1.md +0 -0
  171. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.5.0.md +0 -0
  172. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.5.1.md +0 -0
  173. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.5.2.md +0 -0
  174. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.5.3.md +0 -0
  175. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.6.0.md +0 -0
  176. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.6.1.md +0 -0
  177. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/research/001-intent-drift-metric.md +0 -0
  178. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/aidr.md +0 -0
  179. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/cli-composition.md +0 -0
  180. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/correlation.md +0 -0
  181. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/daemon-store.md +0 -0
  182. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/detection-upload.md +0 -0
  183. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/detector.md +0 -0
  184. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/event-time.md +0 -0
  185. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/notification-delivery.md +0 -0
  186. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/reasoning-jev.md +0 -0
  187. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/session-input.md +0 -0
  188. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/scripts/git-hooks/pre-push +0 -0
  189. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/scripts/install-hooks.sh +0 -0
  190. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/__main__.py +0 -0
  191. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/analysis.py +0 -0
  192. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/build.py +0 -0
  193. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/cli.py +0 -0
  194. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/cloud/__init__.py +0 -0
  195. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/cloud/setup.sh +0 -0
  196. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/__init__.py +0 -0
  197. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/acquire.py +0 -0
  198. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/composition.py +0 -0
  199. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/join.py +0 -0
  200. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/observed.py +0 -0
  201. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/orchestrate.py +0 -0
  202. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/project_map.py +0 -0
  203. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/record.py +0 -0
  204. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/render.py +0 -0
  205. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/__init__.py +0 -0
  206. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/activity_log.py +0 -0
  207. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/bom.py +0 -0
  208. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/client.py +0 -0
  209. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/composition.py +0 -0
  210. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/config.py +0 -0
  211. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/db.py +0 -0
  212. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/fleet.py +0 -0
  213. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/identity.py +0 -0
  214. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/jobs.py +0 -0
  215. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/lifecycle.py +0 -0
  216. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/observer.py +0 -0
  217. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/paths.py +0 -0
  218. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/presentation.py +0 -0
  219. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/protocol.py +0 -0
  220. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/runtime.py +0 -0
  221. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/scan.py +0 -0
  222. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/server.py +0 -0
  223. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/service.py +0 -0
  224. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/store.py +0 -0
  225. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/__init__.py +0 -0
  226. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/analyzer.py +0 -0
  227. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/blocked.py +0 -0
  228. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/cache.py +0 -0
  229. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/history.py +0 -0
  230. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/jev.py +0 -0
  231. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/priors.py +0 -0
  232. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/prompts/__init__.py +0 -0
  233. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/prompts/jev-v1/stacktrace-deceptive-completion.json +0 -0
  234. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/prompts/jev-v2/stacktrace-deceptive-completion.json +0 -0
  235. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/prompts/v1/exclusions.md +0 -0
  236. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/prompts/v1/framing.md +0 -0
  237. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/prompts/v1/stacktrace-deceptive-completion.md +0 -0
  238. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/reasoning.py +0 -0
  239. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/render.py +0 -0
  240. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/rules.py +0 -0
  241. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/run.py +0 -0
  242. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/secrets.py +0 -0
  243. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/verdict.py +0 -0
  244. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/windows.py +0 -0
  245. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/__init__.py +0 -0
  246. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/inventory.py +0 -0
  247. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/reasoning.py +0 -0
  248. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/render.py +0 -0
  249. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/site/fonts/OFL.txt +0 -0
  250. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/site/fonts/dm-mono-400-latin.woff2 +0 -0
  251. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/site/fonts/dm-mono-500-latin.woff2 +0 -0
  252. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/site/fonts/dm-sans-latin.woff2 +0 -0
  253. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/state.py +0 -0
  254. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/verdicts.py +0 -0
  255. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/watch.py +0 -0
  256. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/options.py +0 -0
  257. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/private_state.py +0 -0
  258. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/__init__.py +0 -0
  259. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/detect_payload.py +0 -0
  260. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/identity.py +0 -0
  261. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/payload.py +0 -0
  262. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/policy.py +0 -0
  263. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/redact.py +0 -0
  264. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/spool.py +0 -0
  265. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/sync_detect.py +0 -0
  266. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/upload_contract.py +0 -0
  267. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/sessions/__init__.py +0 -0
  268. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/sessions/access.py +0 -0
  269. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/sessions/index.py +0 -0
  270. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/sessions/outcome.py +0 -0
  271. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/sessions/protocols.py +0 -0
  272. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/sessions/render.py +0 -0
  273. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/telemetry/__init__.py +0 -0
  274. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/telemetry/cli.py +0 -0
  275. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/telemetry/events.py +0 -0
  276. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/telemetry/posthog.py +0 -0
  277. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/telemetry/state.py +0 -0
  278. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/webhook/__init__.py +0 -0
  279. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/webhook/cli.py +0 -0
  280. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/webhook/config.py +0 -0
  281. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/__init__.py +0 -0
  282. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/agent_bom_fixture.py +0 -0
  283. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/conftest.py +0 -0
  284. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/__init__.py +0 -0
  285. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_activity_log.py +0 -0
  286. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_client.py +0 -0
  287. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_composition.py +0 -0
  288. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_config.py +0 -0
  289. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_db.py +0 -0
  290. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_detection_needs_no_subscriber.py +0 -0
  291. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_fleet.py +0 -0
  292. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_identity.py +0 -0
  293. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_jobs.py +0 -0
  294. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_lifecycle.py +0 -0
  295. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_observer.py +0 -0
  296. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_queue_reader.py +0 -0
  297. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_runtime.py +0 -0
  298. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_scan.py +0 -0
  299. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_service.py +0 -0
  300. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_socket.py +0 -0
  301. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_store.py +0 -0
  302. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_the_drained_payload_is_the_cold_one.py +0 -0
  303. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_the_stored_row_is_sufficient.py +0 -0
  304. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_wire_frames_are_bounded.py +0 -0
  305. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/detector_session_fixture.py +0 -0
  306. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/__init__.py +0 -0
  307. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_inventory.py +0 -0
  308. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_reasoning_gates.py +0 -0
  309. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_render.py +0 -0
  310. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_state.py +0 -0
  311. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_verdicts.py +0 -0
  312. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_watch.py +0 -0
  313. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/__init__.py +0 -0
  314. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/helpers.py +0 -0
  315. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_activity.py +0 -0
  316. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_cli.py +0 -0
  317. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_client.py +0 -0
  318. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_contract_is_exhaustive.py +0 -0
  319. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_gate_matches_the_cloud.py +0 -0
  320. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_layers_compose.py +0 -0
  321. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_payload_reaches_the_cloud_model.py +0 -0
  322. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_redaction.py +0 -0
  323. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_spool.py +0 -0
  324. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_upload_contract.py +0 -0
  325. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_wire_payload.py +0 -0
  326. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_facade_contract.py +0 -0
  327. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_identity.py +0 -0
  328. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_no_local_path_survives_redaction.py +0 -0
  329. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_payload.py +0 -0
  330. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_policy.py +0 -0
  331. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_redact_payload.py +0 -0
  332. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_spool.py +0 -0
  333. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_sync_detect.py +0 -0
  334. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_upload_contract.py +0 -0
  335. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/telemetry/__init__.py +0 -0
  336. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/telemetry/test_activity_log.py +0 -0
  337. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/telemetry/test_cli.py +0 -0
  338. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/telemetry/test_events.py +0 -0
  339. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/telemetry/test_hooks.py +0 -0
  340. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/telemetry/test_release_gate.py +0 -0
  341. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/telemetry/test_state.py +0 -0
  342. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/telemetry/test_uploader.py +0 -0
  343. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_acquire.py +0 -0
  344. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_adr_cross_references_are_reciprocal.py +0 -0
  345. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_agent_instance_id.py +0 -0
  346. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_analysis.py +0 -0
  347. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_bom_shape.py +0 -0
  348. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_build_commit.py +0 -0
  349. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_cli.py +0 -0
  350. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_composition.py +0 -0
  351. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_correlate_orchestrate.py +0 -0
  352. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_correlate_render.py +0 -0
  353. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_correlated_session.py +0 -0
  354. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detection_components.py +0 -0
  355. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detection_event_time.py +0 -0
  356. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detection_subject.py +0 -0
  357. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_analyzer_contract.py +0 -0
  358. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_analyzer_live.py +0 -0
  359. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_blocked.py +0 -0
  360. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_cache.py +0 -0
  361. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_deterministic.py +0 -0
  362. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_end_to_end.py +0 -0
  363. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_finding.py +0 -0
  364. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_history.py +0 -0
  365. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_jev.py +0 -0
  366. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_new_deterministic.py +0 -0
  367. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_priors.py +0 -0
  368. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_prompts.py +0 -0
  369. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_reasoning.py +0 -0
  370. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_render.py +0 -0
  371. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_run.py +0 -0
  372. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_secrets.py +0 -0
  373. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_verdict.py +0 -0
  374. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_vulnerable_dep_invoked.py +0 -0
  375. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_windows.py +0 -0
  376. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_evidence_is_dated_not_numbered.py +0 -0
  377. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_fingerprint_covers_what_the_analyzer_reads.py +0 -0
  378. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_help_sections.py +0 -0
  379. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_join.py +0 -0
  380. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_monitor_cli.py +0 -0
  381. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_no_live_document_states_the_old_stage_three_default.py +0 -0
  382. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_no_test_undoes_every_patch_at_once.py +0 -0
  383. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_observed.py +0 -0
  384. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_openaca_contract.py +0 -0
  385. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_openaidr_contract.py +0 -0
  386. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_option_arity_matches_the_binary.py +0 -0
  387. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_project_map.py +0 -0
  388. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_readme_examples_are_real_output.py +0 -0
  389. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_release_gate_coverage.py +0 -0
  390. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_release_readiness.py +0 -0
  391. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_seam_boundary.py +0 -0
  392. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_session_identity_is_the_pair.py +0 -0
  393. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_sessions_access.py +0 -0
  394. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_sessions_end_to_end.py +0 -0
  395. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_sessions_protocol_typing.py +0 -0
  396. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_sessions_protocols.py +0 -0
  397. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_sessions_render.py +0 -0
  398. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_shell_separators_match_the_shell.py +0 -0
  399. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_stored_verdicts_are_never_gated_on_reasoning.py +0 -0
  400. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_the_detector_spec_lists_the_shipped_catalogue.py +0 -0
  401. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_the_jev_spec_states_the_shipped_thresholds.py +0 -0
  402. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_the_locality_claim_is_qualified_everywhere.py +0 -0
  403. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_title_disclosure_invariant.py +0 -0
  404. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_verification_subcommands_match_the_binary.py +0 -0
  405. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_what_jev_is_told_is_what_was_disclosed.py +0 -0
  406. {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/webhook/test_cli.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: stacktrace-cli
3
- Version: 0.6.1
3
+ Version: 0.7.1
4
4
  Summary: CLI for Stacktrace — Detection and Response platform for AI Agents.
5
5
  Project-URL: Homepage, https://stacktrace.ai
6
6
  Author-email: "Stacktrace AI, Inc" <founders@stacktrace.ai>
@@ -20,7 +20,7 @@ Classifier: Topic :: Security
20
20
  Requires-Python: >=3.11
21
21
  Requires-Dist: click>=8.1
22
22
  Requires-Dist: httpx<1.0.dev0,>=0.28.1
23
- Requires-Dist: openaca==0.7.0
23
+ Requires-Dist: openaca==0.8.0
24
24
  Requires-Dist: openaidr==0.3.2
25
25
  Requires-Dist: posthog<8,>=7.0
26
26
  Description-Content-Type: text/markdown
@@ -51,7 +51,7 @@ Requires Python 3.11 or newer.
51
51
 
52
52
  ```console
53
53
  $ stacktrace --version
54
- stacktrace 0.6.1 (openaca 0.7.0)
54
+ stacktrace 0.7.1 (openaca 0.8.0)
55
55
  ```
56
56
 
57
57
  ## Quick start
@@ -24,7 +24,7 @@ Requires Python 3.11 or newer.
24
24
 
25
25
  ```console
26
26
  $ stacktrace --version
27
- stacktrace 0.6.1 (openaca 0.7.0)
27
+ stacktrace 0.7.1 (openaca 0.8.0)
28
28
  ```
29
29
 
30
30
  ## Quick start
@@ -5,7 +5,7 @@ status: accepted
5
5
  date: 2026-08-28
6
6
  supersedes: null
7
7
  superseded-by: null
8
- amended-by: 0011, 0027, 0031, 0039, 0064, 0084
8
+ amended-by: 0011, 0027, 0031, 0039, 0064, 0084, 0086
9
9
  ---
10
10
 
11
11
  ## Context
@@ -5,6 +5,8 @@ status: accepted
5
5
  date: 2026-09-03
6
6
  supersedes: null
7
7
  superseded-by: null
8
+ amends: null
9
+ amended-by: 0087
8
10
  ---
9
11
 
10
12
  ## Context
@@ -6,6 +6,7 @@ date: 2026-09-07
6
6
  supersedes: null
7
7
  superseded-by: null
8
8
  amends: 0006
9
+ amended-by: 0086
9
10
  ---
10
11
 
11
12
  ## Context
@@ -6,7 +6,7 @@ date: 2026-09-26
6
6
  supersedes: null
7
7
  superseded-by: null
8
8
  amends: 0067
9
- amended-by: 0073
9
+ amended-by: 0073, 0088
10
10
  ---
11
11
 
12
12
  ## Context
@@ -0,0 +1,110 @@
1
+ ---
2
+ id: 0086
3
+ title: A refusal, retry or sent credential names who the call reached
4
+ status: accepted
5
+ date: 2026-10-01
6
+ supersedes: null
7
+ superseded-by: null
8
+ amends: 0006, 0027
9
+ amended-by: null
10
+ ---
11
+
12
+ ## Context
13
+
14
+ A Fleet Slack alert for `stacktrace-blocked-upstream` read *Subject: Bash
15
+ (tool) (built-in)*, *Evidence: upstream_refused*. The person reading it could
16
+ not tell who refused. A `stacktrace-tool-retry-storm` alert had the same gap:
17
+ it never said what the agent kept calling, so a service browning out looked
18
+ the same as an agent sending a bad request. A `stacktrace-credential-egress`
19
+ alert said a token was in a call's arguments, at a character offset no reader
20
+ can use, and not where it was sent.
21
+
22
+ Each citation's `detail` was built from `tool_name_for(call)`. For a shell call
23
+ that is `Bash`, and for every MCP call it is the fixed `an MCP connector`. Both
24
+ were deliberate. ADR-0006 constraint 3 keeps names the other side chose out of
25
+ a finding, and ADR-0027 lets an unplaced server's alias sit only in
26
+ `Participant.name`. The result is that the alert names the agent's own tool and
27
+ never the thing that refused.
28
+
29
+ ## Decision
30
+
31
+ The `detail` of a citation on `stacktrace-blocked-throttled`,
32
+ `stacktrace-blocked-upstream`, `stacktrace-tool-retry-storm` and
33
+ `stacktrace-credential-egress` names who the call reached
34
+ (`deterministic._outside_target`). For a sent credential it reads `sent to
35
+ <target>`, and the character offset is no longer named:
36
+
37
+ - **MCP call:** `linear MCP · search_issues`, the server alias and the tool.
38
+ Each part is named only when it is shaped like an identifier (letters,
39
+ digits, `_ . : -`, at most 64), so it is never a sentence or a path. A
40
+ server that fails the shape names nothing. A tool that fails it leaves
41
+ `linear MCP`. This holds for a placed or an unplaced server.
42
+ - **WebFetch:** the host of its `url`.
43
+ - **Shell call:** a vendor CLI from a closed list names its service
44
+ (`GitHub (gh)`). Any other segment that reaches the network must carry
45
+ exactly one `http(s)://` URL, and its host is named. A command that reaches
46
+ two places, or a network segment with no URL, names nothing.
47
+
48
+ Only the host of a URL is named. Scheme, userinfo, port, path and query never
49
+ are. A target that matches a credential shape is dropped. When nothing is
50
+ named, the detail reads as before (`Bash`, `an MCP connector`).
51
+
52
+ A block the client raised, a spend limit or a safety check, keeps the tool
53
+ name. The call never reached the service, so naming the service would blame
54
+ it.
55
+
56
+ This amends ADR-0006 constraint 3 and ADR-0027 for these four rules' citation
57
+ `detail` only. Every other field and rule is unchanged, and the retry storm's
58
+ remediation keeps `tool_name_for`. `tests/test_untrusted_content_never_travels.py`
59
+ states the bound as `_PERMITTED_AS_A_TARGET` and `_TARGET_RULES`.
60
+
61
+ ## Alternatives considered
62
+
63
+ - **Name only a vendor CLI's service, never a host or an MCP tool.** Rejected.
64
+ It was the first version of this change. It left every MCP refusal and every
65
+ `curl` refusal naming nothing, and those are the cases a reader most needs.
66
+ - **Read the service from the error text.** Rejected. The service writes its
67
+ own error body and can put any name there. `blocked.py` already refuses to
68
+ copy captures out of it. The target here comes from the call the agent made.
69
+ - **Name the first target when a command reaches several.** Rejected. The
70
+ record does not say which segment failed, and naming the wrong one sends the
71
+ reader to the wrong service.
72
+ - **Name the full URL.** Rejected. Paths and queries carry tokens, account ids
73
+ and customer data. The upload contract already refuses a URL with a path or
74
+ query.
75
+ - **Carry the target as a new Subject or wire field.** Rejected for this
76
+ change. `Participant` has a closed set of kinds, and Fleet checks
77
+ `subject_kind` with a constraint. A new kind changes the upload contract,
78
+ Fleet's schema and its console. The detail already travels and is already
79
+ stored.
80
+
81
+ ## Consequences
82
+
83
+ A refusal names `linear MCP · search_issues`, `api.ledgerline.io` or
84
+ `GitHub (gh)`. Fleet shows this once its Slack message prints evidence detail
85
+ (Fleet ADR-0072). Local surfaces that print detail show it at once.
86
+
87
+ An MCP server can now put a word of its choosing into a finding through its
88
+ tool name. The identifier shape bounds it to one token, the upload redactor
89
+ and contract gate still walk it, and Fleet secret-scans it again before Slack.
90
+ A host can now leave the machine for these four rules. That includes internal
91
+ hostnames.
92
+
93
+ A command whose URL sits in a variable (`curl "$URL"`), or that runs through a
94
+ wrapper `command_segments` does not unwrap (`npx vercel`, `sudo gh`), names
95
+ nothing. Each fails towards the old wording, never towards a wrong name.
96
+
97
+ Two known limits are accepted rather than parsed around, because handling
98
+ each means reading per-program flags:
99
+
100
+ - A URL argument is taken to be where the request went. A command whose only
101
+ literal URL is a proxy or a referer (`curl -x http://proxy:3128 "$URL"`)
102
+ names that host.
103
+ - A vendor CLI keeps its service name when pointed at another endpoint
104
+ (`aws --endpoint-url …`, `gh --hostname …`).
105
+
106
+ ## When to revisit
107
+
108
+ Revisit if a deployment cannot send hostnames or MCP tool names to Fleet, if
109
+ the identifier shape lets through a tool name that carries data, or if the
110
+ target needs to become a structured field of its own.
@@ -0,0 +1,195 @@
1
+ ---
2
+ id: 0087
3
+ title: Deploy compiled policy with a privileged scheduled job
4
+ status: proposed
5
+ date: 2026-09-30
6
+ supersedes: null
7
+ superseded-by: null
8
+ amends: 0018
9
+ amended-by: null
10
+ ---
11
+
12
+ ## Context
13
+
14
+ Fleet publishes an organization policy and `stacktrace remote policy compile`
15
+ can turn it into Claude Code managed settings, but an operator must rerun and
16
+ privileged-install that artifact after every change. Automatic deployment is a
17
+ launch requirement, and MDM cannot be a prerequisite.
18
+
19
+ The ordinary daemon should not install the file. It runs as the developer,
20
+ reads transcript and agent configuration content, launches analyzers and
21
+ adapters, and owns user-readable state. Running all of it as root gives far
22
+ more code privilege than the one required filesystem write. The launch bridge
23
+ also needs to work before the later daemon policy API and hook enforcement
24
+ architecture exists.
25
+
26
+ This bridge assumes a cooperative endpoint administrator and developer. It
27
+ automates distribution and protects the privileged installation path from
28
+ accidental corruption and local privilege escalation; it is not a claim that
29
+ Claude managed settings resist a developer or agent deliberately acting with
30
+ that developer's permissions.
31
+
32
+ The inputs also change on two clocks. A Fleet revision can change at any time,
33
+ while the result for one revision can change as endpoint composition or
34
+ advisories change. Compiling only on revision changes would leave new local
35
+ components and newly published vulnerabilities unevaluated indefinitely.
36
+
37
+ Finally, a managed-settings artifact can contain hooks, helpers and environment
38
+ variables that execute commands or redirect credentials. Treating compiler
39
+ output as harmless JSON would make the policy path a root-mediated
40
+ code-execution channel.
41
+
42
+ ## Decision
43
+
44
+ Stacktrace deploys the Claude managed-settings artifact through a root-owned
45
+ scheduled one-shot job, installed once with administrator approval. launchd on
46
+ macOS or a systemd timer on Linux invokes an absolute, root-owned Stacktrace
47
+ policy runtime under `/opt/stacktrace-policy` every minute and at boot. The
48
+ existing uv-installed developer CLI and daemon remain unchanged. The one-line
49
+ remote installer downloads uv in the root context, installs the same
50
+ Stacktrace release into the policy runtime and installs the service after one
51
+ sudo approval; it never runs the developer-owned uv or Stacktrace executable
52
+ as root.
53
+ Stacktrace writes each launchd or systemd definition relative to a
54
+ descriptor-walked root-owned directory after rejecting symlinks, non-root
55
+ writability and extended ACLs on every component.
56
+ The job fetches Fleet policy using a separate root-only enrollment, recompiles
57
+ immediately when the revision changes and unconditionally once an hour, and
58
+ atomically installs the last validated result as `50-openaca-policy.json` at
59
+ mode `0644`.
60
+
61
+ The root parent fetches and installs. Compilation runs in a child after dropping
62
+ to the pinned developer UID, GID and groups. It uses Python's isolated-import
63
+ mode from a verified root-owned working directory, calls OpenACA through its
64
+ public facade, and returns its dry-run report over a private pipe; no
65
+ user-writable staging file exists. Root accepts only the exact non-executable
66
+ policy-control keys emitted by the pinned compiler and rejects every unknown
67
+ key or shape. Any failure before the artifact's durable rename preserves the
68
+ prior artifact and installed revision unchanged. A failure in the directory
69
+ sync or independent state write after the rename is recovered by recompiling
70
+ and repeating the idempotent atomic install on the next poll. Missing or corrupt
71
+ state after enrollment fails static; same-deployment re-enrollment preserves a
72
+ valid revision anchor rather than constructing a new one from Fleet. An
73
+ explicitly confirmed organization switch on the same API origin and pinned
74
+ account stops the timer, removes the previous organization's artifact, resets
75
+ the organization-scoped revision anchor and installs the new enrollment before
76
+ reconciliation resumes. API-origin or pinned-account changes remain refused.
77
+ Fresh bootstrap is the only other reset: enrollment is first marked incomplete,
78
+ the empty state anchor is written, and enrollment is then marked complete. A
79
+ retry may recreate only that incomplete empty anchor before any service or
80
+ artifact exists; a completed enrollment with missing state remains
81
+ `state_lost`.
82
+
83
+ The job preserves Fleet's policy revision in the client contract, rechecks it
84
+ after compilation, and discards a candidate if the revision changed mid-run.
85
+ It uses no configuration fingerprint: revision change is the fast trigger and
86
+ the hourly full compile is the reconciliation fallback, matching the daemon's
87
+ current composition-refresh cadence rather than its six-hour BOM-delivery
88
+ cadence.
89
+
90
+ This amends ADR-0018 only for privileged deployment: the user remote channel
91
+ continues to own `~/.config/stacktrace/remote.toml`, while the scheduled root
92
+ job requires a separate root-only copy because an unprivileged user config
93
+ cannot be authoritative input to a root service. The OpenACA facade and
94
+ one-directional dependency decisions remain unchanged.
95
+
96
+ ## Alternatives considered
97
+
98
+ - **Run the whole Stacktrace daemon as root.** Rejected because transcript
99
+ parsing, network upload, analyzer and adapter subprocesses, logs, the socket
100
+ and the daemon database would all gain root privilege, and the daemon would
101
+ resolve the wrong home directory unless more user-selection machinery were
102
+ added.
103
+ - **Have the user daemon compile and a root helper copy its file.** Rejected
104
+ for this temporary bridge because it adds a staging file, a daemon-to-root
105
+ handoff and another wake protocol when the scheduled command can fetch,
106
+ compile and install in one pass. The later hook architecture can consolidate
107
+ clients around the daemon API deliberately instead of preserving this
108
+ throwaway handoff.
109
+ - **Install a setuid helper.** Rejected because a compiled setuid input surface
110
+ is more dangerous than a scheduled job, interpreted entry points cannot be
111
+ setuid, and the design still needs a one-time root install. No persistent
112
+ root authority should be callable by the governed user.
113
+ - **Run a long-lived root policy service or add a privileged socket.** Rejected
114
+ because a timer plus one-shot command already supplies retries and boot
115
+ execution. A resident service and request protocol add lifecycle and attack
116
+ surface without improving the launch guarantee.
117
+ - **Use `policyHelper`.** Rejected because it is Claude-specific, still needs a
118
+ protected root-owned configuration entry, runs only when its managed source
119
+ is selected, and its emitted object becomes the session's complete managed
120
+ settings. It does not solve source precedence or the cross-agent direction.
121
+ - **Require MDM.** Rejected as a launch prerequisite. MDM remains a supported
122
+ way for customers to deploy the same root-owned runtime and service files.
123
+ - **Compile only when Fleet's revision changes.** Rejected because endpoint
124
+ composition and advisory data can change under the same semantic policy.
125
+ - **Fingerprint every OpenACA input and compile when it changes.** Rejected for
126
+ launch because it duplicates discovery knowledge and creates invalidation
127
+ state. Hourly reconciliation is simpler and already matches the product's
128
+ current composition-freshness trade.
129
+ - **Compile in Fleet and make root only download an artifact.** Deferred rather
130
+ than rejected permanently. Fleet does not yet have authoritative fresh
131
+ project/user composition for the endpoint, and the current policy compiler
132
+ evaluates local configuration and advisories.
133
+ - **Install the changing policy through hooks now.** Deferred to the portable
134
+ enforcement architecture. It is the strategic path, but it does not remove
135
+ the launch requirement to deploy the Claude artifact already supported.
136
+
137
+ ## Consequences
138
+
139
+ One administrator action makes subsequent policy revisions automatic on
140
+ laptops and self-hosted hosts without keeping Stacktrace's transcript pipeline
141
+ privileged. Policy changes normally land within a minute; local composition and
142
+ advisory drift converge within an hour even when Fleet policy is unchanged.
143
+
144
+ There are temporarily two Stacktrace installations on such a machine: the
145
+ developer's uv tool environment for the CLI and daemon, and the root-owned
146
+ policy-only runtime. Re-running the same one-line installer pins both to the
147
+ same released version, stops the timer before replacing its runtime and then
148
+ reinstalls it. This duplication is accepted for the short-lived Claude bridge
149
+ and disappears with hook-based enforcement. One user per machine is the
150
+ supported scope.
151
+
152
+ Every interactive `stacktrace remote configure` retries reconciliation of an
153
+ already-installed, same-version root policy runtime, including when
154
+ credentials are unchanged. Reconciliation is idempotent, so no retry marker is
155
+ stored in the developer's config; a second interactive run retries a failed,
156
+ declined or interrupted update. Noninteractive configuration never inspects
157
+ the privileged runtime or opens a sudo prompt. An interactive configuration
158
+ with a missing or version-mismatched root runtime directs the developer back
159
+ to the one-line installer, which remains the only bootstrap and upgrade path
160
+ for `/opt`.
161
+
162
+ The file's installation is not proof that every key is effective. Claude can
163
+ select a higher-ranked server or MDM source; current versions combine some
164
+ restrictive MCP keys across sources, but not every key the compiler emits.
165
+ Anthropic-hosted sessions never read the endpoint file. Local status therefore
166
+ reports the published and installed revisions separately and does not claim
167
+ enforcement; `/status` or `claude doctor` remains the verification surface.
168
+
169
+ The strict root validator deliberately creates upgrade friction. If OpenACA
170
+ adds a legitimate emitted key, policy apply retains the last good artifact
171
+ until Stacktrace updates its allowlist. That is preferable to silently turning
172
+ an automated fleet channel into remote code execution.
173
+
174
+ ## When to revisit
175
+
176
+ - Replace minute polling with long-poll or push when measured Fleet scale makes
177
+ the request volume material.
178
+ - Remove the hourly local compile when Fleet can provide a trustworthy artifact
179
+ derived from fresh endpoint composition and advisory data.
180
+ - Replace this Claude-specific bridge when portable hook enforcement has equal
181
+ or better rollout, failure and receipt semantics on supported agents.
182
+ - Add multi-user host support only with an explicit artifact and enrollment
183
+ ownership model for each user.
184
+ - Revisit local effective-policy verification when Claude publishes a stable,
185
+ machine-readable source and key-status interface.
186
+
187
+ ## References
188
+
189
+ - [Automatic managed-policy deployment](../specs/managed-policy-deployment.md)
190
+ - [Claude Code managed settings](https://code.claude.com/docs/en/managed-settings)
191
+ - ADR-0018 — remote configuration and OpenACA facade consumption
192
+ - ADR-0020 — the OpenACA consumption boundary
193
+ - ADR-0032 — hourly composition refresh
194
+ - ADR-0041 — target host platforms
195
+ - ADR-0072 — host service managers own persistent lifecycle
@@ -0,0 +1,44 @@
1
+ ---
2
+ id: 0088
3
+ title: The local Slack alert leaves out confidence
4
+ status: accepted
5
+ date: 2026-10-01
6
+ supersedes: null
7
+ superseded-by: null
8
+ amends: 0071
9
+ amended-by: null
10
+ ---
11
+
12
+ ## Context
13
+
14
+ ADR-0071 lists confidence among what a Slack message names. In practice nearly
15
+ every finding is graded `high`, so the field repeats the same word on every
16
+ alert and tells a reader in a channel nothing. Fleet's Slack alert drops it for
17
+ the same reason (Fleet ADR-0072).
18
+
19
+ ## Decision
20
+
21
+ The `--format slack` body shows Subject, Evidence and Severity, and no
22
+ Confidence field. This replaces "confidence" in ADR-0071's list of what a Slack
23
+ message names. The JSON format, the payload allowlist (ADR-0067) and
24
+ `stacktrace findings` are unchanged and still carry confidence.
25
+
26
+ ## Alternatives considered
27
+
28
+ - **Keep confidence in Slack.** Rejected. It is the same word on almost every
29
+ alert, so it costs a field and adds nothing.
30
+ - **Show confidence only when it is not `high`.** Rejected. A field that
31
+ appears on some alerts and not others reads as a layout bug, and the finding
32
+ page has the grade for anyone who needs it.
33
+ - **Drop it from the JSON payload too.** Rejected. That is a contract change
34
+ for endpoints that may read it.
35
+
36
+ ## Consequences
37
+
38
+ The local alert and Fleet's alert show the same three fields again. A reader
39
+ who wants the grade runs `stacktrace findings` or opens the Fleet page.
40
+
41
+ ## When to revisit
42
+
43
+ Revisit if graded-down findings become common enough that the grade changes
44
+ what a reader does.
@@ -34,6 +34,8 @@ supersedes anything yet.
34
34
 
35
35
  ## Active
36
36
 
37
+ - [0087](0087-deploy-compiled-policy-with-a-privileged-scheduled-job.md) — **Deploy compiled policy with a privileged scheduled job.** A root-owned launchd/systemd timer polls Fleet every minute, compiles as the pinned developer on every revision change and hourly otherwise, validates an exact non-executable key allowlist, and atomically installs `50-openaca-policy.json`; the user daemon never supplies root's input. Amends ADR-0018 with a separate root-only enrollment. Read before putting policy installation in the daemon, adding a privileged copier/socket/setuid helper, compiling only on revision changes, or treating installed settings as proof they are effective.
38
+
37
39
  - [0069](0069-webhooks-deliver-what-retention-holds.md) — **Webhooks deliver what retention holds, and configuration takes no lock.** Amends ADR-0068: no retention floors for the webhook, configuration read before each request without a lock (one in-flight request may reach the previous endpoint), and the daemon never removes a webhook cursor. Read before adding a floor for a subscriber, locking configuration against delivery, or letting a config read release anything.
38
40
  - [0068](0068-webhooks-retry-the-retained-backlog.md) — **Webhooks retry the retained backlog.** Amends ADR-0067: no configuration-time cutoff, no retry cap. Its per-request locking and retention-floor release are replaced by ADR-0069 (no lock, no floors) — see that entry for the semantics actually in force.
39
41
 
@@ -55,7 +57,7 @@ supersedes anything yet.
55
57
  - [0015](0015-narrow-the-security-catalogue.md) — **Withdraw five security rules, narrowing the catalogue.** `unsanctioned-mcp-tool-use`, `unattended-privileged-action`, `provider-refusal`, `refusal-circumvention` and `capability-crossing` are removed — 19 of 42 measured findings, and a scope decision rather than ADR-0013's kind of quality measurement. Reverses ADR-0013's argument for keeping `capability-crossing` without disputing it. Read before re-adding a rule, or before assuming a missing rule was never built.
56
58
  - [0016](0016-stall-grouping-is-session-wide.md) — **`progress-stall` groups over the whole session, not a contiguous run.** Contiguity was proposed twice and is rejected on recall — a real retry loop is interleaved with the reads that investigate it — and the trade cannot be settled without the 540-session corpus. Read before changing how the stall rule groups calls, or before reporting an interleaved group as a new false positive.
57
59
  - [0017](0017-a-declined-repeat-is-a-stall.md) — **A declined repeat is a stall, and the finding says which outcome it saw.** `outcome.py`'s *a denied call is evidence of nothing* governs what a call **reached**; a stall is a claim about the agent's own repetition, which a denial establishes as well as an error does. What was wrong was the prose — a declined group was described as a tool failure with something to remediate. Read before narrowing a rule's failure predicate to `error`, or before treating `rejected` as outside every rule.
58
- - [0018](0018-remote-sync-config-and-facade-consumption.md) — **Remote sync keeps its own configuration and consumes OpenACA through the facade.** `~/.config/stacktrace/remote.toml` is this channel's own file and it never reads one OpenACA writes; the BOM, posture findings and observations come from `openaca.core` in-process, never from a subprocess and never from `tools.*`. Overlaps ADR-0020 on the facade half. Read before adding configuration to the remote channel or changing how it acquires OpenACA's data.
60
+ - [0018](0018-remote-sync-config-and-facade-consumption.md) — **Remote sync keeps its own configuration and consumes OpenACA through the facade.** `~/.config/stacktrace/remote.toml` is this channel's own file and it never reads one OpenACA writes; the BOM, posture findings and observations come from `openaca.core` in-process, never from a subprocess and never from `tools.*`. Amended by ADR-0087 with a separate root-only enrollment for privileged scheduled policy deployment. Overlaps ADR-0020 on the facade half. Read before adding configuration to the remote channel or changing how it acquires OpenACA's data.
59
61
  - [0019](0019-delegated-commands-are-openaca-objects.md) — **Delegated commands are OpenACA's own Click command objects.** `add_command(openaca_cli.commands[name], name)` — not a wrapper, a subprocess, a hand-written re-declaration, or a runtime scan of OpenACA's command list. Overlaps ADR-0021 on CLI composition. Read before adding or changing a delegated command.
60
62
  - [0020](0020-openaca-consumption-boundary.md) — **Consume OpenACA as a library through `openaca.core`, in-process.** The seam is `openaca.core` / `openaca.cli` and nothing else; rejected shelling out to the CLI (two invocations disagree, `bom-ref` does not join across documents, a target path to strip, `--fail-on any` makes exit status unreadable), importing `tools.*` (no compatibility promise, and the one-way arrow means nobody upstream watches for the break), and vendoring. Overlaps ADR-0018 on the facade half. Read before reaching into OpenACA from a new module.
61
63
  - [0021](0021-two-command-kinds.md) — **A command is a pass-through or native, never both.** A mounted OpenACA command declares no flag of its own; rejected `stacktrace scan --upload` because noticing our flag means parsing argv first, which reduces "a new upstream flag works the day it ships" to "unless it collides with ours", plus wrapping and help-text rebranding. Overlaps ADR-0019 on CLI composition. Read before adding a command or an option to `src/stacktrace_cli/cli.py`.
@@ -114,3 +116,5 @@ supersedes anything yet.
114
116
  - [0083](0083-each-block-reason-is-its-own-rule.md) — **Each block reason is its own rule.** `stacktrace-agent-blocked` filed four reasons under one id, so everything keyed on the rule id alone — Fleet's seeded catalogue and roll-up, Slack, local notifications — read a spend limit, a safety block, a throttle and a service refusal as one finding. Now `stacktrace-blocked-quota`, `-policy`, `-throttled` and `-upstream`, each named by its `Reason`, each `session`-scoped by ADR-0022 cardinality. `agent-blocked` is retired to `rules.RETIRED_SCOPES` so stored rows still upload. Amends ADR-0039: `finding_delivered` no longer carries `reason`. Read before adding a block reason, before teaching Fleet a sub-rule key, or before putting a second property beside `rule` on a telemetry event.
115
117
  - [0084](0084-a-recursive-deletes-evidence-is-the-rm-that-ran.md) — **A recursive delete's evidence names what it deleted.** Amends ADR-0006 constraint 3 and ADR-0073's kind-is-a-classifier rule, for `stacktrace-destructive-action` only. Its evidence `kind` is `rm -rf` and the paths that escaped the workspace, whole, listed once, counted past 500 characters; never wrappers, flags or the rest of the call, because an alert saying only `recursive_delete` cannot be triaged and a reproduced command is a parser of its own. No new field: Fleet already stores and shows `kind`, so device and Fleet keep one schema. The redactor cleans `kind` word by word and drops credentials; the upload contract still checks it, so a display flaw is refused, never leaked. Read before putting session text in any other field or rule, or before making the display reproduce more of the command.
116
118
  - [0085](0085-show-when-and-which-finding-slack-delivered.md) — **Show when and which finding Slack delivered.** Amends ADR-0067, ADR-0068 and ADR-0073: `detected_at` is the first notifiable revision's queue creation time, Slack renders it in the viewer's locale beside the visible stable finding ID, and `webhook configure` previews the exact currently pending eligible count before enabling. The count is a snapshot, not a cutoff or confirmation policy; retained-history and at-least-once delivery semantics do not change. Read before redefining `detected_at`, hiding the ID again, or turning the preview into a second backlog policy.
119
+ - [0086](0086-a-refusal-names-who-answered-the-call.md) — **A refusal, retry or sent credential names who the call reached.** Amends ADR-0006 constraint 3 and ADR-0027 for the citation `detail` of `stacktrace-blocked-throttled`, `stacktrace-blocked-upstream`, `stacktrace-tool-retry-storm` and `stacktrace-credential-egress` (`sent to <target>`) only: an MCP call names `server MCP · tool` (each part only if identifier-shaped, placed or not), WebFetch names its URL's host, and a shell call names a vendor CLI's service or the one URL host it reached. Only the host of a URL, never userinfo, port, path or query; nothing secret-shaped; nothing when a command reaches two places. Client-raised blocks keep the tool name. Not the error text, not the full URL, not a new Subject field. Read before naming a target anywhere else, or before widening what the identifier shape admits.
120
+ - [0088](0088-slack-alerts-leave-out-confidence.md) — **The local Slack alert leaves out confidence.** Amends ADR-0071: `--format slack` shows Subject, Evidence and Severity, because confidence is `high` on nearly every finding. The JSON format, the payload allowlist and `stacktrace findings` still carry it. Read before adding a field back to the Slack body.
@@ -0,0 +1,47 @@
1
+ # Managed Policy Deployment Implementation Plan
2
+
3
+ **Goal:** Automatically reconcile Fleet policy into Claude Code managed
4
+ settings from the existing one-line onboarding flow without running the
5
+ ordinary daemon or developer CLI as root.
6
+
7
+ **Architecture:** `stacktrace_cli.remote.policy_service` is one deep module
8
+ behind the four native CLI commands. It owns root-only enrollment and state,
9
+ the one-minute reconciliation decision, the privilege-dropped compiler child,
10
+ strict output validation, descriptor-relative atomic installation, and
11
+ launchd/systemd definitions. `RemoteClient` exposes the complete policy
12
+ envelope. A separate policy-only Stacktrace runtime lives under
13
+ `/opt/stacktrace-policy`; the user daemon and developer uv tool environment
14
+ remain outside the privileged path.
15
+
16
+ **Spec:** [Automatic managed-policy deployment](../specs/managed-policy-deployment.md)
17
+ and [ADR-0087](../adrs/0087-deploy-compiled-policy-with-a-privileged-scheduled-job.md).
18
+
19
+ ## Constraints
20
+
21
+ - The public test seams are the `remote policy` CLI, the `RemoteClient`
22
+ envelope contract, and generated launchd/systemd definitions.
23
+ - Work red-to-green in vertical slices; do not reimplement OpenACA policy
24
+ evaluation.
25
+ - The developer CLI remains in its uv tool environment. A second root-owned
26
+ runtime at `/opt/stacktrace-policy` serves only the privileged timer and is
27
+ installed from a root-downloaded uv; no developer-owned executable runs with
28
+ sudo.
29
+ - Missing or corrupt service state after enrollment fails static with
30
+ `state_lost`; installation creates the initial state anchor.
31
+ - The existing token-bearing installer asks for sudo once on macOS, installs
32
+ the same released Stacktrace version into the policy runtime, installs the
33
+ LaunchDaemon and clears sudo state. That installer change lives in the
34
+ companion `stacktrace-site` repository.
35
+ - Every gate in `scripts/git-hooks/pre-push` passes before push.
36
+
37
+ ## Tasks
38
+
39
+ - [x] Preserve and validate the complete Fleet policy envelope.
40
+ - [x] Amend the proposed spec and ADR for the separate policy runtime and
41
+ fail-static state loss.
42
+ - [x] Add root enrollment/state models and atomic persistence.
43
+ - [x] Add revision/hourly reconciliation and strict candidate validation.
44
+ - [x] Add the bounded privilege-dropped compiler child.
45
+ - [x] Add descriptor-relative managed-settings verification and atomic install.
46
+ - [x] Add launchd/systemd rendering plus install/uninstall/status commands.
47
+ - [x] Run targeted tests, the full repository gate, and inspect the final diff.
@@ -0,0 +1,87 @@
1
+ # 0.7.0 — Fleet policy deploys itself
2
+
3
+ 0.6.x could compile your organization's Fleet policy into Claude Code managed
4
+ settings, but a person still had to copy the result into a root-owned directory
5
+ on every machine, every time the policy changed. This release installs it
6
+ automatically, without MDM and without trusting anything the developer's
7
+ account — or an agent running as it — can write.
8
+
9
+ ## Fleet policy is installed and kept current automatically
10
+
11
+ On macOS, Fleet's one-line onboarding installer now asks for sudo once,
12
+ installs this release into a separate root-owned runtime under
13
+ `/opt/stacktrace-policy`, and runs its
14
+ `remote policy install-service --user <developer> --api-url <fleet>`. That
15
+ installs a root-owned scheduled job —
16
+ launchd on macOS, a systemd timer on Linux — that runs every minute and at boot
17
+ (ADR-0087):
18
+
19
+ - **Fetches the policy itself**, with its own root-only enrollment and Fleet's
20
+ policy revision. Nothing the developer's account can write is ever an input
21
+ to the root job.
22
+ - **Compiles as the developer, not as root.** A child process drops to the
23
+ enrolled user's UID, GID and groups and runs the OpenACA compiler on their
24
+ `~/.claude`; root only receives the result over a private pipe.
25
+ - **Accepts only policy keys.** Root installs nothing but the exact,
26
+ non-executable policy-control keys the compiler emits, so a tampered or buggy
27
+ compile cannot slip a hook or helper command into managed settings.
28
+ - **Installs atomically and fails static.** The artifact lands as
29
+ `managed-settings.d/50-openaca-policy.json`, root-owned and `0644`, by an
30
+ atomic rename. Any failure keeps the previous policy in force.
31
+ - **Recompiles on change and hourly.** A new Fleet revision is picked up within
32
+ a minute; a full recompile every hour catches new components and new
33
+ advisories.
34
+
35
+ The job only ever runs that root-owned runtime, never the developer's
36
+ uv-installed CLI or uv. `remote policy status` shows what is
37
+ installed and why the last run failed, `remote policy apply` runs one
38
+ reconciliation now, and `remote policy uninstall-service` removes the job and
39
+ leaves the last installed policy in place.
40
+
41
+ ## Vulnerability gates work on ordinary machines
42
+
43
+ This release pins OpenACA 0.8.0. A policy with a vulnerability gate no longer
44
+ refuses to compile because a plugin, hook or skill has no advisory coordinate:
45
+ components that can be looked up are blocked on a match, and the rest are
46
+ listed under `vulnerability_coverage` in the compile report (OpenACA ADR-0064).
47
+
48
+ ## Findings say who a call reached
49
+
50
+ A throttled or upstream-blocked call, a retry storm, and a credential sent off
51
+ the machine now name their target: the MCP server and tool, the WebFetch host,
52
+ or the vendor CLI's service — and only when the name is shaped like an
53
+ identifier, never a path or a sentence (ADR-0086). A denied call names no
54
+ target.
55
+
56
+ ## Also in this release
57
+
58
+ - **Slack alerts leave out confidence** (ADR-0088). A `--format slack` message
59
+ shows subject, evidence and severity; the JSON payload and
60
+ `stacktrace findings` still carry confidence.
61
+ - **Monitor:** plainer Live tab headings, a simpler Inventory check cell and
62
+ Vulnerabilities tiles, a selected severity keeps its tile, and the strip's
63
+ chips add up to its "invoked" total.
64
+ - **Bug fixes.** A URL host is scanned for credentials as it was written, and a
65
+ reply-only block gets a span the upload contract accepts.
66
+
67
+ ## Install
68
+
69
+ `uv tool install stacktrace-cli==0.7.0` or `pip install stacktrace-cli==0.7.0`.
70
+
71
+ ## Compatibility
72
+
73
+ Beta — no back-compat hedging.
74
+
75
+ - **New privileged surface, opt-in.** Nothing changes on a machine until an
76
+ administrator runs `remote policy install-service` (or the onboarding
77
+ installer). That opt-in surface is the only privileged-policy change; it
78
+ doesn't touch the Slack format, finding targets, or Monitor changes below,
79
+ which apply whether or not policy deployment is installed.
80
+ - **Managed settings file name.** The installed drop-in is
81
+ `50-openaca-policy.json`, the name OpenACA excludes from its own collision
82
+ check. Don't hand-place another drop-in with that name.
83
+ - **Vulnerability-gated compiles now succeed with gaps** instead of failing.
84
+ Read `vulnerability_coverage` if you relied on the old error to detect
85
+ incomplete coverage.
86
+ - **Slack message body.** `--format slack` no longer shows a Confidence field;
87
+ the JSON format is unchanged.