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