agent-postmortem 0.3.6__tar.gz → 0.5.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.
Files changed (609) hide show
  1. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/CHANGELOG.md +220 -0
  2. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/PKG-INFO +40 -11
  3. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/README.md +39 -10
  4. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/docs/DESIGN.md +1247 -35
  5. agent_postmortem-0.5.0/hatch_build.py +74 -0
  6. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/plugin/.claude-plugin/plugin.json +1 -1
  7. agent_postmortem-0.5.0/plugin/README.md +105 -0
  8. agent_postmortem-0.5.0/plugin/hooks/hooks.json +114 -0
  9. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/plugin/hooks/run.sh +143 -4
  10. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/pyproject.toml +7 -3
  11. agent_postmortem-0.5.0/scripts/live_fault_injection.py +283 -0
  12. agent_postmortem-0.5.0/scripts/live_replay.py +439 -0
  13. agent_postmortem-0.5.0/scripts/scan_cache_check.py +188 -0
  14. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/__init__.py +1 -1
  15. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/cli.py +952 -98
  16. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/commands.py +582 -8
  17. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/claim_contradiction.py +21 -4
  18. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/mislabeled_kill.py +6 -3
  19. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/missing_artifact.py +45 -14
  20. agent_postmortem-0.5.0/src/agent_postmortem/entry.py +50 -0
  21. agent_postmortem-0.5.0/src/agent_postmortem/hook_gate.py +267 -0
  22. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/hooks_cli.py +955 -27
  23. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/ledger.py +3 -1
  24. agent_postmortem-0.5.0/src/agent_postmortem/live.py +2189 -0
  25. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/markers.py +7 -0
  26. agent_postmortem-0.5.0/src/agent_postmortem/pre_bash.py +274 -0
  27. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/reader.py +254 -13
  28. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/report.py +99 -41
  29. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/rescue.py +16 -6
  30. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/returns.py +15 -1
  31. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/severity.py +29 -0
  32. agent_postmortem-0.5.0/src/agent_postmortem/stalls.py +205 -0
  33. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/state.py +269 -8
  34. agent_postmortem-0.5.0/src/agent_postmortem/status.py +739 -0
  35. agent_postmortem-0.5.0/src/agent_postmortem/statusline.py +145 -0
  36. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/watch.py +62 -10
  37. agent_postmortem-0.5.0/src/agent_postmortem/watcher.py +413 -0
  38. agent_postmortem-0.5.0/src/agent_postmortem/workers.py +443 -0
  39. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rules__local.txt +1 -1
  40. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rules__raw.txt +1 -1
  41. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rules__share.txt +1 -1
  42. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rules_all__local.txt +1 -1
  43. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rules_all__raw.txt +1 -1
  44. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rules_all__share.txt +1 -1
  45. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rules_propose__local.txt +1 -1
  46. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rules_propose__raw.txt +1 -1
  47. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rules_propose__share.txt +1 -1
  48. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/run__local.txt +29 -7
  49. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/run__raw.txt +29 -7
  50. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/run__share.txt +29 -7
  51. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/scan__local.txt +1 -1
  52. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/scan__raw.txt +1 -1
  53. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/scan__share.txt +1 -1
  54. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/scan_all__local.txt +1 -1
  55. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/scan_all__raw.txt +1 -1
  56. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/scan_all__share.txt +1 -1
  57. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/trend__local.txt +12 -12
  58. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/trend__raw.txt +12 -12
  59. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/trend__share.txt +12 -12
  60. agent_postmortem-0.5.0/tests/live_helpers.py +139 -0
  61. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/synthetic-ids.txt +10 -0
  62. agent_postmortem-0.5.0/tests/test_build_identity.py +162 -0
  63. agent_postmortem-0.5.0/tests/test_e48_commit_ids_behind_a_prefix.py +276 -0
  64. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fa_commit_no_id.py +51 -1
  65. agent_postmortem-0.5.0/tests/test_failed_meaning.py +36 -0
  66. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_help.py +7 -3
  67. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_field_v03.py +1 -1
  68. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_field_v03_more.py +1 -5
  69. agent_postmortem-0.5.0/tests/test_fork_hook_identity.py +232 -0
  70. agent_postmortem-0.5.0/tests/test_four_workers_report.py +553 -0
  71. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_launch_docs.py +2 -1
  72. agent_postmortem-0.5.0/tests/test_live_branch_review.py +304 -0
  73. agent_postmortem-0.5.0/tests/test_live_hooks.py +139 -0
  74. agent_postmortem-0.5.0/tests/test_live_nested_return.py +720 -0
  75. agent_postmortem-0.5.0/tests/test_live_plugin.py +336 -0
  76. agent_postmortem-0.5.0/tests/test_live_post_tool.py +602 -0
  77. agent_postmortem-0.5.0/tests/test_live_post_tool_review.py +473 -0
  78. agent_postmortem-0.5.0/tests/test_live_release_review.py +134 -0
  79. agent_postmortem-0.5.0/tests/test_live_replay.py +27 -0
  80. agent_postmortem-0.5.0/tests/test_live_review_fixes.py +340 -0
  81. agent_postmortem-0.5.0/tests/test_live_scan.py +133 -0
  82. agent_postmortem-0.5.0/tests/test_live_scan_cache.py +194 -0
  83. agent_postmortem-0.5.0/tests/test_live_session.py +466 -0
  84. agent_postmortem-0.5.0/tests/test_live_status.py +161 -0
  85. agent_postmortem-0.5.0/tests/test_live_statusline.py +124 -0
  86. agent_postmortem-0.5.0/tests/test_live_store.py +78 -0
  87. agent_postmortem-0.5.0/tests/test_live_watch_cli.py +113 -0
  88. agent_postmortem-0.5.0/tests/test_live_watch_workflow.py +98 -0
  89. agent_postmortem-0.5.0/tests/test_live_words_doc.py +27 -0
  90. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4a_commit_grammar.py +27 -4
  91. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4fixb_differential.py +47 -8
  92. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n6_stderr.py +7 -0
  93. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n8_k3_precursor.py +11 -2
  94. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n9_docs.py +3 -3
  95. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n9_release_gate.py +8 -7
  96. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_no_write_surface.py +80 -24
  97. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_plugin.py +51 -24
  98. agent_postmortem-0.5.0/tests/test_pre_bash.py +189 -0
  99. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_privacy_matrix.py +156 -1
  100. agent_postmortem-0.5.0/tests/test_release_050_review.py +471 -0
  101. agent_postmortem-0.5.0/tests/test_release_review.py +80 -0
  102. agent_postmortem-0.5.0/tests/test_removed_worktree.py +177 -0
  103. agent_postmortem-0.5.0/tests/test_rescue_brief_scope.py +84 -0
  104. agent_postmortem-0.5.0/tests/test_resumed_subagent_notice.py +164 -0
  105. agent_postmortem-0.5.0/tests/test_rules_propose_cache.py +72 -0
  106. agent_postmortem-0.5.0/tests/test_run_id_errors.py +44 -0
  107. agent_postmortem-0.5.0/tests/test_scan_own_marker.py +95 -0
  108. agent_postmortem-0.5.0/tests/test_scan_totals_window.py +55 -0
  109. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_share_label_case.py +37 -3
  110. agent_postmortem-0.5.0/tests/test_stall_hook.py +239 -0
  111. agent_postmortem-0.5.0/tests/test_stalls.py +849 -0
  112. agent_postmortem-0.5.0/tests/test_status_commands.py +423 -0
  113. agent_postmortem-0.5.0/tests/test_status_disclosure.py +144 -0
  114. agent_postmortem-0.5.0/tests/test_status_workflows.py +159 -0
  115. agent_postmortem-0.5.0/tests/test_stop_deadline.py +241 -0
  116. agent_postmortem-0.5.0/tests/test_stop_watch.py +733 -0
  117. agent_postmortem-0.5.0/tests/test_story_plurals.py +24 -0
  118. agent_postmortem-0.5.0/tests/test_transcript_cache.py +488 -0
  119. agent_postmortem-0.5.0/tests/test_transcript_memo.py +340 -0
  120. agent_postmortem-0.5.0/tests/test_watch_pipe.py +143 -0
  121. agent_postmortem-0.5.0/tests/test_worker_notice.py +1055 -0
  122. agent_postmortem-0.5.0/tests/test_worker_rows.py +375 -0
  123. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/uv.lock +1 -1
  124. agent_postmortem-0.3.6/plugin/README.md +0 -58
  125. agent_postmortem-0.3.6/plugin/hooks/hooks.json +0 -60
  126. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/.claude-plugin/marketplace.json +0 -0
  127. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  128. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/.github/ISSUE_TEMPLATE/confusing_output.yml +0 -0
  129. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/.github/ISSUE_TEMPLATE/detector_request.yml +0 -0
  130. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/.github/ISSUE_TEMPLATE/run_shape_not_covered.yml +0 -0
  131. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/.github/ISSUE_TEMPLATE/wrong_verdict.yml +0 -0
  132. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  133. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/.github/workflows/ci.yml +0 -0
  134. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/.github/workflows/release.yml +0 -0
  135. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/.gitignore +0 -0
  136. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/CLAUDE.md +0 -0
  137. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/CONTRIBUTING.md +0 -0
  138. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/LICENSE +0 -0
  139. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/plugin/skills/postmortem/SKILL.md +0 -0
  140. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/plugin/skills/rescue/SKILL.md +0 -0
  141. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/scripts/check-privacy.sh +0 -0
  142. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/scripts/export-public.sh +0 -0
  143. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/argerrors.py +0 -0
  144. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/claims.py +0 -0
  145. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/config.py +0 -0
  146. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000001.jsonl +0 -0
  147. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000001.meta.json +0 -0
  148. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000002.jsonl +0 -0
  149. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000002.meta.json +0 -0
  150. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000003.jsonl +0 -0
  151. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000003.meta.json +0 -0
  152. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000004.jsonl +0 -0
  153. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000004.meta.json +0 -0
  154. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/journal.jsonl +0 -0
  155. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  156. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/__init__.py +0 -0
  157. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/attempt_failed.py +0 -0
  158. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/base.py +0 -0
  159. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/bash_backgrounded.py +0 -0
  160. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/bash_timeout.py +0 -0
  161. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/classifier_unavailable.py +0 -0
  162. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/codex_unavailable.py +0 -0
  163. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/codex_write_denied.py +0 -0
  164. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/git_cwd_mismatch.py +0 -0
  165. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/permission_denied.py +0 -0
  166. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/silent_retry.py +0 -0
  167. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/structured_output_failure.py +0 -0
  168. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/tool_json_error.py +0 -0
  169. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/wasted_time.py +0 -0
  170. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/detectors/workflow_failed.py +0 -0
  171. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/disclosure.py +0 -0
  172. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/hooks/model_allocation_guard.mjs +0 -0
  173. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/models.py +0 -0
  174. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/observe.py +0 -0
  175. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/redact.py +0 -0
  176. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/rules.py +0 -0
  177. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/src/agent_postmortem/trend.py +0 -0
  178. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/conftest.py +0 -0
  179. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/README.md +0 -0
  180. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/demo__share.txt +0 -0
  181. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rescue_plan__local.txt +0 -0
  182. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rescue_plan__raw.txt +0 -0
  183. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rescue_plan__share.txt +0 -0
  184. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rescue_status__local.txt +0 -0
  185. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rescue_status__raw.txt +0 -0
  186. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rescue_status__share.txt +0 -0
  187. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rules_review__local.txt +0 -0
  188. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rules_review__raw.txt +0 -0
  189. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rules_review__share.txt +0 -0
  190. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rules_show__local.txt +0 -0
  191. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rules_show__raw.txt +0 -0
  192. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/golden/schema3/rules_show__share.txt +0 -0
  193. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000001.jsonl +0 -0
  194. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000001.meta.json +0 -0
  195. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000002.jsonl +0 -0
  196. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000002.meta.json +0 -0
  197. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000003.jsonl +0 -0
  198. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000003.meta.json +0 -0
  199. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000004.jsonl +0 -0
  200. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000004.meta.json +0 -0
  201. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000005.jsonl +0 -0
  202. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000005.meta.json +0 -0
  203. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000006.jsonl +0 -0
  204. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000006.meta.json +0 -0
  205. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000008.jsonl +0 -0
  206. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000008.meta.json +0 -0
  207. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000009.jsonl +0 -0
  208. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000009.meta.json +0 -0
  209. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000010.jsonl +0 -0
  210. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000010.meta.json +0 -0
  211. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000011.jsonl +0 -0
  212. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000011.meta.json +0 -0
  213. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/journal.jsonl +0 -0
  214. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000001.jsonl +0 -0
  215. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000001.meta.json +0 -0
  216. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000002.jsonl +0 -0
  217. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000002.meta.json +0 -0
  218. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000003.jsonl +0 -0
  219. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000003.meta.json +0 -0
  220. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000004.jsonl +0 -0
  221. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000004.meta.json +0 -0
  222. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000005.jsonl +0 -0
  223. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000005.meta.json +0 -0
  224. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000006.jsonl +0 -0
  225. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000006.meta.json +0 -0
  226. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000007.jsonl +0 -0
  227. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000007.meta.json +0 -0
  228. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a1.jsonl +0 -0
  229. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a1.meta.json +0 -0
  230. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a2.jsonl +0 -0
  231. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a2.meta.json +0 -0
  232. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a3.jsonl +0 -0
  233. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a3.meta.json +0 -0
  234. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a4.jsonl +0 -0
  235. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a4.meta.json +0 -0
  236. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_causes/journal.jsonl +0 -0
  237. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afa10000000000001.jsonl +0 -0
  238. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afa10000000000001.meta.json +0 -0
  239. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afa10000000000002.jsonl +0 -0
  240. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afa10000000000002.meta.json +0 -0
  241. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afb10000000000001.jsonl +0 -0
  242. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afb10000000000001.meta.json +0 -0
  243. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/attempt_failed_retry_tail/journal.jsonl +0 -0
  244. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/bash_backgrounded_timeout/agent-ac300000000000001.jsonl +0 -0
  245. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/bash_backgrounded_timeout/agent-ac300000000000001.meta.json +0 -0
  246. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/bash_backgrounded_timeout/journal.jsonl +0 -0
  247. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/claim_contradiction/journal.jsonl +0 -0
  248. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/clean_run/agent-ac100000000000001.jsonl +0 -0
  249. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/clean_run/agent-ac100000000000001.meta.json +0 -0
  250. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/clean_run/agent-ac100000000000002.jsonl +0 -0
  251. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/clean_run/agent-ac100000000000002.meta.json +0 -0
  252. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/clean_run/journal.jsonl +0 -0
  253. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000001.jsonl +0 -0
  254. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000001.meta.json +0 -0
  255. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000002.jsonl +0 -0
  256. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000002.meta.json +0 -0
  257. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000003.jsonl +0 -0
  258. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000003.meta.json +0 -0
  259. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000004.jsonl +0 -0
  260. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000004.meta.json +0 -0
  261. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/codex_unavailable/journal.jsonl +0 -0
  262. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000001.jsonl +0 -0
  263. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000001.meta.json +0 -0
  264. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000002.jsonl +0 -0
  265. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000002.meta.json +0 -0
  266. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000003.jsonl +0 -0
  267. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000003.meta.json +0 -0
  268. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/codex_write_denied/journal.jsonl +0 -0
  269. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/evidence_noise/agent-acf00000000000001.jsonl +0 -0
  270. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/evidence_noise/agent-acf00000000000001.meta.json +0 -0
  271. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/evidence_noise/journal.jsonl +0 -0
  272. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ae300000000000001.jsonl +0 -0
  273. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ae300000000000001.meta.json +0 -0
  274. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-710/agent-ae100000000000001.jsonl +0 -0
  275. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-710/agent-ae100000000000001.meta.json +0 -0
  276. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-710/agent-ae100000000000002.jsonl +0 -0
  277. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-710/agent-ae100000000000002.meta.json +0 -0
  278. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-710/journal.jsonl +0 -0
  279. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-720/agent-ae200000000000001.jsonl +0 -0
  280. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-720/agent-ae200000000000001.meta.json +0 -0
  281. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-720/journal.jsonl +0 -0
  282. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  283. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/incomplete_journal/agent-ad000000000000001.jsonl +0 -0
  284. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/incomplete_journal/agent-ad000000000000001.meta.json +0 -0
  285. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/incomplete_journal/journal.jsonl +0 -0
  286. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/agent-aee00000000000001.jsonl +0 -0
  287. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/agent-aee00000000000001.meta.json +0 -0
  288. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/agent-aee00000000000003.jsonl +0 -0
  289. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/agent-aee00000000000003.meta.json +0 -0
  290. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/agent-aee00000000000004.jsonl +0 -0
  291. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/agent-aee00000000000004.meta.json +0 -0
  292. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/journal.jsonl +0 -0
  293. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  294. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_orphan_failed/journal.jsonl +0 -0
  295. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad200000000000001.jsonl +0 -0
  296. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad200000000000001.meta.json +0 -0
  297. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad300000000000001.jsonl +0 -0
  298. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad300000000000001.meta.json +0 -0
  299. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad400000000000001.jsonl +0 -0
  300. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad400000000000001.meta.json +0 -0
  301. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad400000000000002.jsonl +0 -0
  302. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad400000000000002.meta.json +0 -0
  303. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad500000000000001.jsonl +0 -0
  304. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad500000000000001.meta.json +0 -0
  305. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad500000000000002.jsonl +0 -0
  306. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad500000000000002.meta.json +0 -0
  307. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad600000000000001.jsonl +0 -0
  308. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad600000000000001.meta.json +0 -0
  309. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad600000000000002.jsonl +0 -0
  310. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad600000000000002.meta.json +0 -0
  311. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad700000000000001.jsonl +0 -0
  312. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad700000000000001.meta.json +0 -0
  313. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad800000000000001.jsonl +0 -0
  314. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/agent-ad800000000000001.meta.json +0 -0
  315. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_resolved/journal.jsonl +0 -0
  316. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_unresolved/agent-ad900000000000001.jsonl +0 -0
  317. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_unresolved/agent-ad900000000000001.meta.json +0 -0
  318. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/journal_state_unresolved/journal.jsonl +0 -0
  319. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/missing_artifact/agent-ac600000000000001.jsonl +0 -0
  320. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/missing_artifact/agent-ac600000000000001.meta.json +0 -0
  321. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/missing_artifact/agent-ac600000000000002.jsonl +0 -0
  322. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/missing_artifact/agent-ac600000000000002.meta.json +0 -0
  323. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/missing_artifact/journal.jsonl +0 -0
  324. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_a0000000-001/journal.jsonl +0 -0
  325. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_b0000000-002/agent-a1111111111111111.jsonl +0 -0
  326. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_b0000000-002/agent-a1111111111111111.meta.json +0 -0
  327. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_b0000000-002/agent-a2222222222222222.jsonl +0 -0
  328. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_b0000000-002/agent-a2222222222222222.meta.json +0 -0
  329. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_b0000000-002/journal.jsonl +0 -0
  330. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_c0000000-003/journal.jsonl +0 -0
  331. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/redaction_adversarial/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-960/agent-ad100000000000001.jsonl +0 -0
  332. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/redaction_adversarial/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-960/agent-ad100000000000001.meta.json +0 -0
  333. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/redaction_adversarial/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-960/journal.jsonl +0 -0
  334. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/self_reference/agent-af000000000000001.jsonl +0 -0
  335. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/self_reference/agent-af000000000000001.meta.json +0 -0
  336. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/self_reference/agent-af000000000000002.jsonl +0 -0
  337. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/self_reference/agent-af000000000000002.meta.json +0 -0
  338. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/self_reference/agent-af000000000000003.jsonl +0 -0
  339. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/self_reference/agent-af000000000000003.meta.json +0 -0
  340. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/self_reference/agent-af000000000000004.jsonl +0 -0
  341. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/self_reference/agent-af000000000000004.meta.json +0 -0
  342. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/self_reference/agent-af000000000000005.jsonl +0 -0
  343. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/self_reference/agent-af000000000000005.meta.json +0 -0
  344. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/self_reference/journal.jsonl +0 -0
  345. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_bridge_only/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  346. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac700000000000001.jsonl +0 -0
  347. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac700000000000001.meta.json +0 -0
  348. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac700000000000002.jsonl +0 -0
  349. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac700000000000002.meta.json +0 -0
  350. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  351. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_compaction/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-aca00000000000001.jsonl +0 -0
  352. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_compaction/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-aca00000000000001.meta.json +0 -0
  353. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_compaction/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  354. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_dedup/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  355. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_envelope/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac900000000000001.jsonl +0 -0
  356. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_envelope/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac900000000000001.meta.json +0 -0
  357. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_envelope/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  358. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_human_interrupt/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acc00000000000001.jsonl +0 -0
  359. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_human_interrupt/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acc00000000000001.meta.json +0 -0
  360. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_human_interrupt/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  361. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_parent_stop/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acb00000000000001.jsonl +0 -0
  362. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_parent_stop/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acb00000000000001.meta.json +0 -0
  363. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_parent_stop/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  364. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_unattributed_long/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acd00000000000001.jsonl +0 -0
  365. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_unattributed_long/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acd00000000000001.meta.json +0 -0
  366. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_unattributed_long/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  367. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_unattributed_short/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ace00000000000001.jsonl +0 -0
  368. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_unattributed_short/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ace00000000000001.meta.json +0 -0
  369. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/session_unattributed_short/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  370. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/structured_output_corrupt/agent-ac400000000000001.jsonl +0 -0
  371. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/structured_output_corrupt/agent-ac400000000000001.meta.json +0 -0
  372. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/fixtures/runs/structured_output_corrupt/journal.jsonl +0 -0
  373. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/g_corpus_support.py +0 -0
  374. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/g_helpers.py +0 -0
  375. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/g_independent_return.py +0 -0
  376. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/n3b_helpers.py +0 -0
  377. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/n3b_planted.py +0 -0
  378. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/n4_reference_commands.py +0 -0
  379. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/n4b2_helpers.py +0 -0
  380. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/n5b_helpers.py +0 -0
  381. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/n5c1_helpers.py +0 -0
  382. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/n5c2_helpers.py +0 -0
  383. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/n6_helpers.py +0 -0
  384. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/privacy_rules.py +0 -0
  385. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/rule_fixtures.py +0 -0
  386. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_attempt_facts.py +0 -0
  387. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_attempt_failed.py +0 -0
  388. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_attribution.py +0 -0
  389. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_bug_report.py +0 -0
  390. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_claim_contradiction.py +0 -0
  391. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_cli_smoke.py +0 -0
  392. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_codex_unavailable.py +0 -0
  393. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_config.py +0 -0
  394. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_deep_lines.py +0 -0
  395. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_detectors_base.py +0 -0
  396. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_detectors_core.py +0 -0
  397. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_detectors_registry.py +0 -0
  398. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_detectors_tooling.py +0 -0
  399. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_disclosure_primitives.py +0 -0
  400. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_empty_state.py +0 -0
  401. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_export.py +0 -0
  402. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_export_public.py +0 -0
  403. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fa_fork.py +0 -0
  404. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fa_generations.py +0 -0
  405. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fa_path_token.py +0 -0
  406. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fa_return_boundary.py +0 -0
  407. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fa_wasted.py +0 -0
  408. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fb_here.py +0 -0
  409. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fb_live_now.py +0 -0
  410. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fb_rescue_live.py +0 -0
  411. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix10_redact.py +0 -0
  412. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix11_redact.py +0 -0
  413. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix12_redact.py +0 -0
  414. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix1_commit.py +0 -0
  415. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix1_launch.py +0 -0
  416. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix1_poll.py +0 -0
  417. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix1_redact.py +0 -0
  418. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix2_launch.py +0 -0
  419. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix2_poll.py +0 -0
  420. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix2_redact.py +0 -0
  421. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix3_redact.py +0 -0
  422. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix4_fuzz.py +0 -0
  423. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix4_lexer.py +0 -0
  424. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix4_redact.py +0 -0
  425. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix4_sinks.py +0 -0
  426. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix5_lexer.py +0 -0
  427. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix5_redact.py +0 -0
  428. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix5_sinks.py +0 -0
  429. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix6_fuzz.py +0 -0
  430. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix6_hook.py +0 -0
  431. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix6_lexer.py +0 -0
  432. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix6_redact.py +0 -0
  433. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix6_sinks.py +0 -0
  434. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix6b_title.py +0 -0
  435. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix7_e2e.py +0 -0
  436. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix7_fuzz.py +0 -0
  437. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix7_redact.py +0 -0
  438. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix7_sinks.py +0 -0
  439. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix7_title.py +0 -0
  440. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix8_e2e.py +0 -0
  441. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix8_fuzz.py +0 -0
  442. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix8_redact.py +0 -0
  443. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix8_sinks.py +0 -0
  444. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix9_e2e.py +0 -0
  445. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix9_fuzz.py +0 -0
  446. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix9_redact.py +0 -0
  447. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_fix9_sinks.py +0 -0
  448. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_scan.py +0 -0
  449. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_table.py +0 -0
  450. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fc_wording.py +0 -0
  451. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_filter_scope.py +0 -0
  452. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fixa_discovery.py +0 -0
  453. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fixa_enqueue.py +0 -0
  454. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_fixa_reader.py +0 -0
  455. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_g_a1_hooks.py +0 -0
  456. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_g_a1_return.py +0 -0
  457. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_g_b1.py +0 -0
  458. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_g_c.py +0 -0
  459. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_g_commit_sentences.py +0 -0
  460. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_g_commits.py +0 -0
  461. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_g_consumers.py +0 -0
  462. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_g_corpus.py +0 -0
  463. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_g_denied.py +0 -0
  464. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_g_failed.py +0 -0
  465. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_g_here.py +0 -0
  466. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_g_hooks.py +0 -0
  467. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_g_registry.py +0 -0
  468. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_g_rescue.py +0 -0
  469. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_g_return.py +0 -0
  470. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_g_selfreport.py +0 -0
  471. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_hooks_benchmark.py +0 -0
  472. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_hooks_cli.py +0 -0
  473. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_journal_malformed_fields.py +0 -0
  474. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_journal_state.py +0 -0
  475. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_model_allocation_guard.py +0 -0
  476. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n1_markers.py +0 -0
  477. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n1_parent_index.py +0 -0
  478. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n2_lifecycle.py +0 -0
  479. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_apply.py +0 -0
  480. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_canonical_ids.py +0 -0
  481. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_context.py +0 -0
  482. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_demo.py +0 -0
  483. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_first_line.py +0 -0
  484. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixa_dedupe.py +0 -0
  485. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixa_demo.py +0 -0
  486. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixa_local_path.py +0 -0
  487. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixa_names.py +0 -0
  488. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixa_paths_c4.py +0 -0
  489. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixa_paths_c6.py +0 -0
  490. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixa_paths_s10.py +0 -0
  491. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixa_paths_s4.py +0 -0
  492. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixa_titles.py +0 -0
  493. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixb_hook_group.py +0 -0
  494. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixb_noident_pointer.py +0 -0
  495. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixb_repr_tokens.py +0 -0
  496. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixb_rescue_c1.py +0 -0
  497. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixb_run_ids.py +0 -0
  498. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixb_traversal.py +0 -0
  499. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixr2_ids.py +0 -0
  500. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixr2_paths.py +0 -0
  501. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixr2_raw_dupes.py +0 -0
  502. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_fixr2_schema2_hostile.py +0 -0
  503. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_flags.py +0 -0
  504. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_handler_errors.py +0 -0
  505. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_hooks.py +0 -0
  506. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_local_path.py +0 -0
  507. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_local_scrub.py +0 -0
  508. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_parser_errors.py +0 -0
  509. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_part2_slow_path.py +0 -0
  510. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_part3_sinks.py +0 -0
  511. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_pointers.py +0 -0
  512. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_reader.py +0 -0
  513. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_rescue.py +0 -0
  514. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_residual_sinks.py +0 -0
  515. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_rules_trend.py +0 -0
  516. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_run_fallback.py +0 -0
  517. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_run_local.py +0 -0
  518. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_run_noncanonical_agent.py +0 -0
  519. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_run_path_matrix.py +0 -0
  520. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_run_share.py +0 -0
  521. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_scan.py +0 -0
  522. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_slow_path.py +0 -0
  523. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n3b_watch.py +0 -0
  524. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4a_base_repo.py +0 -0
  525. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4a_lexer.py +0 -0
  526. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4a_measure.py +0 -0
  527. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4a_readonly.py +0 -0
  528. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4a_rows.py +0 -0
  529. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4a_write_grammar.py +0 -0
  530. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4b1_discovery.py +0 -0
  531. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4b1_reader_facts.py +0 -0
  532. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4b1_schema2.py +0 -0
  533. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4b2_forms.py +0 -0
  534. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4b2_measure.py +0 -0
  535. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4b2_population.py +0 -0
  536. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4b2_reasons.py +0 -0
  537. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4b2_repo_groups.py +0 -0
  538. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4b2_rows.py +0 -0
  539. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4fixb_c3.py +0 -0
  540. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4fixb_minor.py +0 -0
  541. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4fixb_s3.py +0 -0
  542. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4fixb_s4.py +0 -0
  543. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4fixb_s5_s10.py +0 -0
  544. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4fixc_a4.py +0 -0
  545. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4fixd_a5.py +0 -0
  546. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n4fixe_a5.py +0 -0
  547. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5_schema3_goldens.py +0 -0
  548. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5a1_schema3.py +0 -0
  549. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5a2_docs.py +0 -0
  550. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5b_detectors.py +0 -0
  551. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5b_inputs.py +0 -0
  552. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5b_severity.py +0 -0
  553. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5b_verdict.py +0 -0
  554. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5c1_gaps.py +0 -0
  555. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5c1_look.py +0 -0
  556. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5c1_observation_export.py +0 -0
  557. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5c1_observe.py +0 -0
  558. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5c1_rescue.py +0 -0
  559. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5c1_returned.py +0 -0
  560. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5c1_work_at_risk.py +0 -0
  561. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5c2_exit_codes.py +0 -0
  562. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5c2_misc.py +0 -0
  563. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5c2_status_repos.py +0 -0
  564. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5fix1_misc.py +0 -0
  565. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5fix1_plan.py +0 -0
  566. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5fix1_returned.py +0 -0
  567. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5fix1_severity.py +0 -0
  568. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n5fix1_status.py +0 -0
  569. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n6_alias_state.py +0 -0
  570. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n6_cwd.py +0 -0
  571. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n6_docs.py +0 -0
  572. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n6_fix1.py +0 -0
  573. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n6_here_run.py +0 -0
  574. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n6_here_scan.py +0 -0
  575. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n6_pins.py +0 -0
  576. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n6_resolve.py +0 -0
  577. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n6_roundtrip.py +0 -0
  578. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n7_detectors.py +0 -0
  579. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n8_fix1.py +0 -0
  580. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n8_fix2.py +0 -0
  581. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n8_k1_killed.py +0 -0
  582. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n8_k2_what_to_do.py +0 -0
  583. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n8_k4_rescue.py +0 -0
  584. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n8_k5_watch.py +0 -0
  585. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_n8_k6_rules.py +0 -0
  586. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_no_lazy_fetch.py +0 -0
  587. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_observe.py +0 -0
  588. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_privacy.py +0 -0
  589. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_r1_scan_risk_parity.py +0 -0
  590. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_reader.py +0 -0
  591. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_reader_session.py +0 -0
  592. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_readme.py +0 -0
  593. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_redact.py +0 -0
  594. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_rel_demo.py +0 -0
  595. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_rel_scan_all.py +0 -0
  596. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_rendered_privacy.py +0 -0
  597. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_report_session.py +0 -0
  598. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_report_v2.py +0 -0
  599. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_rescue.py +0 -0
  600. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_rules.py +0 -0
  601. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_rules_propose.py +0 -0
  602. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_rules_review.py +0 -0
  603. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_scan_triage.py +0 -0
  604. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_state.py +0 -0
  605. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_tooling_agent_scope.py +0 -0
  606. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_trend.py +0 -0
  607. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_watch.py +0 -0
  608. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_wheel.py +0 -0
  609. {agent_postmortem-0.3.6 → agent_postmortem-0.5.0}/tests/test_workflows.py +0 -0
