stacktrace-cli 0.13.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.13.0 → stacktrace_cli-0.15.0}/.github/workflows/guard-staging.yml +13 -6
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/CLAUDE.md +17 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/PKG-INFO +4 -4
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/README.md +1 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0036-deliver-eligible-findings-to-slack-from-the-daemon.md +1 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0073-name-what-fired-and-which-component.md +1 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0083-each-block-reason-is-its-own-rule.md +1 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0086-a-refusal-names-who-answered-the-call.md +1 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0109-a-detection-carries-its-runs-title-and-the-persons-name.md +1 -1
- {stacktrace_cli-0.13.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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0118-observe-agents-through-adapters-and-a-shared-analyzer.md +1 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0119-read-sessions-from-an-ai-gateway-and-block-inline.md +1 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0131-activate-hook-policy-without-a-privileged-runtime.md +1 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0133-a-clients-own-error-record-is-a-third-block-channel.md +1 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0135-enforce-policy-through-the-daemon-and-agent-hooks.md +1 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0136-bound-policy-evidence-collection-as-one-bundle.md +1 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0139-remediation-finding-contract.md +1 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0141-two-remediation-models-one-credential-identity-and-a-letters-only-fragment.md +1 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0143-the-plugin-owns-session-hooks-on-every-host.md +1 -1
- stacktrace_cli-0.15.0/docs/adrs/0146-eight-rules-send-remediation-targets.md +138 -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 +105 -0
- stacktrace_cli-0.15.0/docs/adrs/0148-credential-egress-notifies-at-medium-confidence-when-it-is-high.md +59 -0
- stacktrace_cli-0.15.0/docs/adrs/0149-a-credential-switch-replaces-the-mcp-sign-in-rule.md +94 -0
- stacktrace_cli-0.15.0/docs/adrs/0150-codex-hooks-use-the-shared-policy-runtime.md +93 -0
- 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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/INDEX.md +9 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/agent-support.html +3 -7
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/agent-support.md +4 -6
- stacktrace_cli-0.15.0/docs/plans/018-remediation-rules.md +48 -0
- stacktrace_cli-0.15.0/docs/plans/019-credential-switch.md +44 -0
- stacktrace_cli-0.15.0/docs/releases/v0.14.0.md +66 -0
- stacktrace_cli-0.15.0/docs/releases/v0.15.0.md +53 -0
- stacktrace_cli-0.15.0/docs/specs/TEMPLATE.md +75 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/codex-agent-kind.md +8 -10
- stacktrace_cli-0.15.0/docs/specs/codex-hook-policy.md +182 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/cost-phase-1.md +4 -4
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/detection-policies.md +61 -120
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/detector.md +39 -28
- stacktrace_cli-0.15.0/docs/specs/gateway-daemon.md +440 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/notification-delivery.md +2 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/policy-enforcement.md +8 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/remote-sync.md +16 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/trust.md +3 -0
- {stacktrace_cli-0.13.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.13.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.13.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.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/main.tf +35 -9
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/outputs.tf +5 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/smoke.sh +33 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/variables.tf +12 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/envoy/envoy.yaml +31 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/e2e/mock_upstream.py +5 -3
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/stacktrace_litellm.py +39 -6
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/pyproject.toml +9 -5
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/__init__.py +1 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/measures.py +2 -2
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/rules.py +1 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/config.py +26 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/costs.py +4 -4
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/fleet.py +29 -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.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/policy_collect.py +45 -5
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/policy_runtime.py +93 -25
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/presentation.py +8 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/runtime.py +34 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/store.py +46 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/webhook.py +231 -27
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/deterministic.py +550 -525
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/rules.py +14 -10
- stacktrace_cli-0.15.0/src/stacktrace/finding_contract.py +553 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/finding_titles.py +9 -20
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/analyzer.py +117 -11
- {stacktrace_cli-0.13.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.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/service.py +29 -4
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/sink.py +129 -15
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/hooks/claude.py +13 -5
- stacktrace_cli-0.15.0/src/stacktrace/hooks/codex.py +84 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/render.py +1 -3
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/app.js +29 -2
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/styles.css +1 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/verdicts.py +26 -9
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/detect_payload.py +34 -2
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/hook_policy.py +52 -7
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/policy_service.py +0 -21
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/policy_show.py +11 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/redact.py +5 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/upload_contract.py +70 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_measures.py +1 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_claude_policy_conformance.py +5 -0
- stacktrace_cli-0.15.0/tests/daemon/test_codex_policy_collect_contract.py +86 -0
- stacktrace_cli-0.15.0/tests/daemon/test_codex_policy_conformance.py +564 -0
- stacktrace_cli-0.15.0/tests/daemon/test_codex_policy_hook.py +125 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_costs.py +7 -7
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_fleet.py +58 -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_agent_scopes.py +55 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_collect.py +68 -0
- stacktrace_cli-0.15.0/tests/daemon/test_policy_decide.py +94 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_reconcile.py +21 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_store.py +25 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_webhook.py +418 -7
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/fixtures/claude-code-2.1.296-suite/gateway-last-turn.json +2 -2
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/fixtures/claude-code-2.1.296-suite/projects/run/b23c3bab-a677-4b5f-ac36-e132c7df29e5.jsonl +2 -2
- 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.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_parity_live_capture.py +3 -2
- stacktrace_cli-0.15.0/tests/gateway/test_principal.py +249 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/feed_harness.mjs +9 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_feed_model.py +13 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_verdicts.py +49 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_contract_is_exhaustive.py +23 -5
- stacktrace_cli-0.15.0/tests/remote/test_exact_remote_mcp_url.py +185 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_hook_policy.py +29 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_identity.py +3 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_policy_show.py +9 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_call_status_conventions.py +1 -1
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_blocked.py +9 -9
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_client_errors.py +5 -2
- stacktrace_cli-0.15.0/tests/test_detector_credential_switched.py +254 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_names_the_service.py +39 -29
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_new_deterministic.py +508 -1666
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_render.py +2 -2
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_why_it_stopped.py +24 -16
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_evidence_is_dated_not_numbered.py +12 -6
- stacktrace_cli-0.15.0/tests/test_finding_contract.py +431 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_kind_conformance.py +3 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_no_agent_kind_is_named.py +9 -1
- stacktrace_cli-0.15.0/tests/test_rules_send_remediation_targets.py +201 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_session_identity_is_the_pair.py +22 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_untrusted_content_never_travels.py +32 -16
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/uv.lock +9 -9
- stacktrace_cli-0.13.0/infra/guard-staging/images/envoy/entrypoint.sh +0 -13
- stacktrace_cli-0.13.0/infra/guard-staging/images/litellm/entrypoint.sh +0 -8
- stacktrace_cli-0.13.0/src/stacktrace/finding_contract.py +0 -236
- stacktrace_cli-0.13.0/tests/test_finding_contract.py +0 -168
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.agents/skills/release-stacktrace/SKILL.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.claude/settings.json +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.claude/skills/release-stacktrace/SKILL.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.codex/hooks.json +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.github/managed-autofix.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.github/pull_request_template.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.github/workflows/bedrock-live.yml +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.github/workflows/ci.yml +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.github/workflows/publish-pypi.yml +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/.gitignore +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/AGENTS.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/SECURITY.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/decision-request.example.json +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/decision-request.schema.json +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/decision-response.example.json +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/decision-response.schema.json +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/example.json +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/contracts/observations/v1/schema.json +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0001-session-telemetry-as-input.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0002-session-collection-in-openaidr.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0003-runtime-edges.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0004-three-stage-detector.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0005-detection-family-and-report-assembly.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0006-trust-boundary-and-detection-upload.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0007-proprietary-package-on-open-dependencies.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0008-console-in-separate-demo-package.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0010-detection-severity-and-confidence-ladders.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0011-verdict-cache.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0012-observation-evidence-kinds-and-transport.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0013-rule-catalogue-triage-and-per-rule-context.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0014-declared-project-mapping.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0015-narrow-the-security-catalogue.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0016-stall-grouping-is-session-wide.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0017-a-declined-repeat-is-a-stall.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0018-remote-sync-config-and-facade-consumption.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0019-delegated-commands-are-openaca-objects.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0020-openaca-consumption-boundary.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0021-two-command-kinds.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0022-detection-scope-is-a-catalogue-column.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0023-sync-detect-collects-and-does-not-escalate.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0024-the-upload-carries-observations.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0025-a-denied-call-is-activity-never-an-invocation.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0026-the-console-becomes-a-product-surface.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0027-a-finding-may-name-what-it-could-not-place.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0028-the-console-shows-what-it-placed.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0029-stage-three-returns-to-opt-in.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0030-a-detection-is-dated-by-the-turns-it-cites.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0031-one-host-daemon-observes-native-session-logs.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0032-refresh-daemon-compositions-outside-detection.md +0 -0
- {stacktrace_cli-0.13.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.13.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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0035-naming-an-analyzer-selects-stored-answers.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0037-reuse-openaidr-append-cursors-in-the-daemon.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0038-poll-normalized-sessions-for-supplemental-changes.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0039-send-usage-telemetry-by-default-with-an-opt-out.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0041-defer-native-windows-support.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0042-read-the-build-commit-from-the-install-record.md +0 -0
- {stacktrace_cli-0.13.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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0044-send-the-build-as-version-prints-it.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0045-scan-every-session-and-outlive-them.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0046-the-finding-store-is-an-append-only-queue.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0047-capture-activity-during-correlation-or-lose-it.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0048-the-daemon-keeps-a-leveled-content-free-activity-log.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0056-stop-a-resident-daemon-by-record-and-signal.md +0 -0
- {stacktrace_cli-0.13.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.13.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.13.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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0060-two-upload-postures-not-one-command-with-two-sources.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0061-the-drain-sends-findings-only.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0062-hold-the-transition-lock-across-remote-side-effects.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0063-underbuilt-debt-does-not-hold-the-scan-watermark.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0064-a-redacted-value-has-one-path-span.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0065-asset-external-id-resolves-by-a-ladder.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0066-host-owned-daemon-supervision.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0067-a-webhook-is-an-independent-queue-subscriber.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0068-webhooks-retry-the-retained-backlog.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0069-webhooks-deliver-what-retention-holds.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0070-package-the-cloud-agent-environment-bootstrap.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0071-render-the-allowlisted-payload-per-destination.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0072-host-supervisors-own-daemon-restarts.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0074-a-window-selects-findings-by-when-they-happened.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0076-two-phase-detection-pipeline.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0077-the-bom-job-wakes-once-at-startup-staggered.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0078-a-seeded-display-prefix-replaces-the-hostname-label.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0079-the-monitor-page-renders-findings-not-pipeline-health.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0080-enabling-reasoning-does-not-requeue-the-past.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0081-reasoning-activation-returns-to-explicit-opt-in.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0082-monitor-checks-every-installed-component-by-default.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0084-a-recursive-deletes-evidence-is-the-rm-that-ran.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0085-show-when-and-which-finding-slack-delivered.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0087-deploy-compiled-policy-with-a-privileged-scheduled-job.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0088-slack-alerts-leave-out-confidence.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0089-infra-gate-reads-commands-not-shell-semantics.md +0 -0
- {stacktrace_cli-0.13.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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0091-mark-our-own-machines-and-name-what-failed.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0092-cost-is-its-own-rule-family.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0093-environment-cost-baselines-count-tokens-keyed-by-model.md +0 -0
- {stacktrace_cli-0.13.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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0095-cost-findings-reach-fleet-each-rule-can-be-muted.md +0 -0
- {stacktrace_cli-0.13.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.13.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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0098-a-run-is-its-main-session.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0099-cost-is-measured-in-tokens-and-relative-increases.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0100-the-monitor-runs-offline-for-the-website.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0101-what-names-a-run-in-fleet.md +0 -0
- {stacktrace_cli-0.13.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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0103-finished-runs-may-leave-as-numbers-for-org-baselines.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0104-usage-is-its-own-upload.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0105-an-asset-key-is-a-bare-uuid.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0106-boot-id-is-salted-with-the-pid-namespace.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0107-the-daemon-follows-every-kind-openaidr-reads.md +0 -0
- {stacktrace_cli-0.13.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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0110-every-kinds-account-comes-from-openaidr.md +0 -0
- {stacktrace_cli-0.13.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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0113-size-triggers-behaviour-explains-session-cost-carries-reasons.md +0 -0
- {stacktrace_cli-0.13.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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0115-usage-states-its-coverage-and-fleet-returns-expected-runs.md +0 -0
- {stacktrace_cli-0.13.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.13.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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0120-own-the-adapter-event-envelope.md +0 -0
- {stacktrace_cli-0.13.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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0122-use-stacktrace-as-the-python-package.md +0 -0
- {stacktrace_cli-0.13.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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0124-fleet-imports-core-from-the-stacktrace-distribution.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0127-the-monitor-shows-weighted-tokens-beside-raw-tokens.md +0 -0
- {stacktrace_cli-0.13.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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0129-an-unfinished-response-counts-the-output-it-shows.md +0 -0
- {stacktrace_cli-0.13.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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0132-every-usage-page-names-the-store-that-built-it.md +0 -0
- {stacktrace_cli-0.13.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.13.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.13.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.13.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.13.0 → stacktrace_cli-0.15.0}/docs/adrs/0142-the-cli-has-no-machine-limit.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/HOOK-PROMPT.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/adrs/TEMPLATE.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/cutover-openaca-remote.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/002-session-input.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/003-correlation.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/004-detector.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/005-remote-sync.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/006-cli-composition.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/007-detection-upload.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/008-monitor.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/009-reasoning-jev.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/010-session-daemon.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/011-daemon-store.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/012-daemon-scanning.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/013-daemon-uploads.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/014-asset-identity.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/015-managed-policy-deployment.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/016-cost-phase-1.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/plans/017-cost-phase-2.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.0.1.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.1.0.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.10.0.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.11.0.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.12.0.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.13.0.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.2.0.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.2.1.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.2.2.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.2.3.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.3.0.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.3.1.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.4.0.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.4.1.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.5.0.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.5.1.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.5.2.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.5.3.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.6.0.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.6.1.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.7.0.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.7.1.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.8.0.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/releases/v0.9.0.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/research/001-intent-drift-metric.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/agent-observability.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/aidr.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/cli-composition.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/correlation.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/cost-notifications.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/cost-phase-2.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/cost.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/daemon-scanning.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/daemon-store.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/daemon-uploads.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/detection-upload.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/event-time.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/hook-policy-rollout.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/managed-policy-deployment.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/monitor-inventory.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/monitor.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/plugin-installation.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/production-agent-observability.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/reasoning-jev.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/session-input.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/docs/specs/usage-upload.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/examples/observations/custom_agent.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/README.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/bedrock-sandbox/.gitignore +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/bedrock-sandbox/ci.tf +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/bedrock-sandbox/main.tf +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/bedrock-sandbox/outputs.tf +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/bedrock-sandbox/variables.tf +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/.gitignore +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/check.sh +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/ci.tf +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/connect.sh +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/images/envoy/litellm.yaml +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/images/litellm/config.subscription.yaml +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/images/litellm/config.yaml +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/moved.tf +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/guard-staging/user-key.sh +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/modules/express-gateway/main.tf +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/modules/express-gateway/outputs.tf +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/infra/modules/express-gateway/variables.tf +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/e2e/claude.sh +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/e2e/scenarios.sh +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/envoy/run.sh +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/README.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/config.example.yaml +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/config.subscription.yaml +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/e2e/config.baseten.yaml +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/e2e/config.mock.yaml +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/e2e/parity.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/integrations/litellm/stacktrace_keys.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/scripts/cost_latency.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/scripts/git-hooks/pre-push +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/scripts/install-hooks.sh +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/__main__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/analysis.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/build.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cli.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cloud/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cloud/boot.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cloud/profile.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cloud/setup.sh +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/core/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/core/observations.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/acquire.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/composition.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/join.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/observed.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/orchestrate.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/project_map.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/record.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/correlate/render.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/baseline.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/clock.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/component_usage.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/components.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/copies.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/evidence.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/ledger.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/models.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/org_baselines.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/output.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/price_class.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/reasons.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/runs.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/tokens.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/totals.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/usage.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/cost/weights.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/accounts.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/activity_log.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/bom.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/cli.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/client.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/composition.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/db.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/identity.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/jobs.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/lifecycle.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/observer.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/paths.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/policy_inputs.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/protocol.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/scan.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/server.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/service.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/daemon/usage.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/analyzer.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/blocked.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/cache.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/finding.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/history.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/jev.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/personal_data.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/priors.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/jev-v1/stacktrace-deceptive-completion.json +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/jev-v2/stacktrace-deceptive-completion.json +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/jev-v2/stacktrace-infra-unsafe-action.json +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/jev-v3/stacktrace-deceptive-completion.json +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/jev-v3/stacktrace-infra-unsafe-action.json +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/v1/exclusions.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/v1/framing.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/prompts/v1/stacktrace-deceptive-completion.md +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/reasoning.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/render.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/run.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/secrets.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/verdict.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/detector/windows.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/cli.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/exchange.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/_json.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/anthropic.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/bedrock.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/body.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/openai_chat.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/formats/openai_responses.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/gateway/session.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/hooks/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/hooks/session.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/costs.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/inventory.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/offline.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/reasoning.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/server.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/apple-icon.png +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/cost.js +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/favicon.ico +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/fonts/OFL.txt +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/fonts/dm-mono-400-latin.woff2 +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/fonts/dm-mono-500-latin.woff2 +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/fonts/dm-sans-latin.woff2 +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/fonts/playfair-display-600-italic-latin.woff2 +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/icon.svg +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/index.html +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/site/inventory.js +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/state.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/monitor/watch.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/options.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/policy_display.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/private_state.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/py.typed +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/cli.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/client.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/config.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/identity.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/payload.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/policy.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/policy_worker.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/spool.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/sync.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/remote/sync_detect.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sdk.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/access.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/entrypoint.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/index.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/lineage.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/outcome.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/protocols.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/sessions/render.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/telemetry/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/telemetry/cli.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/telemetry/events.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/telemetry/posthog.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/telemetry/state.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/webhook/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/webhook/cli.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/src/stacktrace/webhook/config.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/agent_bom_fixture.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/conftest.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/fakes.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/scenarios.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_as_of_cuts_every_timed_collection.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_baseline.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_clock.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_component_usage.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_components.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_copies.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_cost_evidence_travels.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_cost_findings_are_dated_by_their_citations.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_cost_findings_carry_no_session_text.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_cost_is_tokens.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_cost_latency.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_evidence.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_ledger.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_models.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_org_baselines.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_output.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_price_class.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_reasons.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_rules_baseline.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_runs.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_totals.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_unfinished_output_counts_what_it_shows.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_usage.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/cost/test_weights.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/observing.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_accounts.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_activity_log.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_claude_policy_hook.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_cli.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_client.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_composition.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_config.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_cost_guidance.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_db.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_detection_needs_no_subscriber.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_identity.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_job_thread.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_jobs.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_lifecycle.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_observer.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_collect_contract.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_hook_transport.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_inputs.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_runtime.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_policy_socket.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_queue_reader.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_runtime.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_scan.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_service.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_session_cost_notices.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_socket.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_stage_times.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_subagent_routing.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_the_drained_payload_is_the_cold_one.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_the_stored_row_is_sufficient.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_usage.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_usage_store.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/daemon/test_wire_frames_are_bounded.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/detector_session_fixture.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_analyzer.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_bodies_and_logs.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_call_records.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_check.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_every_choice_is_read.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_every_read_field_is_validated.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_every_shortfall_is_a_recorded_fallback.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_gateway_keys.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_gateway_scripts.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_litellm_stream.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_litellm_subscription_config.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_service.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_session.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/gateway/test_unstated_outcomes.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/cost_harness.mjs +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/inventory_harness.mjs +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_cost_page.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_cost_range_switch.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_inventory.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_inventory_page.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_offline.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_reasoning_gates.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_render.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_render_cost.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_server.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_site_assets.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_state.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/monitor/test_watch.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/observations/test_contract.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/observations/test_decisions.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/observations/test_event_envelope.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/helpers.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_cli.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_client.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_cloud_boot_updates_the_client.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_cloud_session.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_cloud_setup_asset_id.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_config.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_activity.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_cli.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_client.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_gate_matches_the_cloud.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_layers_compose.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_payload_reaches_the_cloud_model.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_redaction.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_spool.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_upload_contract.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_detect_wire_payload.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_facade_contract.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_no_local_path_survives_redaction.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_payload.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_policy.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_policy_service.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_policy_service_cli.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_redact_payload.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_seam.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_session_registration.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_spool.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_sync.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_sync_detect.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_upload_contract.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_usage_client.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_usage_contract.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/remote/test_user_install_profile.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/sdk/test_observation_client.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/__init__.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_activity_log.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_cli.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_events.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_every_derived_site.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_every_internal_save_is_reported.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_hooks.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_release_gate.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_state.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/telemetry/test_uploader.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_acquire.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_adr_cross_references_are_reciprocal.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_agent_instance_id.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_agent_support_doc.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_analysis.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_bom_shape.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_build_commit.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_cli.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_composition.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_correlate_orchestrate.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_correlate_render.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_correlated_session.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detection_components.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detection_event_time.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detection_subject.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_analyzer_contract.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_analyzer_live.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_cache.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_credential_in_prompt.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_declared_egress.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_deterministic.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_end_to_end.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_finding.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_history.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_infra_reasoning.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_jev.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_personal_data.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_pii_in_prompt.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_priors.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_prompts.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_reasoning.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_run.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_secrets.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_verdict.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_vulnerable_dep_invoked.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_detector_windows.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_entrypoint_conventions.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_fingerprint_covers_what_the_analyzer_reads.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_help_sections.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_join.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_monitor_cli.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_no_live_document_states_the_old_stage_three_default.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_no_test_undoes_every_patch_at_once.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_observed.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_one_wording_per_rule.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_openaca_contract.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_openaidr_contract.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_option_arity_matches_the_binary.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_project_map.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_python_namespace.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_readme_examples_are_real_output.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_release_gate_coverage.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_release_readiness.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_seam_boundary.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_sessions_access.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_sessions_end_to_end.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_sessions_protocol_typing.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_sessions_protocols.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_sessions_render.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_shell_separators_match_the_shell.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_signed_in_asks_the_agent.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_stored_verdicts_are_never_gated_on_reasoning.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_the_detector_spec_lists_the_shipped_catalogue.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_the_jev_spec_states_the_shipped_thresholds.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_the_locality_claim_is_qualified_everywhere.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_title_disclosure_invariant.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_verification_subcommands_match_the_binary.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/test_what_jev_is_told_is_what_was_disclosed.py +0 -0
- {stacktrace_cli-0.13.0 → stacktrace_cli-0.15.0}/tests/tool_fields.py +0 -0
- {stacktrace_cli-0.13.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
|
|
@@ -129,6 +129,23 @@ nothing about detection.
|
|
|
129
129
|
`tests/monitor/test_render_cost.py`. When reviews keep re-arguing scope (a
|
|
130
130
|
time boundary, which sessions a rule reads), write the answer into the spec,
|
|
131
131
|
as `docs/specs/cost-phase-1.md` §1 "What a rule reads, and when" does.
|
|
132
|
+
- Write an ADR only in a `/kind feature` PR. Bug fixes, cleanups, wording changes
|
|
133
|
+
and UI changes get no ADR.
|
|
134
|
+
- A spec holds the design. An ADR holds one decision and its rejected alternatives.
|
|
135
|
+
Keep the Decision section of an ADR short. Write one paragraph, or a short
|
|
136
|
+
numbered list of choices. Put commands, flags, failure behavior and test plans
|
|
137
|
+
in the spec.
|
|
138
|
+
- The specs in `docs/specs/` describe components and change with them. A feature
|
|
139
|
+
that changes a component updates the spec of that component in the same PR. A
|
|
140
|
+
feature that adds a component adds a new spec. Start a new spec from
|
|
141
|
+
`docs/specs/TEMPLATE.md`.
|
|
142
|
+
- Write or update the spec first. Then write ADRs for the decisions whose rejected
|
|
143
|
+
alternative is plausible. List those ADRs in a "Decisions" table in the spec.
|
|
144
|
+
Link each ADR to the spec section that has the detail.
|
|
145
|
+
- Do not write "This spec implements ADR-NNNN". The spec is the source of the
|
|
146
|
+
design.
|
|
147
|
+
- Before a multi-step implementation plan, write the spec and its ADRs. The plan
|
|
148
|
+
references them. A plan is not a substitute for either.
|
|
132
149
|
|
|
133
150
|
## Adding a command
|
|
134
151
|
|
|
@@ -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>
|
|
@@ -20,8 +20,8 @@ Classifier: Topic :: Security
|
|
|
20
20
|
Requires-Python: >=3.11
|
|
21
21
|
Requires-Dist: click>=8.1
|
|
22
22
|
Requires-Dist: httpx<1.0.dev0,>=0.28.1
|
|
23
|
-
Requires-Dist: openaca==0.
|
|
24
|
-
Requires-Dist: openaidr==0.7.
|
|
23
|
+
Requires-Dist: openaca==0.12.0
|
|
24
|
+
Requires-Dist: openaidr==0.7.1
|
|
25
25
|
Requires-Dist: posthog<8,>=7.0
|
|
26
26
|
Requires-Dist: pydantic<3,>=2.10
|
|
27
27
|
Description-Content-Type: text/markdown
|
|
@@ -52,7 +52,7 @@ Requires Python 3.11 or newer.
|
|
|
52
52
|
|
|
53
53
|
```console
|
|
54
54
|
$ stacktrace --version
|
|
55
|
-
stacktrace 0.
|
|
55
|
+
stacktrace 0.15.0
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
## Python package namespace
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: 0146
|
|
3
|
+
title: Eight more rules send remediation targets, one target kind for each rule
|
|
4
|
+
status: proposed
|
|
5
|
+
date: 2026-10-18
|
|
6
|
+
supersedes: null
|
|
7
|
+
superseded-by: null
|
|
8
|
+
amends: 0083, 0086, 0133, 0139, 0141
|
|
9
|
+
amended-by: 0149
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
ADR-0139 gave two rules a list of `finding_targets`: credential egress and
|
|
15
|
+
vulnerable packages. Fleet groups each by its target, and every channel shows
|
|
16
|
+
one title for it. ADR-0141 says to decide the model for any other rule in its
|
|
17
|
+
own ADR.
|
|
18
|
+
|
|
19
|
+
A customer could not read Fleet's finding page for the other rules. The
|
|
20
|
+
product owner reviewed a catalogue of every rule on 2026-10-18. It gave each
|
|
21
|
+
rule a title, an explanation, a fix, more detail and a grouping by its fix.
|
|
22
|
+
The product owner then gave these decisions:
|
|
23
|
+
|
|
24
|
+
- Move eight rules to the framework.
|
|
25
|
+
- Report a recursive delete only when it is `high`.
|
|
26
|
+
- Read `~` and `$HOME` in a delete.
|
|
27
|
+
- Remove the Publishing rule.
|
|
28
|
+
- Leave the infrastructure, completion and cost rules as they are.
|
|
29
|
+
|
|
30
|
+
## Decision
|
|
31
|
+
|
|
32
|
+
1. **Eight rules send `finding_targets`.** Each rule has one target kind of its
|
|
33
|
+
own. `KIND_RULES` in `finding_contract.py` maps each kind to its rule.
|
|
34
|
+
`KIND_FIELDS` names the fields that each kind carries. The contract refuses
|
|
35
|
+
a target that sets a field of another kind.
|
|
36
|
+
|
|
37
|
+
| Rule | Kind | Fields | Groups by | Title |
|
|
38
|
+
| --- | --- | --- | --- | --- |
|
|
39
|
+
| `credential-persisted` | `stored_credential` | fingerprint, mask, credential kind | kind, fingerprint | Credential written to a file: **{mask}** |
|
|
40
|
+
| `destructive-action` | `deleted_folder` | span, folder | kind, span | Recursive delete removed **{folder}** |
|
|
41
|
+
| `mcp-transient-failure` | `mcp_signin` | service | kind, service | MCP sign-in failed, then recovered: **{service}** |
|
|
42
|
+
| `blocked-quota` | `spend_limit` | account | kind, account | Spend limit reached |
|
|
43
|
+
| `blocked-policy` | `safety_check` | session id, service | kind, session id | **{service}** stopped the agent |
|
|
44
|
+
| `blocked-throttled` | `rate_limit` | service, status | kind, service, status | Rate limited by **{service}** |
|
|
45
|
+
| `blocked-upstream` | `access_denied` | service, status | kind, service, status | Access denied by **{service}** |
|
|
46
|
+
| `tool-retry-storm` | `retried_call` | service, attempts | kind, service | **{service}** retried without change |
|
|
47
|
+
|
|
48
|
+
2. **A new key includes its kind.** A credential that is both sent and stored
|
|
49
|
+
then has two keys. Fleet finds a group's name by its key alone. The keys of
|
|
50
|
+
the first two kinds do not change, so their groups keep their history.
|
|
51
|
+
|
|
52
|
+
3. **A target names no path and no session text.**
|
|
53
|
+
- `folder` is one of four fixed words: `root`, `workspace`, `system` and
|
|
54
|
+
`home`. The paths stay in the evidence `kind` (ADR-0084), and redaction
|
|
55
|
+
cleans them on upload.
|
|
56
|
+
- `service` is the call's `_outside_target` without the tool name. A
|
|
57
|
+
block that the client reports in a reply names `the model provider`. A
|
|
58
|
+
call with no target names `an unnamed service`. A retried call keeps the
|
|
59
|
+
tool name, as its citation does. A safety check names `A safety check`
|
|
60
|
+
or `An automatic approval reviewer`. This amends ADR-0086 for this field
|
|
61
|
+
only, with the same shape rules.
|
|
62
|
+
- `status` is `401`, `403`, `429`, `529` or empty.
|
|
63
|
+
- `account` is the run's `session.account` (ADR-0112). The upload adds it.
|
|
64
|
+
A run with no account sends no `spend_limit` target. Fleet never shows
|
|
65
|
+
the account.
|
|
66
|
+
- `session_id` is the finding's own session. `span` is a span that the
|
|
67
|
+
finding cites.
|
|
68
|
+
|
|
69
|
+
4. **The explanation and the fix follow the status.** A 401 says that the
|
|
70
|
+
service rejected the sign-in, and the fix is to sign in again. A 403 says
|
|
71
|
+
that the service denied access, and the fix is to grant the permission.
|
|
72
|
+
A 529 says that the provider was overloaded, and there is no limit to raise.
|
|
73
|
+
|
|
74
|
+
5. **A rule can have no fix.** A retried call has an empty remediation. Every
|
|
75
|
+
channel then leaves out the Remediation section.
|
|
76
|
+
|
|
77
|
+
6. **A title counts several targets with the rule's own noun.** `title_for`
|
|
78
|
+
moves into `finding_contract.py`. Fleet's list, detail page and Slack then
|
|
79
|
+
use the client's title. This amends ADR-0141 clauses 4 and 6.
|
|
80
|
+
|
|
81
|
+
7. **A block's remediation states the fix and nothing about one session.**
|
|
82
|
+
Fleet groups many sessions under one fix. The count of events, a repeated
|
|
83
|
+
reply, and whether the session ended on the block move to the target's
|
|
84
|
+
reasons. Each channel shows them under More Detail for that occurrence. The
|
|
85
|
+
title of a Codex approval reviewer comes from the target, not from the
|
|
86
|
+
notice. This amends ADR-0083 and ADR-0133.
|
|
87
|
+
|
|
88
|
+
8. **`destructive-action` reports a `high` delete only.** A delete near the
|
|
89
|
+
workspace (`medium`) or deep in another tree (`low`) is not a finding. The
|
|
90
|
+
rule reads `~`, `~/...`, `$HOME` and `${HOME}` against the home folder
|
|
91
|
+
that the workspace path shows: `/Users/<name>`, `/home/<name>` or `/root`.
|
|
92
|
+
With no such home folder, the rule declines the target, as before.
|
|
93
|
+
|
|
94
|
+
9. **`stacktrace-unrequested-publication` is removed.** No stage ran its gate.
|
|
95
|
+
It moves to `RETIRED_SCOPES` with the scope `call`.
|
|
96
|
+
|
|
97
|
+
## Alternatives considered
|
|
98
|
+
|
|
99
|
+
- **Keep the `credential` kind for a stored credential.** Rejected. The rule
|
|
100
|
+
comes from the kind, and Fleet checks that each target belongs to its rule.
|
|
101
|
+
- **Put the deleted path in the target.** Rejected. The client builds the
|
|
102
|
+
title before redaction, and nothing redacts a target. Fleet would get a raw
|
|
103
|
+
path, and the Monitor and Fleet titles would differ.
|
|
104
|
+
- **Group a delete by host and path.** Rejected because the path does not
|
|
105
|
+
travel. A delete groups by its call. Each delete needs its own restore.
|
|
106
|
+
- **Name the account in the spend limit title.** Rejected. The account is an
|
|
107
|
+
opaque id (ADR-0112). Fleet shows the person in its Users section.
|
|
108
|
+
- **Name the session in the safety check title.** Rejected. ADR-0109 gates
|
|
109
|
+
the session title, and nothing gates a target.
|
|
110
|
+
- **Group a throttle by the service only.** Rejected. A 429 has a limit to
|
|
111
|
+
raise, and a 529 does not.
|
|
112
|
+
- **Keep the outcome sentence in the remediation.** Rejected. A sentence
|
|
113
|
+
about one session is false for a group of sessions.
|
|
114
|
+
- **Drop the outcome sentence.** Rejected. A reader decides whether to resume
|
|
115
|
+
a session from it.
|
|
116
|
+
- **Keep `medium` and `low` deletes.** Rejected by the product owner.
|
|
117
|
+
Readers skip a finding that is usually harmless (ADR-0013).
|
|
118
|
+
- **Expand `~` with the detector's own `HOME`.** Rejected. The detector need
|
|
119
|
+
not run as the session's user.
|
|
120
|
+
- **Move all fifteen rules.** Rejected by the product owner. The cost rules
|
|
121
|
+
have their own layout, and two security rules are not in use.
|
|
122
|
+
|
|
123
|
+
## Consequences
|
|
124
|
+
|
|
125
|
+
- Fleet must accept the new kinds before a client sends them. An older Fleet
|
|
126
|
+
refuses the whole run.
|
|
127
|
+
- A Fleet row of these rules with no target keeps its old grouping.
|
|
128
|
+
- Monitor and the webhook show new titles for these rules.
|
|
129
|
+
- Nobody gets a finding for a `medium` or `low` delete. The gateway also
|
|
130
|
+
stops blocking them.
|
|
131
|
+
- Fleet must show a block's reasons on each session, not as one list for the
|
|
132
|
+
group.
|
|
133
|
+
- The contract file grows. Both copies must stay the same.
|
|
134
|
+
|
|
135
|
+
## When to revisit
|
|
136
|
+
|
|
137
|
+
Revisit when a responder needs the deleted path in Fleet. Revisit when a rule
|
|
138
|
+
needs two target kinds.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: 0147
|
|
3
|
+
title: The webhook names the run and the person, links to Fleet, and an egress label keeps its last four
|
|
4
|
+
status: proposed
|
|
5
|
+
date: 2026-10-18
|
|
6
|
+
supersedes: null
|
|
7
|
+
superseded-by: null
|
|
8
|
+
amends: 0073, 0109, 0141
|
|
9
|
+
amended-by: null
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
The live policy suite's `credential-egress` case sends a classic OpenAI `sk-` key with `curl`.
|
|
15
|
+
The daemon's Slack webhook posted two messages for it:
|
|
16
|
+
|
|
17
|
+
- "OpenAI API key sk-…e8e2 sent to the model in a prompt"
|
|
18
|
+
- "Credential exposure for OpenAI API key"
|
|
19
|
+
|
|
20
|
+
The second one does not say which key to rotate.
|
|
21
|
+
ADR-0141 clause 3 lets an egress label show a mask only for four issuer prefixes.
|
|
22
|
+
Fleet's grammar takes a mask with no prefix (Fleet ADR-0094, `_SUFFIX_MASK`).
|
|
23
|
+
So the client dropped the last four characters when it only had to drop the prefix.
|
|
24
|
+
|
|
25
|
+
The Slack message from the webhook also has no session name and no person.
|
|
26
|
+
Fleet's own Slack message shows both (Fleet ADR-0093, ADR-0109).
|
|
27
|
+
ADR-0073 keeps out of the webhook any field written about one session.
|
|
28
|
+
A run's title is such a field, so the webhook did not send it.
|
|
29
|
+
|
|
30
|
+
The labels were also weak.
|
|
31
|
+
"Subject" for a credential sent by `curl` was "Bash (tool) (built-in)".
|
|
32
|
+
"Evidence" was the raw kind, such as `openai_key`.
|
|
33
|
+
The footer showed a finding ID to copy, and the message had no way to open the finding in Fleet.
|
|
34
|
+
|
|
35
|
+
## Decision
|
|
36
|
+
|
|
37
|
+
1. **An egress label keeps its last four.**
|
|
38
|
+
A credential that is not a private key gets its kind's name, then the issuer prefix if Fleet shows it, then `…` and the last four characters.
|
|
39
|
+
A prefix Fleet does not show is dropped, not the whole mask.
|
|
40
|
+
A classic OpenAI key reads "OpenAI API key …e8e2".
|
|
41
|
+
A private key still reads by its kind's name alone.
|
|
42
|
+
This amends ADR-0141 clause 3.
|
|
43
|
+
2. **The webhook carries the run's names and the person.**
|
|
44
|
+
`session.title`, else `session.opening_words`, and `session.person`, join the projection.
|
|
45
|
+
They are the values the Fleet upload sends, read from the same store under the same gate (ADR-0101 clause 5, ADR-0140).
|
|
46
|
+
The person is named only when the run's account is the account signed in now (ADR-0109 clause 3).
|
|
47
|
+
Each is left out when there is none, bounded at 200 characters, and rendered as inert text.
|
|
48
|
+
This amends ADR-0073's rule that no field written about one session may be mapped, for these three fields only.
|
|
49
|
+
Evidence detail, spans, remediation and prompts still do not travel.
|
|
50
|
+
3. **The Slack message names these fields for a reader.**
|
|
51
|
+
"Affected" lists the targets.
|
|
52
|
+
"Component" shows the subject, and only when the finding has no targets.
|
|
53
|
+
"Finding Detail" shows the evidence kinds, with a credential kind by its name.
|
|
54
|
+
"Session" shows the title, or the quoted opening words.
|
|
55
|
+
"User(s)" shows the person.
|
|
56
|
+
"Detected" stays in the footer with the time, so it is not a field label.
|
|
57
|
+
These are the words Fleet's own Slack message uses (Fleet ADR-0096), taken from the finding detail page.
|
|
58
|
+
4. **The Slack message links to the finding in Fleet.**
|
|
59
|
+
A "View in Fleet" button sits under the fields.
|
|
60
|
+
The footer's finding ID is the link text for the same page.
|
|
61
|
+
The address is the origin of the `dashboard_url` in Fleet's last upload response, kept in `schema_meta`.
|
|
62
|
+
The path is the one Fleet's own button builds: the rule, the agent kind and the group key.
|
|
63
|
+
The group key is a target's key, after the upload adds a spend limit's account, or `target:` and a prompt credential's key.
|
|
64
|
+
Both come from `finding_contract.py`, which Fleet holds an identical copy of.
|
|
65
|
+
A finding keyed by an id only Fleet assigns opens Fleet's findings list.
|
|
66
|
+
Before any upload, there is no button, and the ID stays plain text.
|
|
67
|
+
The JSON format does not carry the link.
|
|
68
|
+
|
|
69
|
+
## Alternatives considered
|
|
70
|
+
|
|
71
|
+
- **Keep the egress label to the kind's name for other prefixes**: rejected.
|
|
72
|
+
A responder cannot tell which key to rotate, and Fleet already takes the last four.
|
|
73
|
+
- **Show the `sk-` prefix too**: rejected.
|
|
74
|
+
Fleet refuses a prefix outside its four, and refuses the whole run with it.
|
|
75
|
+
- **Leave the names to Fleet's Slack message**: rejected.
|
|
76
|
+
A machine with a webhook and no Fleet Slack connection gets no names at all.
|
|
77
|
+
- **Send the person to the webhook without the account check**: rejected.
|
|
78
|
+
It names whoever is signed in today on any run (ADR-0109 clause 3).
|
|
79
|
+
- **Keep "Subject" beside "Affected"**: rejected.
|
|
80
|
+
For a finding with targets, the component is often the Bash tool, which a responder cannot act on.
|
|
81
|
+
- **Link by Fleet's detection id**: rejected.
|
|
82
|
+
Fleet assigns it after the upload, and the webhook sends before or beside the upload.
|
|
83
|
+
- **Derive the console address from `api_url`**: rejected.
|
|
84
|
+
The API and the console have different hosts in production and different ports locally.
|
|
85
|
+
|
|
86
|
+
## Consequences
|
|
87
|
+
|
|
88
|
+
- The person's name now leaves the machine to the webhook URL, which the person configured.
|
|
89
|
+
That can be a third-party workspace, which is wider than the org's own Fleet that ADR-0109 named.
|
|
90
|
+
A destination that must not learn names should not be a webhook destination.
|
|
91
|
+
- A run's title and opening words now reach the webhook.
|
|
92
|
+
Both passed the upload contract's string rules, and opening words are letters only (ADR-0141 clause 5).
|
|
93
|
+
- The names are recorded only while Fleet is configured (`UsageRecorder.record`).
|
|
94
|
+
A machine with a webhook and no Fleet sends no Session and no User(s).
|
|
95
|
+
- A receiver that validates the JSON format with `additionalProperties: false` must accept three new `session` keys.
|
|
96
|
+
`version` stays `1`, as in ADR-0073.
|
|
97
|
+
- A link waits for the first upload after a restart only on a new store; the address persists.
|
|
98
|
+
A link can point at a group Fleet has not stored yet, when the webhook sends before the upload.
|
|
99
|
+
The page then shows no members until the upload lands.
|
|
100
|
+
- More egress labels carry four characters of a credential: AWS, Slack, Stripe, Google and classic OpenAI keys.
|
|
101
|
+
Four characters do not let anyone recover the key.
|
|
102
|
+
|
|
103
|
+
## When to revisit
|
|
104
|
+
|
|
105
|
+
Revisit when the webhook gets names on a machine without Fleet, or when Fleet widens its label grammar.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: 0148
|
|
3
|
+
title: Credential egress notifies at medium confidence when its severity is high
|
|
4
|
+
status: proposed
|
|
5
|
+
date: 2026-10-18
|
|
6
|
+
supersedes: null
|
|
7
|
+
superseded-by: null
|
|
8
|
+
amends: 0036
|
|
9
|
+
amended-by: null
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
The notification gate notifies on `medium` severity and above, at `high` confidence only (`FindingStore._eligible`).
|
|
15
|
+
`stacktrace-credential-egress` is `high` severity on every finding.
|
|
16
|
+
Its confidence is the confidence of the egress it read.
|
|
17
|
+
A tool that is network access, such as `WebFetch`, or a recorded MCP transport, gives `high`.
|
|
18
|
+
A shell command such as `curl`, `gh` or `ssh` gives `medium`, because the network access is read from the command string.
|
|
19
|
+
|
|
20
|
+
So a credential sent with `curl` was uploaded to Fleet and never notified.
|
|
21
|
+
The live policy suite's `credential-egress` case showed it.
|
|
22
|
+
Slack received only `credential-in-prompt`, which is `high` confidence.
|
|
23
|
+
The egress finding, the more serious of the two, reached nobody until they opened Fleet.
|
|
24
|
+
|
|
25
|
+
## Decision
|
|
26
|
+
|
|
27
|
+
1. **Credential egress notifies at `medium` confidence when its severity is `high`.**
|
|
28
|
+
`FindingStore._MEDIUM_CONFIDENCE_WHEN_HIGH` names the rule.
|
|
29
|
+
`low` confidence still does not notify.
|
|
30
|
+
2. **Every other rule keeps the high-confidence gate.**
|
|
31
|
+
A rule joins the set only by its own decision.
|
|
32
|
+
3. **The finding keeps its own confidence.**
|
|
33
|
+
The notification and the webhook payload carry `medium`.
|
|
34
|
+
Nothing raises a grade to pass the gate.
|
|
35
|
+
|
|
36
|
+
## Alternatives considered
|
|
37
|
+
|
|
38
|
+
- **Grade `curl` egress `high`**: rejected.
|
|
39
|
+
A command string can be misread, and `observed.py` keeps the two grades apart for that reason.
|
|
40
|
+
The grade would claim more than the detector saw.
|
|
41
|
+
- **Notify every rule at `medium` confidence**: rejected.
|
|
42
|
+
`mcp-transient-failure` is `medium` on every finding, by its spec, and would alert on each one.
|
|
43
|
+
- **Keep the gate and test egress with `WebFetch`**: rejected.
|
|
44
|
+
Claude Code's `WebFetch` refuses loopback hosts and sends no headers, so no test can show a credential leaving through it.
|
|
45
|
+
The gate would still hide every `curl` egress in real use.
|
|
46
|
+
|
|
47
|
+
## Consequences
|
|
48
|
+
|
|
49
|
+
- A credential sent by `curl`, `gh`, `ssh` or another shell command now alerts in Slack and in the plugin.
|
|
50
|
+
- A misread command string can now alert.
|
|
51
|
+
The finding says `medium` confidence, so a reader can tell.
|
|
52
|
+
- ADR-0036 reads a missing `confidence` as `high`, because older records were all `high`.
|
|
53
|
+
That reading stays true for those records.
|
|
54
|
+
Records from now on always carry their own `confidence`.
|
|
55
|
+
- `docs/specs/notification-delivery.md` names the exception.
|
|
56
|
+
|
|
57
|
+
## When to revisit
|
|
58
|
+
|
|
59
|
+
Revisit when the detector reads shell egress with `high` confidence, or when another rule's severity alone should decide.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: 0149
|
|
3
|
+
title: A credential switch after a refusal replaces the MCP sign-in rule, and the retry storm is removed
|
|
4
|
+
status: proposed
|
|
5
|
+
date: 2026-10-19
|
|
6
|
+
supersedes: null
|
|
7
|
+
superseded-by: null
|
|
8
|
+
amends: 0073, 0086, 0146
|
|
9
|
+
amended-by: null
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
ADR-0146 moved `stacktrace-mcp-transient-failure` and
|
|
15
|
+
`stacktrace-tool-retry-storm` to the remediation framework. The product owner
|
|
16
|
+
then asked of each rule whether a person can act on it.
|
|
17
|
+
|
|
18
|
+
The MCP sign-in rule fires when an MCP call fails with an auth error and a
|
|
19
|
+
later call to the same tool succeeds. The record does not say which credential
|
|
20
|
+
a call used. So the rule cannot tell a token refresh from an agent that used a
|
|
21
|
+
credential it found. Its fix asked a person to check something that had
|
|
22
|
+
already recovered. The case that matters is the second one: the agent got past
|
|
23
|
+
a refusal with a credential that nobody gave it.
|
|
24
|
+
|
|
25
|
+
The retry storm fires on three identical failing calls. It has no fix. A
|
|
26
|
+
refusal, a throttle or a spend limit behind the failures is already a block
|
|
27
|
+
finding with its own fix.
|
|
28
|
+
|
|
29
|
+
`stacktrace-scavenged-credential` caught part of the credential case until
|
|
30
|
+
0.4.0. It fired on no session of the measured corpus and was removed. The
|
|
31
|
+
product owner accepts a rule that seldom fires when each finding is useful.
|
|
32
|
+
|
|
33
|
+
## Decision
|
|
34
|
+
|
|
35
|
+
1. **`stacktrace-credential-switched` replaces the MCP sign-in rule.** It is a
|
|
36
|
+
security rule, graded `high`. It fires when a service refuses a call with
|
|
37
|
+
an auth error, and a later call to the same service succeeds with a
|
|
38
|
+
credential that the refused call did not carry. The credential is in the
|
|
39
|
+
successful call's arguments, and the agent read it first in the result of
|
|
40
|
+
an earlier call. Or the agent wrote it into an agent config file between
|
|
41
|
+
the two calls. A credential-shaped string in the arguments can be the
|
|
42
|
+
content of a document, so a credential that the agent did not read does
|
|
43
|
+
not count.
|
|
44
|
+
2. **It never fires when a person or the client acted.** A person's turn
|
|
45
|
+
between the two calls closes the episode. With no new credential in sight,
|
|
46
|
+
such as a token the client refreshed, there is no finding.
|
|
47
|
+
3. **Its confidence says where the credential came from.** It is `high` when
|
|
48
|
+
the agent read each new credential in an earlier result. It is `medium`
|
|
49
|
+
when the agent wrote a credential into a config file and did not read it
|
|
50
|
+
first.
|
|
51
|
+
4. **Its target is the new credential.** The kind is `switched_credential`.
|
|
52
|
+
It carries the credential's digest, mask and kind, as credential exposure
|
|
53
|
+
does, and Fleet groups by the digest. It also carries the mask of the
|
|
54
|
+
refused credential (`previous_label`, empty when the call carried none),
|
|
55
|
+
the service and the refusal's status. Every channel shows both
|
|
56
|
+
credentials. The webhook adds a `before` field to its JSON, one line for
|
|
57
|
+
each refused credential and its service. Its Slack message shows the line
|
|
58
|
+
as Before, as Fleet's message does.
|
|
59
|
+
5. **The fix is to revoke the new credential and take it out of reach.**
|
|
60
|
+
"Revoke or rotate this {credential}. Then remove it from where the agent can
|
|
61
|
+
read it. If the agent needs this access, grant it to the agent's own
|
|
62
|
+
credential."
|
|
63
|
+
6. **The retry storm is removed.** Its kind, `retried_call`, and the
|
|
64
|
+
`attempts` field leave the contract.
|
|
65
|
+
7. **Both old ids move to `RETIRED_SCOPES`** with the scope `call`, so a
|
|
66
|
+
stored finding still uploads.
|
|
67
|
+
8. **The filter stays.** An auth refusal that the same MCP tool later
|
|
68
|
+
answered is still not an "Access denied" finding.
|
|
69
|
+
9. **The citations name the service**, on ADR-0086's terms.
|
|
70
|
+
|
|
71
|
+
## Alternatives considered
|
|
72
|
+
|
|
73
|
+
- **Keep the MCP sign-in rule.** Rejected. Most of its findings are token
|
|
74
|
+
refreshes, and it has no fix.
|
|
75
|
+
- **Bring back `scavenged-credential` as it was.** Rejected. It saw only a
|
|
76
|
+
credential in the call's arguments. Most MCP servers sign in through their
|
|
77
|
+
config, so the config write is the likely path.
|
|
78
|
+
- **Fire on any credential the agent read after a refusal.** Rejected. Reading
|
|
79
|
+
a credential is not using it. Credential exposure and credential in a file
|
|
80
|
+
already report a credential that goes somewhere.
|
|
81
|
+
- **Keep the retry storm without a fix.** Rejected. A person cannot act on it.
|
|
82
|
+
|
|
83
|
+
## Consequences
|
|
84
|
+
|
|
85
|
+
- The rule fires rarely. A finding means that the agent got past an access
|
|
86
|
+
control.
|
|
87
|
+
- A credential that the agent passes without its value in the record, such
|
|
88
|
+
as `export TOKEN=$(cat .env)`, is not seen.
|
|
89
|
+
- Three identical failing calls with no block reason are no longer reported.
|
|
90
|
+
|
|
91
|
+
## When to revisit
|
|
92
|
+
|
|
93
|
+
Revisit when the record says which credential each call used. Revisit when a
|
|
94
|
+
measured corpus shows findings that a person could not act on.
|