agent-postmortem 0.3.4__tar.gz → 0.3.6__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 (547) hide show
  1. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/CHANGELOG.md +31 -0
  2. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/CONTRIBUTING.md +14 -16
  3. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/PKG-INFO +11 -9
  4. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/README.md +8 -6
  5. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/docs/DESIGN.md +25 -10
  6. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/plugin/.claude-plugin/plugin.json +1 -1
  7. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/plugin/README.md +4 -3
  8. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/plugin/hooks/run.sh +16 -8
  9. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/plugin/skills/postmortem/SKILL.md +1 -1
  10. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/pyproject.toml +3 -3
  11. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/__init__.py +1 -1
  12. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/report.py +81 -35
  13. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/synthetic-ids.txt +1 -0
  14. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_launch_docs.py +15 -10
  15. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n9_docs.py +3 -3
  16. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_plugin.py +42 -11
  17. agent_postmortem-0.3.6/tests/test_share_label_case.py +284 -0
  18. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/uv.lock +1 -1
  19. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/.claude-plugin/marketplace.json +0 -0
  20. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  21. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/confusing_output.yml +0 -0
  22. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/detector_request.yml +0 -0
  23. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/run_shape_not_covered.yml +0 -0
  24. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/wrong_verdict.yml +0 -0
  25. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  26. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/.github/workflows/ci.yml +0 -0
  27. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/.github/workflows/release.yml +0 -0
  28. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/.gitignore +0 -0
  29. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/CLAUDE.md +0 -0
  30. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/LICENSE +0 -0
  31. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/plugin/hooks/hooks.json +0 -0
  32. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/plugin/skills/rescue/SKILL.md +0 -0
  33. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/scripts/check-privacy.sh +0 -0
  34. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/scripts/export-public.sh +0 -0
  35. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/argerrors.py +0 -0
  36. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/claims.py +0 -0
  37. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/cli.py +0 -0
  38. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/commands.py +0 -0
  39. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/config.py +0 -0
  40. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000001.jsonl +0 -0
  41. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000001.meta.json +0 -0
  42. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000002.jsonl +0 -0
  43. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000002.meta.json +0 -0
  44. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000003.jsonl +0 -0
  45. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000003.meta.json +0 -0
  46. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000004.jsonl +0 -0
  47. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000004.meta.json +0 -0
  48. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/journal.jsonl +0 -0
  49. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  50. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/__init__.py +0 -0
  51. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/attempt_failed.py +0 -0
  52. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/base.py +0 -0
  53. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/bash_backgrounded.py +0 -0
  54. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/bash_timeout.py +0 -0
  55. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/claim_contradiction.py +0 -0
  56. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/classifier_unavailable.py +0 -0
  57. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/codex_unavailable.py +0 -0
  58. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/codex_write_denied.py +0 -0
  59. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/git_cwd_mismatch.py +0 -0
  60. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/mislabeled_kill.py +0 -0
  61. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/missing_artifact.py +0 -0
  62. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/permission_denied.py +0 -0
  63. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/silent_retry.py +0 -0
  64. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/structured_output_failure.py +0 -0
  65. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/tool_json_error.py +0 -0
  66. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/wasted_time.py +0 -0
  67. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/workflow_failed.py +0 -0
  68. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/disclosure.py +0 -0
  69. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/hooks/model_allocation_guard.mjs +0 -0
  70. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/hooks_cli.py +0 -0
  71. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/ledger.py +0 -0
  72. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/markers.py +0 -0
  73. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/models.py +0 -0
  74. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/observe.py +0 -0
  75. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/reader.py +0 -0
  76. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/redact.py +0 -0
  77. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/rescue.py +0 -0
  78. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/returns.py +0 -0
  79. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/rules.py +0 -0
  80. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/severity.py +0 -0
  81. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/state.py +0 -0
  82. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/trend.py +0 -0
  83. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/src/agent_postmortem/watch.py +0 -0
  84. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/conftest.py +0 -0
  85. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/README.md +0 -0
  86. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/demo__share.txt +0 -0
  87. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_plan__local.txt +0 -0
  88. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_plan__raw.txt +0 -0
  89. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_plan__share.txt +0 -0
  90. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_status__local.txt +0 -0
  91. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_status__raw.txt +0 -0
  92. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_status__share.txt +0 -0
  93. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules__local.txt +0 -0
  94. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules__raw.txt +0 -0
  95. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules__share.txt +0 -0
  96. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_all__local.txt +0 -0
  97. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_all__raw.txt +0 -0
  98. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_all__share.txt +0 -0
  99. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_propose__local.txt +0 -0
  100. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_propose__raw.txt +0 -0
  101. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_propose__share.txt +0 -0
  102. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_review__local.txt +0 -0
  103. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_review__raw.txt +0 -0
  104. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_review__share.txt +0 -0
  105. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_show__local.txt +0 -0
  106. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_show__raw.txt +0 -0
  107. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_show__share.txt +0 -0
  108. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/run__local.txt +0 -0
  109. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/run__raw.txt +0 -0
  110. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/run__share.txt +0 -0
  111. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan__local.txt +0 -0
  112. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan__raw.txt +0 -0
  113. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan__share.txt +0 -0
  114. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan_all__local.txt +0 -0
  115. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan_all__raw.txt +0 -0
  116. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan_all__share.txt +0 -0
  117. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/trend__local.txt +0 -0
  118. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/trend__raw.txt +0 -0
  119. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/trend__share.txt +0 -0
  120. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000001.jsonl +0 -0
  121. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000001.meta.json +0 -0
  122. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000002.jsonl +0 -0
  123. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000002.meta.json +0 -0
  124. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000003.jsonl +0 -0
  125. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000003.meta.json +0 -0
  126. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000004.jsonl +0 -0
  127. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000004.meta.json +0 -0
  128. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000005.jsonl +0 -0
  129. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000005.meta.json +0 -0
  130. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000006.jsonl +0 -0
  131. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000006.meta.json +0 -0
  132. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000008.jsonl +0 -0
  133. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000008.meta.json +0 -0
  134. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000009.jsonl +0 -0
  135. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000009.meta.json +0 -0
  136. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000010.jsonl +0 -0
  137. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000010.meta.json +0 -0
  138. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000011.jsonl +0 -0
  139. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000011.meta.json +0 -0
  140. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/journal.jsonl +0 -0
  141. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000001.jsonl +0 -0
  142. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000001.meta.json +0 -0
  143. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000002.jsonl +0 -0
  144. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000002.meta.json +0 -0
  145. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000003.jsonl +0 -0
  146. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000003.meta.json +0 -0
  147. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000004.jsonl +0 -0
  148. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000004.meta.json +0 -0
  149. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000005.jsonl +0 -0
  150. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000005.meta.json +0 -0
  151. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000006.jsonl +0 -0
  152. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000006.meta.json +0 -0
  153. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000007.jsonl +0 -0
  154. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000007.meta.json +0 -0
  155. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a1.jsonl +0 -0
  156. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a1.meta.json +0 -0
  157. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a2.jsonl +0 -0
  158. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a2.meta.json +0 -0
  159. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a3.jsonl +0 -0
  160. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a3.meta.json +0 -0
  161. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a4.jsonl +0 -0
  162. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a4.meta.json +0 -0
  163. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/journal.jsonl +0 -0
  164. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afa10000000000001.jsonl +0 -0
  165. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afa10000000000001.meta.json +0 -0
  166. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afa10000000000002.jsonl +0 -0
  167. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afa10000000000002.meta.json +0 -0
  168. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afb10000000000001.jsonl +0 -0
  169. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afb10000000000001.meta.json +0 -0
  170. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/journal.jsonl +0 -0
  171. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/bash_backgrounded_timeout/agent-ac300000000000001.jsonl +0 -0
  172. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/bash_backgrounded_timeout/agent-ac300000000000001.meta.json +0 -0
  173. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/bash_backgrounded_timeout/journal.jsonl +0 -0
  174. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/claim_contradiction/journal.jsonl +0 -0
  175. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/clean_run/agent-ac100000000000001.jsonl +0 -0
  176. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/clean_run/agent-ac100000000000001.meta.json +0 -0
  177. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/clean_run/agent-ac100000000000002.jsonl +0 -0
  178. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/clean_run/agent-ac100000000000002.meta.json +0 -0
  179. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/clean_run/journal.jsonl +0 -0
  180. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000001.jsonl +0 -0
  181. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000001.meta.json +0 -0
  182. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000002.jsonl +0 -0
  183. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000002.meta.json +0 -0
  184. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000003.jsonl +0 -0
  185. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000003.meta.json +0 -0
  186. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000004.jsonl +0 -0
  187. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000004.meta.json +0 -0
  188. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/journal.jsonl +0 -0
  189. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000001.jsonl +0 -0
  190. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000001.meta.json +0 -0
  191. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000002.jsonl +0 -0
  192. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000002.meta.json +0 -0
  193. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000003.jsonl +0 -0
  194. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000003.meta.json +0 -0
  195. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/journal.jsonl +0 -0
  196. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/evidence_noise/agent-acf00000000000001.jsonl +0 -0
  197. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/evidence_noise/agent-acf00000000000001.meta.json +0 -0
  198. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/evidence_noise/journal.jsonl +0 -0
  199. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ae300000000000001.jsonl +0 -0
  200. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ae300000000000001.meta.json +0 -0
  201. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-710/agent-ae100000000000001.jsonl +0 -0
  202. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-710/agent-ae100000000000001.meta.json +0 -0
  203. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-710/agent-ae100000000000002.jsonl +0 -0
  204. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-710/agent-ae100000000000002.meta.json +0 -0
  205. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-710/journal.jsonl +0 -0
  206. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-720/agent-ae200000000000001.jsonl +0 -0
  207. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-720/agent-ae200000000000001.meta.json +0 -0
  208. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-720/journal.jsonl +0 -0
  209. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  210. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/incomplete_journal/agent-ad000000000000001.jsonl +0 -0
  211. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/incomplete_journal/agent-ad000000000000001.meta.json +0 -0
  212. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/incomplete_journal/journal.jsonl +0 -0
  213. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/agent-aee00000000000001.jsonl +0 -0
  214. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/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
  215. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/agent-aee00000000000003.jsonl +0 -0
  216. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/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
  217. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/agent-aee00000000000004.jsonl +0 -0
  218. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/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
  219. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/journal.jsonl +0 -0
  220. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  221. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_orphan_failed/journal.jsonl +0 -0
  222. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad200000000000001.jsonl +0 -0
  223. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad200000000000001.meta.json +0 -0
  224. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad300000000000001.jsonl +0 -0
  225. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad300000000000001.meta.json +0 -0
  226. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad400000000000001.jsonl +0 -0
  227. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad400000000000001.meta.json +0 -0
  228. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad400000000000002.jsonl +0 -0
  229. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad400000000000002.meta.json +0 -0
  230. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad500000000000001.jsonl +0 -0
  231. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad500000000000001.meta.json +0 -0
  232. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad500000000000002.jsonl +0 -0
  233. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad500000000000002.meta.json +0 -0
  234. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad600000000000001.jsonl +0 -0
  235. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad600000000000001.meta.json +0 -0
  236. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad600000000000002.jsonl +0 -0
  237. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad600000000000002.meta.json +0 -0
  238. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad700000000000001.jsonl +0 -0
  239. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad700000000000001.meta.json +0 -0
  240. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad800000000000001.jsonl +0 -0
  241. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad800000000000001.meta.json +0 -0
  242. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/journal.jsonl +0 -0
  243. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_unresolved/agent-ad900000000000001.jsonl +0 -0
  244. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_unresolved/agent-ad900000000000001.meta.json +0 -0
  245. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_unresolved/journal.jsonl +0 -0
  246. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/missing_artifact/agent-ac600000000000001.jsonl +0 -0
  247. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/missing_artifact/agent-ac600000000000001.meta.json +0 -0
  248. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/missing_artifact/agent-ac600000000000002.jsonl +0 -0
  249. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/missing_artifact/agent-ac600000000000002.meta.json +0 -0
  250. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/missing_artifact/journal.jsonl +0 -0
  251. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_a0000000-001/journal.jsonl +0 -0
  252. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_b0000000-002/agent-a1111111111111111.jsonl +0 -0
  253. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_b0000000-002/agent-a1111111111111111.meta.json +0 -0
  254. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_b0000000-002/agent-a2222222222222222.jsonl +0 -0
  255. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_b0000000-002/agent-a2222222222222222.meta.json +0 -0
  256. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_b0000000-002/journal.jsonl +0 -0
  257. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_c0000000-003/journal.jsonl +0 -0
  258. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/redaction_adversarial/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-960/agent-ad100000000000001.jsonl +0 -0
  259. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/redaction_adversarial/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-960/agent-ad100000000000001.meta.json +0 -0
  260. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/redaction_adversarial/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-960/journal.jsonl +0 -0
  261. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000001.jsonl +0 -0
  262. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000001.meta.json +0 -0
  263. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000002.jsonl +0 -0
  264. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000002.meta.json +0 -0
  265. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000003.jsonl +0 -0
  266. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000003.meta.json +0 -0
  267. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000004.jsonl +0 -0
  268. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000004.meta.json +0 -0
  269. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000005.jsonl +0 -0
  270. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000005.meta.json +0 -0
  271. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/journal.jsonl +0 -0
  272. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_bridge_only/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  273. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac700000000000001.jsonl +0 -0
  274. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac700000000000001.meta.json +0 -0
  275. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac700000000000002.jsonl +0 -0
  276. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac700000000000002.meta.json +0 -0
  277. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  278. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_compaction/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-aca00000000000001.jsonl +0 -0
  279. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_compaction/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-aca00000000000001.meta.json +0 -0
  280. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_compaction/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  281. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_dedup/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  282. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_envelope/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac900000000000001.jsonl +0 -0
  283. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_envelope/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac900000000000001.meta.json +0 -0
  284. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_envelope/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  285. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_human_interrupt/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acc00000000000001.jsonl +0 -0
  286. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_human_interrupt/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acc00000000000001.meta.json +0 -0
  287. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_human_interrupt/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  288. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_parent_stop/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acb00000000000001.jsonl +0 -0
  289. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_parent_stop/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acb00000000000001.meta.json +0 -0
  290. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_parent_stop/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  291. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_unattributed_long/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acd00000000000001.jsonl +0 -0
  292. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_unattributed_long/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acd00000000000001.meta.json +0 -0
  293. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_unattributed_long/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  294. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_unattributed_short/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ace00000000000001.jsonl +0 -0
  295. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_unattributed_short/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ace00000000000001.meta.json +0 -0
  296. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_unattributed_short/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  297. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/structured_output_corrupt/agent-ac400000000000001.jsonl +0 -0
  298. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/structured_output_corrupt/agent-ac400000000000001.meta.json +0 -0
  299. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/fixtures/runs/structured_output_corrupt/journal.jsonl +0 -0
  300. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/g_corpus_support.py +0 -0
  301. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/g_helpers.py +0 -0
  302. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/g_independent_return.py +0 -0
  303. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/n3b_helpers.py +0 -0
  304. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/n3b_planted.py +0 -0
  305. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/n4_reference_commands.py +0 -0
  306. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/n4b2_helpers.py +0 -0
  307. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/n5b_helpers.py +0 -0
  308. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/n5c1_helpers.py +0 -0
  309. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/n5c2_helpers.py +0 -0
  310. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/n6_helpers.py +0 -0
  311. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/privacy_rules.py +0 -0
  312. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/rule_fixtures.py +0 -0
  313. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_attempt_facts.py +0 -0
  314. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_attempt_failed.py +0 -0
  315. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_attribution.py +0 -0
  316. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_bug_report.py +0 -0
  317. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_claim_contradiction.py +0 -0
  318. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_cli_smoke.py +0 -0
  319. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_codex_unavailable.py +0 -0
  320. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_config.py +0 -0
  321. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_deep_lines.py +0 -0
  322. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_detectors_base.py +0 -0
  323. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_detectors_core.py +0 -0
  324. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_detectors_registry.py +0 -0
  325. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_detectors_tooling.py +0 -0
  326. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_disclosure_primitives.py +0 -0
  327. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_empty_state.py +0 -0
  328. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_export.py +0 -0
  329. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_export_public.py +0 -0
  330. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fa_commit_no_id.py +0 -0
  331. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fa_fork.py +0 -0
  332. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fa_generations.py +0 -0
  333. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fa_path_token.py +0 -0
  334. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fa_return_boundary.py +0 -0
  335. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fa_wasted.py +0 -0
  336. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fb_here.py +0 -0
  337. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fb_live_now.py +0 -0
  338. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fb_rescue_live.py +0 -0
  339. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix10_redact.py +0 -0
  340. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix11_redact.py +0 -0
  341. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix12_redact.py +0 -0
  342. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix1_commit.py +0 -0
  343. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix1_launch.py +0 -0
  344. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix1_poll.py +0 -0
  345. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix1_redact.py +0 -0
  346. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix2_launch.py +0 -0
  347. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix2_poll.py +0 -0
  348. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix2_redact.py +0 -0
  349. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix3_redact.py +0 -0
  350. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix4_fuzz.py +0 -0
  351. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix4_lexer.py +0 -0
  352. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix4_redact.py +0 -0
  353. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix4_sinks.py +0 -0
  354. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix5_lexer.py +0 -0
  355. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix5_redact.py +0 -0
  356. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix5_sinks.py +0 -0
  357. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix6_fuzz.py +0 -0
  358. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix6_hook.py +0 -0
  359. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix6_lexer.py +0 -0
  360. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix6_redact.py +0 -0
  361. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix6_sinks.py +0 -0
  362. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix6b_title.py +0 -0
  363. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix7_e2e.py +0 -0
  364. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix7_fuzz.py +0 -0
  365. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix7_redact.py +0 -0
  366. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix7_sinks.py +0 -0
  367. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix7_title.py +0 -0
  368. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix8_e2e.py +0 -0
  369. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix8_fuzz.py +0 -0
  370. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix8_redact.py +0 -0
  371. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix8_sinks.py +0 -0
  372. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix9_e2e.py +0 -0
  373. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix9_fuzz.py +0 -0
  374. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix9_redact.py +0 -0
  375. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_fix9_sinks.py +0 -0
  376. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_help.py +0 -0
  377. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_scan.py +0 -0
  378. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_table.py +0 -0
  379. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fc_wording.py +0 -0
  380. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_field_v03.py +0 -0
  381. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_field_v03_more.py +0 -0
  382. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_filter_scope.py +0 -0
  383. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fixa_discovery.py +0 -0
  384. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fixa_enqueue.py +0 -0
  385. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_fixa_reader.py +0 -0
  386. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_g_a1_hooks.py +0 -0
  387. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_g_a1_return.py +0 -0
  388. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_g_b1.py +0 -0
  389. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_g_c.py +0 -0
  390. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_g_commit_sentences.py +0 -0
  391. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_g_commits.py +0 -0
  392. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_g_consumers.py +0 -0
  393. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_g_corpus.py +0 -0
  394. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_g_denied.py +0 -0
  395. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_g_failed.py +0 -0
  396. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_g_here.py +0 -0
  397. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_g_hooks.py +0 -0
  398. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_g_registry.py +0 -0
  399. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_g_rescue.py +0 -0
  400. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_g_return.py +0 -0
  401. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_g_selfreport.py +0 -0
  402. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_hooks_benchmark.py +0 -0
  403. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_hooks_cli.py +0 -0
  404. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_journal_malformed_fields.py +0 -0
  405. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_journal_state.py +0 -0
  406. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_model_allocation_guard.py +0 -0
  407. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n1_markers.py +0 -0
  408. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n1_parent_index.py +0 -0
  409. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n2_lifecycle.py +0 -0
  410. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_apply.py +0 -0
  411. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_canonical_ids.py +0 -0
  412. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_context.py +0 -0
  413. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_demo.py +0 -0
  414. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_first_line.py +0 -0
  415. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_dedupe.py +0 -0
  416. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_demo.py +0 -0
  417. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_local_path.py +0 -0
  418. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_names.py +0 -0
  419. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_paths_c4.py +0 -0
  420. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_paths_c6.py +0 -0
  421. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_paths_s10.py +0 -0
  422. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_paths_s4.py +0 -0
  423. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_titles.py +0 -0
  424. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_hook_group.py +0 -0
  425. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_noident_pointer.py +0 -0
  426. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_repr_tokens.py +0 -0
  427. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_rescue_c1.py +0 -0
  428. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_run_ids.py +0 -0
  429. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_traversal.py +0 -0
  430. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixr2_ids.py +0 -0
  431. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixr2_paths.py +0 -0
  432. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixr2_raw_dupes.py +0 -0
  433. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_fixr2_schema2_hostile.py +0 -0
  434. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_flags.py +0 -0
  435. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_handler_errors.py +0 -0
  436. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_hooks.py +0 -0
  437. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_local_path.py +0 -0
  438. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_local_scrub.py +0 -0
  439. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_parser_errors.py +0 -0
  440. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_part2_slow_path.py +0 -0
  441. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_part3_sinks.py +0 -0
  442. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_pointers.py +0 -0
  443. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_reader.py +0 -0
  444. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_rescue.py +0 -0
  445. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_residual_sinks.py +0 -0
  446. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_rules_trend.py +0 -0
  447. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_run_fallback.py +0 -0
  448. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_run_local.py +0 -0
  449. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_run_noncanonical_agent.py +0 -0
  450. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_run_path_matrix.py +0 -0
  451. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_run_share.py +0 -0
  452. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_scan.py +0 -0
  453. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_slow_path.py +0 -0
  454. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n3b_watch.py +0 -0
  455. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4a_base_repo.py +0 -0
  456. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4a_commit_grammar.py +0 -0
  457. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4a_lexer.py +0 -0
  458. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4a_measure.py +0 -0
  459. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4a_readonly.py +0 -0
  460. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4a_rows.py +0 -0
  461. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4a_write_grammar.py +0 -0
  462. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4b1_discovery.py +0 -0
  463. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4b1_reader_facts.py +0 -0
  464. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4b1_schema2.py +0 -0
  465. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4b2_forms.py +0 -0
  466. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4b2_measure.py +0 -0
  467. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4b2_population.py +0 -0
  468. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4b2_reasons.py +0 -0
  469. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4b2_repo_groups.py +0 -0
  470. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4b2_rows.py +0 -0
  471. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4fixb_c3.py +0 -0
  472. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4fixb_differential.py +0 -0
  473. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4fixb_minor.py +0 -0
  474. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4fixb_s3.py +0 -0
  475. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4fixb_s4.py +0 -0
  476. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4fixb_s5_s10.py +0 -0
  477. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4fixc_a4.py +0 -0
  478. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4fixd_a5.py +0 -0
  479. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n4fixe_a5.py +0 -0
  480. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5_schema3_goldens.py +0 -0
  481. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5a1_schema3.py +0 -0
  482. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5a2_docs.py +0 -0
  483. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5b_detectors.py +0 -0
  484. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5b_inputs.py +0 -0
  485. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5b_severity.py +0 -0
  486. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5b_verdict.py +0 -0
  487. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5c1_gaps.py +0 -0
  488. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5c1_look.py +0 -0
  489. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5c1_observation_export.py +0 -0
  490. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5c1_observe.py +0 -0
  491. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5c1_rescue.py +0 -0
  492. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5c1_returned.py +0 -0
  493. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5c1_work_at_risk.py +0 -0
  494. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5c2_exit_codes.py +0 -0
  495. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5c2_misc.py +0 -0
  496. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5c2_status_repos.py +0 -0
  497. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5fix1_misc.py +0 -0
  498. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5fix1_plan.py +0 -0
  499. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5fix1_returned.py +0 -0
  500. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5fix1_severity.py +0 -0
  501. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n5fix1_status.py +0 -0
  502. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n6_alias_state.py +0 -0
  503. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n6_cwd.py +0 -0
  504. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n6_docs.py +0 -0
  505. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n6_fix1.py +0 -0
  506. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n6_here_run.py +0 -0
  507. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n6_here_scan.py +0 -0
  508. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n6_pins.py +0 -0
  509. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n6_resolve.py +0 -0
  510. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n6_roundtrip.py +0 -0
  511. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n6_stderr.py +0 -0
  512. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n7_detectors.py +0 -0
  513. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n8_fix1.py +0 -0
  514. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n8_fix2.py +0 -0
  515. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n8_k1_killed.py +0 -0
  516. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n8_k2_what_to_do.py +0 -0
  517. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n8_k3_precursor.py +0 -0
  518. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n8_k4_rescue.py +0 -0
  519. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n8_k5_watch.py +0 -0
  520. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n8_k6_rules.py +0 -0
  521. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_n9_release_gate.py +0 -0
  522. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_no_lazy_fetch.py +0 -0
  523. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_no_write_surface.py +0 -0
  524. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_observe.py +0 -0
  525. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_privacy.py +0 -0
  526. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_privacy_matrix.py +0 -0
  527. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_r1_scan_risk_parity.py +0 -0
  528. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_reader.py +0 -0
  529. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_reader_session.py +0 -0
  530. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_readme.py +0 -0
  531. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_redact.py +0 -0
  532. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_rel_demo.py +0 -0
  533. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_rel_scan_all.py +0 -0
  534. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_rendered_privacy.py +0 -0
  535. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_report_session.py +0 -0
  536. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_report_v2.py +0 -0
  537. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_rescue.py +0 -0
  538. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_rules.py +0 -0
  539. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_rules_propose.py +0 -0
  540. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_rules_review.py +0 -0
  541. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_scan_triage.py +0 -0
  542. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_state.py +0 -0
  543. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_tooling_agent_scope.py +0 -0
  544. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_trend.py +0 -0
  545. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_watch.py +0 -0
  546. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_wheel.py +0 -0
  547. {agent_postmortem-0.3.4 → agent_postmortem-0.3.6}/tests/test_workflows.py +0 -0
