stacktrace-cli 0.3.0__tar.gz → 0.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/.agents/skills/release-stacktrace/SKILL.md +14 -3
  2. stacktrace_cli-0.3.1/.claude/skills/release-stacktrace/SKILL.md +1 -0
  3. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/PKG-INFO +2 -2
  4. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/README.md +1 -1
  5. stacktrace_cli-0.3.1/docs/releases/v0.3.1.md +38 -0
  6. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/pyproject.toml +1 -1
  7. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/__init__.py +1 -1
  8. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_readme_examples_are_real_output.py +30 -0
  9. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/uv.lock +1 -1
  10. stacktrace_cli-0.3.0/.claude/skills/release-stacktrace/SKILL.md +0 -194
  11. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/.claude/settings.json +0 -0
  12. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/.codex/hooks.json +0 -0
  13. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/.github/workflows/autofix.yml +0 -0
  14. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/.github/workflows/ci.yml +0 -0
  15. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/.github/workflows/claude.yml +0 -0
  16. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/.github/workflows/publish-pypi.yml +0 -0
  17. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/.gitignore +0 -0
  18. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/AGENTS.md +0 -0
  19. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/CLAUDE.md +0 -0
  20. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0001-session-telemetry-as-input.md +0 -0
  21. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0002-session-collection-in-openaidr.md +0 -0
  22. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0003-runtime-edges.md +0 -0
  23. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0004-three-stage-detector.md +0 -0
  24. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0005-detection-family-and-report-assembly.md +0 -0
  25. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0006-trust-boundary-and-detection-upload.md +0 -0
  26. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0007-proprietary-package-on-open-dependencies.md +0 -0
  27. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0008-console-in-separate-demo-package.md +0 -0
  28. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0010-detection-severity-and-confidence-ladders.md +0 -0
  29. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0011-verdict-cache.md +0 -0
  30. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0012-observation-evidence-kinds-and-transport.md +0 -0
  31. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0013-rule-catalogue-triage-and-per-rule-context.md +0 -0
  32. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0014-declared-project-mapping.md +0 -0
  33. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0015-narrow-the-security-catalogue.md +0 -0
  34. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0016-stall-grouping-is-session-wide.md +0 -0
  35. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0017-a-declined-repeat-is-a-stall.md +0 -0
  36. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0018-remote-sync-config-and-facade-consumption.md +0 -0
  37. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0019-delegated-commands-are-openaca-objects.md +0 -0
  38. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0020-openaca-consumption-boundary.md +0 -0
  39. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0021-two-command-kinds.md +0 -0
  40. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0022-detection-scope-is-a-catalogue-column.md +0 -0
  41. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0023-sync-detect-collects-and-does-not-escalate.md +0 -0
  42. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0024-the-upload-carries-observations.md +0 -0
  43. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0025-a-denied-call-is-activity-never-an-invocation.md +0 -0
  44. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0026-the-console-becomes-a-product-surface.md +0 -0
  45. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0027-a-finding-may-name-what-it-could-not-place.md +0 -0
  46. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0028-the-console-shows-what-it-placed.md +0 -0
  47. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/0029-stage-three-returns-to-opt-in.md +0 -0
  48. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/HOOK-PROMPT.md +0 -0
  49. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/INDEX.md +0 -0
  50. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/adrs/TEMPLATE.md +0 -0
  51. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/cutover-openaca-remote.md +0 -0
  52. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/plans/002-session-input.md +0 -0
  53. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/plans/003-correlation.md +0 -0
  54. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/plans/004-detector.md +0 -0
  55. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/plans/005-remote-sync.md +0 -0
  56. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/plans/006-cli-composition.md +0 -0
  57. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/plans/007-detection-upload.md +0 -0
  58. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/plans/008-monitor.md +0 -0
  59. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/releases/v0.0.1.md +0 -0
  60. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/releases/v0.1.0.md +0 -0
  61. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/releases/v0.2.0.md +0 -0
  62. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/releases/v0.2.1.md +0 -0
  63. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/releases/v0.2.2.md +0 -0
  64. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/releases/v0.2.3.md +0 -0
  65. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/releases/v0.3.0.md +0 -0
  66. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/specs/aidr.md +0 -0
  67. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/specs/cli-composition.md +0 -0
  68. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/specs/correlation.md +0 -0
  69. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/specs/detection-upload.md +0 -0
  70. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/specs/detector.md +0 -0
  71. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/specs/monitor.md +0 -0
  72. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/specs/remote-sync.md +0 -0
  73. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/docs/specs/session-input.md +0 -0
  74. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/scripts/git-hooks/pre-push +0 -0
  75. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/scripts/install-hooks.sh +0 -0
  76. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/__main__.py +0 -0
  77. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/analysis.py +0 -0
  78. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/cli.py +0 -0
  79. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/correlate/__init__.py +0 -0
  80. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/correlate/acquire.py +0 -0
  81. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/correlate/composition.py +0 -0
  82. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/correlate/join.py +0 -0
  83. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/correlate/observed.py +0 -0
  84. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/correlate/orchestrate.py +0 -0
  85. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/correlate/project_map.py +0 -0
  86. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/correlate/record.py +0 -0
  87. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/correlate/render.py +0 -0
  88. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/__init__.py +0 -0
  89. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/analyzer.py +0 -0
  90. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/cache.py +0 -0
  91. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/deterministic.py +0 -0
  92. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/finding.py +0 -0
  93. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/markers.py +0 -0
  94. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/priors.py +0 -0
  95. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/prompts/__init__.py +0 -0
  96. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/prompts/v1/exclusions.md +0 -0
  97. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/prompts/v1/framing.md +0 -0
  98. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/prompts/v1/stacktrace-deceptive-completion.md +0 -0
  99. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/prompts/v1/stacktrace-injected-instruction-followed.md +0 -0
  100. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/prompts/v1/stacktrace-intent-drift.md +0 -0
  101. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/reasoning.py +0 -0
  102. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/render.py +0 -0
  103. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/rules.py +0 -0
  104. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/run.py +0 -0
  105. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/secrets.py +0 -0
  106. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/detector/verdict.py +0 -0
  107. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/monitor/__init__.py +0 -0
  108. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/monitor/reasoning.py +0 -0
  109. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/monitor/render.py +0 -0
  110. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/monitor/server.py +0 -0
  111. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/monitor/site/app.js +0 -0
  112. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/monitor/site/fonts/OFL.txt +0 -0
  113. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/monitor/site/fonts/dm-mono-400-latin.woff2 +0 -0
  114. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/monitor/site/fonts/dm-mono-500-latin.woff2 +0 -0
  115. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/monitor/site/fonts/dm-sans-latin.woff2 +0 -0
  116. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/monitor/site/index.html +0 -0
  117. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/monitor/site/styles.css +0 -0
  118. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/monitor/state.py +0 -0
  119. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/monitor/verdicts.py +0 -0
  120. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/monitor/watch.py +0 -0
  121. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/remote/__init__.py +0 -0
  122. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/remote/cli.py +0 -0
  123. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/remote/client.py +0 -0
  124. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/remote/config.py +0 -0
  125. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/remote/detect_payload.py +0 -0
  126. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/remote/payload.py +0 -0
  127. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/remote/policy.py +0 -0
  128. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/remote/redact.py +0 -0
  129. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/remote/spool.py +0 -0
  130. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/remote/sync.py +0 -0
  131. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/remote/sync_detect.py +0 -0
  132. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/remote/upload_contract.py +0 -0
  133. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/sessions/__init__.py +0 -0
  134. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/sessions/access.py +0 -0
  135. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/sessions/outcome.py +0 -0
  136. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/sessions/protocols.py +0 -0
  137. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/src/stacktrace_cli/sessions/render.py +0 -0
  138. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/__init__.py +0 -0
  139. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/agent_bom_fixture.py +0 -0
  140. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/detector_session_fixture.py +0 -0
  141. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/monitor/__init__.py +0 -0
  142. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/monitor/feed_harness.mjs +0 -0
  143. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/monitor/test_feed_model.py +0 -0
  144. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/monitor/test_reasoning_gates.py +0 -0
  145. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/monitor/test_render.py +0 -0
  146. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/monitor/test_server.py +0 -0
  147. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/monitor/test_site_assets.py +0 -0
  148. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/monitor/test_state.py +0 -0
  149. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/monitor/test_verdicts.py +0 -0
  150. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/monitor/test_watch.py +0 -0
  151. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/__init__.py +0 -0
  152. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/helpers.py +0 -0
  153. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_cli.py +0 -0
  154. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_client.py +0 -0
  155. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_config.py +0 -0
  156. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_detect_activity.py +0 -0
  157. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_detect_cli.py +0 -0
  158. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_detect_client.py +0 -0
  159. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_detect_contract_is_exhaustive.py +0 -0
  160. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_detect_gate_matches_the_cloud.py +0 -0
  161. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_detect_layers_compose.py +0 -0
  162. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_detect_payload_reaches_the_cloud_model.py +0 -0
  163. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_detect_redaction.py +0 -0
  164. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_detect_spool.py +0 -0
  165. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_detect_upload_contract.py +0 -0
  166. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_detect_wire_payload.py +0 -0
  167. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_facade_contract.py +0 -0
  168. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_payload.py +0 -0
  169. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_policy.py +0 -0
  170. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_redact_payload.py +0 -0
  171. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_seam.py +0 -0
  172. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_spool.py +0 -0
  173. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_sync.py +0 -0
  174. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_sync_detect.py +0 -0
  175. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/remote/test_upload_contract.py +0 -0
  176. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_acquire.py +0 -0
  177. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_agent_instance_id.py +0 -0
  178. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_analysis.py +0 -0
  179. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_bom_shape.py +0 -0
  180. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_call_status_conventions.py +0 -0
  181. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_cli.py +0 -0
  182. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_composition.py +0 -0
  183. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_correlate_orchestrate.py +0 -0
  184. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_correlate_render.py +0 -0
  185. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_correlated_session.py +0 -0
  186. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_detection_components.py +0 -0
  187. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_detection_subject.py +0 -0
  188. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_detector_analyzer_contract.py +0 -0
  189. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_detector_analyzer_live.py +0 -0
  190. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_detector_cache.py +0 -0
  191. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_detector_deterministic.py +0 -0
  192. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_detector_end_to_end.py +0 -0
  193. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_detector_finding.py +0 -0
  194. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_detector_liveness.py +0 -0
  195. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_detector_markers.py +0 -0
  196. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_detector_priors.py +0 -0
  197. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_detector_reasoning.py +0 -0
  198. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_detector_render.py +0 -0
  199. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_detector_run.py +0 -0
  200. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_detector_secrets.py +0 -0
  201. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_detector_verdict.py +0 -0
  202. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_fingerprint_covers_what_the_analyzer_reads.py +0 -0
  203. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_help_sections.py +0 -0
  204. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_join.py +0 -0
  205. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_monitor_cli.py +0 -0
  206. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_no_live_document_states_the_old_stage_three_default.py +0 -0
  207. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_observed.py +0 -0
  208. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_openaca_contract.py +0 -0
  209. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_openaidr_contract.py +0 -0
  210. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_option_arity_matches_the_binary.py +0 -0
  211. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_project_map.py +0 -0
  212. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_release_readiness.py +0 -0
  213. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_seam_boundary.py +0 -0
  214. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_sessions_access.py +0 -0
  215. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_sessions_end_to_end.py +0 -0
  216. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_sessions_protocol_typing.py +0 -0
  217. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_sessions_protocols.py +0 -0
  218. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_sessions_render.py +0 -0
  219. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_shell_separators_match_the_shell.py +0 -0
  220. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_stored_verdicts_are_never_gated_on_reasoning.py +0 -0
  221. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_untrusted_content_never_travels.py +0 -0
  222. {stacktrace_cli-0.3.0 → stacktrace_cli-0.3.1}/tests/test_verification_subcommands_match_the_binary.py +0 -0
