stacktrace-cli 0.14.0__tar.gz → 0.15.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/.github/workflows/guard-staging.yml +13 -6
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/PKG-INFO +2 -2
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/README.md +1 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.0}/docs/adrs/0118-observe-agents-through-adapters-and-a-shared-analyzer.md +1 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0119-read-sessions-from-an-ai-gateway-and-block-inline.md +1 -1
- stacktrace_cli-0.15.0/docs/adrs/0151-step-one-puts-the-daemon-beside-the-gateway.md +174 -0
- stacktrace_cli-0.15.0/docs/adrs/0153-a-gateway-person-reaches-fleet-as-an-account-card.md +62 -0
- stacktrace_cli-0.15.0/docs/adrs/0155-a-remote-mcp-servers-exact-url-reaches-fleet.md +69 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/INDEX.md +3 -0
- stacktrace_cli-0.15.0/docs/releases/v0.15.0.md +53 -0
- stacktrace_cli-0.15.0/docs/specs/gateway-daemon.md +440 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/remote-sync.md +16 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/guard-staging/README.md +39 -0
- stacktrace_cli-0.15.0/infra/guard-staging/images/daemon.sh +47 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/guard-staging/images/envoy/Dockerfile +6 -4
- stacktrace_cli-0.15.0/infra/guard-staging/images/envoy/entrypoint.sh +31 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/guard-staging/images/litellm/Dockerfile +1 -1
- stacktrace_cli-0.15.0/infra/guard-staging/images/litellm/entrypoint.sh +21 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/guard-staging/main.tf +35 -9
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/guard-staging/outputs.tf +5 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/guard-staging/smoke.sh +33 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/guard-staging/variables.tf +12 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/integrations/envoy/envoy.yaml +31 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/integrations/litellm/stacktrace_litellm.py +39 -6
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/pyproject.toml +1 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/__init__.py +1 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/config.py +26 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/fleet.py +4 -1
- stacktrace_cli-0.15.0/src/stacktrace/daemon/gateway.py +153 -0
- stacktrace_cli-0.15.0/src/stacktrace/daemon/gateway_policy.py +161 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/policy_runtime.py +61 -21
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/runtime.py +14 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/analyzer.py +117 -11
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/check.py +4 -0
- stacktrace_cli-0.15.0/src/stacktrace/gateway/principal.py +88 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/service.py +29 -4
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/sink.py +129 -15
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/hooks/claude.py +9 -4
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/detect_payload.py +14 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/redact.py +5 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/upload_contract.py +61 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_claude_policy_conformance.py +5 -0
- stacktrace_cli-0.15.0/tests/daemon/test_gateway.py +375 -0
- stacktrace_cli-0.15.0/tests/daemon/test_gateway_fleet.py +131 -0
- stacktrace_cli-0.15.0/tests/daemon/test_gateway_person.py +140 -0
- stacktrace_cli-0.15.0/tests/daemon/test_gateway_policy.py +372 -0
- stacktrace_cli-0.15.0/tests/daemon/test_policy_decide.py +94 -0
- stacktrace_cli-0.15.0/tests/gateway/test_envoy_principal.py +37 -0
- stacktrace_cli-0.15.0/tests/gateway/test_litellm_through_daemon.py +272 -0
- stacktrace_cli-0.15.0/tests/gateway/test_principal.py +249 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_contract_is_exhaustive.py +11 -6
- stacktrace_cli-0.15.0/tests/remote/test_exact_remote_mcp_url.py +185 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_hook_policy.py +3 -1
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_identity.py +3 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_kind_conformance.py +3 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_no_agent_kind_is_named.py +4 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_session_identity_is_the_pair.py +4 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/uv.lock +2 -2
- 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.15.0}/.agents/skills/release-stacktrace/SKILL.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/.claude/settings.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/.claude/skills/release-stacktrace/SKILL.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/.codex/hooks.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/.github/managed-autofix.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/.github/pull_request_template.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/.github/workflows/bedrock-live.yml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/.github/workflows/ci.yml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/.github/workflows/publish-pypi.yml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/.gitignore +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/AGENTS.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/CLAUDE.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/SECURITY.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/decision-request.example.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/decision-request.schema.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/decision-response.example.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/decision-response.schema.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/example.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/schema.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0001-session-telemetry-as-input.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0002-session-collection-in-openaidr.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0003-runtime-edges.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0004-three-stage-detector.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0005-detection-family-and-report-assembly.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0006-trust-boundary-and-detection-upload.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0007-proprietary-package-on-open-dependencies.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0008-console-in-separate-demo-package.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0010-detection-severity-and-confidence-ladders.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0011-verdict-cache.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0012-observation-evidence-kinds-and-transport.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0013-rule-catalogue-triage-and-per-rule-context.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0014-declared-project-mapping.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0015-narrow-the-security-catalogue.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0016-stall-grouping-is-session-wide.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0017-a-declined-repeat-is-a-stall.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0018-remote-sync-config-and-facade-consumption.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0019-delegated-commands-are-openaca-objects.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0020-openaca-consumption-boundary.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0021-two-command-kinds.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0022-detection-scope-is-a-catalogue-column.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0023-sync-detect-collects-and-does-not-escalate.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0024-the-upload-carries-observations.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0025-a-denied-call-is-activity-never-an-invocation.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0026-the-console-becomes-a-product-surface.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0027-a-finding-may-name-what-it-could-not-place.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0028-the-console-shows-what-it-placed.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0029-stage-three-returns-to-opt-in.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0030-a-detection-is-dated-by-the-turns-it-cites.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0031-one-host-daemon-observes-native-session-logs.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0032-refresh-daemon-compositions-outside-detection.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.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.15.0}/docs/adrs/0035-naming-an-analyzer-selects-stored-answers.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0036-deliver-eligible-findings-to-slack-from-the-daemon.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0037-reuse-openaidr-append-cursors-in-the-daemon.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0038-poll-normalized-sessions-for-supplemental-changes.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0039-send-usage-telemetry-by-default-with-an-opt-out.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0041-defer-native-windows-support.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0042-read-the-build-commit-from-the-install-record.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.0}/docs/adrs/0044-send-the-build-as-version-prints-it.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0045-scan-every-session-and-outlive-them.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0046-the-finding-store-is-an-append-only-queue.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0047-capture-activity-during-correlation-or-lose-it.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0048-the-daemon-keeps-a-leveled-content-free-activity-log.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0056-stop-a-resident-daemon-by-record-and-signal.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.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.15.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.15.0}/docs/adrs/0060-two-upload-postures-not-one-command-with-two-sources.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0061-the-drain-sends-findings-only.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0062-hold-the-transition-lock-across-remote-side-effects.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0063-underbuilt-debt-does-not-hold-the-scan-watermark.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0064-a-redacted-value-has-one-path-span.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0065-asset-external-id-resolves-by-a-ladder.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0066-host-owned-daemon-supervision.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0067-a-webhook-is-an-independent-queue-subscriber.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0068-webhooks-retry-the-retained-backlog.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0069-webhooks-deliver-what-retention-holds.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0070-package-the-cloud-agent-environment-bootstrap.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0071-render-the-allowlisted-payload-per-destination.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0072-host-supervisors-own-daemon-restarts.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0073-name-what-fired-and-which-component.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0074-a-window-selects-findings-by-when-they-happened.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0076-two-phase-detection-pipeline.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0077-the-bom-job-wakes-once-at-startup-staggered.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0078-a-seeded-display-prefix-replaces-the-hostname-label.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0079-the-monitor-page-renders-findings-not-pipeline-health.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0080-enabling-reasoning-does-not-requeue-the-past.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0081-reasoning-activation-returns-to-explicit-opt-in.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0082-monitor-checks-every-installed-component-by-default.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0083-each-block-reason-is-its-own-rule.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0084-a-recursive-deletes-evidence-is-the-rm-that-ran.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0085-show-when-and-which-finding-slack-delivered.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0086-a-refusal-names-who-answered-the-call.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0087-deploy-compiled-policy-with-a-privileged-scheduled-job.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0088-slack-alerts-leave-out-confidence.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0089-infra-gate-reads-commands-not-shell-semantics.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.0}/docs/adrs/0091-mark-our-own-machines-and-name-what-failed.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0092-cost-is-its-own-rule-family.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0093-environment-cost-baselines-count-tokens-keyed-by-model.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.0}/docs/adrs/0095-cost-findings-reach-fleet-each-rule-can-be-muted.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.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.15.0}/docs/adrs/0098-a-run-is-its-main-session.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0099-cost-is-measured-in-tokens-and-relative-increases.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0100-the-monitor-runs-offline-for-the-website.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0101-what-names-a-run-in-fleet.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.0}/docs/adrs/0103-finished-runs-may-leave-as-numbers-for-org-baselines.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0104-usage-is-its-own-upload.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0105-an-asset-key-is-a-bare-uuid.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0106-boot-id-is-salted-with-the-pid-namespace.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0107-the-daemon-follows-every-kind-openaidr-reads.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.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.15.0}/docs/adrs/0110-every-kinds-account-comes-from-openaidr.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.0}/docs/adrs/0113-size-triggers-behaviour-explains-session-cost-carries-reasons.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.0}/docs/adrs/0115-usage-states-its-coverage-and-fleet-returns-expected-runs.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.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.15.0}/docs/adrs/0120-own-the-adapter-event-envelope.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0121-a-cloud-sessions-runs-are-its-persons-and-a-card-says-where-its-name-came-from.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0122-use-stacktrace-as-the-python-package.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.0}/docs/adrs/0124-fleet-imports-core-from-the-stacktrace-distribution.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0127-the-monitor-shows-weighted-tokens-beside-raw-tokens.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.0}/docs/adrs/0129-an-unfinished-response-counts-the-output-it-shows.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.0}/docs/adrs/0131-activate-hook-policy-without-a-privileged-runtime.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0132-every-usage-page-names-the-store-that-built-it.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.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.15.0}/docs/adrs/0135-enforce-policy-through-the-daemon-and-agent-hooks.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0136-bound-policy-evidence-collection-as-one-bundle.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.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.15.0}/docs/adrs/0139-remediation-finding-contract.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.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.15.0}/docs/adrs/0142-the-cli-has-no-machine-limit.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0143-the-plugin-owns-session-hooks-on-every-host.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0146-eight-rules-send-remediation-targets.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0147-the-webhook-names-the-run-and-the-person-and-an-egress-label-keeps-its-last-four.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.0}/docs/adrs/0149-a-credential-switch-replaces-the-mcp-sign-in-rule.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/0150-codex-hooks-use-the-shared-policy-runtime.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/HOOK-PROMPT.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/adrs/TEMPLATE.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/agent-support.html +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/agent-support.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/cutover-openaca-remote.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/002-session-input.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/003-correlation.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/004-detector.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/005-remote-sync.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/006-cli-composition.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/007-detection-upload.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/008-monitor.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/009-reasoning-jev.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/010-session-daemon.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/011-daemon-store.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/012-daemon-scanning.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/013-daemon-uploads.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/014-asset-identity.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/015-managed-policy-deployment.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/016-cost-phase-1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/017-cost-phase-2.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/018-remediation-rules.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/plans/019-credential-switch.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.0.1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.1.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.10.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.11.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.12.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.13.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.14.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.2.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.2.1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.2.2.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.2.3.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.3.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.3.1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.4.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.4.1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.5.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.5.1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.5.2.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.5.3.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.6.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.6.1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.7.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.7.1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.8.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/releases/v0.9.0.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/research/001-intent-drift-metric.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/TEMPLATE.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/agent-observability.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/aidr.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/cli-composition.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/codex-agent-kind.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/codex-hook-policy.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/correlation.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/cost-notifications.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/cost-phase-1.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/cost-phase-2.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/cost.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/daemon-scanning.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/daemon-store.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/daemon-uploads.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/detection-policies.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/detection-upload.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/detector.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/event-time.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/hook-policy-rollout.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/managed-policy-deployment.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/monitor-inventory.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/monitor.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/notification-delivery.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/plugin-installation.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/policy-enforcement.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/production-agent-observability.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/reasoning-jev.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/session-input.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/specs/usage-upload.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/docs/trust.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/examples/observations/custom_agent.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/README.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/bedrock-sandbox/.gitignore +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/bedrock-sandbox/ci.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/bedrock-sandbox/main.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/bedrock-sandbox/outputs.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/bedrock-sandbox/variables.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/guard-staging/.gitignore +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/guard-staging/check.sh +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/guard-staging/ci.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/guard-staging/connect.sh +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/guard-staging/images/envoy/litellm.yaml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/guard-staging/images/litellm/config.subscription.yaml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/guard-staging/images/litellm/config.yaml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/guard-staging/moved.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/guard-staging/user-key.sh +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/modules/express-gateway/main.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/modules/express-gateway/outputs.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/infra/modules/express-gateway/variables.tf +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/integrations/e2e/claude.sh +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/integrations/e2e/scenarios.sh +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/integrations/envoy/run.sh +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/integrations/litellm/README.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/integrations/litellm/config.example.yaml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/integrations/litellm/config.subscription.yaml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/integrations/litellm/e2e/config.baseten.yaml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/integrations/litellm/e2e/config.mock.yaml +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/integrations/litellm/e2e/mock_upstream.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/integrations/litellm/e2e/parity.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/integrations/litellm/stacktrace_keys.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/scripts/cost_latency.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/scripts/git-hooks/pre-push +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/scripts/install-hooks.sh +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/__main__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/analysis.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/build.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cloud/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cloud/boot.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cloud/profile.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cloud/setup.sh +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/core/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/core/observations.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/acquire.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/composition.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/join.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/observed.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/orchestrate.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/project_map.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/record.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/render.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/baseline.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/clock.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/component_usage.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/components.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/copies.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/evidence.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/ledger.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/measures.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/models.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/org_baselines.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/output.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/price_class.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/reasons.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/rules.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/runs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/tokens.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/totals.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/usage.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/weights.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/accounts.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/activity_log.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/bom.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/client.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/composition.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/costs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/db.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/identity.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/jobs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/lifecycle.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/observer.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/paths.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/policy_collect.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/policy_inputs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/presentation.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/protocol.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/scan.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/server.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/service.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/store.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/usage.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/webhook.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/analyzer.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/blocked.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/cache.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/deterministic.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/finding.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/history.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/jev.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/personal_data.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/priors.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/jev-v1/stacktrace-deceptive-completion.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/jev-v2/stacktrace-deceptive-completion.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/jev-v2/stacktrace-infra-unsafe-action.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/jev-v3/stacktrace-deceptive-completion.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/jev-v3/stacktrace-infra-unsafe-action.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/v1/exclusions.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/v1/framing.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/v1/stacktrace-deceptive-completion.md +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/reasoning.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/render.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/rules.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/run.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/secrets.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/verdict.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/windows.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/finding_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/finding_titles.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/exchange.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/_json.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/anthropic.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/bedrock.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/body.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/openai_chat.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/openai_responses.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/session.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/hooks/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/hooks/codex.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/hooks/session.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/costs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/inventory.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/offline.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/reasoning.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/render.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/server.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/app.js +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/apple-icon.png +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/cost.js +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/favicon.ico +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/fonts/OFL.txt +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/fonts/dm-mono-400-latin.woff2 +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/fonts/dm-mono-500-latin.woff2 +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/fonts/dm-sans-latin.woff2 +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/fonts/playfair-display-600-italic-latin.woff2 +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/icon.svg +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/index.html +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/inventory.js +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/styles.css +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/state.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/verdicts.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/watch.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/options.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/policy_display.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/private_state.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/py.typed +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/client.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/config.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/hook_policy.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/identity.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/payload.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/policy.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/policy_service.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/policy_show.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/policy_worker.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/spool.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/sync.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/sync_detect.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/sdk.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/access.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/entrypoint.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/index.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/lineage.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/outcome.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/protocols.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/render.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/telemetry/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/telemetry/cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/telemetry/events.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/telemetry/posthog.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/telemetry/state.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/webhook/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/webhook/cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/src/stacktrace/webhook/config.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/agent_bom_fixture.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/conftest.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/fakes.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/scenarios.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_as_of_cuts_every_timed_collection.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_baseline.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_clock.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_component_usage.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_components.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_copies.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_cost_evidence_travels.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_cost_findings_are_dated_by_their_citations.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_cost_findings_carry_no_session_text.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_cost_is_tokens.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_cost_latency.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_evidence.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_ledger.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_measures.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_models.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_org_baselines.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_output.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_price_class.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_reasons.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_rules_baseline.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_runs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_totals.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_unfinished_output_counts_what_it_shows.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_usage.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/cost/test_weights.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/observing.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_accounts.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_activity_log.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_claude_policy_hook.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_client.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_codex_policy_collect_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_codex_policy_conformance.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_codex_policy_hook.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_composition.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_config.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_cost_guidance.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_costs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_db.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_detection_needs_no_subscriber.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_fleet.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_identity.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_job_thread.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_jobs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_lifecycle.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_observer.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_agent_scopes.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_collect.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_collect_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_hook_transport.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_inputs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_reconcile.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_runtime.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_socket.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_queue_reader.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_runtime.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_scan.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_service.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_session_cost_notices.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_socket.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_stage_times.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_store.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_subagent_routing.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_the_drained_payload_is_the_cold_one.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_the_stored_row_is_sufficient.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_usage.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_usage_store.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_webhook.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/daemon/test_wire_frames_are_bounded.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/detector_session_fixture.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/gateway/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/gateway/fixtures/claude-code-2.1.296-suite/gateway-last-turn.json +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.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.15.0}/tests/gateway/test_analyzer.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/gateway/test_bodies_and_logs.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/gateway/test_call_records.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/gateway/test_check.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/gateway/test_every_choice_is_read.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/gateway/test_every_read_field_is_validated.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/gateway/test_every_shortfall_is_a_recorded_fallback.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/gateway/test_gateway_keys.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/gateway/test_gateway_scripts.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/gateway/test_litellm_stream.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/gateway/test_litellm_subscription_config.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/gateway/test_parity_live_capture.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/gateway/test_service.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/gateway/test_session.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/gateway/test_unstated_outcomes.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/cost_harness.mjs +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/feed_harness.mjs +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/inventory_harness.mjs +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/test_cost_page.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/test_cost_range_switch.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/test_feed_model.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/test_inventory.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/test_inventory_page.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/test_offline.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/test_reasoning_gates.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/test_render.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/test_render_cost.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/test_server.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/test_site_assets.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/test_state.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/test_verdicts.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/monitor/test_watch.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/observations/test_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/observations/test_decisions.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/observations/test_event_envelope.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/helpers.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_client.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_cloud_boot_updates_the_client.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_cloud_session.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_cloud_setup_asset_id.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_config.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_activity.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_client.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_gate_matches_the_cloud.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_layers_compose.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_payload_reaches_the_cloud_model.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_redaction.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_spool.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_upload_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_wire_payload.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_facade_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_no_local_path_survives_redaction.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_payload.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_policy.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_policy_service.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_policy_service_cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_policy_show.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_redact_payload.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_seam.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_session_registration.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_spool.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_sync.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_sync_detect.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_upload_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_usage_client.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_usage_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/remote/test_user_install_profile.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/sdk/test_observation_client.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/telemetry/__init__.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_activity_log.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_events.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_every_derived_site.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_every_internal_save_is_reported.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_hooks.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_release_gate.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_state.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_uploader.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_acquire.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_adr_cross_references_are_reciprocal.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_agent_instance_id.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_agent_support_doc.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_analysis.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_bom_shape.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_build_commit.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_call_status_conventions.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_composition.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_correlate_orchestrate.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_correlate_render.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_correlated_session.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detection_components.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detection_event_time.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detection_subject.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_analyzer_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_analyzer_live.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_blocked.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_cache.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_client_errors.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_credential_in_prompt.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_credential_switched.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_declared_egress.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_deterministic.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_end_to_end.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_finding.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_history.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_infra_reasoning.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_jev.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_names_the_service.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_new_deterministic.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_personal_data.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_pii_in_prompt.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_priors.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_prompts.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_reasoning.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_render.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_run.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_secrets.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_verdict.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_vulnerable_dep_invoked.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_why_it_stopped.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_detector_windows.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_entrypoint_conventions.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_evidence_is_dated_not_numbered.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_finding_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_fingerprint_covers_what_the_analyzer_reads.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_help_sections.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_join.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_monitor_cli.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_no_live_document_states_the_old_stage_three_default.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_no_test_undoes_every_patch_at_once.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_observed.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_one_wording_per_rule.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_openaca_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_openaidr_contract.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_option_arity_matches_the_binary.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_project_map.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_python_namespace.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_readme_examples_are_real_output.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_release_gate_coverage.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_release_readiness.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_rules_send_remediation_targets.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_seam_boundary.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_sessions_access.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_sessions_end_to_end.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_sessions_protocol_typing.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_sessions_protocols.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_sessions_render.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_shell_separators_match_the_shell.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_signed_in_asks_the_agent.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_stored_verdicts_are_never_gated_on_reasoning.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_the_detector_spec_lists_the_shipped_catalogue.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_the_jev_spec_states_the_shipped_thresholds.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_the_locality_claim_is_qualified_everywhere.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_title_disclosure_invariant.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_untrusted_content_never_travels.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_verification_subcommands_match_the_binary.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/test_what_jev_is_told_is_what_was_disclosed.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/tool_fields.py +0 -0
- {stacktrace_cli-0.14.0 → stacktrace_cli-0.15.0}/tests/webhook/test_cli.py +0 -0
|
@@ -9,7 +9,8 @@ name: guard-staging
|
|
|
9
9
|
# litellm-staging environment: AWS_DEPLOY_ROLE_ARN, ECR_REPOSITORY_URL,
|
|
10
10
|
# ENVOY_ECR_REPOSITORY_URL, SUBSCRIPTION_ECR_REPOSITORY_URL, ECS_CLUSTER,
|
|
11
11
|
# ECS_SERVICE, ENVOY_SERVICE, SUBSCRIPTION_SERVICE, LOG_GROUP, MASTER_KEY_SECRET,
|
|
12
|
-
# STAGING_ENDPOINT, ENVOY_ENDPOINT, SUBSCRIPTION_ENDPOINT, GUARD_MODE
|
|
12
|
+
# STAGING_ENDPOINT, ENVOY_ENDPOINT, SUBSCRIPTION_ENDPOINT, GUARD_MODE, and
|
|
13
|
+
# GATEWAY_DAEMON=1 once tofu runs with fleet_enrollment = true (ADR-0151).
|
|
13
14
|
|
|
14
15
|
on:
|
|
15
16
|
workflow_dispatch:
|
|
@@ -128,16 +129,22 @@ jobs:
|
|
|
128
129
|
env:
|
|
129
130
|
MODE: ${{ vars.GUARD_MODE }}
|
|
130
131
|
LOG_GROUP: ${{ vars.LOG_GROUP }}
|
|
132
|
+
# 1: each task runs the enrolled daemon, and the smoke test checks that
|
|
133
|
+
# the rm finding reached Fleet through it (infra/guard-staging/smoke.sh).
|
|
134
|
+
DAEMON: ${{ vars.GATEWAY_DAEMON }}
|
|
131
135
|
run: |
|
|
132
136
|
MASTER_KEY=$(aws secretsmanager get-secret-value --secret-id "${{ vars.MASTER_KEY_SECRET }}" \
|
|
133
137
|
--query SecretString --output text)
|
|
134
138
|
echo "::add-mask::$MASTER_KEY"
|
|
135
139
|
fail=0
|
|
136
|
-
|
|
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.15.0
|
|
4
4
|
Summary: CLI for Stacktrace — Detection and Response platform for AI Agents.
|
|
5
5
|
Project-URL: Homepage, https://stacktrace.ai
|
|
6
6
|
Author-email: "Stacktrace AI, Inc" <founders@stacktrace.ai>
|
|
@@ -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.15.0
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
## Python package namespace
|
|
@@ -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.
|
|
@@ -184,3 +184,6 @@ 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.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# 0.15.0 — The daemon guards a model gateway
|
|
2
|
+
|
|
3
|
+
The enrolled daemon can run beside a LiteLLM or Envoy gateway. It judges each
|
|
4
|
+
turn there with the blocking rules and Fleet policy, and sends Fleet the person
|
|
5
|
+
behind the call and what the gateway did. Fleet can now block a remote MCP
|
|
6
|
+
server by its exact URL.
|
|
7
|
+
|
|
8
|
+
## Highlights
|
|
9
|
+
|
|
10
|
+
- **The daemon runs beside a gateway** (ADR-0151). With
|
|
11
|
+
`STACKTRACE_GATEWAY_LISTEN` set, the enrolled daemon serves the gateway's
|
|
12
|
+
checks on loopback. It runs the blocking rules on each turn and queues their
|
|
13
|
+
findings for Fleet.
|
|
14
|
+
- **Fleet policy applies at the gateway** (ADR-0151). The daemon blocks a
|
|
15
|
+
skill or plugin agent that Fleet's policy denies, by name, with the same
|
|
16
|
+
message as the hook. A laptop and a gateway reach a decision through one
|
|
17
|
+
function. With no policy, or one more than an hour old, the turn passes
|
|
18
|
+
and the rules still judge it. No MCP server rule matches at a gateway; see
|
|
19
|
+
Compatibility below.
|
|
20
|
+
- **A gateway finding names its person** (ADR-0153). The person comes only
|
|
21
|
+
from the gateway's own authentication: LiteLLM's key user, or the claims of
|
|
22
|
+
a JWT that Envoy verified. Fleet shows that person as it does for a laptop
|
|
23
|
+
run, and an email joins both.
|
|
24
|
+
- **Fleet shows what the gateway did with each call.** A gateway finding says
|
|
25
|
+
whether the call was blocked, allowed or only observed, and what decided it.
|
|
26
|
+
- **Fleet can block a remote MCP server by its exact URL** (ADR-0155). Remote
|
|
27
|
+
sync uploads a remote MCP server's full URL when it holds nothing beyond
|
|
28
|
+
what the server's identity already shows. Every other URL is still reduced
|
|
29
|
+
to its host. Fleet's Policy editor then offers a URL that blocks the server
|
|
30
|
+
on the machine.
|
|
31
|
+
- **Bug fixes.** A policy error no longer turns a turn that a rule blocked
|
|
32
|
+
into an allow. A policy fetched under one enrollment no longer counts as
|
|
33
|
+
fresh after a re-enrollment.
|
|
34
|
+
|
|
35
|
+
## Install
|
|
36
|
+
|
|
37
|
+
`uv tool install stacktrace-cli==0.15.0` or `pip install stacktrace-cli==0.15.0`.
|
|
38
|
+
Python 3.11 or newer; macOS and Linux. The LiteLLM and Envoy adapters live in
|
|
39
|
+
the repository's `integrations/`, not in this package.
|
|
40
|
+
|
|
41
|
+
## Compatibility
|
|
42
|
+
|
|
43
|
+
Beta — no back-compat hedging.
|
|
44
|
+
|
|
45
|
+
- **Remote sync needs a Fleet that takes exact MCP URLs** (Fleet ADR-0101).
|
|
46
|
+
The hosted Fleet takes them. A self-hosted Fleet must update first.
|
|
47
|
+
Otherwise it refuses the BOM of any agent that has a remote MCP server.
|
|
48
|
+
- **Fleet drift reports each remote MCP server once.** Its URL changes from
|
|
49
|
+
the host to the full URL on the first upload after the update.
|
|
50
|
+
- **At a gateway, policy matches by name.** No MCP rule can match there,
|
|
51
|
+
because an MCP rule names a command or a URL. A plugin rule matches on the
|
|
52
|
+
plugin's name.
|
|
53
|
+
- **Dependencies** are unchanged: `openaca==0.12.0` and `openaidr==0.7.1`.
|