@@ -5,6 +5,37 @@ 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.3.6]
9
+
10
+ ### Fixed
11
+
12
+ - The default (share) output could print an agent's own label. A story sentence starts with
13
+ a capital, and when an agent's whole story was its interrupt finding, whose title starts
14
+ with the label, the label was capitalized before the name substitution ran. That
15
+ substitution matched names case-sensitively, so a workflow label such as `impl:t2` or a
16
+ subagent description starting with a lowercase letter printed as `Impl:t2` in the
17
+ STORIES section of `run` and in `stories[].text` of `run --json`. A story clause is now
18
+ capitalized after its names are replaced, so it reads `Agent-1 interrupted after ...`.
19
+ `scan`, `run --bug-report`, `rescue` and the hook messages never carried it, and none of
20
+ the 382 runs on the maintainer's machine hit it. `--local` and `--raw` are unchanged.
21
+
22
+ ## [0.3.5]
23
+
24
+ ### Changed
25
+
26
+ - The PyPI summary is the positioning line the plugin already uses: it reads the Claude Code
27
+ logs already on your machine and tells you which agent's "done" you can't trust. The package
28
+ is classified as Alpha, matching the README's status line, and the README's license badge
29
+ links to the LICENSE file by full URL, so it also works on the PyPI page. PyPI version and
30
+ Python version badges join the CI and license badges.
31
+ - Installs come from PyPI now. The README's first command is `uvx agent-postmortem scan`, and
32
+ Quick start, the plugin README and the `/postmortem` skill say `uv tool install
33
+ agent-postmortem`. No git is needed.
34
+ - The plugin installs its CLI from PyPI at the plugin's own version. It falls back to the
35
+ matching GitHub tag only if that install fails, for example in the minutes between a release
36
+ reaching GitHub and reaching PyPI. Both attempts share the one 60-second deadline the single
37
+ install had. The missing-CLI hint says `uv tool install agent-postmortem`.
38
+
8
39
  ## [0.3.4]