@@ -102,9 +102,10 @@ shipped.
102
102
 
103
103
  ### Step 4. Bump the version, pin workspace dependencies, and gate
104
104
 
105
- `pyproject.toml`'s `version` and `src/stacktrace_cli/__init__.py`'s
106
- `__version__` are separate sources; the workflow fails the build if they
107
- disagree with the tag. Move them together:
105
+ `pyproject.toml`'s `version`, `src/stacktrace_cli/__init__.py`'s
106
+ `__version__` and the `--version` console block in `README.md` are three
107
+ separate copies of the version string. The workflow fails the build if the
108
+ first two disagree with the tag. Move them together:
108
109
 
109
110
  ```bash
110
111
  sed -i.bak 's/^version = ".*"/version = "<version>"/' pyproject.toml && rm pyproject.toml.bak
@@ -125,6 +126,16 @@ uv lock # refresh uv.lock, now free t
125
126
  uv run stacktrace --version # sanity: prints <version>
126
127
  ```
127
128
 
129
+ Paste that exact output over the console block under `## Installation` in
130
+ `README.md`. `readme = "README.md"` makes that file the PyPI long description,
131
+ and a description is baked into the artifact at upload — releases being
132
+ immutable, a stale line there is only ever corrected by burning the next
133
+ version number, which is what 0.3.1 was for. The block sat at `0.2.1` through
134
+ three releases before anything checked it;
135
+ `tests/test_readme_examples_are_real_output.py` now fails the build when it
136
+ drifts, so this is a step you are reminded of rather than one you must
137
+ remember.
138
+
128
139
  Now pin both to whatever `uv lock` just resolved — the one point in the
