stacktrace-cli 0.14.0__tar.gz → 0.16.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/.github/workflows/guard-staging.yml +13 -6
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/PKG-INFO +8 -7
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/README.md +6 -5
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0112-a-person-is-known-by-the-accounts-on-the-host.md +1 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0118-observe-agents-through-adapters-and-a-shared-analyzer.md +1 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0119-read-sessions-from-an-ai-gateway-and-block-inline.md +1 -1
- stacktrace_cli-0.16.0/docs/adrs/0151-step-one-puts-the-daemon-beside-the-gateway.md +174 -0
- stacktrace_cli-0.16.0/docs/adrs/0153-a-gateway-person-reaches-fleet-as-an-account-card.md +62 -0
- stacktrace_cli-0.16.0/docs/adrs/0155-a-remote-mcp-servers-exact-url-reaches-fleet.md +69 -0
- stacktrace_cli-0.16.0/docs/adrs/0156-the-client-localizes-fleet-policy-targets.md +67 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/INDEX.md +4 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/agent-support.html +106 -50
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/agent-support.md +86 -56
- stacktrace_cli-0.16.0/docs/releases/v0.15.0.md +53 -0
- stacktrace_cli-0.16.0/docs/releases/v0.16.0.md +46 -0
- stacktrace_cli-0.16.0/docs/specs/cursor-agent-kind.md +378 -0
- stacktrace_cli-0.16.0/docs/specs/gateway-daemon.md +440 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/managed-policy-deployment.md +5 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/policy-enforcement.md +77 -4
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/remote-sync.md +22 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/guard-staging/README.md +39 -0
- stacktrace_cli-0.16.0/infra/guard-staging/images/daemon.sh +47 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/envoy/Dockerfile +6 -4
- stacktrace_cli-0.16.0/infra/guard-staging/images/envoy/entrypoint.sh +31 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/litellm/Dockerfile +1 -1
- stacktrace_cli-0.16.0/infra/guard-staging/images/litellm/entrypoint.sh +21 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/guard-staging/main.tf +35 -9
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/guard-staging/outputs.tf +5 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/guard-staging/smoke.sh +33 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/guard-staging/variables.tf +12 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/integrations/envoy/envoy.yaml +31 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/integrations/litellm/stacktrace_litellm.py +39 -6
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/pyproject.toml +4 -3
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/__init__.py +1 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/composition.py +9 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/evidence.py +0 -10
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/cli.py +17 -4
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/config.py +38 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/fleet.py +4 -1
- stacktrace_cli-0.16.0/src/stacktrace/daemon/gateway.py +153 -0
- stacktrace_cli-0.16.0/src/stacktrace/daemon/gateway_policy.py +161 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/policy_collect.py +90 -5
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/policy_runtime.py +116 -28
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/runtime.py +20 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/jev-v3/stacktrace-infra-unsafe-action.json +1 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/analyzer.py +117 -11
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/check.py +4 -0
- stacktrace_cli-0.16.0/src/stacktrace/gateway/principal.py +88 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/service.py +29 -4
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/sink.py +129 -15
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/hooks/claude.py +10 -5
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/detect_payload.py +14 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/policy.py +17 -1
- stacktrace_cli-0.16.0/src/stacktrace/remote/policy_localize.py +211 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/policy_worker.py +14 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/redact.py +5 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/upload_contract.py +61 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/entrypoint.py +8 -6
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/conftest.py +13 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_evidence.py +1 -8
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_claude_policy_conformance.py +5 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_cli.py +37 -5
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_codex_policy_collect_contract.py +15 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_config.py +23 -0
- stacktrace_cli-0.16.0/tests/daemon/test_gateway.py +375 -0
- stacktrace_cli-0.16.0/tests/daemon/test_gateway_fleet.py +131 -0
- stacktrace_cli-0.16.0/tests/daemon/test_gateway_person.py +140 -0
- stacktrace_cli-0.16.0/tests/daemon/test_gateway_policy.py +372 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_agent_scopes.py +27 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_collect.py +39 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_collect_contract.py +57 -0
- stacktrace_cli-0.16.0/tests/daemon/test_policy_decide.py +94 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_hook_transport.py +12 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_reconcile.py +141 -2
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_runtime.py +75 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_runtime.py +16 -1
- stacktrace_cli-0.16.0/tests/gateway/test_envoy_principal.py +37 -0
- stacktrace_cli-0.16.0/tests/gateway/test_litellm_through_daemon.py +272 -0
- stacktrace_cli-0.16.0/tests/gateway/test_principal.py +249 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_contract_is_exhaustive.py +11 -6
- stacktrace_cli-0.16.0/tests/remote/test_exact_remote_mcp_url.py +185 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_facade_contract.py +21 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_hook_policy.py +3 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_identity.py +3 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_policy.py +45 -0
- stacktrace_cli-0.16.0/tests/remote/test_policy_localize.py +379 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_events.py +1 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_every_derived_site.py +1 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_hooks.py +1 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_agent_support_doc.py +1 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_cli.py +1 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_entrypoint_conventions.py +4 -2
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_kind_conformance.py +36 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_no_agent_kind_is_named.py +8 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_openaidr_contract.py +231 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_session_identity_is_the_pair.py +4 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/uv.lock +5 -5
- stacktrace_cli-0.14.0/infra/guard-staging/images/envoy/entrypoint.sh +0 -13
- stacktrace_cli-0.14.0/infra/guard-staging/images/litellm/entrypoint.sh +0 -8
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/.agents/skills/release-stacktrace/SKILL.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/.claude/settings.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/.claude/skills/release-stacktrace/SKILL.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/.codex/hooks.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/.github/managed-autofix.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/.github/pull_request_template.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/.github/workflows/bedrock-live.yml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/.github/workflows/ci.yml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/.github/workflows/publish-pypi.yml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/.gitignore +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/AGENTS.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/CLAUDE.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/SECURITY.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/decision-request.example.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/decision-request.schema.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/decision-response.example.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/decision-response.schema.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/example.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/contracts/observations/v1/schema.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0001-session-telemetry-as-input.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0002-session-collection-in-openaidr.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0003-runtime-edges.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0004-three-stage-detector.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0005-detection-family-and-report-assembly.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0006-trust-boundary-and-detection-upload.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0007-proprietary-package-on-open-dependencies.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0008-console-in-separate-demo-package.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0010-detection-severity-and-confidence-ladders.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0011-verdict-cache.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0012-observation-evidence-kinds-and-transport.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0013-rule-catalogue-triage-and-per-rule-context.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0014-declared-project-mapping.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0015-narrow-the-security-catalogue.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0016-stall-grouping-is-session-wide.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0017-a-declined-repeat-is-a-stall.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0018-remote-sync-config-and-facade-consumption.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0019-delegated-commands-are-openaca-objects.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0020-openaca-consumption-boundary.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0021-two-command-kinds.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0022-detection-scope-is-a-catalogue-column.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0023-sync-detect-collects-and-does-not-escalate.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0024-the-upload-carries-observations.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0025-a-denied-call-is-activity-never-an-invocation.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0026-the-console-becomes-a-product-surface.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0027-a-finding-may-name-what-it-could-not-place.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0028-the-console-shows-what-it-placed.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0029-stage-three-returns-to-opt-in.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0030-a-detection-is-dated-by-the-turns-it-cites.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0031-one-host-daemon-observes-native-session-logs.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0032-refresh-daemon-compositions-outside-detection.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0033-a-third-party-analyzer-only-by-a-flag-that-names-it.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0034-the-drift-grade-is-read-off-a-run-not-a-call.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0035-naming-an-analyzer-selects-stored-answers.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0036-deliver-eligible-findings-to-slack-from-the-daemon.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0037-reuse-openaidr-append-cursors-in-the-daemon.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0038-poll-normalized-sessions-for-supplemental-changes.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0039-send-usage-telemetry-by-default-with-an-opt-out.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0041-defer-native-windows-support.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0042-read-the-build-commit-from-the-install-record.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0043-name-the-session-agent-and-host-and-count-errors-by-class.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0044-send-the-build-as-version-prints-it.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0045-scan-every-session-and-outlive-them.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0046-the-finding-store-is-an-append-only-queue.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0047-capture-activity-during-correlation-or-lose-it.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0048-the-daemon-keeps-a-leveled-content-free-activity-log.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0056-stop-a-resident-daemon-by-record-and-signal.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0057-grow-the-queue-schema-additively-and-share-only-the-document.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0058-one-word-for-a-finding-columns-for-a-counter-and-a-push-that-does-not-wait.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0059-the-daemon-does-not-decide-whether-it-should-be-running.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0060-two-upload-postures-not-one-command-with-two-sources.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0061-the-drain-sends-findings-only.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0062-hold-the-transition-lock-across-remote-side-effects.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0063-underbuilt-debt-does-not-hold-the-scan-watermark.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0064-a-redacted-value-has-one-path-span.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0065-asset-external-id-resolves-by-a-ladder.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0066-host-owned-daemon-supervision.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0067-a-webhook-is-an-independent-queue-subscriber.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0068-webhooks-retry-the-retained-backlog.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0069-webhooks-deliver-what-retention-holds.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0070-package-the-cloud-agent-environment-bootstrap.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0071-render-the-allowlisted-payload-per-destination.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0072-host-supervisors-own-daemon-restarts.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0073-name-what-fired-and-which-component.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0074-a-window-selects-findings-by-when-they-happened.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0076-two-phase-detection-pipeline.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0077-the-bom-job-wakes-once-at-startup-staggered.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0078-a-seeded-display-prefix-replaces-the-hostname-label.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0079-the-monitor-page-renders-findings-not-pipeline-health.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0080-enabling-reasoning-does-not-requeue-the-past.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0081-reasoning-activation-returns-to-explicit-opt-in.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0082-monitor-checks-every-installed-component-by-default.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0083-each-block-reason-is-its-own-rule.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0084-a-recursive-deletes-evidence-is-the-rm-that-ran.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0085-show-when-and-which-finding-slack-delivered.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0086-a-refusal-names-who-answered-the-call.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0087-deploy-compiled-policy-with-a-privileged-scheduled-job.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0088-slack-alerts-leave-out-confidence.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0089-infra-gate-reads-commands-not-shell-semantics.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0090-count-completed-commands-locate-by-ip-send-through-the-managed-proxy.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0091-mark-our-own-machines-and-name-what-failed.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0092-cost-is-its-own-rule-family.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0093-environment-cost-baselines-count-tokens-keyed-by-model.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0094-estimate-cost-from-tokens-the-agent-figure-is-a-cross-check.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0095-cost-findings-reach-fleet-each-rule-can-be-muted.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0096-cost-usage-may-leave-as-token-totals-and-work-identifiers.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0097-the-daemon-makes-cost-findings-and-the-monitor-reads-them.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0098-a-run-is-its-main-session.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0099-cost-is-measured-in-tokens-and-relative-increases.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0100-the-monitor-runs-offline-for-the-website.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0101-what-names-a-run-in-fleet.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0102-token-use-is-never-compared-with-a-providers-usage-api.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0103-finished-runs-may-leave-as-numbers-for-org-baselines.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0104-usage-is-its-own-upload.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0105-an-asset-key-is-a-bare-uuid.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0106-boot-id-is-salted-with-the-pid-namespace.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0107-the-daemon-follows-every-kind-openaidr-reads.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0108-a-kind-renamed-before-any-release-read-it-keeps-no-alias.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0109-a-detection-carries-its-runs-title-and-the-persons-name.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0110-every-kinds-account-comes-from-openaidr.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0111-built-in-sub-agents-and-skills-come-from-the-bom.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0113-size-triggers-behaviour-explains-session-cost-carries-reasons.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0114-similar-sessions-are-the-same-agent-in-the-same-repo.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0115-usage-states-its-coverage-and-fleet-returns-expected-runs.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0116-a-component-row-carries-what-its-results-cost-under-one-closed-key.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0117-a-component-row-on-the-day-of-a-switch-counts-from-the-switch.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0120-own-the-adapter-event-envelope.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0121-a-cloud-sessions-runs-are-its-persons-and-a-card-says-where-its-name-came-from.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0122-use-stacktrace-as-the-python-package.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0123-the-cloud-boot-hook-brings-the-client-up-to-the-latest-release.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0124-fleet-imports-core-from-the-stacktrace-distribution.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0127-the-monitor-shows-weighted-tokens-beside-raw-tokens.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0128-usage-files-each-response-once-where-it-was-first-filed.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0129-an-unfinished-response-counts-the-output-it-shows.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0130-usage-carries-one-hour-cache-writes-and-each-responses-price-class.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0131-activate-hook-policy-without-a-privileged-runtime.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0132-every-usage-page-names-the-store-that-built-it.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0133-a-clients-own-error-record-is-a-third-block-channel.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0134-a-secret-sent-to-a-server-configured-as-remote-is-egress.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0135-enforce-policy-through-the-daemon-and-agent-hooks.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0136-bound-policy-evidence-collection-as-one-bundle.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0137-a-rule-in-wording-reads-the-same-on-every-surface.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0138-a-credential-in-a-prompt-travels-as-a-mask-and-a-digest.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0139-remediation-finding-contract.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0140-an-untitled-run-names-itself-by-its-first-five-words.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0141-two-remediation-models-one-credential-identity-and-a-letters-only-fragment.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0142-the-cli-has-no-machine-limit.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0143-the-plugin-owns-session-hooks-on-every-host.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0146-eight-rules-send-remediation-targets.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0147-the-webhook-names-the-run-and-the-person-and-an-egress-label-keeps-its-last-four.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0148-credential-egress-notifies-at-medium-confidence-when-it-is-high.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0149-a-credential-switch-replaces-the-mcp-sign-in-rule.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/0150-codex-hooks-use-the-shared-policy-runtime.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/HOOK-PROMPT.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/adrs/TEMPLATE.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/cutover-openaca-remote.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/002-session-input.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/003-correlation.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/004-detector.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/005-remote-sync.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/006-cli-composition.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/007-detection-upload.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/008-monitor.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/009-reasoning-jev.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/010-session-daemon.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/011-daemon-store.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/012-daemon-scanning.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/013-daemon-uploads.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/014-asset-identity.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/015-managed-policy-deployment.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/016-cost-phase-1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/017-cost-phase-2.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/018-remediation-rules.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/plans/019-credential-switch.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.0.1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.1.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.10.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.11.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.12.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.13.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.14.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.2.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.2.1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.2.2.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.2.3.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.3.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.3.1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.4.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.4.1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.5.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.5.1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.5.2.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.5.3.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.6.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.6.1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.7.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.7.1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.8.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/releases/v0.9.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/research/001-intent-drift-metric.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/TEMPLATE.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/agent-observability.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/aidr.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/cli-composition.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/codex-agent-kind.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/codex-hook-policy.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/correlation.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/cost-notifications.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/cost-phase-1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/cost-phase-2.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/cost.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/daemon-scanning.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/daemon-store.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/daemon-uploads.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/detection-policies.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/detection-upload.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/detector.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/event-time.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/hook-policy-rollout.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/monitor-inventory.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/monitor.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/notification-delivery.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/plugin-installation.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/production-agent-observability.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/reasoning-jev.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/session-input.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/specs/usage-upload.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/docs/trust.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/examples/observations/custom_agent.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/README.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/bedrock-sandbox/.gitignore +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/bedrock-sandbox/ci.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/bedrock-sandbox/main.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/bedrock-sandbox/outputs.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/bedrock-sandbox/variables.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/guard-staging/.gitignore +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/guard-staging/check.sh +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/guard-staging/ci.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/guard-staging/connect.sh +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/envoy/litellm.yaml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/litellm/config.subscription.yaml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/guard-staging/images/litellm/config.yaml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/guard-staging/moved.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/guard-staging/user-key.sh +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/modules/express-gateway/main.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/modules/express-gateway/outputs.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/infra/modules/express-gateway/variables.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/integrations/e2e/claude.sh +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/integrations/e2e/scenarios.sh +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/integrations/envoy/run.sh +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/integrations/litellm/README.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/integrations/litellm/config.example.yaml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/integrations/litellm/config.subscription.yaml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/integrations/litellm/e2e/config.baseten.yaml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/integrations/litellm/e2e/config.mock.yaml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/integrations/litellm/e2e/mock_upstream.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/integrations/litellm/e2e/parity.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/integrations/litellm/stacktrace_keys.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/scripts/cost_latency.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/scripts/git-hooks/pre-push +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/scripts/install-hooks.sh +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/__main__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/analysis.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/build.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cloud/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cloud/boot.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cloud/profile.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cloud/setup.sh +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/core/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/core/observations.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/acquire.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/join.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/observed.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/orchestrate.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/project_map.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/record.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/correlate/render.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/baseline.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/clock.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/component_usage.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/components.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/copies.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/ledger.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/measures.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/models.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/org_baselines.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/output.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/price_class.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/reasons.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/rules.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/runs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/tokens.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/totals.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/usage.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/cost/weights.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/accounts.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/activity_log.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/bom.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/client.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/composition.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/costs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/db.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/identity.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/jobs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/lifecycle.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/observer.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/paths.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/policy_inputs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/presentation.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/protocol.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/scan.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/server.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/service.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/store.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/usage.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/daemon/webhook.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/analyzer.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/blocked.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/cache.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/deterministic.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/finding.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/history.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/jev.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/personal_data.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/priors.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/jev-v1/stacktrace-deceptive-completion.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/jev-v2/stacktrace-deceptive-completion.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/jev-v2/stacktrace-infra-unsafe-action.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/jev-v3/stacktrace-deceptive-completion.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/v1/exclusions.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/v1/framing.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/prompts/v1/stacktrace-deceptive-completion.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/reasoning.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/render.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/rules.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/run.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/secrets.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/verdict.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/detector/windows.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/finding_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/finding_titles.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/exchange.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/_json.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/anthropic.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/bedrock.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/body.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/openai_chat.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/formats/openai_responses.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/gateway/session.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/hooks/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/hooks/codex.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/hooks/session.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/costs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/inventory.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/offline.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/reasoning.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/render.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/server.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/app.js +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/apple-icon.png +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/cost.js +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/favicon.ico +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/fonts/OFL.txt +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/fonts/dm-mono-400-latin.woff2 +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/fonts/dm-mono-500-latin.woff2 +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/fonts/dm-sans-latin.woff2 +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/fonts/playfair-display-600-italic-latin.woff2 +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/icon.svg +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/index.html +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/inventory.js +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/site/styles.css +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/state.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/verdicts.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/monitor/watch.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/options.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/policy_display.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/private_state.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/py.typed +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/client.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/config.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/hook_policy.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/identity.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/payload.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/policy_service.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/policy_show.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/spool.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/sync.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/remote/sync_detect.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/sdk.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/access.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/index.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/lineage.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/outcome.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/protocols.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/sessions/render.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/telemetry/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/telemetry/cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/telemetry/events.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/telemetry/posthog.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/telemetry/state.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/webhook/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/webhook/cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/src/stacktrace/webhook/config.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/agent_bom_fixture.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/fakes.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/scenarios.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_as_of_cuts_every_timed_collection.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_baseline.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_clock.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_component_usage.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_components.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_copies.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_cost_evidence_travels.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_cost_findings_are_dated_by_their_citations.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_cost_findings_carry_no_session_text.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_cost_is_tokens.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_cost_latency.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_ledger.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_measures.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_models.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_org_baselines.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_output.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_price_class.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_reasons.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_rules_baseline.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_runs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_totals.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_unfinished_output_counts_what_it_shows.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_usage.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/cost/test_weights.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/observing.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_accounts.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_activity_log.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_claude_policy_hook.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_client.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_codex_policy_conformance.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_codex_policy_hook.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_composition.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_cost_guidance.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_costs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_db.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_detection_needs_no_subscriber.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_fleet.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_identity.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_job_thread.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_jobs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_lifecycle.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_observer.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_inputs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_policy_socket.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_queue_reader.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_scan.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_service.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_session_cost_notices.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_socket.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_stage_times.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_store.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_subagent_routing.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_the_drained_payload_is_the_cold_one.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_the_stored_row_is_sufficient.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_usage.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_usage_store.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_webhook.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/daemon/test_wire_frames_are_bounded.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/detector_session_fixture.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/fixtures/claude-code-2.1.296-suite/gateway-last-turn.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/fixtures/claude-code-2.1.296-suite/projects/run/b23c3bab-a677-4b5f-ac36-e132c7df29e5.jsonl +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/test_analyzer.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/test_bodies_and_logs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/test_call_records.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/test_check.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/test_every_choice_is_read.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/test_every_read_field_is_validated.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/test_every_shortfall_is_a_recorded_fallback.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/test_gateway_keys.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/test_gateway_scripts.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/test_litellm_stream.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/test_litellm_subscription_config.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/test_parity_live_capture.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/test_service.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/test_session.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/gateway/test_unstated_outcomes.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/cost_harness.mjs +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/feed_harness.mjs +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/inventory_harness.mjs +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/test_cost_page.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/test_cost_range_switch.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/test_feed_model.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/test_inventory.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/test_inventory_page.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/test_offline.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/test_reasoning_gates.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/test_render.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/test_render_cost.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/test_server.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/test_site_assets.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/test_state.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/test_verdicts.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/monitor/test_watch.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/observations/test_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/observations/test_decisions.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/observations/test_event_envelope.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/helpers.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_client.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_cloud_boot_updates_the_client.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_cloud_session.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_cloud_setup_asset_id.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_config.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_activity.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_client.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_gate_matches_the_cloud.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_layers_compose.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_payload_reaches_the_cloud_model.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_redaction.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_spool.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_upload_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_detect_wire_payload.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_no_local_path_survives_redaction.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_payload.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_policy_service.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_policy_service_cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_policy_show.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_redact_payload.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_seam.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_session_registration.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_spool.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_sync.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_sync_detect.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_upload_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_usage_client.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_usage_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/remote/test_user_install_profile.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/sdk/test_observation_client.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/telemetry/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_activity_log.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_every_internal_save_is_reported.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_release_gate.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_state.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/telemetry/test_uploader.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_acquire.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_adr_cross_references_are_reciprocal.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_agent_instance_id.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_analysis.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_bom_shape.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_build_commit.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_call_status_conventions.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_composition.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_correlate_orchestrate.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_correlate_render.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_correlated_session.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detection_components.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detection_event_time.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detection_subject.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_analyzer_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_analyzer_live.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_blocked.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_cache.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_client_errors.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_credential_in_prompt.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_credential_switched.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_declared_egress.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_deterministic.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_end_to_end.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_finding.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_history.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_infra_reasoning.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_jev.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_names_the_service.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_new_deterministic.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_personal_data.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_pii_in_prompt.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_priors.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_prompts.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_reasoning.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_render.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_run.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_secrets.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_verdict.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_vulnerable_dep_invoked.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_why_it_stopped.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_detector_windows.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_evidence_is_dated_not_numbered.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_finding_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_fingerprint_covers_what_the_analyzer_reads.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_help_sections.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_join.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_monitor_cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_no_live_document_states_the_old_stage_three_default.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_no_test_undoes_every_patch_at_once.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_observed.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_one_wording_per_rule.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_openaca_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_option_arity_matches_the_binary.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_project_map.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_python_namespace.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_readme_examples_are_real_output.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_release_gate_coverage.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_release_readiness.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_rules_send_remediation_targets.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_seam_boundary.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_sessions_access.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_sessions_end_to_end.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_sessions_protocol_typing.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_sessions_protocols.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_sessions_render.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_shell_separators_match_the_shell.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_signed_in_asks_the_agent.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_stored_verdicts_are_never_gated_on_reasoning.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_the_detector_spec_lists_the_shipped_catalogue.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_the_jev_spec_states_the_shipped_thresholds.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_the_locality_claim_is_qualified_everywhere.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_title_disclosure_invariant.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_untrusted_content_never_travels.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_verification_subcommands_match_the_binary.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/test_what_jev_is_told_is_what_was_disclosed.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/tool_fields.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.16.0}/tests/webhook/test_cli.py +0 -0
|
@@ -9,7 +9,8 @@ name: guard-staging
|
|
|
9
9
|
# litellm-staging environment: AWS_DEPLOY_ROLE_ARN, ECR_REPOSITORY_URL,
|
|
10
10
|
# ENVOY_ECR_REPOSITORY_URL, SUBSCRIPTION_ECR_REPOSITORY_URL, ECS_CLUSTER,
|
|
11
11
|
# ECS_SERVICE, ENVOY_SERVICE, SUBSCRIPTION_SERVICE, LOG_GROUP, MASTER_KEY_SECRET,
|
|
12
|
-
# STAGING_ENDPOINT, ENVOY_ENDPOINT, SUBSCRIPTION_ENDPOINT, GUARD_MODE
|
|
12
|
+
# STAGING_ENDPOINT, ENVOY_ENDPOINT, SUBSCRIPTION_ENDPOINT, GUARD_MODE, and
|
|
13
|
+
# GATEWAY_DAEMON=1 once tofu runs with fleet_enrollment = true (ADR-0151).
|
|
13
14
|
|
|
14
15
|
on:
|
|
15
16
|
workflow_dispatch:
|
|
@@ -128,16 +129,22 @@ jobs:
|
|
|
128
129
|
env:
|
|
129
130
|
MODE: ${{ vars.GUARD_MODE }}
|
|
130
131
|
LOG_GROUP: ${{ vars.LOG_GROUP }}
|
|
132
|
+
# 1: each task runs the enrolled daemon, and the smoke test checks that
|
|
133
|
+
# the rm finding reached Fleet through it (infra/guard-staging/smoke.sh).
|
|
134
|
+
DAEMON: ${{ vars.GATEWAY_DAEMON }}
|
|
131
135
|
run: |
|
|
132
136
|
MASTER_KEY=$(aws secretsmanager get-secret-value --secret-id "${{ vars.MASTER_KEY_SECRET }}" \
|
|
133
137
|
--query SecretString --output text)
|
|
134
138
|
echo "::add-mask::$MASTER_KEY"
|
|
135
139
|
fail=0
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
+
# Each service logs under its own stream prefix (infra/guard-staging/main.tf).
|
|
141
|
+
echo "== ${{ vars.STAGING_ENDPOINT }}"
|
|
142
|
+
ENDPOINT="${{ vars.STAGING_ENDPOINT }}" MASTER_KEY="$MASTER_KEY" LOG_STREAM_PREFIX=litellm \
|
|
143
|
+
infra/guard-staging/smoke.sh || fail=1
|
|
144
|
+
echo "== ${{ vars.ENVOY_ENDPOINT }}"
|
|
145
|
+
ENDPOINT="${{ vars.ENVOY_ENDPOINT }}" MASTER_KEY="$MASTER_KEY" LOG_STREAM_PREFIX=envoy \
|
|
146
|
+
infra/guard-staging/smoke.sh || fail=1
|
|
140
147
|
echo "== ${{ vars.SUBSCRIPTION_ENDPOINT }} (subscription)"
|
|
141
148
|
ENDPOINT="${{ vars.SUBSCRIPTION_ENDPOINT }}" MASTER_KEY="$MASTER_KEY" SUBSCRIPTION=1 \
|
|
142
|
-
infra/guard-staging/smoke.sh || fail=1
|
|
149
|
+
LOG_STREAM_PREFIX=subscription infra/guard-staging/smoke.sh || fail=1
|
|
143
150
|
exit $fail
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: stacktrace-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.16.0
|
|
4
4
|
Summary: CLI for Stacktrace — Detection and Response platform for AI Agents.
|
|
5
5
|
Project-URL: Homepage, https://stacktrace.ai
|
|
6
6
|
Author-email: "Stacktrace AI, Inc" <founders@stacktrace.ai>
|
|
@@ -21,7 +21,7 @@ Requires-Python: >=3.11
|
|
|
21
21
|
Requires-Dist: click>=8.1
|
|
22
22
|
Requires-Dist: httpx<1.0.dev0,>=0.28.1
|
|
23
23
|
Requires-Dist: openaca==0.12.0
|
|
24
|
-
Requires-Dist: openaidr==0.
|
|
24
|
+
Requires-Dist: openaidr==0.8.0
|
|
25
25
|
Requires-Dist: posthog<8,>=7.0
|
|
26
26
|
Requires-Dist: pydantic<3,>=2.10
|
|
27
27
|
Description-Content-Type: text/markdown
|
|
@@ -52,7 +52,7 @@ Requires Python 3.11 or newer.
|
|
|
52
52
|
|
|
53
53
|
```console
|
|
54
54
|
$ stacktrace --version
|
|
55
|
-
stacktrace 0.
|
|
55
|
+
stacktrace 0.16.0
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
## Python package namespace
|
|
@@ -251,13 +251,14 @@ enables telemetry again under a new identity (ADR-0039, ADR-0090).
|
|
|
251
251
|
|
|
252
252
|
Beta, and under active development.
|
|
253
253
|
|
|
254
|
-
`sessions`, `detect` and `monitor` work end to end today, for Claude Code
|
|
255
|
-
Devin
|
|
254
|
+
`sessions`, `detect` and `monitor` work end to end today, for Claude Code,
|
|
255
|
+
Devin (Devin CLI and Devin Desktop's local agent), Codex and Cursor (the Cursor
|
|
256
|
+
CLI) sessions. Session collection is
|
|
256
257
|
[OpenAIDR](https://github.com/open-agent-security/openaidr)'s, and further agent
|
|
257
258
|
kinds arrive with it. The daemon observes every kind it reads, sub-agents included.
|
|
258
259
|
[Agent support](docs/agent-support.md) lists what works for each agent, rule by
|
|
259
|
-
rule, and what cannot.
|
|
260
|
-
([spec](docs/specs/
|
|
260
|
+
rule, and what cannot. Cursor arrives with OpenAIDR 0.8.0
|
|
261
|
+
([spec](docs/specs/cursor-agent-kind.md)).
|
|
261
262
|
|
|
262
263
|
## Built on
|
|
263
264
|
|
|
@@ -24,7 +24,7 @@ Requires Python 3.11 or newer.
|
|
|
24
24
|
|
|
25
25
|
```console
|
|
26
26
|
$ stacktrace --version
|
|
27
|
-
stacktrace 0.
|
|
27
|
+
stacktrace 0.16.0
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
## Python package namespace
|
|
@@ -223,13 +223,14 @@ enables telemetry again under a new identity (ADR-0039, ADR-0090).
|
|
|
223
223
|
|
|
224
224
|
Beta, and under active development.
|
|
225
225
|
|
|
226
|
-
`sessions`, `detect` and `monitor` work end to end today, for Claude Code
|
|
227
|
-
Devin
|
|
226
|
+
`sessions`, `detect` and `monitor` work end to end today, for Claude Code,
|
|
227
|
+
Devin (Devin CLI and Devin Desktop's local agent), Codex and Cursor (the Cursor
|
|
228
|
+
CLI) sessions. Session collection is
|
|
228
229
|
[OpenAIDR](https://github.com/open-agent-security/openaidr)'s, and further agent
|
|
229
230
|
kinds arrive with it. The daemon observes every kind it reads, sub-agents included.
|
|
230
231
|
[Agent support](docs/agent-support.md) lists what works for each agent, rule by
|
|
231
|
-
rule, and what cannot.
|
|
232
|
-
([spec](docs/specs/
|
|
232
|
+
rule, and what cannot. Cursor arrives with OpenAIDR 0.8.0
|
|
233
|
+
([spec](docs/specs/cursor-agent-kind.md)).
|
|
233
234
|
|
|
234
235
|
## Built on
|
|
235
236
|
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: 0151
|
|
3
|
+
title: Step one puts the daemon beside the gateway, names the person, and enforces Fleet policy there; Core is step two
|
|
4
|
+
status: proposed
|
|
5
|
+
date: 2026-10-19
|
|
6
|
+
supersedes: null
|
|
7
|
+
superseded-by: null
|
|
8
|
+
amends: 0118, 0119
|
|
9
|
+
amended-by: null
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
Stacktrace has two gateway adapters on main: a LiteLLM guardrail and an Envoy
|
|
15
|
+
Lua filter (ADR-0119). Both ask `stacktrace guard serve` one question about a
|
|
16
|
+
model response: may its tool calls reach the agent? The guard runs the three
|
|
17
|
+
`BLOCKING_RULES` and answers `allow` or `block`. It fails open.
|
|
18
|
+
|
|
19
|
+
The guard writes its findings to a JSONL file or to stdout. It has no path to
|
|
20
|
+
Fleet. It has no enrollment, no credentials, no retry queue and no
|
|
21
|
+
notification sinks. It does not know Fleet policy. It knows the person only
|
|
22
|
+
through a separate `call` record that LiteLLM writes, which no finding carries.
|
|
23
|
+
|
|
24
|
+
The user daemon already has the parts the guard lacks. It stores findings in
|
|
25
|
+
`FindingStore`. It uploads them to Fleet through the enrolled drain. It fans
|
|
26
|
+
notifications out to Slack and to webhooks. It fetches the organization's
|
|
27
|
+
policy from Fleet and turns it into decisions with the OpenACA evaluator
|
|
28
|
+
(ADR-0135, ADR-0136). Claude Code hooks ask it a yes or no question over a
|
|
29
|
+
private Unix socket and block on "no" (ADR-0131, ADR-0143).
|
|
30
|
+
|
|
31
|
+
The earlier direction was gateway, then a guard service, then a new Core
|
|
32
|
+
service, then Fleet. ADR-0150 and Plan 018 (proposed, on
|
|
33
|
+
`claude/core-service-plan`) describe Core. Core is not built.
|
|
34
|
+
|
|
35
|
+
At the 2026-10-19 founder sync, Vinod proposed a simpler first step: run the
|
|
36
|
+
daemon beside the gateway, as it runs beside agents today. Micheal agreed, and
|
|
37
|
+
asked for three more things: name the person behind each call, enforce Fleet
|
|
38
|
+
policy at the gateway, and keep the move to Core cheap. The
|
|
39
|
+
[gateway and daemon spec](../specs/gateway-daemon.md) gives the mechanism. The
|
|
40
|
+
[architecture one-pager](https://claude.ai/artifact/MCGpTPuUzH14C6EMKfR8Cx)
|
|
41
|
+
shows the flow, the requirements it meets and the step after it.
|
|
42
|
+
|
|
43
|
+
## Decision
|
|
44
|
+
|
|
45
|
+
1. **The daemon answers the gateway.** The daemon runs on the gateway host,
|
|
46
|
+
beside the gateway, in the same container group or on the same machine.
|
|
47
|
+
With `STACKTRACE_GATEWAY_LISTEN` set, it serves ADR-0119's contract
|
|
48
|
+
(`/v1/evaluate`, `/v1/observe`, `/healthz`) on loopback. It replaces
|
|
49
|
+
`stacktrace guard serve` for an enrolled host. The rules, the reply and the
|
|
50
|
+
fail-open behaviour are the guard's own. The listener is off by default.
|
|
51
|
+
2. **The decision is made on the gateway host.** The adapter asks the daemon
|
|
52
|
+
over loopback, or evaluates in-process. A decision never waits on a network
|
|
53
|
+
round trip to another host. This is the same constraint ADR-0150 sets for
|
|
54
|
+
Core.
|
|
55
|
+
3. **The gateway names the person.** The adapter adds a `principal` to each
|
|
56
|
+
request: `{"id": "...", "source": "litellm-key" | "envoy-jwt" | ...}`. It
|
|
57
|
+
comes only from the gateway's own authentication (LiteLLM's key check, an
|
|
58
|
+
Envoy auth filter), never from a header the client sets. The daemon accepts
|
|
59
|
+
it only on an authenticated channel: loopback with `STACKTRACE_GUARD_TOKEN`.
|
|
60
|
+
Without a verified identity the principal is absent, not guessed. The
|
|
61
|
+
daemon keys a gateway session by agent kind, session id and principal, and
|
|
62
|
+
every finding it stores carries the principal as `actor`. The event
|
|
63
|
+
identity uses the same key, so two people who send one session id never
|
|
64
|
+
share an event.
|
|
65
|
+
4. **The gateway enforces Fleet policy.** The daemon already fetches the
|
|
66
|
+
organization's policy. It also serves the decisions to the gateway path.
|
|
67
|
+
The adapter maps each tool call in a model response to a policy subject:
|
|
68
|
+
- an MCP tool call to its server (`mcp__github__create_issue` is server
|
|
69
|
+
`github` for Claude Code; each agent kind has its own naming map),
|
|
70
|
+
- a `Skill` call to the skill it names,
|
|
71
|
+
- a `Task` or `Agent` call with a namespaced `subagent_type` to that plugin
|
|
72
|
+
agent.
|
|
73
|
+
In `enforce`, an explicit `deny` blocks the response, with the hook's own
|
|
74
|
+
message: the rule's description and where to see the policy. In `observe`, a
|
|
75
|
+
deny does not block. The daemon records the action as `allowed`, and keeps
|
|
76
|
+
the policy rule. A deny on one call blocks the whole response, so no call in it runs. A subject the policy does
|
|
77
|
+
not name gets the category default only when the organization turns that on
|
|
78
|
+
for gateways; otherwise it passes. Built-in tools are not policy subjects;
|
|
79
|
+
the three `BLOCKING_RULES` still apply to them. No policy, a policy past its
|
|
80
|
+
time to live, or an unreadable response passes and is recorded as a
|
|
81
|
+
fallback.
|
|
82
|
+
5. **One decision function.** The hook path and the gateway path call the same
|
|
83
|
+
function to turn the policy into a decision for a named subject. It is
|
|
84
|
+
extracted from `policy_runtime.py`, so a deny in Fleet means the same thing
|
|
85
|
+
on a laptop and at the gateway.
|
|
86
|
+
6. **The gateway's findings reach Fleet.** Each finding is written to
|
|
87
|
+
`FindingStore` with `actor`, `action` (`blocked`, `allowed`, `observed`) and
|
|
88
|
+
the policy revision or rule pack version that produced it. The Fleet drain
|
|
89
|
+
uploads it under the gateway host's enrollment. A verdict with no finding
|
|
90
|
+
(an allow, a fallback, or a policy deny that no rule matched) stays in the
|
|
91
|
+
daemon's log in step one. Fleet has no record type for it yet. Fleet groups a gateway's findings by `actor`, not
|
|
92
|
+
by asset. On the wire, `actor` travels as ADR-0112's person: the run's
|
|
93
|
+
`session.account` and an `accounts[]` card with its `person_key`, which
|
|
94
|
+
Fleet already accepts. Fleet stays agnostic to where a finding came from,
|
|
95
|
+
so the gateway enrolls as an ordinary asset. The fields that say what the
|
|
96
|
+
gateway did need Fleet to declare them first. The spec lists
|
|
97
|
+
them under "What Fleet needs".
|
|
98
|
+
7. **The hook protocol does not change.** ADR-0135's socket, its fixed action
|
|
99
|
+
and its version stay as they are. The gateway does not use it: the adapters
|
|
100
|
+
call out over HTTP, and the rules read the request's whole history, not one
|
|
101
|
+
action. The hook frame is 64 KiB and has no principal.
|
|
102
|
+
8. **The contract is the seam to Core.** `principal`, `action`, the version
|
|
103
|
+
that decided, and the event id (session, rule, anchor span) are defined once
|
|
104
|
+
and are the fields Core's observe and decide APIs accept. The adapters then
|
|
105
|
+
move to Core by changing one URL.
|
|
106
|
+
9. **Core is step two.** When Core serves observe and decide, the adapters send
|
|
107
|
+
to Core, Core holds the findings, and session-context rules (retry storms,
|
|
108
|
+
cost) start to run on gateway traffic. The daemon listener retires for
|
|
109
|
+
gateways. ADR-0150 and Plan 018, or their successors, govern that step.
|
|
110
|
+
10. **This amends ADR-0118 decision 2 for step one only.** Until Core serves the
|
|
111
|
+
gateway, the daemon on the gateway host evaluates `BLOCKING_RULES` and
|
|
112
|
+
Fleet policy for it. No other rule blocks.
|
|
113
|
+
11. **This amends ADR-0119** on where the contract runs and on its fields. The
|
|
114
|
+
daemon hosts it for an enrolled gateway host. The capability is called
|
|
115
|
+
"guard", and it will follow Core's interface. `stacktrace guard serve` goes
|
|
116
|
+
away. Until then, the entrypoint falls back to `guard serve` only on a host
|
|
117
|
+
that is not enrolled. Requests gain `principal`; replies and stored records
|
|
118
|
+
gain `action` and the deciding version.
|
|
119
|
+
|
|
120
|
+
## Alternatives considered
|
|
121
|
+
|
|
122
|
+
- **A separate guard service that sends to Core.** This was the earlier
|
|
123
|
+
direction. It lost because Core does not exist yet, so the guard has nowhere
|
|
124
|
+
to send. Without Core it must also get enrollment, credentials, a durable
|
|
125
|
+
queue and an uploader. The daemon has all four, and they have shipped.
|
|
126
|
+
- **Go straight to Core.** It lost on time and on evidence. Core is 13 planned
|
|
127
|
+
tasks away, and the gateway-to-Core latency is not measured. Step one gives
|
|
128
|
+
Fleet gateway findings and policy enforcement now, and moving to Core is a
|
|
129
|
+
URL change for each adapter.
|
|
130
|
+
- **Use the hook's `authorize` message as it is.** It lost on two facts. The
|
|
131
|
+
adapters call out over HTTP: LiteLLM from a guardrail callback, Envoy from a
|
|
132
|
+
Lua `httpCall`. The hook protocol is JSON lines on a Unix socket. The rules
|
|
133
|
+
also read the request's whole history, not one action. A request can be up
|
|
134
|
+
to 32 MiB (`gateway/service.py:45`), and the hook frame is 64 KiB. Adding
|
|
135
|
+
arguments and history to `authorize` would make it `/v1/evaluate`. Adding a
|
|
136
|
+
principal would break its version 1 contract for every installed plugin.
|
|
137
|
+
- **Take the person from a request header.** It lost because any client could
|
|
138
|
+
name anyone, and the daemon sits in front of every person on the host.
|
|
139
|
+
- **Enforce policy only on laptops, through hooks.** It lost on coverage. Hooks
|
|
140
|
+
cover Claude Code only. A gateway also covers Codex, SDK and production
|
|
141
|
+
agents, and any machine without the plugin.
|
|
142
|
+
- **Strip denied tools from the request instead of blocking the call.** It lost
|
|
143
|
+
because ADR-0119 never edits traffic, and the model would then call a tool it
|
|
144
|
+
cannot see described.
|
|
145
|
+
- **Envoy `ext_authz`.** It lost because it sees the downstream request only.
|
|
146
|
+
The tool call to judge is in the upstream response.
|
|
147
|
+
|
|
148
|
+
## Consequences
|
|
149
|
+
|
|
150
|
+
- Gateway findings, blocks and the person behind them reach Fleet, Slack and
|
|
151
|
+
webhooks with no new service.
|
|
152
|
+
- One Fleet policy is enforced in two places: on the laptop through hooks, and
|
|
153
|
+
centrally at the gateway.
|
|
154
|
+
- Policy at the gateway matches by name only. The hook path resolves a
|
|
155
|
+
component from local evidence; the gateway sees only the name the model
|
|
156
|
+
sees. A user can rename an MCP server in their own configuration to pass a
|
|
157
|
+
deny. The hooks stay the authority for components; the gateway is the
|
|
158
|
+
backstop.
|
|
159
|
+
- Slash commands are not enforced at the gateway. They expand on the client.
|
|
160
|
+
- A per-person policy becomes possible, because the gateway knows the
|
|
161
|
+
principal. It is not decided here.
|
|
162
|
+
- The rules and the policy check run in the daemon process, beside its scans.
|
|
163
|
+
Nobody has measured gateway load against the daemon's scan cadence.
|
|
164
|
+
- A listener on a non-loopback address does not start without
|
|
165
|
+
`STACKTRACE_GUARD_TOKEN`.
|
|
166
|
+
- Fleet must accept and show `actor` and `action`. That is a Fleet change.
|
|
167
|
+
|
|
168
|
+
## When to revisit
|
|
169
|
+
|
|
170
|
+
- When Core serves observe and decide for a gateway. Then step two starts.
|
|
171
|
+
- When one gateway host's load makes the daemon miss its scan cadence or the
|
|
172
|
+
3000 ms adapter budget.
|
|
173
|
+
- When renamed servers are seen passing a gateway deny. Then fingerprint a
|
|
174
|
+
server by the tools it declares in the request.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: 0153
|
|
3
|
+
title: A gateway person reaches Fleet as an account and its card
|
|
4
|
+
status: proposed
|
|
5
|
+
date: 2026-10-20
|
|
6
|
+
supersedes: null
|
|
7
|
+
superseded-by: null
|
|
8
|
+
amends: 0112
|
|
9
|
+
amended-by: null
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
ADR-0151 names the person behind each gateway call from the gateway's own
|
|
15
|
+
authentication. #272 stored that person as `actor` and kept it off the wire,
|
|
16
|
+
because Fleet refuses undeclared fields. A gateway finding then reached Fleet
|
|
17
|
+
with no person: the staging finding showed "—" where the person goes.
|
|
18
|
+
|
|
19
|
+
ADR-0112 already gives Fleet a person model: a run's `session.account` and an
|
|
20
|
+
`accounts[]` card, whose `person_key` joins the same email across agent kinds.
|
|
21
|
+
It defines the account as the one the agent is signed in as on the host. A
|
|
22
|
+
gateway principal is a different kind of account. The design is in the
|
|
23
|
+
[gateway spec](../specs/gateway-daemon.md#the-person-behind-each-call).
|
|
24
|
+
|
|
25
|
+
## Decision
|
|
26
|
+
|
|
27
|
+
A gateway person reaches Fleet as ADR-0112's person, with no new field. The
|
|
28
|
+
finding's `session.account` is a digest of the verified principal's source and
|
|
29
|
+
id, and the payload carries a card for it. When the principal is an email
|
|
30
|
+
address, the card keeps ADR-0112's email digest, so its person key is the one a
|
|
31
|
+
laptop run under that email gets. Any other principal, such as a JWT `sub`, gets
|
|
32
|
+
a card with no person key and no name. `actor` stays local and never travels.
|
|
33
|
+
This amends ADR-0112: an account can also be one a gateway verified.
|
|
34
|
+
|
|
35
|
+
## Alternatives considered
|
|
36
|
+
|
|
37
|
+
- **Send `actor` as a new detection field.** Rejected: it needs a Fleet change,
|
|
38
|
+
it duplicates the person model Fleet already has, and it sends the principal
|
|
39
|
+
itself.
|
|
40
|
+
- **Use the client's `metadata.user_id`.** Rejected: the client sets it, so
|
|
41
|
+
anyone could claim to be anyone.
|
|
42
|
+
- **Send the principal's id as the account.** Rejected: an email would travel,
|
|
43
|
+
which ADR-0112 clause 4 forbids.
|
|
44
|
+
- **Send no person until Fleet adds a field.** Rejected: Fleet can already show
|
|
45
|
+
a person from a card, and a gateway finding with no person is the gap the
|
|
46
|
+
staging run showed.
|
|
47
|
+
|
|
48
|
+
## Consequences
|
|
49
|
+
|
|
50
|
+
- One person's laptop runs and gateway calls show as one Person in Fleet when
|
|
51
|
+
the gateway names them by email.
|
|
52
|
+
- A principal that is no email shows as an account with no name. Fleet shows
|
|
53
|
+
the account id until the person is named another way.
|
|
54
|
+
- A person who uses two gateways with different sources gets two accounts. The
|
|
55
|
+
person key still joins them when both are the same email.
|
|
56
|
+
|
|
57
|
+
## When to revisit
|
|
58
|
+
|
|
59
|
+
- When Fleet holds gateway principals as their own kind of identity, apart from
|
|
60
|
+
host sign-ins.
|
|
61
|
+
- When a gateway names people by something other than an email, such as an
|
|
62
|
+
identity provider's user id that Fleet can resolve.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: 0155
|
|
3
|
+
title: A remote MCP server's exact URL reaches Fleet
|
|
4
|
+
status: proposed
|
|
5
|
+
date: 2026-10-20
|
|
6
|
+
supersedes: null
|
|
7
|
+
superseded-by: null
|
|
8
|
+
amends: null
|
|
9
|
+
amended-by: null
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
The redaction pass reduces every http(s) URL in an `openaca:*` property to
|
|
15
|
+
`scheme://host`. OpenACA blocks a remote MCP server by its exact URL, and this
|
|
16
|
+
host compiles Fleet's policy against its own unredacted config. So the target
|
|
17
|
+
Fleet offered for a server at `https://mcp.linear.app/mcp` was
|
|
18
|
+
`https://mcp.linear.app`. A run of `compile_endpoint_policy` against a real
|
|
19
|
+
`~/.claude.json` allowed the server under that entry. Only the full URL blocked
|
|
20
|
+
it.
|
|
21
|
+
|
|
22
|
+
The component's `openaca:identity`, `mcp-remote/<host>[:port]<path>`, already
|
|
23
|
+
uploads the path. Fleet ADR-0101 admits the exact URL when it normalizes to
|
|
24
|
+
that identity, and stops offering a URL without a path as a target.
|
|
25
|
+
|
|
26
|
+
The design is in [Remote Sync](../specs/remote-sync.md#privacy-is-unchanged-and-that-is-the-point).
|
|
27
|
+
|
|
28
|
+
## Decision
|
|
29
|
+
|
|
30
|
+
The redaction pass keeps a remote MCP server's `openaca:url` and
|
|
31
|
+
`openaca:install_source` whole when the component is an `mcp_server` and the
|
|
32
|
+
URL normalizes to the component's own `openaca:identity`. Such a URL has no
|
|
33
|
+
userinfo, query or fragment. The upload contract admits the same values. Every
|
|
34
|
+
other URL, including the URLs inside `openaca:capabilities` evidence, is still
|
|
35
|
+
reduced to `scheme://host`.
|
|
36
|
+
|
|
37
|
+
## Alternatives considered
|
|
38
|
+
|
|
39
|
+
- **Keep every URL at `scheme://host`, and let Fleet build the URL from the
|
|
40
|
+
identity.** Rejected. The identity drops the query and userinfo. A server at
|
|
41
|
+
`https://host/mcp?key=v` would get the target `https://host/mcp`, which
|
|
42
|
+
matches nothing on the host.
|
|
43
|
+
- **Upload a hash of the exact URL.** Rejected. A policy entry needs the URL
|
|
44
|
+
itself. A hash cannot fill a target.
|
|
45
|
+
- **Keep the path of every http(s) URL.** Rejected. A path that differs from
|
|
46
|
+
the identity's path is a new disclosure. The identity comparison keeps the
|
|
47
|
+
disclosure at what this client already uploads.
|
|
48
|
+
- **Strip the query and keep the rest.** Rejected. The result is not the URL
|
|
49
|
+
on the host, so a block on it blocks nothing. Fleet cannot tell it from an
|
|
50
|
+
exact URL.
|
|
51
|
+
|
|
52
|
+
## Consequences
|
|
53
|
+
|
|
54
|
+
- (+) Fleet's Policy editor offers a URL target that blocks the server here.
|
|
55
|
+
- (+) Nothing leaves the machine that the identity does not already state,
|
|
56
|
+
apart from the scheme, the host's case and a default port.
|
|
57
|
+
- (–) A Fleet without ADR-0101 refuses a BOM that carries a URL path. Release
|
|
58
|
+
this change only after that Fleet deploys.
|
|
59
|
+
- (–) The rule mirrors an OpenACA function. A test compares the two, so an
|
|
60
|
+
upstream change fails the suite.
|
|
61
|
+
- (–) The redaction pass is no longer a pure transcription of openaca's. The
|
|
62
|
+
exception is marked where it runs.
|
|
63
|
+
- (Watch) A URL path can carry a secret. The identity already uploads it, and
|
|
64
|
+
the upload contract's credential check refuses a value that looks like one.
|
|
65
|
+
|
|
66
|
+
## When to revisit
|
|
67
|
+
|
|
68
|
+
- OpenACA changes the `mcp-remote` identity form or adds URL prefix matching.
|
|
69
|
+
- This client starts to redact identities that carry a secret path.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: 0156
|
|
3
|
+
title: The client localizes Fleet's policy targets before it evaluates or compiles them
|
|
4
|
+
status: accepted
|
|
5
|
+
date: 2026-10-21
|
|
6
|
+
supersedes: null
|
|
7
|
+
superseded-by: null
|
|
8
|
+
amends: null
|
|
9
|
+
amended-by: null
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
Fleet's catalog (Fleet ADR-0102 and ADR-0104) writes an exact policy target
|
|
15
|
+
for each MCP server that an administrator approves or blocks. Fleet derives
|
|
16
|
+
the target from the uploaded Agent BOM. The upload is redacted: a launch
|
|
17
|
+
command loses its flags, such as `-y`. So Fleet writes
|
|
18
|
+
`{"command": ["npx", "@acme/jira-mcp@1.4.2"]}`. On the machine, OpenACA's
|
|
19
|
+
matcher compares exact targets with `npx -y @acme/jira-mcp@1.4.2`, and
|
|
20
|
+
matches nothing. A simulation with the real client and Fleet showed that a
|
|
21
|
+
decision made in Fleet did not block the server on the machine.
|
|
22
|
+
|
|
23
|
+
A URL is uploaded whole only when it normalizes to the server's identity
|
|
24
|
+
(ADR-0155). Any other URL is uploaded as `scheme://host`. Fleet writes a URL
|
|
25
|
+
target only when the uploaded URL has a path (Fleet ADR-0101). An
|
|
26
|
+
administrator can still type a host-only URL target.
|
|
27
|
+
|
|
28
|
+
## Decision
|
|
29
|
+
|
|
30
|
+
Before the client evaluates or compiles a fetched policy, it localizes the
|
|
31
|
+
`admission.mcps` lists against the local components. For each local MCP
|
|
32
|
+
server, the client computes the upload form with the same functions that
|
|
33
|
+
prepare the upload. When a list target equals that upload form, the client
|
|
34
|
+
adds the server's exact local target to the same list. The hook path, the
|
|
35
|
+
`remote policy compile` command and the privileged apply worker all localize.
|
|
36
|
+
No new data goes up. Plugins need no step: their `name@marketplace` is not
|
|
37
|
+
redacted.
|
|
38
|
+
|
|
39
|
+
## Alternatives considered
|
|
40
|
+
|
|
41
|
+
- **Upload the exact launch command, so Fleet can write exact targets**:
|
|
42
|
+
rejected because flags can carry user paths, tenant names and secrets. An
|
|
43
|
+
exact URL is uploaded only because the identity already states its path
|
|
44
|
+
(ADR-0155). A command has no such identity.
|
|
45
|
+
- **Change OpenACA's matcher to compare redacted forms**: rejected because
|
|
46
|
+
the matcher is a shared library whose exact semantics other callers
|
|
47
|
+
depend on, and a client step fixes the defect without a new OpenACA
|
|
48
|
+
release.
|
|
49
|
+
- **Have Fleet guess the exact form, for example add `-y`**: rejected
|
|
50
|
+
because flags vary, and a guess matches only some machines.
|
|
51
|
+
|
|
52
|
+
## Consequences
|
|
53
|
+
|
|
54
|
+
- A Fleet decision on a launch command now acts on the machine, in the hooks
|
|
55
|
+
and in Claude's managed settings.
|
|
56
|
+
- A decision on an upload form covers every local variant with the same
|
|
57
|
+
upload form. An approval covers each flag variant of the same command.
|
|
58
|
+
- An exact URL target already equals the local target, so the join adds
|
|
59
|
+
nothing for it. A host-only URL target joins each local server whose
|
|
60
|
+
upload shows only that host: a URL with userinfo, a query or a fragment.
|
|
61
|
+
- The localization must use the upload's own functions. A change to the
|
|
62
|
+
redaction must keep the two in step; the tests drive both.
|
|
63
|
+
|
|
64
|
+
## When to revisit
|
|
65
|
+
|
|
66
|
+
Revisit when Fleet can carry an exact, privacy-safe command target, for
|
|
67
|
+
example a hash that the OpenACA policy language can match.
|
|
@@ -184,3 +184,7 @@ supersedes anything yet.
|
|
|
184
184
|
- [0149](0149-a-credential-switch-replaces-the-mcp-sign-in-rule.md) — **A credential switch after a refusal replaces the MCP sign-in rule, and the retry storm is removed** (proposed). `stacktrace-credential-switched` fires when a service refuses a call with an auth error and a later call to it succeeds with a credential the refused call did not carry: in its arguments after the agent read it, or in an agent config file the agent wrote between them. Never after a person's turn, never without a new credential. High confidence when the agent read the credential first. Its `switched_credential` target groups by the new credential and carries the refused credential's mask, so every channel shows both, and the webhook adds `before`. The fix revokes the new credential and takes it out of reach. `stacktrace-mcp-transient-failure` and `stacktrace-tool-retry-storm` move to `RETIRED_SCOPES`; the recovered-refusal filter stays. Amends ADR-0073, ADR-0086 and ADR-0146. Rejected: keeping either rule, reviving `scavenged-credential` as it was, firing on any credential read. Read before changing how a credential switch is detected.
|
|
185
185
|
|
|
186
186
|
- [0150: Codex hooks use the shared policy runtime](0150-codex-hooks-use-the-shared-policy-runtime.md). CLI first; desktop and cloud require separate conformance.
|
|
187
|
+
- [0151](0151-step-one-puts-the-daemon-beside-the-gateway.md) — **Step one puts the daemon beside the gateway, names the person, and enforces Fleet policy there; Core is step two** (proposed). With `STACKTRACE_GATEWAY_LISTEN` set, the enrolled daemon on the gateway host serves ADR-0119's `/v1/evaluate` on loopback, runs `BLOCKING_RULES` and Fleet policy (MCP servers, skills, plugin agents, matched by name through the hooks' shared decision function), and uploads findings and verdicts with `actor` and `action`. The `principal` comes only from the gateway's own auth. The hook protocol (ADR-0135) is unchanged. The contract is the seam to Core: adapters move by URL. Amends ADR-0118 decision 2 and ADR-0119 for step one. Rejected: a guard service feeding Core, Core first, the hook socket as is, a header-named person, laptop-only policy, stripping tools, Envoy `ext_authz`. Read before routing a gateway to the daemon or to Core, or enforcing policy at a gateway.
|
|
188
|
+
- [0153](0153-a-gateway-person-reaches-fleet-as-an-account-card.md) — **A gateway person reaches Fleet as an account and its card** (proposed). A gateway finding's `session.account` is a digest of the verified principal, and the payload carries an `accounts[]` card for it. An email principal keeps ADR-0112's email digest, so its person key matches a laptop run under that email; any other principal gets a card with no key and no name. `actor` stays local. Amends ADR-0112. Rejected: an `actor` field, the client's `metadata.user_id`, the principal as the account, no person. Read before changing how a gateway names its person in Fleet.
|
|
189
|
+
- [0155](0155-a-remote-mcp-servers-exact-url-reaches-fleet.md) — **A remote MCP server's exact URL reaches Fleet** (proposed). The redaction pass keeps `openaca:url` and `openaca:install_source` whole on an `mcp_server` when the URL normalizes to the component's own `mcp-remote` identity, so it has no userinfo, query or fragment; the upload contract admits the same values. Every other URL is still reduced to `scheme://host`. Pairs with Fleet ADR-0101; release after that Fleet deploys. Rejected: building the URL from the identity, a URL hash, keeping every path, stripping only the query. Read before changing how a URL is redacted for upload.
|
|
190
|
+
- [0156: The client localizes Fleet's policy targets before it evaluates or compiles them](0156-the-client-localizes-fleet-policy-targets.md). Fleet writes upload-form targets, such as a launch command without its flags; the client adds each matching local server's exact target. An exact URL target (ADR-0155) adds nothing. Rejected: uploading exact commands, changing OpenACA's matcher, guessing flags in Fleet.
|