@@ -5,6 +5,226 @@ All notable changes to this project are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.5.0]
9
+
10
+ 0.5 tells a session about the workers it launched, with nothing to arm. Claude Code records a
11
+ background session's state in its job file and tells nobody: a worker sat 8.5 hours on a
12
+ permission prompt while the session that launched it heard nothing. Now that session reads one
13
+ line at its next tool call or prompt, and an idle session is woken for it. This needs the plugin;
14
+ without it, `status` and `scan` print the same reasons when someone runs them.
15
+
16
+ ### Added
17
+
18
+ - Worker notice. The plugin reads the `claude --bg` in the session's own Bash call and follows
19
+ that worker from then on: `WORKER night-run (a1b2c3d4) blocked 15m: waiting for a permission
20
+ approval (approve Entering worktree). A person must approve it: claude attach a1b2c3d4`. A
21
+ permission prompt, a question, a first prompt never sent, an API error, a failure and a worker
22
+ idle on a stuck command each have their own line, told once per change at the next tool call
23
+ or prompt, ahead of anything else the hook has to say. A worker that delivered gets a one-line
24
+ note with no problem word. The worker's own words are never printed: only the name its launch
25
+ printed, the short id and a permission's tool. A worker that finishes on its own schedule is
26
+ told finishing twice, then not until trouble. A first look after an upgrade tells trouble from
27
+ the last 24 hours and deliveries from the last 10 minutes, and records the rest silently. A
28
+ launch by a subagent, by another session or by a Bash call that ran in the background is not
29
+ linked; `status` and `scan` still list those workers.
30
+ - Idle wake. Every Stop starts a watcher (`hook stop-watch`, an `asyncRewake` hook) when the
31
+ session has a worker or a running command to follow, and it wakes an idle session with the
32
+ same line. It checks every 20 s, wakes at most once per 5 minutes, leaves as soon as the session
33
+ acts again, and gives a worker's own report 2 minutes to arrive before it wakes for a delivery.
34
+ A session is never woken for a line it could not record as told, and any error exits without
35
+ waking it. It needs Claude Code 2.1.314 or later, a reboot loses it until the next Stop, and
36
+ `AGENT_POSTMORTEM_WAKE=0` turns it off. A running session starts it after `/reload-plugins` or
37
+ a restart; the per-call line does not need either.
38
+ - Reason classes in `status` and `scan`. A BLOCKED row says what the session waits for
39
+ (`waiting for a permission approval`, `waiting for an answer`, `stopped on an API error`, `the
40
+ reason is not recorded`) and `dispatched by this session` when it did, those rows first. A
41
+ worker that delivered and waits on a decision has its own DELIVERED row. `--local` adds the
42
+ tool and the command that helps (`-> claude attach <id>`, `-> claude logs <id>`), `status
43
+ --json` adds `class` and `mine`, and `--local` adds `label` and `short`. Another session's row
44
+ older than 3 days folds into one count line.
45
+ - `scan` lists under NEEDS ATTENTION every background session waiting on a person or failed in
46
+ the last day, read at scan time and whatever `--since` says, the caller's own workers first. One
47
+ that delivered is not listed. `scan --json` gains `blocked` only when one is listed.
48
+ - Stall checks. A background command whose output has not changed for 30 minutes, or whose output
49
+ ends in codex's "Reading additional input from stdin..." for 2 minutes, is told once through a
50
+ COMMAND line at the next tool call or prompt. `status` prints a STALLED row and `scan` lists the
51
+ session first under NEEDS ATTENTION when its process is alive, its turn ended 30 minutes ago and
52
+ nothing is set to wake it. The BACKGROUND line counts such a session as stalled, not working. A
53
+ command under a real `timeout`, a timer by any path to `sleep`, or one carrying the marker
54
+ `# postmortem: silent-wait` is quiet by design, and only the stdin rule still speaks for it. So
55
+ is `perl -e 'alarm N; exec @ARGV' ...` or `'alarm shift; exec @ARGV' N ...`, in that exact shape
56
+ with only exact, literal steps around it. Any other wrapper is told once, in words that say it
57
+ may be fine: a loose rule would silence the only alarm for a real hang.
58
+ - Codex stdin warning. `hook pre-bash` warns before a background `codex exec` with no stdin
59
+ redirect runs: codex reads stdin to its end when it is not a terminal, and one review hung
60
+ 26 hours that way.
61
+ - A Stop with a background command still running asks the session to arm a deadline, once per
62
+ command, wherever the idle watcher would not catch a hang: an interactive session, an older
63
+ Claude Code or plugin, or a command whose output the watcher cannot read (`> "$LOG"`).
64
+ A Monitor or a wake that can still fire counts as that deadline.
65
+ - A background session whose subagents and workflows have all ended, with no `status`, `scan`,
66
+ `run` or `watch` of this tool since, is reminded once at a Stop with nothing else to say to run
67
+ `status` before reporting done. An interactive session gets none, and
68
+ `AGENT_POSTMORTEM_WATCH_HINT=0` turns it off.
69
+ - At a session start with nothing else to say, at most once a day, the plugin says so when the
70
+ `agent-postmortem` on PATH is older than the plugin and its newer hooks stay silent. `hook
71
+ capabilities` lists `hooks`, and an older CLI is never started for `stop-watch`.
72
+
73
+ ### Changed
74
+
75
+ - A tool call with nothing new starts about a third faster: 26 ms down to 15 ms for the CLI on Linux,
76
+ measured in a container. It no longer loads `dataclasses`, `tempfile`, `secrets` or `datetime`,
77
+ nor OpenSSL where Python has its builtin sha256, and that call uses none of them. Every tool call
78
+ of every session pays this.
79
+ - `watch` flushes every line. A Monitor reads it through a pipe, where block buffering delivered
80
+ nothing until the run ended. It also stops quietly when its reader closes the pipe.
81
+ - `watch --session`, `status` and `scan` read a worker's `tempo` before its `state`, which is
82
+ written only when a turn ends: a worker on a permission prompt reads `state: working, tempo:
83
+ blocked`, and one given a new prompt reads `state: blocked, tempo: active`.
84
+ - The top-level help names `watch --session` and a background worker's blocked or needs-input
85
+ state.
86
+ - In a session that is itself a background worker, `status` lists only the rows it launched and
87
+ ends the count line with `; this session launched <n>, scan lists the rest`. `--json` keeps every
88
+ row with its owner, and if it launched a worker whose id it never saw, all rows stay.
89
+
90
+ ### Fixed
91
+
92
+ - `status` no longer keeps a finished subagent as RUNNING. A subagent resumed by a message ends
93
+ with a notice naming only its task, no tool-use id, and the live read dropped it, so the first
94
+ notice stood while the transcript grew past it. It now counts when the task is a subagent this
95
+ session launched.
96
+ - A commit's id is read per segment of the shell command. When an assignment or expansion
97
+ elsewhere in the command made the whole command unplaced, an agent's printed summary line was
98
+ dropped and its COMMITS read `?`. Substitutions that spell a commit still read `?`.
99
+ - A Monitor no longer gets the deadline request (Claude Code lists it as a plain shell task, so a
100
+ Monitor is now known from the session's own Monitor calls), and a deliberately silent wait no
101
+ longer reads as hung and suggests stopping it.
102
+ - On CI the hook-speed test compares a nothing-new call with a bare start of the same interpreter
103
+ in interleaved rounds. A shared runner read 152 ms against the 150 ms budget on a correct
104
+ build; the 150 ms test still runs where CI is unset.
105
+
106
+ ## [0.4.0]
107
+
108
+ 0.4 adds live mode: the tool checks a subagent's "done" the moment it returns, and tells the
109
+ main agent at its next tool call, with nothing to arm. It speaks only for what Claude Code does
110
+ not already say: an interrupt nothing in the session explains, a failure that left files
111
+ changed, and a return its own transcript contradicts. A second `scan` is fast.
112
+
113
+ ### Added
114
+
115
+ - Per-call live checks. The plugin runs `hook post-tool` after every tool call and
116
+ `hook prompt-submit` on every prompt. When one of the session's own subagents was interrupted
117
+ with nothing in the session to explain it, failed after changing files (with the count), or
118
+ returned while its own last entry is an error or the file its prompt asked for is missing,
119
+ the agent hears it at its next tool call, or at its next prompt if it sat idle. A call with
120
+ nothing new prints nothing: 58 ms median through the plugin with its bundled CLI, about
121
+ 130 ms with a CLI on PATH, which the plugin checks at every call.
122
+ Each ending is told once across every channel: these hooks, `watch --session`, Stop and the
123
+ resume sentence.
124
+ - `agent-postmortem watch --session [SESSION_ID|PATH]` follows one session, for a Claude Code
125
+ Monitor on a long background run. It prints a line only for the endings above, passes
126
+ background-session state changes through, says ENDED when the session exits, and a re-armed
127
+ watch never repeats a line.
128
+ - `agent-postmortem status [SESSION]` prints one snapshot of a session: its subagents running,
129
+ returned, interrupted or failed, what an interrupted one changed, returns their own
130
+ transcripts contradict, how each of its workflows ended, and the background sessions' states
131
+ as Claude Code records them. With no argument it reads the calling session. A second call
132
+ reads only what was appended (0.13 to 0.37 s warm on the maintainer's machine). A session
133
+ that ran shell commands in the background (for example a `codex exec` worker) gets one
134
+ COMMANDS line counting them by how Claude Code says they ended, with the oldest running
135
+ one's age, and saying that status does not check their output.
136
+ - `agent-postmortem statusline subagents` is a `subagentStatusLine` command for Claude Code's
137
+ subagent panel. It rewrites a row only when it has something to add: an interrupt nothing in
138
+ the session explains, how many paths an interrupted or failed subagent changed, a return its
139
+ own last entry contradicts, or quiet time over two minutes. `AGENT_POSTMORTEM_STATUSLINE=0`
140
+ turns it off.
141
+ - `hook agent-launched` runs on every Agent and Task launch. A foreground subagent that returns
142
+ on an error or without its prompted output file is reported in the same hook. The first
143
+ background launch of a session says that its subagents are checked when they return and
144
+ that a Monitor running `watch --session` is an option for a long run; a foreground launch
145
+ gets no hint, and `AGENT_POSTMORTEM_WATCH_HINT=0` turns it off.
146
+ - `hook session-start` on a resumed session says how many of its own subagents never returned
147
+ or were interrupted before it stopped, and how many paths they changed, unless a live
148
+ channel already told it.
149
+ - `watch <RUN_ID>` checks each result the moment it lands. A workflow agent that returns
150
+ `ok: false`, failed tests, failure counts or a report path that does not exist gets a CLAIM
151
+ line in place of its OK line, so the main agent hears about it before using the result.
152
+ - `agent-postmortem --version` names the build when it was installed from a git checkout, as
153
+ `agent-postmortem <version> (<branch> <commit>, <date>)`, with `+dirty` when tracked files
154
+ were modified. A release prints the plain version, and `hook capabilities` always does.
155
+ - The plugin keeps its bundled CLI at the plugin's version. Before, it installed one only when
156
+ none was found, so a plugin upgrade left the old CLI in place. Now SessionStart compares the
157
+ bundled CLI's version with the plugin's and, when they differ, reinstalls the plugin's
158
+ version in the background, at most once a day per version. A CLI you installed yourself on
159
+ PATH is never touched, and neither is a bundled CLI that is a link to a CLI outside the
160
+ plugin's data directory.
161
+
162
+ ### Changed
163
+
164
+ - A second `scan` is fast. Each run's analysis is cached by the exact size, time and inode of
165
+ every file it reads, and is read again the moment any of them changes, a path it checked
166
+ appears or disappears, the config or version changes, or its 72-hour report window closes.
167
+ A transcript that grew is parsed again on its own, so a live session with hundreds of
168
+ subagents no longer makes every scan slow: on the maintainer's machine a warm scan takes
169
+ 2.7 s after the largest session grew, where it took 17 to 23 s. A warm scan prints exactly
170
+ what a cold one prints. `--no-cache` reads everything.
171
+ - `scan --since D` no longer reads runs it is about to drop: a run whose files were all last
172
+ written more than a day before D is skipped before it is parsed. The result set is the same,
173
+ except for a run with no readable event at all, which has no start date and can be left out.
174
+ The totals line says `SINCE D` instead of `ALL TIME`.
175
+ - `scan` says it is working. On a terminal one stderr line counts the runs read and is erased
176
+ at the end; elsewhere, a scan of more than 50 runs prints one line when it starts.
177
+ - The `missing_artifact` path rule, shared with the live check: a path must start a token,
178
+ templates (`<case>`, `{id}`, `*`, `$VAR`) are skipped, and a period that ends the sentence
179
+ right after a path no longer hides it. On the maintainer's 355 runs this removes 12 info
180
+ findings (placeholders and slashes inside relative paths) and adds 16, all in sessions
181
+ built to leave that file missing.
182
+ - README: a table maps the live words KILL, FAILED and CLAIM to what `scan` and `run` print.
183
+
184
+ ### Fixed
185
+
186
+ - A subagent that another subagent launched in the foreground no longer stays RUNNING
187
+ ("quiet 7d") in `status`, the resume sentence and the per-call check after it returned. Its
188
+ result lands in its launcher's transcript as a "[Subagent hand-back]" with no notice in the
189
+ main one; live mode now reads it there, as `run` already did.
190
+ - The share-label fix of 0.3.6 also covers an attempt whose journal entry has no key and an
191
+ agent id that carries two labels. Such an attempt's interrupt finding is told as the run's
192
+ story, and its label is now replaced there too.
193
+ - A forked session no longer owns its parent's history when the copied entries carry the fork's
194
+ own `sessionId` (Claude Code 2.1.305 and later). The hook attachments in the copied block still
195
+ name the session that wrote them, and that now marks where the fork's own entries begin. On a
196
+ background session forked from its dispatcher, `status` had counted the dispatcher's subagent
197
+ as running and `run` had said WORK AT RISK unknown; both now read 0 subagents.
198
+ - `rescue plan` on a session names, under BRIEF FOR A RELAUNCH, only what the rescued subagents
199
+ wrote. It listed every subagent's files, so a relaunched agent was told to build on other
200
+ agents' work. A workflow's brief still covers the whole run.
201
+ - A commit run behind `NAME=VALUE`, `env NAME=VALUE` or `mise exec ... --` counts as a commit
202
+ command, so an agent that committed that way and printed no summary line reads `COMMITS ?`
203
+ instead of `0`.
204
+ - `scan --since <today>` could print more runs under SINCE than under LAST 7 DAYS. A run whose
205
+ files carry no timestamp is kept by `--since`; the 7-day line now places it by its newest
206
+ file write too.
207
+ - `status --local` and `--raw` print real agent ids (the `agent-<id>.jsonl` names), and a blocked
208
+ or failed background session's own name and working directory. Before, `--no-redact` printed
209
+ the same aliases as the default, which ends with one line saying what `--local` adds.
210
+ - `scan` marks the caller's own runs: a triage row ends in `(this session)` or
211
+ `(started by this session)` when `CLAUDE_CODE_SESSION_ID` names that session.
212
+ - A story's count agrees with its noun: `1 Bash command backgrounded`, not `1 Bash commands`.
213
+ - An unattributed interrupt's title says what the transcript logged: `..., cause unattributed,
214
+ logged as a user interrupt, consistent with a runtime kill`.
215
+ - `status` says how each of the session's workflows ended. Open ones keep their `watch` command,
216
+ a failed, killed or stopped one points at `run`, and completed ones are one count line, where
217
+ a long session printed one watch line per workflow.
218
+ - A worktree removed after its run (a merged branch, cleaned up) no longer reads as false
219
+ alarms: its report files are named as in a directory that no longer exists, WHAT TO DO stops
220
+ asking to check them, WORK AT RISK names the removed directory instead of a `git status`
221
+ command for it, and `status` makes no CLAIM of an output there.
222
+ - `rules propose` reads through scan's cache: 101 s on 382 runs before, 1.2 s warm.
223
+ - A no-match error repeats a typed `wf_` or `s_` id and says `agent-postmortem scan --all` lists
224
+ every run id.
225
+ - A FAILED workflow whose agents all completed says that Claude Code reported the failure and to
226
+ check what the workflow itself returned.
227
+
8
228
  ## [0.3.6]
9
229
 
10
230
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agent-postmortem
3
- Version: 0.3.6
3
+ Version: 0.5.0
4
4
  Summary: Reads the Claude Code logs already on your machine and tells you which agent's 'done' you can't trust, and what to run next.
5
5
  Project-URL: Homepage, https://github.com/zeyusuntt/agent-postmortem
6
6
  Project-URL: Issues, https://github.com/zeyusuntt/agent-postmortem/issues
@@ -23,9 +23,13 @@ Description-Content-Type: text/markdown
23
23
 
24
24
  # agent-postmortem
25
25
 
26
- Which "done" in your last Claude Code run can't you trust?
26
+ Claude Code records the state. The plugin tells you.
27
27
 
28
- agent-postmortem reads the transcripts Claude Code already wrote under `~/.claude/projects` and, for every Workflow run and every session with subagents, says which agents were killed (in a Workflow, often quietly started over), which never returned, which said "done" while their own result said otherwise, and which files and commits that left at risk. Then it lists at most 3 next steps. No setup, no proxy, no LLM, no network access, and it never changes your files.
28
+ One night a background worker sat 8.5 hours on a permission prompt. Its job file said `blocked` and `approve Entering worktree`, the session that launched it heard nothing, and its agent list showed the worker as idle. With the plugin, that session reads this at its next tool call, and an idle session is woken for it: `WORKER night-run (a1b2c3d4) blocked 15m: waiting for a permission approval (approve Entering worktree). A person must approve it: claude attach a1b2c3d4`.
29
+
30
+ Nothing has to be armed. The plugin reads the `claude --bg` in the session's own Bash call and follows that worker from then on. A permission prompt, a question, an API error, a failure, or a worker idle on a command that never ends is told once per change, and a worker that delivered gets a one-line note. `AGENT_POSTMORTEM_WAKE=0` keeps a session from being woken.
31
+
32
+ Which "done" in your last Claude Code run can't you trust? agent-postmortem reads the transcripts Claude Code already wrote under `~/.claude/projects` and, for every Workflow run and every session with subagents, says which agents were killed (in a Workflow, often quietly started over), which never returned, which said "done" while their own result said otherwise, and which files and commits that left at risk. Then it lists at most 3 next steps. No setup, no proxy, no LLM, no network access, and it never changes your files.
29
33
 
30
34
  On the maintainer's machine (scan 2026-10-27, 0.3.2), 13 of 166 workflow runs launched at least one agent's task a second time, and 10.2 hours went to retries and to attempts that ended without a result.
31
35
 
@@ -35,7 +39,7 @@ uvx agent-postmortem scan
35
39
 
36
40
  That runs the latest release from PyPI with [uv](https://docs.astral.sh/uv/), which fetches Python 3.11 or later if you don't have it; nothing else to install. On a machine with no runs yet it says where it looked and suggests `agent-postmortem demo`.
37
41
 
38
- The command-line tool is local and read-only: Python standard library only, no LLM, no network access, and it never changes your files, transcripts, commits, or branches. (The Claude Code plugin's one network action, installing that tool, is described under Privacy; Limits notes two rare git index modes in which git's own `status` still updates its bookkeeping.) What it covers, below, lists the run shapes it handles and the ones it does not yet. Status: alpha, used so far on the maintainer's own machines. Claude Code only.
42
+ The command-line tool is local and read-only: Python standard library only, no LLM, no network access, and it never changes your files, transcripts, commits, or branches. (The Claude Code plugin's one network action, installing that tool into its own data directory or replacing that copy with the plugin's version, is described under Privacy; Limits notes two rare git index modes in which git's own `status` still updates its bookkeeping.) What it covers, below, lists the run shapes it handles and the ones it does not yet. Status: alpha, used so far on the maintainer's own machines. Claude Code only.
39
43
 
40
44
  [![CI](https://github.com/zeyusuntt/agent-postmortem/actions/workflows/ci.yml/badge.svg)](https://github.com/zeyusuntt/agent-postmortem/actions/workflows/ci.yml)
41
45
  [![PyPI](https://img.shields.io/pypi/v/agent-postmortem.svg)](https://pypi.org/project/agent-postmortem/)
@@ -88,9 +92,9 @@ Coverage today, checked against the failure reports in Claude Code's issue track
88
92
  | Workflow runs: runtime kills and retries | covered | kills logged as `[Request interrupted by user]` with no one at the keyboard, cold same-key retries and the time they cost, failed attempts with their cause (usage limit and reset time, machine sleep, server error), and a workflow the harness reported failed |
89
93
  | A "done" you can't trust | covered | an agent that completed while its own result reports failed tests, `ok: false` or blockers (`claim_contradiction`), or while its Codex companion call never started (`codex_unavailable`) |
90
94
  | Subagents that never returned | covered | WORK AT RISK says `unknown` instead of `none`, and names them |
91
- | `claude -p` (headless) | partial | killed and unreturned subagents show; the process's own exit status (for example exit 0 with `result: success` after a kill) is not in the transcript, so the tool cannot see it |
95
+ | `claude -p` (headless) | partial | killed and unreturned subagents show; with the plugin, a foreground subagent that returns on an error or without its prompted output file is reported at once. The process's own exit status (for example exit 0 with `result: success` after a kill) is not in the transcript, so the tool cannot see it |
92
96
  | Background subagents (`run_in_background`) | partial | killed and unreturned ones show; a "completed" that arrived while the agent's own background work was still running, or with a tool call that never got a result, is not flagged yet |
93
- | `claude --bg` sessions | not yet | each job's session is read like any session, but the job's own state (its "done" line, work still in flight) is not |
97
+ | `claude --bg` sessions | partial | with the plugin, the session that launched a worker is told each change at its next tool call or prompt and woken when idle (permission prompt, question, API error, failure, a stuck command, delivered). `status` and `scan` give the same reason when someone runs them, and `watch --session` prints each state change. Not linked: a launch by a subagent, by another session, or by a Bash call that itself ran in the background; `status` and `scan` still list those. "No report past its expected time" is not covered, since nothing records an expected time |
94
98
  | Agent teams | not yet | teammates and their idle or blocked states are not modeled |
95
99
  | Cross-session messages (`SendMessage`) | not yet | whether a message was delivered is not checked |
96
100
 
@@ -139,9 +143,12 @@ Verdict: 0.3 stops guessing. Severity, the WORK AT RISK block, and the run's end
139
143
  | `agent-postmortem rescue plan <run-id>` | Print a read-only decision packet: what a killed or failed attempt wrote, its repo state, declared checks, and the steps to take next. Never edits anything or runs a check itself. |
140
144
  | `agent-postmortem rescue status <run-id>` | Print what the main session's own transcript shows was run and observed after the run ended. Reports only what it saw, never a confirmation that a check passed. |
141
145
  | `agent-postmortem watch <run-id>` | Follow one running workflow: print START, then KILL, FAILED, OK (a result came back), and QUIET as they happen, then DONE or LIMIT. DONE comes the moment the session's own record says the run ended, or after a grace period once every journal key is resolved. Read-only, designed to be a Claude Code Monitor command. |
146
+ | `agent-postmortem watch --session [<session-id>]` | Follow one session while it runs, for a Claude Code Monitor: a line only when a subagent is interrupted with nothing in the session to explain it, fails after changing files, or returns while its own last entry says otherwise, plus background-session state changes. With no id it follows the session you are in. |
147
+ | `agent-postmortem status [<session-id>]` | One snapshot of a session: its subagents running, returned, interrupted or failed, what an interrupted one changed, returns its own transcript contradicts, and the background sessions' states with what each waits for and whether this session dispatched it (a session that is itself a background worker lists only the rows it launched). Reads only what was appended since the last call. |
148
+ | `agent-postmortem statusline subagents` | A `subagentStatusLine` command: adds a fact to a row of Claude Code's subagent panel and leaves every other row as Claude Code draws it. |
142
149
  | `agent-postmortem hook <event>` | Claude Code plugin hook entry point; reads hook JSON from stdin. |
143
150
 
144
- `scan`, `run`, `rules`, `trend`, and `rescue` take `--json` and the level flags; `apply` takes the level flags only; `demo` and `watch` take `--json` only; `hook` takes neither. The level flags are `--local` and `--raw` (`--no-redact` is the same as `--raw`); see Privacy.
151
+ `scan`, `run`, `rules`, `trend`, `rescue`, and `status` take `--json` and the level flags; `apply` takes the level flags only; `demo` and `watch` take `--json` only; `statusline` and `hook` take neither. The level flags are `--local` and `--raw` (`--no-redact` is the same as `--raw`); see Privacy.
145
152
 
146
153
  ## Why
147
154
 
@@ -187,7 +194,18 @@ Install the command-line tool first (Quick start above), so the plugin finds it
187
194
  /plugin install agent-postmortem@agent-postmortem
188
195
  ```
189
196
 
190
- Its hooks shell out to the same CLI, never touch a run directory, and never fail a turn. On `SessionStart` they summarize any run that finished since you last looked. On `Stop` and `StopFailure` they check every subagent and workflow unit spawned so far and print a finding the moment it is detected, not only at session end. On `SessionEnd` they run the read-only tooling checks over the main thread itself. On a `Workflow` launch they register the run immediately, so it is tracked even before its own directory exists, and hand the session the `watch` command to arm as a Monitor. Two skills come with it: `/postmortem` for the verdict and `/rescue` for the bounded rescue protocol.
197
+ Its hooks shell out to the same CLI, never touch a run directory, and never fail a turn. After every tool call and on every prompt they read the job files of the workers this session launched with `claude --bg` and tell each change once, in a `WORKER` line that says the state, the reason and what helps; at each Stop a watcher starts if there is something to follow, and it wakes the session when it has gone idle. It checks every 20 s, wakes at most once per 5 minutes, and leaves when the session acts again. It needs Claude Code 2.1.314 or later, a session already running starts it after `/reload-plugins` or a restart, and `AGENT_POSTMORTEM_WAKE=0` turns it off. After every tool call and on every prompt the hooks also check the session's own subagents: one that was interrupted with nothing in the session to explain it, failed after changing files, or returned while its own transcript contradicts the return is reported to the agent at its next tool call, once. A call with nothing new prints nothing. On `SessionStart` they summarize any run that finished since you last looked, and a resumed session hears which of its own subagents never returned. On `Stop` and `StopFailure` they check every subagent and workflow unit spawned so far and print a finding the moment it is detected, not only at session end. On `SessionEnd` they run the read-only tooling checks over the main thread itself. On a `Workflow` launch they register the run immediately, so it is tracked even before its own directory exists, and hand the session the `watch` command to arm as a Monitor. Two skills come with it: `/postmortem` for the verdict and `/rescue` for the bounded rescue protocol.
198
+
199
+ For your own view, add the subagent panel command to `~/.claude/settings.json`, at the top level:
200
+
201
+ ```json
202
+ "subagentStatusLine": {
203
+ "type": "command",
204
+ "command": "agent-postmortem statusline subagents"
205
+ }
206
+ ```
207
+
208
+ It rewrites a row of the subagent panel only when it has a fact to add (an interrupt nothing explains, how many paths an interrupted or failed subagent changed, a return its own last entry contradicts, quiet over two minutes) and leaves every other row as Claude Code draws it. `agent-postmortem status` prints the same facts for the session you are in.
191
209
 
192
210
  ## What it detects
193
211
 
@@ -214,6 +232,17 @@ The honesty rule: `mislabeled_kill` blames the runtime only when the same key wa
214
232
 
215
233
  The verdict follows from those severities: `FAILED` when the harness itself reported the workflow failed (or a finding is critical, which no detector produces today), `DEGRADED` when any finding is major, `CLEAN` otherwise, with `(INCOMPLETE)` added when the tool could not read everything. `run`, `demo`, and `scan` exit 3 for `FAILED` and 4 for `INCOMPLETE` without `FAILED`; 3 wins when both apply. They exit 2 when there is nothing to judge: no run matches, or no runs at all under the root, in which case the message says where it looked (`~/.claude/projects` by default), what it reads, and to try `agent-postmortem demo`.
216
234
 
235
+ ### Live words and report words
236
+
237
+ `watch`, `status`, the statusline and the hooks speak in three words; `scan` and `run` speak in
238
+ verdicts and detector names. A line to settle in one is the same thing in the other:
239
+
240
+ | Live line | What it means | In `scan` and `run` |
241
+ |---|---|---|
242
+ | `KILL` | a subagent was interrupted and nothing in the session explains it | `mislabeled_kill`, and `silent_retry` when a workflow restarted it |
243
+ | `FAILED` | an agent failed (usage limit, API error, stall) or the harness failed the workflow | `attempt_failed`; the verdict `FAILED` and `workflow_failed` |
244
+ | `CLAIM` | an agent said it was done, but its own result or its last entry says otherwise | `claim_contradiction`, `missing_artifact`, and `codex_unavailable` when a Codex review never ran |
245
+
217
246
  ### Quieting a detector
218
247
 
219
248
  A detector you have already acted on, or one that does not apply to how you work, can be quieted without losing its data. List its id in `~/.config/agent-postmortem/config.toml` (or `$XDG_CONFIG_HOME/agent-postmortem/config.toml`):
@@ -237,7 +266,7 @@ The default output is meant for sharing: names become aliases, every path the to
237
266
  | local | `--local` | real labels, phase titles, agent ids, and project names | a recognized path is relative to the repository, `~/.../<name>` inside your home directory, otherwise `path-N`; never a recognized absolute path | only with `--evidence` |
238
267
  | raw | `--raw` | real | absolute | only with `--evidence` |
239
268
 
240
- At `local` and `raw` the first line of a command's output says so and says not to paste it (an error printed alone on stderr carries no such line; at the default and `local` levels an error never echoes a path or id, and at `raw` it prints as 0.2 did). Hooks and `watch` always print at the default level. An error message never echoes a path or id you typed back at the default level: it says `path-1` or `value-1` and names what it expected.
269
+ At `local` and `raw` the first line of a command's output says so and says not to paste it (an error printed alone on stderr carries no such line; at the default and `local` levels an error never echoes a path or a private id, and at `raw` it prints as 0.2 did). Hooks and `watch` always print at the default level. An error message never echoes a path or id you typed back at the default level: it says `path-1` or `value-1` and names what it expected. The one exception is a public run id (`wf_...`, `s_...`), which is what `scan` prints and is repeated as typed.
241
270
 
242
271
  An alias is a prefix, 12 or more hex characters, of an HMAC of the real id under a secret created once on your machine. Once assigned, an alias never changes: the same agent has the same alias in `run`, `rescue`, `watch`, and hook messages, the same project in `scan --all` and `run`, and nobody without the secret can turn an alias back into the id or match it to a transcript file. On top of that, the default and `local` levels replace your home directory with `~`, a bare account name with `user`, an email with `email:` plus a 6-character hash, a session id inside text with `uuid:` plus its last 4 hex digits, and any other project slug with `project:` plus a 6-character hash.
243
272
 
@@ -247,7 +276,7 @@ Paths inside free text (finding titles, diagnostics, error messages, and at `--l
247
276
 
248
277
  State lives in `$XDG_STATE_HOME/agent-postmortem/`, or `~/.local/state/agent-postmortem/` if that variable is unset: `state.json` (which findings a session already reported, and the rules the 0.1 `apply` command wrote, now read-only history), plus `secret` and `aliases.json` for the aliases. All three are mode 0600. The secret and the registry are never printed; `trend` shows the applied-rule history from `state.json` at the active level. If a command prints `stable aliases unavailable` on stderr, that output named everything `agent-1`, `agent-2`, and so on instead of by alias; nothing is repaired automatically, because a new secret would change every alias. Remove both `secret` and `aliases.json` to start over with new aliases.
249
278
 
250
- The plugin's one network action happens on `SessionStart` only: when it has not installed a CLI into its own data directory and no `agent-postmortem` on `PATH` passes its protocol check, it installs the CLI from PyPI at the plugin's own version, or from the matching GitHub tag if that install fails, into that data directory, retrying at most once every 24 hours on failure; opt out by setting `AGENT_POSTMORTEM_NO_AUTO_INSTALL=1`, or by installing the CLI yourself first.
279
+ The plugin's one network action happens on `SessionStart` only: it installs the CLI into its own data directory (uv keeps its download cache, and Python if it has to fetch one, in its usual places) from PyPI at the plugin's own version, or from the matching GitHub tag if that install fails. It does so when it has not installed a CLI there and no `agent-postmortem` on `PATH` passes its protocol check, retrying at most once every 24 hours on failure, and when the CLI it installed there reports another version than the plugin's (after a plugin upgrade), in the background and at most once a day per version. A CLI on `PATH`, or a bundled CLI that is a link to one outside that directory, is never replaced. Opt out of both by setting `AGENT_POSTMORTEM_NO_AUTO_INSTALL=1`, or by installing the CLI yourself first.
251
280
 
252
281
  ## How it was built
253
282
 
@@ -255,7 +284,7 @@ It was built across two Claude Code Workflow runs, and those same runs are among
255
284
 
256
285
  ## Limits
257
286
 
258
- The formats this tool parses are internal to Claude Code, not a published API, and were observed on versions 2.1.251 to 2.1.312; a future version can change them without notice. A few transcript entry types first seen in 2.1.285 to 2.1.310 (`tools-used`, `relocated`, `agent-setting`, `history-suppression`, `continued-in`) are not interpreted yet, so an attempt whose transcript holds one reads as "the tool cannot see all of what was written". Claude Code deletes transcripts older than 30 days by default (the `cleanupPeriodDays` setting), and with them the history `scan`, `trend` and `rules propose` read; raise that setting to keep more. A session's retries are not observable the way a workflow's are: a session has no cache key to compare attempts against, so `silent_retry` never fires on one. Whether a main-session interrupt was a human pressing Escape is not knowable from the transcript, so it is never attributed, only recorded as a limit. Tested on macOS and Linux only. The repository check (`run --observe`, `rescue status`) uses `git status` to inspect paths, with every filter driver switched off and no network transport allowed; in a repository with a sparse index or a split index, git's own `status` can still store a cached tree object or refresh the shared index file's timestamps, without changing tracked content, commits, or branches.
287
+ The formats this tool parses are internal to Claude Code, not a published API, and were observed on versions 2.1.251 to 2.1.318; a future version can change them without notice. A few transcript entry types first seen in 2.1.285 to 2.1.310 (`tools-used`, `relocated`, `agent-setting`, `history-suppression`, `continued-in`) are not interpreted yet, so an attempt whose transcript holds one reads as "the tool cannot see all of what was written". Claude Code deletes transcripts older than 30 days by default (the `cleanupPeriodDays` setting), and with them the history `scan`, `trend` and `rules propose` read; raise that setting to keep more. A session's retries are not observable the way a workflow's are: a session has no cache key to compare attempts against, so `silent_retry` never fires on one. Whether a main-session interrupt was a human pressing Escape is not knowable from the transcript, so it is never attributed, only recorded as a limit. Tested on macOS and Linux only. The repository check (`run --observe`, `rescue status`) uses `git status` to inspect paths, with every filter driver switched off and no network transport allowed; in a repository with a sparse index or a split index, git's own `status` can still store a cached tree object or refresh the shared index file's timestamps, without changing tracked content, commits, or branches.
259
288
 
260
289
  ## Contributing
261
290
 
@@ -1,8 +1,12 @@
1
1
  # agent-postmortem
2
2
 
3
- Which "done" in your last Claude Code run can't you trust?
3
+ Claude Code records the state. The plugin tells you.
4
4
 
5
- agent-postmortem reads the transcripts Claude Code already wrote under `~/.claude/projects` and, for every Workflow run and every session with subagents, says which agents were killed (in a Workflow, often quietly started over), which never returned, which said "done" while their own result said otherwise, and which files and commits that left at risk. Then it lists at most 3 next steps. No setup, no proxy, no LLM, no network access, and it never changes your files.
5
+ One night a background worker sat 8.5 hours on a permission prompt. Its job file said `blocked` and `approve Entering worktree`, the session that launched it heard nothing, and its agent list showed the worker as idle. With the plugin, that session reads this at its next tool call, and an idle session is woken for it: `WORKER night-run (a1b2c3d4) blocked 15m: waiting for a permission approval (approve Entering worktree). A person must approve it: claude attach a1b2c3d4`.
6
+
7
+ Nothing has to be armed. The plugin reads the `claude --bg` in the session's own Bash call and follows that worker from then on. A permission prompt, a question, an API error, a failure, or a worker idle on a command that never ends is told once per change, and a worker that delivered gets a one-line note. `AGENT_POSTMORTEM_WAKE=0` keeps a session from being woken.
8
+
9
+ Which "done" in your last Claude Code run can't you trust? agent-postmortem reads the transcripts Claude Code already wrote under `~/.claude/projects` and, for every Workflow run and every session with subagents, says which agents were killed (in a Workflow, often quietly started over), which never returned, which said "done" while their own result said otherwise, and which files and commits that left at risk. Then it lists at most 3 next steps. No setup, no proxy, no LLM, no network access, and it never changes your files.
6
10
 
7
11
  On the maintainer's machine (scan 2026-10-27, 0.3.2), 13 of 166 workflow runs launched at least one agent's task a second time, and 10.2 hours went to retries and to attempts that ended without a result.
8
12
 
@@ -12,7 +16,7 @@ uvx agent-postmortem scan
12
16
 
13
17
  That runs the latest release from PyPI with [uv](https://docs.astral.sh/uv/), which fetches Python 3.11 or later if you don't have it; nothing else to install. On a machine with no runs yet it says where it looked and suggests `agent-postmortem demo`.
14
18
 
15
- The command-line tool is local and read-only: Python standard library only, no LLM, no network access, and it never changes your files, transcripts, commits, or branches. (The Claude Code plugin's one network action, installing that tool, is described under Privacy; Limits notes two rare git index modes in which git's own `status` still updates its bookkeeping.) What it covers, below, lists the run shapes it handles and the ones it does not yet. Status: alpha, used so far on the maintainer's own machines. Claude Code only.
19
+ The command-line tool is local and read-only: Python standard library only, no LLM, no network access, and it never changes your files, transcripts, commits, or branches. (The Claude Code plugin's one network action, installing that tool into its own data directory or replacing that copy with the plugin's version, is described under Privacy; Limits notes two rare git index modes in which git's own `status` still updates its bookkeeping.) What it covers, below, lists the run shapes it handles and the ones it does not yet. Status: alpha, used so far on the maintainer's own machines. Claude Code only.
16
20
 
17
21
  [![CI](https://github.com/zeyusuntt/agent-postmortem/actions/workflows/ci.yml/badge.svg)](https://github.com/zeyusuntt/agent-postmortem/actions/workflows/ci.yml)
18
22
  [![PyPI](https://img.shields.io/pypi/v/agent-postmortem.svg)](https://pypi.org/project/agent-postmortem/)
@@ -65,9 +69,9 @@ Coverage today, checked against the failure reports in Claude Code's issue track
65
69
  | Workflow runs: runtime kills and retries | covered | kills logged as `[Request interrupted by user]` with no one at the keyboard, cold same-key retries and the time they cost, failed attempts with their cause (usage limit and reset time, machine sleep, server error), and a workflow the harness reported failed |
66
70
  | A "done" you can't trust | covered | an agent that completed while its own result reports failed tests, `ok: false` or blockers (`claim_contradiction`), or while its Codex companion call never started (`codex_unavailable`) |
67
71
  | Subagents that never returned | covered | WORK AT RISK says `unknown` instead of `none`, and names them |
68
- | `claude -p` (headless) | partial | killed and unreturned subagents show; the process's own exit status (for example exit 0 with `result: success` after a kill) is not in the transcript, so the tool cannot see it |
72
+ | `claude -p` (headless) | partial | killed and unreturned subagents show; with the plugin, a foreground subagent that returns on an error or without its prompted output file is reported at once. The process's own exit status (for example exit 0 with `result: success` after a kill) is not in the transcript, so the tool cannot see it |
69
73
  | Background subagents (`run_in_background`) | partial | killed and unreturned ones show; a "completed" that arrived while the agent's own background work was still running, or with a tool call that never got a result, is not flagged yet |
70
- | `claude --bg` sessions | not yet | each job's session is read like any session, but the job's own state (its "done" line, work still in flight) is not |
74
+ | `claude --bg` sessions | partial | with the plugin, the session that launched a worker is told each change at its next tool call or prompt and woken when idle (permission prompt, question, API error, failure, a stuck command, delivered). `status` and `scan` give the same reason when someone runs them, and `watch --session` prints each state change. Not linked: a launch by a subagent, by another session, or by a Bash call that itself ran in the background; `status` and `scan` still list those. "No report past its expected time" is not covered, since nothing records an expected time |
71
75
  | Agent teams | not yet | teammates and their idle or blocked states are not modeled |
72
76
  | Cross-session messages (`SendMessage`) | not yet | whether a message was delivered is not checked |
73
77
 
@@ -116,9 +120,12 @@ Verdict: 0.3 stops guessing. Severity, the WORK AT RISK block, and the run's end
116
120
  | `agent-postmortem rescue plan <run-id>` | Print a read-only decision packet: what a killed or failed attempt wrote, its repo state, declared checks, and the steps to take next. Never edits anything or runs a check itself. |
117
121
  | `agent-postmortem rescue status <run-id>` | Print what the main session's own transcript shows was run and observed after the run ended. Reports only what it saw, never a confirmation that a check passed. |
118
122
  | `agent-postmortem watch <run-id>` | Follow one running workflow: print START, then KILL, FAILED, OK (a result came back), and QUIET as they happen, then DONE or LIMIT. DONE comes the moment the session's own record says the run ended, or after a grace period once every journal key is resolved. Read-only, designed to be a Claude Code Monitor command. |
123
+ | `agent-postmortem watch --session [<session-id>]` | Follow one session while it runs, for a Claude Code Monitor: a line only when a subagent is interrupted with nothing in the session to explain it, fails after changing files, or returns while its own last entry says otherwise, plus background-session state changes. With no id it follows the session you are in. |
124
+ | `agent-postmortem status [<session-id>]` | One snapshot of a session: its subagents running, returned, interrupted or failed, what an interrupted one changed, returns its own transcript contradicts, and the background sessions' states with what each waits for and whether this session dispatched it (a session that is itself a background worker lists only the rows it launched). Reads only what was appended since the last call. |
125
+ | `agent-postmortem statusline subagents` | A `subagentStatusLine` command: adds a fact to a row of Claude Code's subagent panel and leaves every other row as Claude Code draws it. |
119
126
  | `agent-postmortem hook <event>` | Claude Code plugin hook entry point; reads hook JSON from stdin. |
120
127
 
121
- `scan`, `run`, `rules`, `trend`, and `rescue` take `--json` and the level flags; `apply` takes the level flags only; `demo` and `watch` take `--json` only; `hook` takes neither. The level flags are `--local` and `--raw` (`--no-redact` is the same as `--raw`); see Privacy.
128
+ `scan`, `run`, `rules`, `trend`, `rescue`, and `status` take `--json` and the level flags; `apply` takes the level flags only; `demo` and `watch` take `--json` only; `statusline` and `hook` take neither. The level flags are `--local` and `--raw` (`--no-redact` is the same as `--raw`); see Privacy.
122
129
 
123
130
  ## Why
124
131
 
@@ -164,7 +171,18 @@ Install the command-line tool first (Quick start above), so the plugin finds it
164
171
  /plugin install agent-postmortem@agent-postmortem
165
172
  ```
166
173
 
167
- Its hooks shell out to the same CLI, never touch a run directory, and never fail a turn. On `SessionStart` they summarize any run that finished since you last looked. On `Stop` and `StopFailure` they check every subagent and workflow unit spawned so far and print a finding the moment it is detected, not only at session end. On `SessionEnd` they run the read-only tooling checks over the main thread itself. On a `Workflow` launch they register the run immediately, so it is tracked even before its own directory exists, and hand the session the `watch` command to arm as a Monitor. Two skills come with it: `/postmortem` for the verdict and `/rescue` for the bounded rescue protocol.
174
+ Its hooks shell out to the same CLI, never touch a run directory, and never fail a turn. After every tool call and on every prompt they read the job files of the workers this session launched with `claude --bg` and tell each change once, in a `WORKER` line that says the state, the reason and what helps; at each Stop a watcher starts if there is something to follow, and it wakes the session when it has gone idle. It checks every 20 s, wakes at most once per 5 minutes, and leaves when the session acts again. It needs Claude Code 2.1.314 or later, a session already running starts it after `/reload-plugins` or a restart, and `AGENT_POSTMORTEM_WAKE=0` turns it off. After every tool call and on every prompt the hooks also check the session's own subagents: one that was interrupted with nothing in the session to explain it, failed after changing files, or returned while its own transcript contradicts the return is reported to the agent at its next tool call, once. A call with nothing new prints nothing. On `SessionStart` they summarize any run that finished since you last looked, and a resumed session hears which of its own subagents never returned. On `Stop` and `StopFailure` they check every subagent and workflow unit spawned so far and print a finding the moment it is detected, not only at session end. On `SessionEnd` they run the read-only tooling checks over the main thread itself. On a `Workflow` launch they register the run immediately, so it is tracked even before its own directory exists, and hand the session the `watch` command to arm as a Monitor. Two skills come with it: `/postmortem` for the verdict and `/rescue` for the bounded rescue protocol.
175
+
176
+ For your own view, add the subagent panel command to `~/.claude/settings.json`, at the top level:
177
+
178
+ ```json
179
+ "subagentStatusLine": {
180
+ "type": "command",
181
+ "command": "agent-postmortem statusline subagents"
182
+ }
183
+ ```
184
+
185
+ It rewrites a row of the subagent panel only when it has a fact to add (an interrupt nothing explains, how many paths an interrupted or failed subagent changed, a return its own last entry contradicts, quiet over two minutes) and leaves every other row as Claude Code draws it. `agent-postmortem status` prints the same facts for the session you are in.
168
186
 
169
187
  ## What it detects
170
188
 
@@ -191,6 +209,17 @@ The honesty rule: `mislabeled_kill` blames the runtime only when the same key wa
191
209
 
192
210
  The verdict follows from those severities: `FAILED` when the harness itself reported the workflow failed (or a finding is critical, which no detector produces today), `DEGRADED` when any finding is major, `CLEAN` otherwise, with `(INCOMPLETE)` added when the tool could not read everything. `run`, `demo`, and `scan` exit 3 for `FAILED` and 4 for `INCOMPLETE` without `FAILED`; 3 wins when both apply. They exit 2 when there is nothing to judge: no run matches, or no runs at all under the root, in which case the message says where it looked (`~/.claude/projects` by default), what it reads, and to try `agent-postmortem demo`.
193
211
 
212
+ ### Live words and report words
213
+
214
+ `watch`, `status`, the statusline and the hooks speak in three words; `scan` and `run` speak in
215
+ verdicts and detector names. A line to settle in one is the same thing in the other:
216
+
217
+ | Live line | What it means | In `scan` and `run` |
218
+ |---|---|---|
219
+ | `KILL` | a subagent was interrupted and nothing in the session explains it | `mislabeled_kill`, and `silent_retry` when a workflow restarted it |
220
+ | `FAILED` | an agent failed (usage limit, API error, stall) or the harness failed the workflow | `attempt_failed`; the verdict `FAILED` and `workflow_failed` |
221
+ | `CLAIM` | an agent said it was done, but its own result or its last entry says otherwise | `claim_contradiction`, `missing_artifact`, and `codex_unavailable` when a Codex review never ran |
222
+
194
223
  ### Quieting a detector
195
224
 
196
225
  A detector you have already acted on, or one that does not apply to how you work, can be quieted without losing its data. List its id in `~/.config/agent-postmortem/config.toml` (or `$XDG_CONFIG_HOME/agent-postmortem/config.toml`):
@@ -214,7 +243,7 @@ The default output is meant for sharing: names become aliases, every path the to
214
243
  | local | `--local` | real labels, phase titles, agent ids, and project names | a recognized path is relative to the repository, `~/.../<name>` inside your home directory, otherwise `path-N`; never a recognized absolute path | only with `--evidence` |
215
244
  | raw | `--raw` | real | absolute | only with `--evidence` |
216
245
 
217
- At `local` and `raw` the first line of a command's output says so and says not to paste it (an error printed alone on stderr carries no such line; at the default and `local` levels an error never echoes a path or id, and at `raw` it prints as 0.2 did). Hooks and `watch` always print at the default level. An error message never echoes a path or id you typed back at the default level: it says `path-1` or `value-1` and names what it expected.
246
+ At `local` and `raw` the first line of a command's output says so and says not to paste it (an error printed alone on stderr carries no such line; at the default and `local` levels an error never echoes a path or a private id, and at `raw` it prints as 0.2 did). Hooks and `watch` always print at the default level. An error message never echoes a path or id you typed back at the default level: it says `path-1` or `value-1` and names what it expected. The one exception is a public run id (`wf_...`, `s_...`), which is what `scan` prints and is repeated as typed.
218
247
 
219
248
  An alias is a prefix, 12 or more hex characters, of an HMAC of the real id under a secret created once on your machine. Once assigned, an alias never changes: the same agent has the same alias in `run`, `rescue`, `watch`, and hook messages, the same project in `scan --all` and `run`, and nobody without the secret can turn an alias back into the id or match it to a transcript file. On top of that, the default and `local` levels replace your home directory with `~`, a bare account name with `user`, an email with `email:` plus a 6-character hash, a session id inside text with `uuid:` plus its last 4 hex digits, and any other project slug with `project:` plus a 6-character hash.
220
249
 
@@ -224,7 +253,7 @@ Paths inside free text (finding titles, diagnostics, error messages, and at `--l
224
253
 
225
254
  State lives in `$XDG_STATE_HOME/agent-postmortem/`, or `~/.local/state/agent-postmortem/` if that variable is unset: `state.json` (which findings a session already reported, and the rules the 0.1 `apply` command wrote, now read-only history), plus `secret` and `aliases.json` for the aliases. All three are mode 0600. The secret and the registry are never printed; `trend` shows the applied-rule history from `state.json` at the active level. If a command prints `stable aliases unavailable` on stderr, that output named everything `agent-1`, `agent-2`, and so on instead of by alias; nothing is repaired automatically, because a new secret would change every alias. Remove both `secret` and `aliases.json` to start over with new aliases.
226
255
 
227
- The plugin's one network action happens on `SessionStart` only: when it has not installed a CLI into its own data directory and no `agent-postmortem` on `PATH` passes its protocol check, it installs the CLI from PyPI at the plugin's own version, or from the matching GitHub tag if that install fails, into that data directory, retrying at most once every 24 hours on failure; opt out by setting `AGENT_POSTMORTEM_NO_AUTO_INSTALL=1`, or by installing the CLI yourself first.
256
+ The plugin's one network action happens on `SessionStart` only: it installs the CLI into its own data directory (uv keeps its download cache, and Python if it has to fetch one, in its usual places) from PyPI at the plugin's own version, or from the matching GitHub tag if that install fails. It does so when it has not installed a CLI there and no `agent-postmortem` on `PATH` passes its protocol check, retrying at most once every 24 hours on failure, and when the CLI it installed there reports another version than the plugin's (after a plugin upgrade), in the background and at most once a day per version. A CLI on `PATH`, or a bundled CLI that is a link to one outside that directory, is never replaced. Opt out of both by setting `AGENT_POSTMORTEM_NO_AUTO_INSTALL=1`, or by installing the CLI yourself first.
228
257
 
229
258
  ## How it was built
230
259
 
@@ -232,7 +261,7 @@ It was built across two Claude Code Workflow runs, and those same runs are among
232
261
 
233
262
  ## Limits
234
263
 
235
- The formats this tool parses are internal to Claude Code, not a published API, and were observed on versions 2.1.251 to 2.1.312; a future version can change them without notice. A few transcript entry types first seen in 2.1.285 to 2.1.310 (`tools-used`, `relocated`, `agent-setting`, `history-suppression`, `continued-in`) are not interpreted yet, so an attempt whose transcript holds one reads as "the tool cannot see all of what was written". Claude Code deletes transcripts older than 30 days by default (the `cleanupPeriodDays` setting), and with them the history `scan`, `trend` and `rules propose` read; raise that setting to keep more. A session's retries are not observable the way a workflow's are: a session has no cache key to compare attempts against, so `silent_retry` never fires on one. Whether a main-session interrupt was a human pressing Escape is not knowable from the transcript, so it is never attributed, only recorded as a limit. Tested on macOS and Linux only. The repository check (`run --observe`, `rescue status`) uses `git status` to inspect paths, with every filter driver switched off and no network transport allowed; in a repository with a sparse index or a split index, git's own `status` can still store a cached tree object or refresh the shared index file's timestamps, without changing tracked content, commits, or branches.
264
+ The formats this tool parses are internal to Claude Code, not a published API, and were observed on versions 2.1.251 to 2.1.318; a future version can change them without notice. A few transcript entry types first seen in 2.1.285 to 2.1.310 (`tools-used`, `relocated`, `agent-setting`, `history-suppression`, `continued-in`) are not interpreted yet, so an attempt whose transcript holds one reads as "the tool cannot see all of what was written". Claude Code deletes transcripts older than 30 days by default (the `cleanupPeriodDays` setting), and with them the history `scan`, `trend` and `rules propose` read; raise that setting to keep more. A session's retries are not observable the way a workflow's are: a session has no cache key to compare attempts against, so `silent_retry` never fires on one. Whether a main-session interrupt was a human pressing Escape is not knowable from the transcript, so it is never attributed, only recorded as a limit. Tested on macOS and Linux only. The repository check (`run --observe`, `rescue status`) uses `git status` to inspect paths, with every filter driver switched off and no network transport allowed; in a repository with a sparse index or a split index, git's own `status` can still store a cached tree object or refresh the shared index file's timestamps, without changing tracked content, commits, or branches.
236
265
 
237
266
  ## Contributing
238
267