129
140
  procedure where the lockfile has just picked the newest available versions
130
141
  and a release is actually being cut:
@@ -0,0 +1 @@
1
+ ../../../.agents/skills/release-stacktrace/SKILL.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: stacktrace-cli
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: CLI for Stacktrace — Detection and Response platform for AI Agents.
5
5
  Project-URL: Homepage, https://stacktrace.ai
6
6
  Author-email: "Stacktrace AI, Inc" <founders@stacktrace.ai>
@@ -49,7 +49,7 @@ Requires Python 3.11 or newer.
49
49
 
50
50
  ```console
51
51
  $ stacktrace --version
52
- stacktrace 0.2.1 (openaca 0.6.0)
52
+ stacktrace 0.3.1 (openaca 0.6.0)
53
53
  ```
54
54
 
55
55
  ## Quick start
@@ -24,7 +24,7 @@ Requires Python 3.11 or newer.
24
24
 
25
25
  ```console
26
26
  $ stacktrace --version
27
- stacktrace 0.2.1 (openaca 0.6.0)
27
+ stacktrace 0.3.1 (openaca 0.6.0)
28
28
  ```
29
29
 
30
30
  ## Quick start
@@ -0,0 +1,38 @@
1
+ # 0.3.1 — the README says what the CLI says
2
+
3
+ A documentation fix, and the test that keeps it fixed. Nothing in the pipeline
4
+ moved; `0.3.1` behaves exactly as `0.3.0` does.
5
+
6
+ The `stacktrace --version` block in `README.md` read `stacktrace 0.2.1` while
7
+ the wheel beside it was `0.3.0`. Because `readme = "README.md"` makes that file
8
+ the PyPI long description, the project page for 0.2.2, 0.2.3 and 0.3.0 each
9
+ opened with a console block contradicting the release it described.
10
+
11
+ ## Highlights
12
+
13
+ - **The README's version example is now asserted against the CLI.** The block
14
+ is produced by invoking `--version` and must appear in `README.md` verbatim,
15
+ so the line cannot drift from the build again — it joins the sessions example,
16
+ which has been checked this way for some time. The flag is invoked rather than
17
+ its text rebuilt from `__version__`, which also puts the `openaca` half of the
18
+ line under the same check.
19
+
20
+ - **The guard runs in the gate that publishes.** It sits in
21
+ `tests/test_readme_examples_are_real_output.py` rather than in
22
+ `test_release_readiness.py`, whose `release_gate` marker is deselected by
23
+ `addopts` — a check placed there would not be collected by the `pytest` step
24
+ the publish workflow runs.
25
+
26
+ ## Install
27
+
28
+ `uv tool install stacktrace-cli==0.3.1` or `pip install stacktrace-cli==0.3.1`.
29
+
30
+ ## Compatibility
31
+
32
+ No behaviour changes. The 0.3.0 rename of `--escalate` to `--reasoning` is the
33
+ last one that needed anything of you; see `docs/releases/v0.3.0.md` if you are
34
+ coming from 0.2.3.
35
+
36
+ The 0.3.0 project page on PyPI still shows the stale `0.2.1` line. A PyPI
37
+ description is baked into the artifact at upload and releases are immutable, so
38
+ that page cannot be corrected in place — this release is the correction.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "stacktrace-cli"
3
- version = "0.3.0"
3
+ version = "0.3.1"
4
4
  description = "CLI for Stacktrace — Detection and Response platform for AI Agents."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -1,3 +1,3 @@