9
40
 
10
41
  ### Fixed
@@ -70,22 +70,20 @@ sets.
70
70
 
71
71
  Releases are cut by pushing a `v*` tag, which `.github/workflows/release.yml`
72
72
  picks up: it runs the tests, builds the wheel and sdist, runs the privacy
73
- check against them, and makes the GitHub release with the built files and
74
- that version's CHANGELOG section. Users install from that tag
75
- (`uv tool install git+https://github.com/zeyusuntt/agent-postmortem@v<version>`),
76
- and so does the plugin.
77
-
78
- Publishing to PyPI (via a trusted publisher, no API token stored in this
79
- repository) is switched off until the repository variable `PUBLISH_PYPI` is
80
- `true`; without it the publish job is skipped, not failed. To turn it on once
81
- the setup below is done: set the variable (Settings, Secrets and variables,
82
- Actions, Variables, `PUBLISH_PYPI` = `true`), then re-run the release workflow
83
- for the existing tag (Actions, Release, the tag's run, Re-run all jobs), and
84
- check that installing the `agent-postmortem` package from PyPI gives that
85
- version. After that,
86
- switch the install lines in README.md, plugin/README.md, the postmortem skill
87
- and plugin/hooks/run.sh back to PyPI in one release (tests/test_launch_docs.py
88
- and tests/test_plugin.py pin them).
73
+ check against them, makes the GitHub release with the built files and
74
+ that version's CHANGELOG section, and publishes both files to PyPI through a
75
+ trusted publisher (no API token is stored in this repository). Users install
76
+ from PyPI (`uv tool install agent-postmortem`), and so does the plugin, pinned
77
+ to its own version, with the matching GitHub tag as a fallback for the minutes
78
+ between the tag and the PyPI upload (tests/test_launch_docs.py and
79
+ tests/test_plugin.py pin these install lines).
80
+
81
+ The publish job runs only while the repository variable `PUBLISH_PYPI` is
82
+ `true` (Settings, Secrets and variables, Actions, Variables); without it the
83
+ job is skipped, not failed. If a release's publish was skipped, set the
84
+ variable, re-run the release workflow for that tag (Actions, Release, the
85
+ tag's run, Re-run all jobs), and check that installing `agent-postmortem`
86
+ from PyPI gives that version.
89
87
 
90
88
  One-time trusted-publisher setup on pypi.org, before the first tagged
91
89
  release:
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agent-postmortem
3
- Version: 0.3.4
4
- Summary: Post-mortem for multi-agent coding runs: prove what silently went wrong, then draft the rule that prevents it.
3
+ Version: 0.3.6
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
7
7
  Project-URL: Changelog, https://github.com/zeyusuntt/agent-postmortem/blob/main/CHANGELOG.md
8
8
  License: MIT
9
9
  License-File: LICENSE
10
- Classifier: Development Status :: 4 - Beta
10
+ Classifier: Development Status :: 3 - Alpha
11
11
  Classifier: Environment :: Console
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: License :: OSI Approved :: MIT License
@@ -30,15 +30,17 @@ agent-postmortem reads the transcripts Claude Code already wrote under `~/.claud
30
30
  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
31
 
32
32
  ```
33
- uvx --from git+https://github.com/zeyusuntt/agent-postmortem@v0.3.4 agent-postmortem scan
33
+ uvx agent-postmortem scan
34
34
  ```
35
35
 
36
- That runs the tagged release straight from GitHub (it needs [uv](https://docs.astral.sh/uv/) and git). A PyPI release is coming. On a machine with no runs yet it says where it looked and suggests `agent-postmortem demo`.
36
+ 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
37
 
38
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.
39
39
 
40
40
  [![CI](https://github.com/zeyusuntt/agent-postmortem/actions/workflows/ci.yml/badge.svg)](https://github.com/zeyusuntt/agent-postmortem/actions/workflows/ci.yml)
41
- [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
41
+ [![PyPI](https://img.shields.io/pypi/v/agent-postmortem.svg)](https://pypi.org/project/agent-postmortem/)
42
+ [![Python versions](https://img.shields.io/pypi/pyversions/agent-postmortem.svg)](https://pypi.org/project/agent-postmortem/)
43
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/zeyusuntt/agent-postmortem/blob/main/LICENSE)
42
44
 
43
45
  ```
44
46
  RUN wf_00000000-d30 DEGRADED ended 2026-01-06 19:55Z
@@ -96,10 +98,10 @@ If you run one of the partial or not-yet shapes, please open a ["my run shape is
96
98
 
97
99
  ## Quick start
98
100
 
99
- Install the command-line tool from the tagged GitHub release with [uv](https://docs.astral.sh/uv/) and git (uv fetches Python 3.11 or later if you don't have it), then try it:
101
+ Install the command-line tool from PyPI with [uv](https://docs.astral.sh/uv/) (it fetches Python 3.11 or later if you don't have it), then try it:
100
102
 
101
103
  ```
102
- uv tool install git+https://github.com/zeyusuntt/agent-postmortem@v0.3.4
104
+ uv tool install agent-postmortem
103
105
  agent-postmortem demo
104
106
  agent-postmortem scan
105
107
  agent-postmortem run <run-id>
@@ -245,7 +247,7 @@ Paths inside free text (finding titles, diagnostics, error messages, and at `--l
245
247
 
246
248
  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.
247
249
 
248
- 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 the GitHub tag that matches the plugin's version (`v0.3.4`) 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.
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.
249
251
 
250
252
  ## How it was built
251
253
 
@@ -7,15 +7,17 @@ agent-postmortem reads the transcripts Claude Code already wrote under `~/.claud
7
7
  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
8
 
9
9
  ```
10
- uvx --from git+https://github.com/zeyusuntt/agent-postmortem@v0.3.4 agent-postmortem scan
10
+ uvx agent-postmortem scan
11
11
  ```
12
12
 
13
- That runs the tagged release straight from GitHub (it needs [uv](https://docs.astral.sh/uv/) and git). A PyPI release is coming. On a machine with no runs yet it says where it looked and suggests `agent-postmortem demo`.
13
+ 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
14
 
15
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.
16
16
 
17
17
  [![CI](https://github.com/zeyusuntt/agent-postmortem/actions/workflows/ci.yml/badge.svg)](https://github.com/zeyusuntt/agent-postmortem/actions/workflows/ci.yml)
18
- [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
18
+ [![PyPI](https://img.shields.io/pypi/v/agent-postmortem.svg)](https://pypi.org/project/agent-postmortem/)
19
+ [![Python versions](https://img.shields.io/pypi/pyversions/agent-postmortem.svg)](https://pypi.org/project/agent-postmortem/)
20
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/zeyusuntt/agent-postmortem/blob/main/LICENSE)
19
21
 
20
22
  ```
21
23
  RUN wf_00000000-d30 DEGRADED ended 2026-01-06 19:55Z
@@ -73,10 +75,10 @@ If you run one of the partial or not-yet shapes, please open a ["my run shape is
73
75
 
74
76
  ## Quick start
75
77
 
76
- Install the command-line tool from the tagged GitHub release with [uv](https://docs.astral.sh/uv/) and git (uv fetches Python 3.11 or later if you don't have it), then try it:
78
+ Install the command-line tool from PyPI with [uv](https://docs.astral.sh/uv/) (it fetches Python 3.11 or later if you don't have it), then try it:
77
79
 
78
80
  ```
79
- uv tool install git+https://github.com/zeyusuntt/agent-postmortem@v0.3.4
81
+ uv tool install agent-postmortem
80
82
  agent-postmortem demo
81
83
  agent-postmortem scan
82
84
  agent-postmortem run <run-id>
@@ -222,7 +224,7 @@ Paths inside free text (finding titles, diagnostics, error messages, and at `--l
222
224
 
223
225
  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.
224
226
 
225
- 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 the GitHub tag that matches the plugin's version (`v0.3.4`) 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.
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.
226
228
 
227
229
  ## How it was built
228
230
 
@@ -4742,7 +4742,19 @@ trend row's target) and `Finding.title`, rendered through `Redactor.title()`
4742
4742
  followed by structural `redact()`; **(N3b S1)** names come first, so a label
4743
4743
  that holds a UUID, an email, or a `-Users-...` slug is replaced whole
4744
4744
  instead of being half-rewritten by the structural pass and then missed)
4745
- work exactly as before. Evidence, a diagnostic, and a metrics value are
4745
+ work exactly as before. **(0.3.6)** A story clause is capitalized only after the sink
4746
+ substituted names in it (`report._render_pieces` renders each `_Clause` through
4747
+ `Redactor.title`, then upper-cases its first character), so a name meets the pattern as
4748
+ written and becomes `Agent-1` at a sentence start. Through 0.3.5 the clause was capitalized
4749
+ first: a `mislabeled_kill` title starts with the label, and when it was an agent's whole
4750
+ story the label `impl:x` reached share output as `Impl:x`, which the case-sensitive pattern
4751
+ never matched (`run` text and `run --json` stories only; `tests/test_share_label_case.py`).
4752
+ Matching stays case-sensitive, and every clause in the tool's own words is written with
4753
+ its capital already (`report._own_clause`: "Killed 1 time by the runtime", "Attempt 2
4754
+ failed: ...", "Wrote no paths."), so a label that is a plain word (`killed`, `attempt`,
4755
+ `wrote`) never rewrites them, and neither are finding titles, except the title of a
4756
+ detector that leads with its agent's own label (`report._LABEL_LED_TITLES`:
4757
+ `mislabeled_kill`), which is capitalized only after the substitution. Evidence, a diagnostic, and a metrics value are
4746
4758
  never fed to the five *name* categories (agent/desc/phase/type/target): they
4747
4759
  pass through structural `redact()` alone (plain `Redactor.__call__`),
4748
4760
  because they are a faithful quote of transcript text (4.5), not a rendered
@@ -6377,9 +6389,12 @@ internal deadline as `check`.
6377
6389
 
6378
6390
  On SessionStart, if no compatible CLI resolves and `uv` is on PATH and
6379
6391
  `AGENT_POSTMORTEM_NO_AUTO_INSTALL` is unset, `run.sh` runs `uv tool install
6392
+ "agent-postmortem==<version in plugin.json>" --python 3.11+` from PyPI, and only if that
6393
+ install fails, `uv tool install
6380
6394
  "git+https://github.com/zeyusuntt/agent-postmortem@v<version in plugin.json>" --python
6381
- 3.11+` (Plan B, 2026-10-28: the public repository's tag instead of PyPI until PyPI
6382
- publishing works; it needs git besides uv; the missing-CLI hint names the same source) (`UV_TOOL_DIR`
6395
+ 3.11+` (0.3.5: PyPI first; the tag covers the minutes between a release reaching GitHub
6396
+ and reaching PyPI, and needs git besides uv; both attempts run inside the one 60 s
6397
+ deadline below; the missing-CLI hint names `uv tool install agent-postmortem`) (`UV_TOOL_DIR`
6383
6398
  and `UV_TOOL_BIN_DIR` both pointed at `$DATA_DIR`, 7.2's one data
6384
6399
  directory, so the installed shim lands at `$DATA_DIR/bin/agent-postmortem`,
6385
6400
  exactly where resolution step (1) looks) under the same process-group-kill
@@ -6704,7 +6719,7 @@ later events go positional).
6704
6719
 
6705
6720
  ### 8.1 Package
6706
6721
 
6707
- `pyproject.toml`: name `agent-postmortem`, version `0.3.4`, console scripts
6722
+ `pyproject.toml`: name `agent-postmortem`, version `0.3.6`, console scripts
6708
6723
  `agent-postmortem` and `postmortem`, `requires-python >= 3.11`, no runtime
6709
6724
  dependencies, `[project.optional-dependencies].dev = ["pytest>=8",
6710
6725
  "ruff>=0.6"]`, classifiers, URLs (Homepage, Issues, Changelog). The wheel
@@ -6754,8 +6769,8 @@ check of the artifacts), then a `github-release` job (`permissions: contents: wr
6754
6769
  `gh release create <tag> dist/* --verify-tag` with that version's CHANGELOG section as
6755
6770
  notes) and a publish job with `environment: pypi`, `permissions: id-token: write`,
6756
6771
  `pypa/gh-action-pypi-publish@release/v1` that runs only when the repository variable
6757
- `PUBLISH_PYPI` is `true` (Plan B, 2026-10-28: until the PyPI trusted publisher works, a
6758
- tag must not turn the release red; a skipped job is not a failure). Both workflows declare a
6772
+ `PUBLISH_PYPI` is `true` (a tag must never turn the release red when publishing is
6773
+ switched off; a skipped job is not a failure; PyPI publishing is on from 0.3.4). Both workflows declare a
6759
6774
  top-level `permissions: contents: read` so every job is read-only by
6760
6775
  default regardless of the repository's own token-permission setting; the
6761
6776
  publish job's own `id-token: write` is layered on top of that at the job
@@ -6769,14 +6784,14 @@ pypi.org and the TestPyPI dry run.
6769
6784
  First screen, in order (from 0.3.3): name; the question the tool answers
6770
6785
  ("Which 'done' in your last Claude Code run can't you trust?"); one paragraph on
6771
6786
  what it reads, what it reports and that it is local and read-only; one dated number
6772
- from a named version's scan; `uvx --from git+https://github.com/zeyusuntt/agent-postmortem@v<version>
6773
- agent-postmortem scan` (the tagged GitHub release; one line says a PyPI release is coming); the status paragraph; badges (CI, license; PyPI version and Python versions only once a
6787
+ from a named version's scan; `uvx agent-postmortem scan` (from PyPI, 0.3.5; 0.3.3 and
6788
+ 0.3.4 used the tagged GitHub release while PyPI was not yet working); the status paragraph; badges (CI, license; PyPI version and Python versions only once a
6774
6789
  PyPI release exists, since a badge for a missing release renders broken),
6775
6790
  the demo output as a fenced code block (not a screenshot: it must stay text,
6776
6791
  so it can be diffed against a live `agent-postmortem demo` run -- 8.2,
6777
6792
  tests/test_readme.py), the install command that works for the current
6778
- distribution (a GitHub install with `uv tool install git+...` until the
6779
- first PyPI release, then `uvx agent-postmortem scan`), a command table
6793
+ distribution (`uv tool install agent-postmortem` from PyPI from 0.3.5; a
6794
+ GitHub install with `uv tool install git+...` in 0.3.3 and 0.3.4), a command table
6780
6795
  listing exactly which commands take `--json` and which take `--no-redact`.
6781
6796
  Then "What it covers", before Quick start: one table of run shapes and failure
6782
6797
  kinds, each marked covered, partial or not yet, as checked against the upstream issue
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-postmortem",
3
- "version": "0.3.4",
3
+ "version": "0.3.6",
4
4
  "description": "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
  "author": {
6
6
  "name": "zeyusuntt",
@@ -41,15 +41,16 @@ On `SessionStart`, if the plugin has not installed a CLI into its own data
41
41
  directory and no `agent-postmortem` on your `PATH` passes its protocol check
42
42
  (`agent-postmortem hook capabilities` answers protocol 1), and
43
43
  [`uv`](https://docs.astral.sh/uv/) is on your `PATH`, the plugin installs
44
- the version pinned in the plugin manifest from its GitHub tag (`git` is
45
- needed too), retrying at most once every 24
44
+ the version pinned in the plugin manifest from PyPI, or from the matching
45
+ GitHub tag if that install fails (that fallback needs `git`), retrying at
46
+ most once every 24
46
47
  hours on failure, and writes what happened to a log file instead of your
47
48
  terminal. This is the plugin's only network access.
48
49
 
49
50
  Opt out by setting `AGENT_POSTMORTEM_NO_AUTO_INSTALL=1` (in your shell
50
51
  profile, or wherever you set environment variables for Claude Code), or by
51
52
  installing the CLI yourself ahead of time with
52
- `uv tool install git+https://github.com/zeyusuntt/agent-postmortem@v0.3.4`.
53
+ `uv tool install agent-postmortem`.
53
54
 
54
55
  ## The `/postmortem` skill
55
56
 
@@ -40,7 +40,9 @@ fi
40
40
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
41
41
  PLUGIN_ROOT="$(cd "$SCRIPT_DIR/.." >/dev/null 2>&1 && pwd)"
42
42
  PLUGIN_JSON="$PLUGIN_ROOT/.claude-plugin/plugin.json"
43
- # The CLI install source (docs/DESIGN.md 7.3): the public repository at the tag v<plugin version>.
43
+ # The CLI install sources (docs/DESIGN.md 7.3): PyPI at the plugin version first, then the
44
+ # public repository at the tag v<plugin version> if that install fails.
45
+ PYPI_PACKAGE="agent-postmortem"
44
46
  GIT_SOURCE="git+https://github.com/zeyusuntt/agent-postmortem"
45
47
 
46
48
  # docs/DESIGN.md 7.2's D9: one data directory, derived once, used for
@@ -325,8 +327,8 @@ _print_missing_cli_hint_if_due() {
325
327
  if _modified_within_a_day "$marker"; then
326
328
  return 0
327
329
  fi
328
- printf '{"systemMessage": "agent-postmortem CLI not found; run: uv tool install %s@v%s"}\n' \
329
- "$GIT_SOURCE" "$(_plugin_version)"
330
+ printf '{"systemMessage": "agent-postmortem CLI not found; run: uv tool install %s"}\n' \
331
+ "$PYPI_PACKAGE"
330
332
  : >"$marker" 2>/dev/null
331
333
  }
332
334
 
@@ -353,16 +355,22 @@ _maybe_install() {
353
355
  pinned_version="$(_plugin_version)"
354
356
  [ -n "$pinned_version" ] || return 0
355
357
 
356
- # Plan B (2026-10-28): the git tag that matches the plugin version, until PyPI works.
357
- source="$GIT_SOURCE@v$pinned_version"
358
+ # PyPI at the plugin version first; the matching GitHub tag only if that install fails
359
+ # (for example in the minutes between a release reaching GitHub and reaching PyPI). Both
360
+ # run under the one 60-second deadline the single install had, so the hook's time budget
361
+ # is unchanged.
362
+ pypi_source="$PYPI_PACKAGE==$pinned_version"
363
+ git_source="$GIT_SOURCE@v$pinned_version"
358
364
  {
359
- printf '%s attempting: uv tool install %s\n' \
360
- "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$source"
365
+ printf '%s attempting: uv tool install %s (fallback: %s)\n' \
366
+ "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$pypi_source" "$git_source"
361
367
  } >>"$install_log" 2>/dev/null
362
368
 
363
369
  mkdir -p "$DATA_DIR/bin" 2>/dev/null
364
370
  UV_TOOL_DIR="$DATA_DIR" UV_TOOL_BIN_DIR="$DATA_DIR/bin" \
365
- _run_with_deadline 60 uv tool install "$source" --python 3.11+ \
371
+ _run_with_deadline 60 sh -c \
372
+ 'uv tool install "$1" --python 3.11+ || uv tool install "$2" --python 3.11+' \
373
+ sh "$pypi_source" "$git_source" \
366
374
  </dev/null >>"$install_log" 2>&1
367
375
  }
368
376
 
@@ -114,5 +114,5 @@ Bash tool.
114
114
  `--no-redact` only if the user asks to see raw paths or session ids, and
115
115
  say so when you do.
116
116
  - If the CLI is missing entirely, tell the user to run
117
- `uv tool install git+https://github.com/zeyusuntt/agent-postmortem@v0.3.4` and stop; do not try to install it
117
+ `uv tool install agent-postmortem` and stop; do not try to install it
118
118
  yourself.
@@ -1,13 +1,13 @@
1
1
  [project]
2
2
  name = "agent-postmortem"
3
- version = "0.3.4"
4
- description = "Post-mortem for multi-agent coding runs: prove what silently went wrong, then draft the rule that prevents it."
3
+ version = "0.3.6"
4
+ description = "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
  readme = "README.md"
6
6
  license = { text = "MIT" }
7
7
  requires-python = ">=3.11"
8
8
  dependencies = []
9
9
  classifiers = [
10
- "Development Status :: 4 - Beta",
10
+ "Development Status :: 3 - Alpha",
11
11
  "Environment :: Console",
12
12
  "Intended Audience :: Developers",
13
13
  "License :: OSI Approved :: MIT License",
@@ -6,4 +6,4 @@ plugin/.claude-plugin/plugin.json's version (docs/DESIGN.md 7.1's D1,
6
6
  enforced by tests/test_plugin.py).
7
7
  """
8
8
 
9
- __version__ = "0.3.4"
9
+ __version__ = "0.3.6"
@@ -1759,9 +1759,11 @@ def _agent_story_pieces(agent, agent_findings: list[Finding]) -> list:
1759
1759
  all_runtime = False
1760
1760
  if all_runtime and silences:
1761
1761
  silence_text = ", ".join(silences)
1762
- lead = f"killed {k} {_plural(k, 'time')} by the runtime ({silence_text} of silence)"
1762
+ lead = _own_clause(
1763
+ f"killed {k} {_plural(k, 'time')} by the runtime ({silence_text} of silence)"
1764
+ )
1763
1765
  else:
1764
- lead = f"restarted {k} {_plural(k, 'time')}"
1766
+ lead = _own_clause(f"restarted {k} {_plural(k, 'time')}")
1765
1767
 
1766
1768
  parent_stop = False
1767
1769
  if final is not None:
@@ -1773,13 +1775,13 @@ def _agent_story_pieces(agent, agent_findings: list[Finding]) -> list:
1773
1775
  elif lead is not None:
1774
1776
  clauses.append(lead)
1775
1777
  elif parent_stop:
1776
- clauses.append("stopped by the parent")
1778
+ clauses.append(_own_clause("stopped by the parent"))
1777
1779
 
1778
1780
  for finding in by_detector.get("attempt_failed", []):
1779
1781
  ordinal = _finding_ordinal(finding, attempts_sorted)
1780
1782
  phrase = _cause_phrase(finding.metrics.get("cause", "unattributed"))
1781
1783
  reset_time = finding.metrics.get("reset_time")
1782
- text = f"attempt {ordinal} failed: {phrase}"
1784
+ text = _own_clause(f"attempt {ordinal} failed: {phrase}")
1783
1785
  if reset_time:
1784
1786
  text += f", resets {reset_time}"
1785
1787
  clauses.append(text)
@@ -1787,7 +1789,9 @@ def _agent_story_pieces(agent, agent_findings: list[Finding]) -> list:
1787
1789
  for finding in by_detector.get("claim_contradiction", []):
1788
1790
  ordinal = _finding_ordinal(finding, attempts_sorted)
1789
1791
  phrases = _claim_contradiction_phrases(finding.metrics)
1790
- clauses.append(f"attempt {ordinal} completed but reported {'; '.join(phrases)}")
1792
+ clauses.append(
1793
+ _own_clause(f"attempt {ordinal} completed but reported {'; '.join(phrases)}")
1794
+ )
1791
1795
 
1792
1796
  _paths_display, commits_count = _agent_facts_totals(agent)
1793
1797
  path_count, paths_partial = _agent_paths(agent)
@@ -1818,30 +1822,68 @@ def _agent_story_pieces(agent, agent_findings: list[Finding]) -> list:
1818
1822
  clauses.append("; ".join(tooling_bits))
1819
1823
 
1820
1824
  if not clauses and agent_findings:
1821
- clauses.append(agent_findings[0].title_parts or agent_findings[0].title)
1825
+ clauses.append(_title_clause(agent_findings[0], agent.label))
1822
1826
 
1823
1827
  return _sentences_pieces(clauses)
1824
1828
 
1825
1829
 
1830
+ def _sentence_case(text: str) -> str:
1831
+ """`text` with its first character upper-cased: how a story sentence starts."""
1832
+ return text[:1].upper() + text[1:]
1833
+
1834
+
1835
+ def _own_clause(text: str) -> str:
1836
+ """A story clause in the tool's own words, capitalized where it is written (0.4 review round
1837
+ 2): every clause is capitalized again only after names are substituted, and a label that is
1838
+ the clause's first word (`killed`, `restarted`, `attempt`) must not meet that word in
1839
+ lowercase."""
1840
+ return _sentence_case(text)
1841
+
1842
+
1843
+ # Detectors whose title starts with the agent's own label ("<label> interrupted after ...").
1844
+ _LABEL_LED_TITLES = frozenset({"mislabeled_kill"})
1845
+
1846
+
1847
+ def _title_clause(finding: Finding, label: str | None) -> object:
1848
+ """A finding title as a story clause (0.3.6 review round 3). The title of a detector that
1849
+ leads with the agent's own label stays as written, so the name substitution meets the label
1850
+ before the sentence is capitalized; every other title is in the tool's own words and is
1851
+ capitalized where it is used (`_own_clause`), so a label that is its first word ("the" in
1852
+ "the harness reported this workflow failed") never rewrites it."""
1853
+ if finding.title_parts:
1854
+ return finding.title_parts
1855
+ title = finding.title
1856
+ if (
1857
+ finding.detector in _LABEL_LED_TITLES
1858
+ and isinstance(label, str) and label and title.startswith(label)
1859
+ ):
1860
+ return title
1861
+ return _own_clause(title)
1862
+
1863
+
1864
+ class _Clause(str):
1865
+ """A story clause as written, without its final period. Its first character is upper-cased
1866
+ only after a sink rendered it (0.3.6): a clause can start with a user-authored name (a
1867
+ `mislabeled_kill` title starts with the label), and the case-sensitive name substitution
1868
+ must meet that name as written (docs/DESIGN.md 5.1)."""
1869
+
1870
+
1826
1871
  def _sentences(clauses: list[str]) -> str:
1827
1872
  """Join clauses as sentences: each starts with a capital and the whole
1828
1873
  ends with one period. Finding titles start lowercase by convention
1829
1874
  (docs/DESIGN.md 4.3), so this is where a story gets its capitals."""
1830
1875
  parts = [clause.rstrip(".") for clause in clauses if clause]
1831
- text = ". ".join(c[:1].upper() + c[1:] for c in parts)
1876
+ text = ". ".join(_sentence_case(c) for c in parts)
1832
1877
  return f"{text}." if text else ""
1833
1878
 
1834
1879
 
1835
1880
  def _sentences_pieces(clauses: list) -> list:
1836
- """`_sentences` as pieces (F fix 7, W7-2): a clause is a string or the `TitleParts` of a
1837
- finding title that names a path. With no `TitleParts` the result is the one string
1838
- `_sentences` returns (or no piece for no text). With one, the template is capitalized and
1839
- stripped of a final period like any clause, and the pieces are the strings around it (merged)
1840
- and the `TitleParts` themselves, so `_render_pieces` can render the path once and never scan
1841
- the tool's own words."""
1842
- if not any(isinstance(clause, TitleParts) for clause in clauses):
1843
- text = _sentences(clauses)
1844
- return [text] if text else []
1881
+ """`_sentences` as pieces (F fix 7, W7-2; 0.3.6): one piece per clause, with the ". "
1882
+ between clauses and the final "." as plain strings. A string clause is a `_Clause`, which a
1883
+ sink renders first and capitalizes after (`_render_pieces`), so a name at its start is
1884
+ substituted as written. The `TitleParts` of a finding title that names a path has its
1885
+ template capitalized and stripped of a final period here, since those words are the tool's
1886
+ own, and `_render_pieces` renders the path once and never scans them. No text, no piece."""
1845
1887
  parts: list = []
1846
1888
  for clause in clauses:
1847
1889
  if not clause:
@@ -1849,35 +1891,39 @@ def _sentences_pieces(clauses: list) -> list:
1849
1891
  if isinstance(clause, TitleParts):
1850
1892
  head, placeholder, tail = clause.template.partition("{path}")
1851
1893
  template = head + placeholder + tail.rstrip(".")
1852
- parts.append(TitleParts(template[:1].upper() + template[1:], clause.path))
1894
+ parts.append(TitleParts(_sentence_case(template), clause.path))
1853
1895
  else:
1854
- text = clause.rstrip(".")
1855
- parts.append(text[:1].upper() + text[1:])
1896
+ parts.append(_Clause(clause.rstrip(".")))
1897
+ if all(isinstance(part, _Clause) and not part for part in parts):
1898
+ return []
1856
1899
  pieces: list = []
1857
1900
  for index, part in enumerate(parts):
1858
- for piece in ((". ",) if index else ()) + (part,):
1859
- if isinstance(piece, str) and pieces and isinstance(pieces[-1], str):
1860
- pieces[-1] += piece
1861
- else:
1862
- pieces.append(piece)
1863
- if pieces and isinstance(pieces[-1], str):
1864
- pieces[-1] += "."
1865
- else:
1866
- pieces.append(".")
1901
+ if index:
1902
+ pieces.append(". ")
1903
+ pieces.append(part)
1904
+ pieces.append(".")
1867
1905
  return pieces
1868
1906
 
1869
1907
 
1870
1908
  def _pieces_raw(pieces: list) -> str:
1871
- """The pieces with the real path (the raw text of a story)."""
1872
- return "".join(piece.raw() if isinstance(piece, TitleParts) else piece for piece in pieces)
1909
+ """The pieces with the real path and real names (the raw text of a story)."""
1910
+ return "".join(
1911
+ piece.raw() if isinstance(piece, TitleParts)
1912
+ else _sentence_case(piece) if isinstance(piece, _Clause)
1913
+ else piece
1914
+ for piece in pieces
1915
+ )
1873
1916
 
1874
1917
 
1875
1918
  def _render_pieces(pieces: list, redactor: Redactor) -> str:
1876
- """The pieces as a sink prints them: a string through `Redactor.title` (labels, paths and the
1877
- rest of the scanner), a `TitleParts` through `Redactor.title_parts` (its path rendered once,
1878
- its words never scanned)."""
1919
+ """The pieces as a sink prints them: a `_Clause` through `Redactor.title` (labels, paths and
1920
+ the rest of the scanner) and only then capitalized, a `TitleParts` through
1921
+ `Redactor.title_parts` (its path rendered once, its words never scanned), and the separators
1922
+ as they are."""
1879
1923
  return "".join(
1880
- redactor.title_parts(piece) if isinstance(piece, TitleParts) else redactor.title(piece)
1924
+ redactor.title_parts(piece) if isinstance(piece, TitleParts)
1925
+ else _sentence_case(redactor.title(piece)) if isinstance(piece, _Clause)
1926
+ else piece
1881
1927
  for piece in pieces
1882
1928
  )
1883
1929
 
@@ -1933,7 +1979,7 @@ def _story_records(run: Run, findings: list[Finding], verbose: bool) -> list[dic
1933
1979
  run_relevant = [f for f in run_level if verbose or f.severity != "info"]
1934
1980
  if run_relevant:
1935
1981
  rank = min(_SEVERITIES.index(f.severity) for f in run_relevant)
1936
- pieces = _sentences_pieces([f.title_parts or f.title for f in run_relevant])
1982
+ pieces = _sentences_pieces([_title_clause(f, None) for f in run_relevant])
1937
1983
  entries.append({
1938
1984
  "agent": "run",
1939
1985
  "severity": _SEVERITIES[rank],
@@ -545,3 +545,4 @@ wf_00000000-8c0
545
545
  wf_00000000-cab
546
546
  wf_00000000-cac
547
547
  wf_00000000-cad
548
+ wf_00000000-b36