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.
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/PKG-INFO +3 -3
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/README.md +1 -1
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0006-trust-boundary-and-detection-upload.md +1 -1
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0018-remote-sync-config-and-facade-consumption.md +2 -0
- {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
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0071-render-the-allowlisted-payload-per-destination.md +1 -1
- stacktrace_cli-0.7.1/docs/adrs/0086-a-refusal-names-who-answered-the-call.md +110 -0
- stacktrace_cli-0.7.1/docs/adrs/0087-deploy-compiled-policy-with-a-privileged-scheduled-job.md +195 -0
- stacktrace_cli-0.7.1/docs/adrs/0088-slack-alerts-leave-out-confidence.md +44 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/INDEX.md +5 -1
- stacktrace_cli-0.7.1/docs/plans/015-managed-policy-deployment.md +47 -0
- stacktrace_cli-0.7.1/docs/releases/v0.7.0.md +87 -0
- stacktrace_cli-0.7.1/docs/releases/v0.7.1.md +76 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/daemon-scanning.md +7 -2
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/daemon-uploads.md +1 -1
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/detection-policies.md +13 -0
- stacktrace_cli-0.7.1/docs/specs/managed-policy-deployment.md +553 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/monitor-inventory.md +15 -11
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/monitor.md +6 -3
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/remote-sync.md +18 -3
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/pyproject.toml +2 -2
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/__init__.py +1 -1
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/cli.py +13 -9
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/webhook.py +2 -1
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/deterministic.py +147 -10
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/finding.py +3 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/server.py +7 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/site/app.js +14 -8
- stacktrace_cli-0.7.1/src/stacktrace_cli/monitor/site/apple-icon.png +0 -0
- stacktrace_cli-0.7.1/src/stacktrace_cli/monitor/site/favicon.ico +0 -0
- stacktrace_cli-0.7.1/src/stacktrace_cli/monitor/site/icon.svg +7 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/site/index.html +3 -6
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/site/inventory.js +19 -15
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/site/styles.css +3 -13
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/cli.py +183 -21
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/client.py +18 -84
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/config.py +5 -1
- stacktrace_cli-0.7.1/src/stacktrace_cli/remote/policy_service.py +1622 -0
- stacktrace_cli-0.7.1/src/stacktrace_cli/remote/policy_worker.py +64 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/sync.py +7 -1
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_cli.py +41 -9
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_webhook.py +2 -1
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/feed_harness.mjs +25 -3
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/inventory_harness.mjs +53 -1
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_feed_model.py +20 -7
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_inventory_page.py +24 -1
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_server.py +13 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_site_assets.py +2 -2
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_cli.py +250 -81
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_client.py +85 -106
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_config.py +11 -0
- stacktrace_cli-0.7.1/tests/remote/test_policy_service.py +2385 -0
- stacktrace_cli-0.7.1/tests/remote/test_policy_service_cli.py +334 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_seam.py +5 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_sync.py +29 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_call_status_conventions.py +41 -0
- stacktrace_cli-0.7.1/tests/test_detector_names_the_service.py +252 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_why_it_stopped.py +24 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_untrusted_content_never_travels.py +101 -9
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/uv.lock +5 -5
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.agents/skills/release-stacktrace/SKILL.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.claude/settings.json +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.claude/skills/pr-review-loop/SKILL.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.claude/skills/release-stacktrace/SKILL.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.codex/hooks.json +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.github/managed-autofix.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.github/workflows/autofix.yml +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.github/workflows/ci.yml +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.github/workflows/claude.yml +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.github/workflows/publish-pypi.yml +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/.gitignore +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/AGENTS.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/CLAUDE.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0001-session-telemetry-as-input.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0002-session-collection-in-openaidr.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0003-runtime-edges.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0004-three-stage-detector.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0005-detection-family-and-report-assembly.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0007-proprietary-package-on-open-dependencies.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0008-console-in-separate-demo-package.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0010-detection-severity-and-confidence-ladders.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0011-verdict-cache.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0012-observation-evidence-kinds-and-transport.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0013-rule-catalogue-triage-and-per-rule-context.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0014-declared-project-mapping.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0015-narrow-the-security-catalogue.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0016-stall-grouping-is-session-wide.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0017-a-declined-repeat-is-a-stall.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0019-delegated-commands-are-openaca-objects.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0020-openaca-consumption-boundary.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0021-two-command-kinds.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0022-detection-scope-is-a-catalogue-column.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0023-sync-detect-collects-and-does-not-escalate.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0024-the-upload-carries-observations.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0025-a-denied-call-is-activity-never-an-invocation.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0026-the-console-becomes-a-product-surface.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0028-the-console-shows-what-it-placed.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0029-stage-three-returns-to-opt-in.md +0 -0
- {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
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0031-one-host-daemon-observes-native-session-logs.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0032-refresh-daemon-compositions-outside-detection.md +0 -0
- {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
- {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
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0035-naming-an-analyzer-selects-stored-answers.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0036-deliver-eligible-findings-to-slack-from-the-daemon.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0037-reuse-openaidr-append-cursors-in-the-daemon.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0038-poll-normalized-sessions-for-supplemental-changes.md +0 -0
- {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
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0041-defer-native-windows-support.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0042-read-the-build-commit-from-the-install-record.md +0 -0
- {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
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0044-send-the-build-as-version-prints-it.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0045-scan-every-session-and-outlive-them.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0046-the-finding-store-is-an-append-only-queue.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0047-capture-activity-during-correlation-or-lose-it.md +0 -0
- {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
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0056-stop-a-resident-daemon-by-record-and-signal.md +0 -0
- {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
- {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
- {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
- {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
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0061-the-drain-sends-findings-only.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0062-hold-the-transition-lock-across-remote-side-effects.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0063-underbuilt-debt-does-not-hold-the-scan-watermark.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0064-a-redacted-value-has-one-path-span.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0065-asset-external-id-resolves-by-a-ladder.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0066-host-owned-daemon-supervision.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0067-a-webhook-is-an-independent-queue-subscriber.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0068-webhooks-retry-the-retained-backlog.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0069-webhooks-deliver-what-retention-holds.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0070-package-the-cloud-agent-environment-bootstrap.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0072-host-supervisors-own-daemon-restarts.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0073-name-what-fired-and-which-component.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0074-a-window-selects-findings-by-when-they-happened.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0076-two-phase-detection-pipeline.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0077-the-bom-job-wakes-once-at-startup-staggered.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0078-a-seeded-display-prefix-replaces-the-hostname-label.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0079-the-monitor-page-renders-findings-not-pipeline-health.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0080-enabling-reasoning-does-not-requeue-the-past.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0081-reasoning-activation-returns-to-explicit-opt-in.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0082-monitor-checks-every-installed-component-by-default.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0083-each-block-reason-is-its-own-rule.md +0 -0
- {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
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/0085-show-when-and-which-finding-slack-delivered.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/HOOK-PROMPT.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/adrs/TEMPLATE.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/cutover-openaca-remote.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/002-session-input.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/003-correlation.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/004-detector.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/005-remote-sync.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/006-cli-composition.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/007-detection-upload.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/008-monitor.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/009-reasoning-jev.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/010-session-daemon.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/011-daemon-store.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/012-daemon-scanning.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/013-daemon-uploads.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/plans/014-asset-identity.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.0.1.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.1.0.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.2.0.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.2.1.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.2.2.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.2.3.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.3.0.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.3.1.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.4.0.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.4.1.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.5.0.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.5.1.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.5.2.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.5.3.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.6.0.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/releases/v0.6.1.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/research/001-intent-drift-metric.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/aidr.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/cli-composition.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/correlation.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/daemon-store.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/detection-upload.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/detector.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/event-time.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/notification-delivery.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/reasoning-jev.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/docs/specs/session-input.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/scripts/git-hooks/pre-push +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/scripts/install-hooks.sh +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/__main__.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/analysis.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/build.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/cli.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/cloud/__init__.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/cloud/setup.sh +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/__init__.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/acquire.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/composition.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/join.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/observed.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/orchestrate.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/project_map.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/record.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/correlate/render.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/__init__.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/activity_log.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/bom.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/client.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/composition.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/config.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/db.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/fleet.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/identity.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/jobs.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/lifecycle.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/observer.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/paths.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/presentation.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/protocol.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/runtime.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/scan.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/server.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/service.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/daemon/store.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/__init__.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/analyzer.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/blocked.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/cache.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/history.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/jev.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/priors.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/prompts/__init__.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/prompts/jev-v1/stacktrace-deceptive-completion.json +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/prompts/jev-v2/stacktrace-deceptive-completion.json +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/prompts/v1/exclusions.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/prompts/v1/framing.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/prompts/v1/stacktrace-deceptive-completion.md +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/reasoning.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/render.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/rules.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/run.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/secrets.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/verdict.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/detector/windows.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/__init__.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/inventory.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/reasoning.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/render.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/site/fonts/OFL.txt +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/site/fonts/dm-mono-400-latin.woff2 +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/site/fonts/dm-mono-500-latin.woff2 +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/site/fonts/dm-sans-latin.woff2 +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/state.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/verdicts.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/monitor/watch.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/options.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/private_state.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/__init__.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/detect_payload.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/identity.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/payload.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/policy.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/redact.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/spool.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/sync_detect.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/remote/upload_contract.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/sessions/__init__.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/sessions/access.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/sessions/index.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/sessions/outcome.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/sessions/protocols.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/sessions/render.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/telemetry/__init__.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/telemetry/cli.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/telemetry/events.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/telemetry/posthog.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/telemetry/state.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/webhook/__init__.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/webhook/cli.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/src/stacktrace_cli/webhook/config.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/__init__.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/agent_bom_fixture.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/conftest.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/__init__.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_activity_log.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_client.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_composition.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_config.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_db.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_detection_needs_no_subscriber.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_fleet.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_identity.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_jobs.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_lifecycle.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_observer.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_queue_reader.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_runtime.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_scan.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_service.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_socket.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_store.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_the_drained_payload_is_the_cold_one.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_the_stored_row_is_sufficient.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/daemon/test_wire_frames_are_bounded.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/detector_session_fixture.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/__init__.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_inventory.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_reasoning_gates.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_render.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_state.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_verdicts.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/monitor/test_watch.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/__init__.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/helpers.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_activity.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_cli.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_client.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_contract_is_exhaustive.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_gate_matches_the_cloud.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_layers_compose.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_payload_reaches_the_cloud_model.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_redaction.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_spool.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_upload_contract.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_detect_wire_payload.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_facade_contract.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_identity.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_no_local_path_survives_redaction.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_payload.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_policy.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_redact_payload.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_spool.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_sync_detect.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/remote/test_upload_contract.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/telemetry/__init__.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/telemetry/test_activity_log.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/telemetry/test_cli.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/telemetry/test_events.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/telemetry/test_hooks.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/telemetry/test_release_gate.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/telemetry/test_state.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/telemetry/test_uploader.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_acquire.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_adr_cross_references_are_reciprocal.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_agent_instance_id.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_analysis.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_bom_shape.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_build_commit.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_cli.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_composition.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_correlate_orchestrate.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_correlate_render.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_correlated_session.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detection_components.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detection_event_time.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detection_subject.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_analyzer_contract.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_analyzer_live.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_blocked.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_cache.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_deterministic.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_end_to_end.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_finding.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_history.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_jev.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_new_deterministic.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_priors.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_prompts.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_reasoning.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_render.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_run.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_secrets.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_verdict.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_vulnerable_dep_invoked.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_detector_windows.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_evidence_is_dated_not_numbered.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_fingerprint_covers_what_the_analyzer_reads.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_help_sections.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_join.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_monitor_cli.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_no_live_document_states_the_old_stage_three_default.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_no_test_undoes_every_patch_at_once.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_observed.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_openaca_contract.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_openaidr_contract.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_option_arity_matches_the_binary.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_project_map.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_readme_examples_are_real_output.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_release_gate_coverage.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_release_readiness.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_seam_boundary.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_session_identity_is_the_pair.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_sessions_access.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_sessions_end_to_end.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_sessions_protocol_typing.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_sessions_protocols.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_sessions_render.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_shell_separators_match_the_shell.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_stored_verdicts_are_never_gated_on_reasoning.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_the_detector_spec_lists_the_shipped_catalogue.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_the_jev_spec_states_the_shipped_thresholds.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_the_locality_claim_is_qualified_everywhere.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_title_disclosure_invariant.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_verification_subcommands_match_the_binary.py +0 -0
- {stacktrace_cli-0.6.1 → stacktrace_cli-0.7.1}/tests/test_what_jev_is_told_is_what_was_disclosed.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
54
|
+
stacktrace 0.7.1 (openaca 0.8.0)
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
## Quick start
|
|
@@ -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.
|