1
1
  """The `stacktrace` command-line interface — detection and response for AI agents."""
2
2
 
3
- __version__ = "0.3.0"
3
+ __version__ = "0.3.1"
@@ -27,7 +27,9 @@ from datetime import UTC, datetime
27
27
  from pathlib import Path
28
28
 
29
29
  import detector_session_fixture as fx
30
+ from click.testing import CliRunner
30
31
 
32
+ from stacktrace_cli.cli import main
31
33
  from stacktrace_cli.sessions.access import SessionView
32
34
  from stacktrace_cli.sessions.render import render_text as render_sessions_text
33
35
 
@@ -67,3 +69,31 @@ def test_the_sessions_example_is_what_the_sessions_renderer_prints() -> None:
67
69
  )
68
70
  rendered = render_sessions_text(SessionView(sessions=(session,)), include_content=True)
69
71
  assert rendered.strip() in _readme()
72
+
73
+
74
+ def test_the_version_example_is_what_the_version_flag_prints() -> None:
75
+ """The README's `--version` block is a third copy of the version string.
76
+
77
+ `pyproject.toml` and `__version__` are kept together by two steps of the
78
+ publish workflow, which fail the build when either disagrees with the tag.
79
+ Nothing watched this block, so it sat at `0.2.1` while 0.2.2, 0.2.3 and
80
+ 0.3.0 shipped past it — and because `readme = "README.md"` makes this file
81
+ the PyPI long description, every one of those releases published a landing
82
+ page whose first console block contradicted the wheel beside it. A PyPI
83
+ description is baked into the artifact at upload and releases are
84
+ immutable, so a stale line there cannot be edited afterwards; it is only
85
+ ever corrected by burning the next version number.
86
+
87
+ Asserted by invoking the flag rather than by rebuilding its text from
88
+ `__version__`, so the openaca half is covered too: a reassembled string
89
+ would restate the f-string in `cli.py` and certify itself.
90
+
91
+ This lives here and not in `test_release_readiness.py` because that module
92
+ is marked `release_gate`, and `addopts` deselects the marker — the
93
+ `uv run pytest -q` step that guards the publish would never collect it.
94
+ """
95
+ printed = CliRunner().invoke(main, ["--version"], prog_name="stacktrace").output
96
+ assert printed.strip() in _readme(), (
97
+ f"README.md does not contain the line `stacktrace --version` prints "
98
+ f"({printed.strip()!r}); the console block under ## Installation has drifted"
99
+ )
@@ -690,7 +690,7 @@ wheels = [
690
690
 
691
691
  [[package]]
692
692
  name = "stacktrace-cli"
693
- version = "0.3.0"
693
+ version = "0.3.1"
694
694
  source = { editable = "." }
695
695
  dependencies = [
696
696
  { name = "click" },
@@ -1,194 +0,0 @@
1
- ---
2
- name: release-stacktrace
3
- description: Use when cutting a new stacktrace-cli PyPI release. Walks through version bump, release-notes drafting, pre-flight checks, tag, and push — enforces the publish-pypi.yml notes-file gate so the GitHub Releases page can't silently drift from PyPI.
4
- ---
5
-
6
- # release-stacktrace
7
-
8
- End-to-end release procedure for the `stacktrace-cli` distribution.
9
- `.github/workflows/publish-pypi.yml` enforces the machine-checkable gates
10
- (tag on main, tag matches both version strings, notes file present, four
11
- CI gates green). This skill is the human-side counterpart: it drafts the
12
- notes with judgment, runs the pre-flight checks, and pushes the tag.
13
-
14
- **Announce at start:** "I'm using the release-stacktrace skill to cut a new
15
- stacktrace-cli release."
16
-
17
- ## When to invoke
18
-
19
- User says any of: "cut a release", "ship 0.0.N", "release stacktrace",
20
- "tag a new version", or starts editing `pyproject.toml`'s version field
21
- in this repo.
22
-
23
- ## Inputs
24
-
25
- 1. **Target version** (e.g. `0.1.0`). Inferred from `pyproject.toml` if
26
- the user already bumped it; otherwise ask.
27
- 2. **Theme** — the H1 line of the notes file. Ask the user; a commit log
28
- can't infer it.
29
-
30
- ## Procedure
31
-
32
- ### Step 1. Pre-flight checks
33
-
34
- Run from the repo root. Stop and ask if any fails — do not "fix" a dirty
35
- tree or out-of-sync main automatically, those signal in-flight work.
36
-
37
- ```bash
38
- git rev-parse --abbrev-ref HEAD # must be main
39
- git status --porcelain # must be empty
40
- git fetch --tags origin
41
- git rev-parse --verify "v<version>" 2>/dev/null # MUST FAIL — tag must not exist
42
- test "$(git rev-parse HEAD)" = "$(git rev-parse origin/main)"
43
- ```
44
-
45
- PyPI versions are immutable, including yanked ones. If `<version>` is
46
- already on PyPI, the only path forward is a new version number:
47
-
48
- ```bash
49
- curl -s https://pypi.org/pypi/stacktrace-cli/json | python3 -c 'import json,sys; print(sorted(json.load(sys.stdin)["releases"]))'
50
- ```
51
-
52
- ### Step 2. Gather the commit log
53
-
54
- ```bash
55
- prev_tag=$(git describe --tags --abbrev=0) # empty on the first release
56
- git log --oneline "${prev_tag}..HEAD"
57
- ```
58
-
59
- Raw material only — do not dump it into the notes file verbatim.
60
-
61
- ### Step 3. Draft `docs/releases/v<version>.md`
62
-
63
- Follow the shape of the existing files in `docs/releases/`:
64
-
65
- ```markdown
66
- # <version> — <theme>
67
-
68
- ## Highlights
69
-
70
- - **<Theme A>.** 1-3 sentences pitched at someone who installs the CLI.
71
- Reference ADRs by number when a design doc backs the change.
72
- - **Bug fixes.** Combine small fixes into one bullet, comma-separated.
73
-
74
- ## Install
75
-
76
- `uv tool install stacktrace-cli==<version>` or `pip install stacktrace-cli==<version>`.
77
-
78
- ## Compatibility
79
-
80
- <Behavior changes existing users will notice. Say "pre-alpha, no
81
- back-compat hedging" while that's still true.>
82
- ```
83
-
84
- **Judgment guidelines (apply ruthlessly):**
85
-
86
- - **Group by theme, not by commit.** Five commits adding one capability
87
- are one bullet.
88
- - **Lead with user-visible impact**, not implementation.
89
- - **Cut chore/format/docs-only and release-machinery commits.** They
90
- aren't release-visible.
91
- - **Acknowledge breaking changes explicitly** under `## Compatibility` —
92
- a renamed subcommand or changed output shape goes there.
93
-
94
- Show the draft to the user and iterate until they agree it captures what
95
- shipped.
96
-
97
- ### Step 4. Bump both version strings together
98
-
99
- `pyproject.toml`'s `version` and `src/stacktrace_cli/__init__.py`'s
100
- `__version__` are separate sources; the workflow fails the build if they
101
- disagree with the tag. Move them together:
102
-
103
- ```bash
104
- sed -i.bak 's/^version = ".*"/version = "<version>"/' pyproject.toml && rm pyproject.toml.bak
105
- sed -i.bak 's/^__version__ = ".*"/__version__ = "<version>"/' src/stacktrace_cli/__init__.py && rm src/stacktrace_cli/__init__.py.bak
106
- uv lock # refresh uv.lock
107
- uv run stacktrace --version # sanity: prints <version>
108
- ```
109
-
110
- ### Step 5. Release-prep commit + PR
111
-
112
- If the user's original request did not explicitly ask to cut, ship, or
113
- publish a release, stop before the push and ask. Editing the version
114
- field is enough to invoke this skill; it is not permission to publish.
115
-
116
- ```bash
117
- git checkout -b release/<version>
118
- git add pyproject.toml uv.lock src/stacktrace_cli/__init__.py docs/releases/v<version>.md
119
- git status --porcelain # inspect anything still unstaged; stage intentionally or stop
120
- git commit -m "release: <version> — <theme>"
121
- git push -u origin release/<version>
122
- ```
123
-
124
- Opening the PR needs its own explicit ask. Then:
125
-
126
- ```bash
127
- gh pr create --title "release: <version>" --body "Release prep for <version>.
128
-
129
- - Bumps \`pyproject.toml\` and \`__version__\` to <version>
130
- - Adds release notes at \`docs/releases/v<version>.md\`
131
- - After merge: tag \`v<version>\` on main and push to trigger PyPI publish + GitHub Release"
132
- ```
133
-
134
- Surface the PR URL. **Stop here.** The user reviews and merges.
135
-
136
- ### Step 6. After merge: tag + push
137
-
138
- After the user confirms the PR merged, on a clean main:
139
-
140
- ```bash
141
- git checkout main
142
- git pull --ff-only
143
- git tag v<version>
144
- git push origin v<version>
145
- ```
146
-
147
- The tag-triggered run registers asynchronously, so `--limit 1` can grab a
148
- stale earlier run. Poll for the run tied to the tagged commit:
149
-
150
- ```bash
151
- tag_sha=$(git rev-parse "v<version>^{commit}")
152
- run_id=""
153
- until [ -n "$run_id" ]; do
154
- run_id=$(gh run list --repo stacktrace-ai/stacktrace \
155
- --workflow publish-pypi.yml --commit "$tag_sha" \
156
- --json databaseId --jq '.[0].databaseId // empty')
157
- [ -z "$run_id" ] && sleep 5
158
- done
159
- gh run watch --repo stacktrace-ai/stacktrace "$run_id"
160
- ```
161
-
162
- ### Step 7. Verify
163
-
164
- ```bash
165
- curl -s https://pypi.org/pypi/stacktrace-cli/json | python3 -c 'import json,sys; print(sorted(json.load(sys.stdin)["releases"]))'
166
- gh release view v<version> --repo stacktrace-ai/stacktrace --json name,body
167
- uvx --from stacktrace-cli==<version> stacktrace --version # installs from PyPI, must print <version>
168
- ```
169
-
170
- All three must succeed. If any fails, surface the workflow run URL rather
171
- than guessing.
172
-
173
- ## Failure modes this prevents
174
-
175
- 1. **On PyPI but not on GitHub Releases.** The workflow's notes-file gate
176
- runs before publish: no notes file at the tag → no PyPI upload.
177
- 2. **Notes file is a raw commit dump.** Step 3's judgment guidelines.
178
- 3. **Tagging a non-main commit.** The workflow's "Verify tag is on main".
179
- 4. **Tag ≠ `pyproject.toml` version, or `__version__` drift.** Two
180
- separate workflow steps; Step 4 keeps them moving together.
181
- 5. **Forgetting to refresh `uv.lock`.** `uv sync --frozen` fails in the
182
- build job; Step 4 bumps the lock to avoid the round-trip.
183
-
184
- ## What this skill does NOT do
185
-
186
- - **Doesn't publish to PyPI directly.** The workflow does, via Trusted
187
- Publishing (OIDC). There is no PyPI token anywhere in this repo, and
188
- none should be added.
189
- - **Doesn't create the GitHub Release directly.** The workflow's
190
- `release-github` job does, from the notes file.
191
- - **Doesn't write a CHANGELOG.md.** The convention is per-release files
192
- under `docs/releases/`.
193
- - **Doesn't yank.** PyPI versions are immutable; a broken release is
194
- fixed by shipping the next version, not by re-uploading.
File without changes
File without changes