agent-postmortem 0.3.5__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.5 → agent_postmortem-0.3.6}/CHANGELOG.md +14 -0
  2. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/PKG-INFO +1 -1
  3. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/docs/DESIGN.md +14 -2
  4. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/plugin/.claude-plugin/plugin.json +1 -1
  5. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/pyproject.toml +1 -1
  6. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/__init__.py +1 -1
  7. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/report.py +81 -35
  8. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/synthetic-ids.txt +1 -0
  9. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n9_docs.py +3 -3
  10. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_plugin.py +4 -4
  11. agent_postmortem-0.3.6/tests/test_share_label_case.py +284 -0
  12. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/uv.lock +1 -1
  13. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.claude-plugin/marketplace.json +0 -0
  14. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  15. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/confusing_output.yml +0 -0
  16. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/detector_request.yml +0 -0
  17. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/run_shape_not_covered.yml +0 -0
  18. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/wrong_verdict.yml +0 -0
  19. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  20. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/workflows/ci.yml +0 -0
  21. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/workflows/release.yml +0 -0
  22. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.gitignore +0 -0
  23. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/CLAUDE.md +0 -0
  24. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/CONTRIBUTING.md +0 -0
  25. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/LICENSE +0 -0
  26. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/README.md +0 -0
  27. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/plugin/README.md +0 -0
  28. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/plugin/hooks/hooks.json +0 -0
  29. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/plugin/hooks/run.sh +0 -0
  30. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/plugin/skills/postmortem/SKILL.md +0 -0
  31. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/plugin/skills/rescue/SKILL.md +0 -0
  32. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/scripts/check-privacy.sh +0 -0
  33. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/scripts/export-public.sh +0 -0
  34. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/argerrors.py +0 -0
  35. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/claims.py +0 -0
  36. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/cli.py +0 -0
  37. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/commands.py +0 -0
  38. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/config.py +0 -0
  39. {agent_postmortem-0.3.5 → 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
  40. {agent_postmortem-0.3.5 → 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
  41. {agent_postmortem-0.3.5 → 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
  42. {agent_postmortem-0.3.5 → 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
  43. {agent_postmortem-0.3.5 → 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
  44. {agent_postmortem-0.3.5 → 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
  45. {agent_postmortem-0.3.5 → 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
  46. {agent_postmortem-0.3.5 → 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
  47. {agent_postmortem-0.3.5 → 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
  48. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  49. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/__init__.py +0 -0
  50. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/attempt_failed.py +0 -0
  51. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/base.py +0 -0
  52. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/bash_backgrounded.py +0 -0
  53. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/bash_timeout.py +0 -0
  54. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/claim_contradiction.py +0 -0
  55. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/classifier_unavailable.py +0 -0
  56. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/codex_unavailable.py +0 -0
  57. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/codex_write_denied.py +0 -0
  58. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/git_cwd_mismatch.py +0 -0
  59. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/mislabeled_kill.py +0 -0
  60. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/missing_artifact.py +0 -0
  61. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/permission_denied.py +0 -0
  62. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/silent_retry.py +0 -0
  63. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/structured_output_failure.py +0 -0
  64. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/tool_json_error.py +0 -0
  65. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/wasted_time.py +0 -0
  66. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/workflow_failed.py +0 -0
  67. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/disclosure.py +0 -0
  68. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/hooks/model_allocation_guard.mjs +0 -0
  69. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/hooks_cli.py +0 -0
  70. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/ledger.py +0 -0
  71. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/markers.py +0 -0
  72. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/models.py +0 -0
  73. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/observe.py +0 -0
  74. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/reader.py +0 -0
  75. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/redact.py +0 -0
  76. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/rescue.py +0 -0
  77. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/returns.py +0 -0
  78. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/rules.py +0 -0
  79. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/severity.py +0 -0
  80. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/state.py +0 -0
  81. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/trend.py +0 -0
  82. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/watch.py +0 -0
  83. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/conftest.py +0 -0
  84. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/README.md +0 -0
  85. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/demo__share.txt +0 -0
  86. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_plan__local.txt +0 -0
  87. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_plan__raw.txt +0 -0
  88. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_plan__share.txt +0 -0
  89. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_status__local.txt +0 -0
  90. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_status__raw.txt +0 -0
  91. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_status__share.txt +0 -0
  92. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules__local.txt +0 -0
  93. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules__raw.txt +0 -0
  94. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules__share.txt +0 -0
  95. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_all__local.txt +0 -0
  96. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_all__raw.txt +0 -0
  97. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_all__share.txt +0 -0
  98. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_propose__local.txt +0 -0
  99. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_propose__raw.txt +0 -0
  100. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_propose__share.txt +0 -0
  101. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_review__local.txt +0 -0
  102. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_review__raw.txt +0 -0
  103. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_review__share.txt +0 -0
  104. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_show__local.txt +0 -0
  105. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_show__raw.txt +0 -0
  106. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_show__share.txt +0 -0
  107. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/run__local.txt +0 -0
  108. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/run__raw.txt +0 -0
  109. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/run__share.txt +0 -0
  110. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan__local.txt +0 -0
  111. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan__raw.txt +0 -0
  112. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan__share.txt +0 -0
  113. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan_all__local.txt +0 -0
  114. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan_all__raw.txt +0 -0
  115. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan_all__share.txt +0 -0
  116. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/trend__local.txt +0 -0
  117. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/trend__raw.txt +0 -0
  118. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/trend__share.txt +0 -0
  119. {agent_postmortem-0.3.5 → 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
  120. {agent_postmortem-0.3.5 → 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
  121. {agent_postmortem-0.3.5 → 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
  122. {agent_postmortem-0.3.5 → 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
  123. {agent_postmortem-0.3.5 → 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
  124. {agent_postmortem-0.3.5 → 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
  125. {agent_postmortem-0.3.5 → 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
  126. {agent_postmortem-0.3.5 → 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
  127. {agent_postmortem-0.3.5 → 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
  128. {agent_postmortem-0.3.5 → 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
  129. {agent_postmortem-0.3.5 → 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
  130. {agent_postmortem-0.3.5 → 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
  131. {agent_postmortem-0.3.5 → 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
  132. {agent_postmortem-0.3.5 → 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
  133. {agent_postmortem-0.3.5 → 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
  134. {agent_postmortem-0.3.5 → 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
  135. {agent_postmortem-0.3.5 → 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
  136. {agent_postmortem-0.3.5 → 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
  137. {agent_postmortem-0.3.5 → 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
  138. {agent_postmortem-0.3.5 → 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
  139. {agent_postmortem-0.3.5 → 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
  140. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000001.jsonl +0 -0
  141. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000001.meta.json +0 -0
  142. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000002.jsonl +0 -0
  143. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000002.meta.json +0 -0
  144. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000003.jsonl +0 -0
  145. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000003.meta.json +0 -0
  146. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000004.jsonl +0 -0
  147. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000004.meta.json +0 -0
  148. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000005.jsonl +0 -0
  149. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000005.meta.json +0 -0
  150. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000006.jsonl +0 -0
  151. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000006.meta.json +0 -0
  152. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000007.jsonl +0 -0
  153. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000007.meta.json +0 -0
  154. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a1.jsonl +0 -0
  155. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a1.meta.json +0 -0
  156. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a2.jsonl +0 -0
  157. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a2.meta.json +0 -0
  158. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a3.jsonl +0 -0
  159. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a3.meta.json +0 -0
  160. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a4.jsonl +0 -0
  161. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a4.meta.json +0 -0
  162. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/journal.jsonl +0 -0
  163. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afa10000000000001.jsonl +0 -0
  164. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afa10000000000001.meta.json +0 -0
  165. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afa10000000000002.jsonl +0 -0
  166. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afa10000000000002.meta.json +0 -0
  167. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afb10000000000001.jsonl +0 -0
  168. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afb10000000000001.meta.json +0 -0
  169. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/journal.jsonl +0 -0
  170. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/bash_backgrounded_timeout/agent-ac300000000000001.jsonl +0 -0
  171. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/bash_backgrounded_timeout/agent-ac300000000000001.meta.json +0 -0
  172. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/bash_backgrounded_timeout/journal.jsonl +0 -0
  173. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/claim_contradiction/journal.jsonl +0 -0
  174. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/clean_run/agent-ac100000000000001.jsonl +0 -0
  175. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/clean_run/agent-ac100000000000001.meta.json +0 -0
  176. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/clean_run/agent-ac100000000000002.jsonl +0 -0
  177. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/clean_run/agent-ac100000000000002.meta.json +0 -0
  178. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/clean_run/journal.jsonl +0 -0
  179. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000001.jsonl +0 -0
  180. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000001.meta.json +0 -0
  181. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000002.jsonl +0 -0
  182. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000002.meta.json +0 -0
  183. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000003.jsonl +0 -0
  184. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000003.meta.json +0 -0
  185. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000004.jsonl +0 -0
  186. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000004.meta.json +0 -0
  187. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/journal.jsonl +0 -0
  188. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000001.jsonl +0 -0
  189. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000001.meta.json +0 -0
  190. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000002.jsonl +0 -0
  191. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000002.meta.json +0 -0
  192. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000003.jsonl +0 -0
  193. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000003.meta.json +0 -0
  194. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/journal.jsonl +0 -0
  195. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/evidence_noise/agent-acf00000000000001.jsonl +0 -0
  196. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/evidence_noise/agent-acf00000000000001.meta.json +0 -0
  197. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/evidence_noise/journal.jsonl +0 -0
  198. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ae300000000000001.jsonl +0 -0
  199. {agent_postmortem-0.3.5 → 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
  200. {agent_postmortem-0.3.5 → 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
  201. {agent_postmortem-0.3.5 → 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
  202. {agent_postmortem-0.3.5 → 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
  203. {agent_postmortem-0.3.5 → 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
  204. {agent_postmortem-0.3.5 → 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
  205. {agent_postmortem-0.3.5 → 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
  206. {agent_postmortem-0.3.5 → 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
  207. {agent_postmortem-0.3.5 → 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
  208. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  209. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/incomplete_journal/agent-ad000000000000001.jsonl +0 -0
  210. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/incomplete_journal/agent-ad000000000000001.meta.json +0 -0
  211. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/incomplete_journal/journal.jsonl +0 -0
  212. {agent_postmortem-0.3.5 → 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
  213. {agent_postmortem-0.3.5 → 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
  214. {agent_postmortem-0.3.5 → 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
  215. {agent_postmortem-0.3.5 → 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
  216. {agent_postmortem-0.3.5 → 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
  217. {agent_postmortem-0.3.5 → 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
  218. {agent_postmortem-0.3.5 → 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
  219. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  220. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_orphan_failed/journal.jsonl +0 -0
  221. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad200000000000001.jsonl +0 -0
  222. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad200000000000001.meta.json +0 -0
  223. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad300000000000001.jsonl +0 -0
  224. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad300000000000001.meta.json +0 -0
  225. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad400000000000001.jsonl +0 -0
  226. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad400000000000001.meta.json +0 -0
  227. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad400000000000002.jsonl +0 -0
  228. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad400000000000002.meta.json +0 -0
  229. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad500000000000001.jsonl +0 -0
  230. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad500000000000001.meta.json +0 -0
  231. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad500000000000002.jsonl +0 -0
  232. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad500000000000002.meta.json +0 -0
  233. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad600000000000001.jsonl +0 -0
  234. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad600000000000001.meta.json +0 -0
  235. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad600000000000002.jsonl +0 -0
  236. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad600000000000002.meta.json +0 -0
  237. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad700000000000001.jsonl +0 -0
  238. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad700000000000001.meta.json +0 -0
  239. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad800000000000001.jsonl +0 -0
  240. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad800000000000001.meta.json +0 -0
  241. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/journal.jsonl +0 -0
  242. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_unresolved/agent-ad900000000000001.jsonl +0 -0
  243. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_unresolved/agent-ad900000000000001.meta.json +0 -0
  244. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_unresolved/journal.jsonl +0 -0
  245. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/missing_artifact/agent-ac600000000000001.jsonl +0 -0
  246. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/missing_artifact/agent-ac600000000000001.meta.json +0 -0
  247. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/missing_artifact/agent-ac600000000000002.jsonl +0 -0
  248. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/missing_artifact/agent-ac600000000000002.meta.json +0 -0
  249. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/missing_artifact/journal.jsonl +0 -0
  250. {agent_postmortem-0.3.5 → 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
  251. {agent_postmortem-0.3.5 → 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
  252. {agent_postmortem-0.3.5 → 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
  253. {agent_postmortem-0.3.5 → 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
  254. {agent_postmortem-0.3.5 → 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
  255. {agent_postmortem-0.3.5 → 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
  256. {agent_postmortem-0.3.5 → 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
  257. {agent_postmortem-0.3.5 → 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
  258. {agent_postmortem-0.3.5 → 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
  259. {agent_postmortem-0.3.5 → 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
  260. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000001.jsonl +0 -0
  261. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000001.meta.json +0 -0
  262. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000002.jsonl +0 -0
  263. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000002.meta.json +0 -0
  264. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000003.jsonl +0 -0
  265. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000003.meta.json +0 -0
  266. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000004.jsonl +0 -0
  267. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000004.meta.json +0 -0
  268. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000005.jsonl +0 -0
  269. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000005.meta.json +0 -0
  270. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/journal.jsonl +0 -0
  271. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_bridge_only/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  272. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac700000000000001.jsonl +0 -0
  273. {agent_postmortem-0.3.5 → 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
  274. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac700000000000002.jsonl +0 -0
  275. {agent_postmortem-0.3.5 → 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
  276. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  277. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_compaction/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-aca00000000000001.jsonl +0 -0
  278. {agent_postmortem-0.3.5 → 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
  279. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_compaction/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  280. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_dedup/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  281. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_envelope/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac900000000000001.jsonl +0 -0
  282. {agent_postmortem-0.3.5 → 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
  283. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_envelope/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  284. {agent_postmortem-0.3.5 → 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
  285. {agent_postmortem-0.3.5 → 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
  286. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_human_interrupt/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  287. {agent_postmortem-0.3.5 → 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
  288. {agent_postmortem-0.3.5 → 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
  289. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_parent_stop/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  290. {agent_postmortem-0.3.5 → 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
  291. {agent_postmortem-0.3.5 → 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
  292. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_unattributed_long/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  293. {agent_postmortem-0.3.5 → 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
  294. {agent_postmortem-0.3.5 → 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
  295. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_unattributed_short/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
  296. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/structured_output_corrupt/agent-ac400000000000001.jsonl +0 -0
  297. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/structured_output_corrupt/agent-ac400000000000001.meta.json +0 -0
  298. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/structured_output_corrupt/journal.jsonl +0 -0
  299. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/g_corpus_support.py +0 -0
  300. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/g_helpers.py +0 -0
  301. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/g_independent_return.py +0 -0
  302. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/n3b_helpers.py +0 -0
  303. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/n3b_planted.py +0 -0
  304. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/n4_reference_commands.py +0 -0
  305. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/n4b2_helpers.py +0 -0
  306. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/n5b_helpers.py +0 -0
  307. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/n5c1_helpers.py +0 -0
  308. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/n5c2_helpers.py +0 -0
  309. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/n6_helpers.py +0 -0
  310. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/privacy_rules.py +0 -0
  311. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/rule_fixtures.py +0 -0
  312. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_attempt_facts.py +0 -0
  313. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_attempt_failed.py +0 -0
  314. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_attribution.py +0 -0
  315. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_bug_report.py +0 -0
  316. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_claim_contradiction.py +0 -0
  317. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_cli_smoke.py +0 -0
  318. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_codex_unavailable.py +0 -0
  319. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_config.py +0 -0
  320. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_deep_lines.py +0 -0
  321. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_detectors_base.py +0 -0
  322. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_detectors_core.py +0 -0
  323. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_detectors_registry.py +0 -0
  324. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_detectors_tooling.py +0 -0
  325. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_disclosure_primitives.py +0 -0
  326. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_empty_state.py +0 -0
  327. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_export.py +0 -0
  328. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_export_public.py +0 -0
  329. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fa_commit_no_id.py +0 -0
  330. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fa_fork.py +0 -0
  331. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fa_generations.py +0 -0
  332. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fa_path_token.py +0 -0
  333. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fa_return_boundary.py +0 -0
  334. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fa_wasted.py +0 -0
  335. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fb_here.py +0 -0
  336. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fb_live_now.py +0 -0
  337. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fb_rescue_live.py +0 -0
  338. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix10_redact.py +0 -0
  339. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix11_redact.py +0 -0
  340. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix12_redact.py +0 -0
  341. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix1_commit.py +0 -0
  342. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix1_launch.py +0 -0
  343. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix1_poll.py +0 -0
  344. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix1_redact.py +0 -0
  345. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix2_launch.py +0 -0
  346. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix2_poll.py +0 -0
  347. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix2_redact.py +0 -0
  348. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix3_redact.py +0 -0
  349. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix4_fuzz.py +0 -0
  350. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix4_lexer.py +0 -0
  351. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix4_redact.py +0 -0
  352. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix4_sinks.py +0 -0
  353. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix5_lexer.py +0 -0
  354. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix5_redact.py +0 -0
  355. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix5_sinks.py +0 -0
  356. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix6_fuzz.py +0 -0
  357. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix6_hook.py +0 -0
  358. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix6_lexer.py +0 -0
  359. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix6_redact.py +0 -0
  360. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix6_sinks.py +0 -0
  361. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix6b_title.py +0 -0
  362. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix7_e2e.py +0 -0
  363. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix7_fuzz.py +0 -0
  364. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix7_redact.py +0 -0
  365. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix7_sinks.py +0 -0
  366. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix7_title.py +0 -0
  367. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix8_e2e.py +0 -0
  368. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix8_fuzz.py +0 -0
  369. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix8_redact.py +0 -0
  370. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix8_sinks.py +0 -0
  371. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix9_e2e.py +0 -0
  372. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix9_fuzz.py +0 -0
  373. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix9_redact.py +0 -0
  374. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix9_sinks.py +0 -0
  375. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_help.py +0 -0
  376. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_scan.py +0 -0
  377. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_table.py +0 -0
  378. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_wording.py +0 -0
  379. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_field_v03.py +0 -0
  380. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_field_v03_more.py +0 -0
  381. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_filter_scope.py +0 -0
  382. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fixa_discovery.py +0 -0
  383. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fixa_enqueue.py +0 -0
  384. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fixa_reader.py +0 -0
  385. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_a1_hooks.py +0 -0
  386. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_a1_return.py +0 -0
  387. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_b1.py +0 -0
  388. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_c.py +0 -0
  389. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_commit_sentences.py +0 -0
  390. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_commits.py +0 -0
  391. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_consumers.py +0 -0
  392. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_corpus.py +0 -0
  393. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_denied.py +0 -0
  394. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_failed.py +0 -0
  395. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_here.py +0 -0
  396. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_hooks.py +0 -0
  397. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_registry.py +0 -0
  398. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_rescue.py +0 -0
  399. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_return.py +0 -0
  400. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_selfreport.py +0 -0
  401. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_hooks_benchmark.py +0 -0
  402. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_hooks_cli.py +0 -0
  403. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_journal_malformed_fields.py +0 -0
  404. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_journal_state.py +0 -0
  405. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_launch_docs.py +0 -0
  406. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_model_allocation_guard.py +0 -0
  407. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n1_markers.py +0 -0
  408. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n1_parent_index.py +0 -0
  409. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n2_lifecycle.py +0 -0
  410. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_apply.py +0 -0
  411. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_canonical_ids.py +0 -0
  412. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_context.py +0 -0
  413. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_demo.py +0 -0
  414. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_first_line.py +0 -0
  415. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_dedupe.py +0 -0
  416. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_demo.py +0 -0
  417. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_local_path.py +0 -0
  418. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_names.py +0 -0
  419. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_paths_c4.py +0 -0
  420. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_paths_c6.py +0 -0
  421. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_paths_s10.py +0 -0
  422. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_paths_s4.py +0 -0
  423. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_titles.py +0 -0
  424. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_hook_group.py +0 -0
  425. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_noident_pointer.py +0 -0
  426. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_repr_tokens.py +0 -0
  427. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_rescue_c1.py +0 -0
  428. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_run_ids.py +0 -0
  429. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_traversal.py +0 -0
  430. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixr2_ids.py +0 -0
  431. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixr2_paths.py +0 -0
  432. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixr2_raw_dupes.py +0 -0
  433. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixr2_schema2_hostile.py +0 -0
  434. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_flags.py +0 -0
  435. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_handler_errors.py +0 -0
  436. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_hooks.py +0 -0
  437. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_local_path.py +0 -0
  438. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_local_scrub.py +0 -0
  439. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_parser_errors.py +0 -0
  440. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_part2_slow_path.py +0 -0
  441. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_part3_sinks.py +0 -0
  442. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_pointers.py +0 -0
  443. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_reader.py +0 -0
  444. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_rescue.py +0 -0
  445. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_residual_sinks.py +0 -0
  446. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_rules_trend.py +0 -0
  447. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_run_fallback.py +0 -0
  448. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_run_local.py +0 -0
  449. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_run_noncanonical_agent.py +0 -0
  450. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_run_path_matrix.py +0 -0
  451. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_run_share.py +0 -0
  452. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_scan.py +0 -0
  453. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_slow_path.py +0 -0
  454. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_watch.py +0 -0
  455. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4a_base_repo.py +0 -0
  456. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4a_commit_grammar.py +0 -0
  457. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4a_lexer.py +0 -0
  458. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4a_measure.py +0 -0
  459. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4a_readonly.py +0 -0
  460. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4a_rows.py +0 -0
  461. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4a_write_grammar.py +0 -0
  462. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b1_discovery.py +0 -0
  463. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b1_reader_facts.py +0 -0
  464. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b1_schema2.py +0 -0
  465. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b2_forms.py +0 -0
  466. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b2_measure.py +0 -0
  467. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b2_population.py +0 -0
  468. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b2_reasons.py +0 -0
  469. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b2_repo_groups.py +0 -0
  470. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b2_rows.py +0 -0
  471. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixb_c3.py +0 -0
  472. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixb_differential.py +0 -0
  473. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixb_minor.py +0 -0
  474. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixb_s3.py +0 -0
  475. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixb_s4.py +0 -0
  476. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixb_s5_s10.py +0 -0
  477. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixc_a4.py +0 -0
  478. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixd_a5.py +0 -0
  479. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixe_a5.py +0 -0
  480. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5_schema3_goldens.py +0 -0
  481. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5a1_schema3.py +0 -0
  482. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5a2_docs.py +0 -0
  483. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5b_detectors.py +0 -0
  484. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5b_inputs.py +0 -0
  485. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5b_severity.py +0 -0
  486. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5b_verdict.py +0 -0
  487. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c1_gaps.py +0 -0
  488. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c1_look.py +0 -0
  489. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c1_observation_export.py +0 -0
  490. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c1_observe.py +0 -0
  491. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c1_rescue.py +0 -0
  492. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c1_returned.py +0 -0
  493. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c1_work_at_risk.py +0 -0
  494. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c2_exit_codes.py +0 -0
  495. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c2_misc.py +0 -0
  496. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c2_status_repos.py +0 -0
  497. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5fix1_misc.py +0 -0
  498. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5fix1_plan.py +0 -0
  499. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5fix1_returned.py +0 -0
  500. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5fix1_severity.py +0 -0
  501. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5fix1_status.py +0 -0
  502. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_alias_state.py +0 -0
  503. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_cwd.py +0 -0
  504. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_docs.py +0 -0
  505. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_fix1.py +0 -0
  506. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_here_run.py +0 -0
  507. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_here_scan.py +0 -0
  508. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_pins.py +0 -0
  509. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_resolve.py +0 -0
  510. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_roundtrip.py +0 -0
  511. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_stderr.py +0 -0
  512. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n7_detectors.py +0 -0
  513. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n8_fix1.py +0 -0
  514. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n8_fix2.py +0 -0
  515. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n8_k1_killed.py +0 -0
  516. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n8_k2_what_to_do.py +0 -0
  517. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n8_k3_precursor.py +0 -0
  518. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n8_k4_rescue.py +0 -0
  519. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n8_k5_watch.py +0 -0
  520. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n8_k6_rules.py +0 -0
  521. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n9_release_gate.py +0 -0
  522. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_no_lazy_fetch.py +0 -0
  523. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_no_write_surface.py +0 -0
  524. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_observe.py +0 -0
  525. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_privacy.py +0 -0
  526. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_privacy_matrix.py +0 -0
  527. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_r1_scan_risk_parity.py +0 -0
  528. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_reader.py +0 -0
  529. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_reader_session.py +0 -0
  530. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_readme.py +0 -0
  531. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_redact.py +0 -0
  532. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_rel_demo.py +0 -0
  533. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_rel_scan_all.py +0 -0
  534. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_rendered_privacy.py +0 -0
  535. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_report_session.py +0 -0
  536. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_report_v2.py +0 -0
  537. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_rescue.py +0 -0
  538. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_rules.py +0 -0
  539. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_rules_propose.py +0 -0
  540. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_rules_review.py +0 -0
  541. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_scan_triage.py +0 -0
  542. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_state.py +0 -0
  543. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_tooling_agent_scope.py +0 -0
  544. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_trend.py +0 -0
  545. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_watch.py +0 -0
  546. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_wheel.py +0 -0
  547. {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_workflows.py +0 -0
@@ -5,6 +5,20 @@ 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
+
8
22
  ## [0.3.5]
9
23
 
10
24
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agent-postmortem
3
- Version: 0.3.5
3
+ Version: 0.3.6
4
4
  Summary: Reads the Claude Code logs already on your machine and tells you which agent's 'done' you can't trust, and what to run next.
5
5
  Project-URL: Homepage, https://github.com/zeyusuntt/agent-postmortem
6
6
  Project-URL: Issues, https://github.com/zeyusuntt/agent-postmortem/issues
@@ -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
@@ -6707,7 +6719,7 @@ later events go positional).
6707
6719
 
6708
6720
  ### 8.1 Package
6709
6721
 
6710
- `pyproject.toml`: name `agent-postmortem`, version `0.3.5`, console scripts
6722
+ `pyproject.toml`: name `agent-postmortem`, version `0.3.6`, console scripts
6711
6723
  `agent-postmortem` and `postmortem`, `requires-python >= 3.11`, no runtime
6712
6724
  dependencies, `[project.optional-dependencies].dev = ["pytest>=8",
6713
6725
  "ruff>=0.6"]`, classifiers, URLs (Homepage, Issues, Changelog). The wheel
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-postmortem",
3
- "version": "0.3.5",
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",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "agent-postmortem"
3
- version = "0.3.5"
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
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -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.5"
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
@@ -96,11 +96,11 @@ def test_changelog_unreleased_entry_is_first_and_grouped():
96
96
  assert "http" not in entry
97
97
 
98
98
 
99
- def test_the_package_version_is_0_3_5():
99
+ def test_the_package_version_is_0_3_6():
100
100
  pyproject = (REPO_ROOT / "pyproject.toml").read_text(encoding="utf-8")
101
101
  init = (REPO_ROOT / "src" / "agent_postmortem" / "__init__.py").read_text(encoding="utf-8")
102
- assert re.search(r'^version = "0\.3\.5"', pyproject, re.M)
103
- assert '__version__ = "0.3.5"' in init
102
+ assert re.search(r'^version = "0\.3\.6"', pyproject, re.M)
103
+ assert '__version__ = "0.3.6"' in init
104
104
 
105
105
 
106
106
  # ---- DESIGN ----
@@ -110,17 +110,17 @@ def test_plugin_version_equals_package_version():
110
110
  assert plugin["version"] == package_version
111
111
 
112
112
 
113
- def test_pyproject_plugin_and_package_versions_are_all_0_3_5():
113
+ def test_pyproject_plugin_and_package_versions_are_all_0_3_6():
114
114
  """docs/DESIGN.md 7.1's D1: the literal, not just mutual equality --
115
115
  a version bump that only kept two of the three in sync would still
116
116
  pass a pure-equality check."""
117
117
  pyproject = tomllib.loads((REPO_ROOT / "pyproject.toml").read_text(encoding="utf-8"))
118
- assert pyproject["project"]["version"] == "0.3.5"
118
+ assert pyproject["project"]["version"] == "0.3.6"
119
119
  plugin = _load_json(PLUGIN_ROOT / ".claude-plugin" / "plugin.json")
120
- assert plugin["version"] == "0.3.5"
120
+ assert plugin["version"] == "0.3.6"
121
121
  import agent_postmortem
122
122
 
123
- assert agent_postmortem.__version__ == "0.3.5"
123
+ assert agent_postmortem.__version__ == "0.3.6"
124
124
 
125
125
 
126
126
  def test_pyproject_declares_agent_postmortem_as_primary_and_postmortem_as_alias():
@@ -0,0 +1,284 @@
1
+ """A user-authored name that starts with a lowercase letter must not reach share output
2
+ capitalized (docs/DESIGN.md 1 and 5.1: pseudonyms for every user-authored name in every
3
+ output; 4.13.5 share invariant).
4
+
5
+ A story sentence starts with a capital. When its first clause is a finding title that starts
6
+ with the agent's label (`mislabeled_kill`: "<label> interrupted after Ns of silence ..."), 0.3.5
7
+ capitalized the label before the case-sensitive name substitution ran, so "impl:x" printed as
8
+ "Impl:x". From 0.3.6 a story clause is capitalized after the sink substituted names
9
+ (`report._render_pieces`), so the tool's own capitalized words never meet a name either. The
10
+ planted names here start lowercase, unlike the sentinels of test_field_v03_more.py, and every
11
+ check is case-insensitive.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import io
17
+ import json
18
+ import os
19
+ from datetime import datetime, timedelta, timezone
20
+ from pathlib import Path
21
+
22
+ import pytest
23
+
24
+ from agent_postmortem import cli, reader, report
25
+ from agent_postmortem.disclosure import DisclosureContext
26
+ from agent_postmortem.redact import Redactor
27
+ from tests.test_field_v03 import (
28
+ FAKE_SLUG,
29
+ FAKE_UUID,
30
+ _assistant_tool,
31
+ _kill,
32
+ _no_config,
33
+ _parent_path,
34
+ _tool_result,
35
+ _user,
36
+ _wf_dir,
37
+ _write_jsonl,
38
+ )
39
+
40
+ _LABEL = "zz-lower-agent-nickname"
41
+ _PHASE = "zz-lower-phase-title"
42
+ _WF_ID = "wf_00000000-b36"
43
+ _AGENT = "ab36" + "0" * 12 + "1"
44
+
45
+
46
+ def _backdate(paths: list[Path], when: datetime) -> None:
47
+ for path in paths:
48
+ os.utime(path, (when.timestamp(), when.timestamp()))
49
+
50
+
51
+ def _killed_after_silence(agent_id: str, base: datetime) -> list[dict]:
52
+ """One Bash call, then 400 s of silence and the interrupt marker: an unattributed
53
+ long-silence mislabeled_kill, whose title starts with the label and is the agent's
54
+ whole story (no path, no commit, no restart)."""
55
+ return [
56
+ _user("Investigate.", base, agent_id),
57
+ _assistant_tool("t1", "Bash", {"command": "ls"}, base + timedelta(seconds=1), agent_id),
58
+ _tool_result("t1", "ok", base + timedelta(seconds=2), agent_id),
59
+ _kill(base + timedelta(seconds=402), agent_id),
60
+ ]
61
+
62
+
63
+ def _workflow(tmp_path: Path) -> tuple[Path, Path, Path]:
64
+ root = tmp_path / "root"
65
+ run_dir = _wf_dir(root, _WF_ID)
66
+ base = datetime.now(timezone.utc) - timedelta(days=1)
67
+ _write_jsonl(run_dir / "journal.jsonl", [
68
+ {"type": "started", "key": "v2:x", "agentId": _AGENT, "label": _LABEL, "phase": _PHASE},
69
+ ])
70
+ transcript = run_dir / f"agent-{_AGENT}.jsonl"
71
+ _write_jsonl(transcript, _killed_after_silence(_AGENT, base))
72
+ main = _parent_path(root)
73
+ _write_jsonl(main, [{
74
+ "type": "user", "message": {"role": "user", "content": "start"},
75
+ "sessionId": FAKE_UUID, "timestamp": base.strftime("%Y-%m-%dT%H:%M:%SZ"),
76
+ }])
77
+ _backdate([run_dir / "journal.jsonl", transcript, main], base + timedelta(seconds=403))
78
+ return root, run_dir, main
79
+
80
+
81
+ def _session(tmp_path: Path) -> tuple[Path, Path, Path]:
82
+ root = tmp_path / "root"
83
+ main = root / FAKE_SLUG / f"{FAKE_UUID}.jsonl"
84
+ base = datetime.now(timezone.utc) - timedelta(days=1)
85
+ _write_jsonl(main, [{
86
+ "type": "user", "message": {"role": "user", "content": "start"},
87
+ "sessionId": FAKE_UUID, "timestamp": base.strftime("%Y-%m-%dT%H:%M:%SZ"),
88
+ }])
89
+ subagents = root / FAKE_SLUG / FAKE_UUID / "subagents"
90
+ transcript = subagents / f"agent-{_AGENT}.jsonl"
91
+ _write_jsonl(transcript, _killed_after_silence(_AGENT, base))
92
+ meta = subagents / f"agent-{_AGENT}.meta.json"
93
+ meta.write_text(json.dumps({"agentType": "general-purpose", "description": _LABEL}),
94
+ encoding="utf-8")
95
+ _backdate([main, transcript, meta], base + timedelta(seconds=403))
96
+ return root, main, main
97
+
98
+
99
+ _KINDS = {"workflow": _workflow, "session": _session}
100
+
101
+
102
+ def _outputs(capsys, monkeypatch, tmp_path, root: Path, run: Path, main: Path) -> dict[str, str]:
103
+ """Every share sink that can carry a label, by command."""
104
+ # (argv, expected exit code): run and scan succeed; rescue exits 4 for a run whose risk
105
+ # population it cannot complete (docs/DESIGN.md 4.11)
106
+ commands = {
107
+ "run": (["run", str(run)], 0),
108
+ "run --json": (["run", str(run), "--json"], 0),
109
+ "run --verbose": (["run", str(run), "--verbose"], 0),
110
+ "run --bug-report": (["run", str(run), "--bug-report"], 0),
111
+ "scan": (["scan", "--root", str(root)], 0),
112
+ "scan --all": (["scan", "--root", str(root), "--all"], 0),
113
+ "scan --json": (["scan", "--root", str(root), "--all", "--json"], 0),
114
+ "rescue plan": (["rescue", "plan", str(run)], 4),
115
+ "rescue plan --json": (["rescue", "plan", str(run), "--json"], 4),
116
+ "rescue status": (["rescue", "status", str(run)], 4),
117
+ }
118
+ run_id = reader.load_run(run).run_id
119
+ out: dict[str, str] = {}
120
+ for name, (argv, expected) in commands.items():
121
+ code = cli.main(argv)
122
+ captured = capsys.readouterr()
123
+ assert code == expected and captured.out.strip(), (name, code, captured.err)
124
+ if name.endswith("--json"):
125
+ json.loads(captured.out)
126
+ record = {"rescue plan": "UNIT agent-1", "rescue plan --json": '"agent-1"',
127
+ "rescue status": None}.get(name, run_id)
128
+ if record is not None:
129
+ assert record in captured.out, (name, record)
130
+ out[name] = captured.out + captured.err
131
+ monkeypatch.setenv("XDG_STATE_HOME", str(tmp_path / "hookstate"))
132
+ payload = {"hook_event_name": "Stop", "transcript_path": str(main),
133
+ "session_id": FAKE_UUID, "stop_hook_active": False}
134
+ monkeypatch.setattr("sys.stdin", io.StringIO(json.dumps(payload)))
135
+ assert cli.main(["hook", "check"]) == 0
136
+ captured = capsys.readouterr()
137
+ out["hook check"] = captured.out + captured.err
138
+ return out
139
+
140
+
141
+ @pytest.mark.parametrize("kind", sorted(_KINDS))
142
+ def test_a_lowercase_label_never_reaches_share_output_in_any_case(
143
+ kind, tmp_path, monkeypatch, capsys,
144
+ ):
145
+ _no_config(monkeypatch, tmp_path)
146
+ root, run, main = _KINDS[kind](tmp_path)
147
+ outputs = _outputs(capsys, monkeypatch, tmp_path, root, run, main)
148
+ # the planted case is exercised: the story that used to carry the label is there, aliased
149
+ assert "Agent-1 interrupted after 400s" in outputs["run"]
150
+ stories = [entry["text"] for entry in json.loads(outputs["run --json"])["stories"]]
151
+ assert any(text.startswith("Agent-1 interrupted after 400s") for text in stories), stories
152
+ leaks = {
153
+ name: text for name, text in outputs.items()
154
+ if _LABEL in text.lower() or _PHASE in text.lower()
155
+ }
156
+ assert not leaks, {name: [line for line in text.splitlines()
157
+ if _LABEL in line.lower() or _PHASE in line.lower()]
158
+ for name, text in leaks.items()}
159
+
160
+
161
+ @pytest.mark.parametrize("kind", sorted(_KINDS))
162
+ def test_the_story_still_starts_with_a_capital_after_the_label_is_replaced(
163
+ kind, tmp_path, monkeypatch, capsys,
164
+ ):
165
+ _no_config(monkeypatch, tmp_path)
166
+ _root, run, _main = _KINDS[kind](tmp_path)
167
+ cli.main(["run", str(run)])
168
+ out = capsys.readouterr().out
169
+ story = [line for line in out.splitlines() if "interrupted after 400s" in line]
170
+ assert len(story) == 1, out
171
+ sentence = story[0].strip().split(" ", 1)[1]
172
+ assert sentence.startswith("Agent-1 interrupted after 400s"), story[0]
173
+
174
+
175
+ def test_local_still_prints_the_real_label_capitalized_where_the_sentence_starts(
176
+ tmp_path, monkeypatch, capsys,
177
+ ):
178
+ _no_config(monkeypatch, tmp_path)
179
+ _root, run, _main = _workflow(tmp_path)
180
+ cli.main(["run", str(run), "--local"])
181
+ out = capsys.readouterr().out
182
+ assert "Zz-lower-agent-nickname interrupted after 400s" in out
183
+
184
+
185
+ def _share_redactor(**names: str) -> Redactor:
186
+ redactor = Redactor(context=DisclosureContext(level="share", home="/home/user"))
187
+ registry = redactor.fresh_names(detailed=False)
188
+ for category, value in names.items():
189
+ getattr(registry, category)(value)
190
+ return redactor
191
+
192
+
193
+ def _story(redactor: Redactor, *clauses) -> str:
194
+ return report._render_pieces(report._sentences_pieces(list(clauses)), redactor)
195
+
196
+
197
+ def test_a_clause_that_starts_with_a_lowercase_label_is_aliased_then_capitalized():
198
+ redactor = _share_redactor(agent="zz-lower")
199
+ assert _story(redactor, "zz-lower interrupted after 400s", "Wrote no paths.") == (
200
+ "Agent-1 interrupted after 400s. Wrote no paths."
201
+ )
202
+
203
+
204
+ def _demo_copy(tmp_path, label: str) -> Path:
205
+ """The packaged demo workflow (two agents, each killed once by the runtime and restarted),
206
+ with every journal label replaced by `label`."""
207
+ import shutil
208
+ from importlib import resources
209
+ source = resources.files("agent_postmortem") / "demo" / "-home-user-project"
210
+ target = tmp_path / "root" / "-home-user-project"
211
+ with resources.as_file(source) as path:
212
+ shutil.copytree(path, target)
213
+ run_dir = next(target.glob("*/subagents/workflows/wf_*"))
214
+ journal = run_dir / "journal.jsonl"
215
+ rows = [json.loads(line) for line in journal.read_text(encoding="utf-8").splitlines()]
216
+ for row in rows:
217
+ if "label" in row:
218
+ row["label"] = label
219
+ journal.write_text("".join(json.dumps(row) + "\n" for row in rows), encoding="utf-8")
220
+ return run_dir
221
+
222
+
223
+ def test_a_label_that_is_the_first_word_of_the_tools_own_clause_leaves_it_alone(
224
+ tmp_path, monkeypatch, capsys,
225
+ ):
226
+ # Review round 2: a workflow agent labelled `killed` with a runtime retry. 0.3.5 printed
227
+ # "Killed 1 time by the runtime (416s of silence)." and so must 0.3.6, in text and JSON.
228
+ _no_config(monkeypatch, tmp_path)
229
+ run_dir = _demo_copy(tmp_path, "killed")
230
+ assert cli.main(["run", str(run_dir)]) == 0
231
+ text = capsys.readouterr().out
232
+ assert "Killed 1 time by the runtime (416s of silence)." in text, text
233
+ assert cli.main(["run", str(run_dir), "--json"]) == 0
234
+ stories = [entry["text"] for entry in json.loads(capsys.readouterr().out)["stories"]]
235
+ assert stories and all(
236
+ story.startswith("Killed 1 time by the runtime") for story in stories
237
+ ), stories
238
+
239
+
240
+ @pytest.mark.parametrize(("label", "clause"), [
241
+ ("restarted", "restarted 1 time"),
242
+ ("attempt", "attempt 2 failed: usage limit"),
243
+ ("stopped", "stopped by the parent"),
244
+ ])
245
+ def test_the_tools_own_lowercase_clause_words_are_capitalized_before_any_name_meets_them(
246
+ label, clause,
247
+ ):
248
+ shown = _story(_share_redactor(agent=label), report._own_clause(clause))
249
+ assert shown == clause[:1].upper() + clause[1:] + ".", shown
250
+
251
+
252
+ @pytest.mark.parametrize(("category", "name", "clause"), [
253
+ ("agent", "wrote", "Wrote no paths."),
254
+ ("type", "codex", "1 Codex call could not start"),
255
+ ("agent", "killed", "Killed 1 time by the runtime (400s of silence)"),
256
+ ])
257
+ def test_the_tools_own_capitalized_words_never_meet_a_name_of_another_case(
258
+ category, name, clause,
259
+ ):
260
+ # A label or agent type that is a plain word only matches that word as written; the
261
+ # tool's own capitalized words around it stay as they are (no sentence-case matching).
262
+ assert _story(_share_redactor(**{category: name}), clause) == clause.rstrip(".") + "."
263
+
264
+
265
+ def test_a_run_title_in_the_tools_own_words_keeps_its_capital_whatever_the_labels(
266
+ tmp_path, monkeypatch, capsys,
267
+ ):
268
+ # Review round 3: a run-level story is a list of finding titles in the tool's own words; a
269
+ # label that is their first word (here "the") must not rewrite them. 0.3.5 printed
270
+ # "The harness reported this workflow failed." and so must 0.3.6.
271
+ from tests.test_field_v03 import _case5_fixture
272
+ run_dir, _parent = _case5_fixture(tmp_path, monkeypatch)
273
+ journal = run_dir / "journal.jsonl"
274
+ rows = [json.loads(line) for line in journal.read_text(encoding="utf-8").splitlines()]
275
+ for row in rows:
276
+ if "label" in row:
277
+ row["label"] = "the"
278
+ journal.write_text("".join(json.dumps(row) + "\n" for row in rows), encoding="utf-8")
279
+ assert cli.main(["run", str(run_dir)]) == 3 # a FAILED verdict
280
+ text = capsys.readouterr().out
281
+ assert "The harness reported this workflow failed." in text, text
282
+ assert cli.main(["run", str(run_dir), "--json"]) == 3
283
+ stories = [entry["text"] for entry in json.loads(capsys.readouterr().out)["stories"]]
284
+ assert "The harness reported this workflow failed." in stories, stories
@@ -4,7 +4,7 @@ requires-python = ">=3.11"
4
4
 
5
5
  [[package]]
6
6
  name = "agent-postmortem"
7
- version = "0.3.5"
7
+ version = "0.3.6"
8
8
  source = { editable = "." }
9
9
 
10
10
  [package.optional-dependencies]