agent-postmortem 0.3.5__tar.gz → 0.3.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/CHANGELOG.md +14 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/PKG-INFO +1 -1
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/docs/DESIGN.md +14 -2
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/plugin/.claude-plugin/plugin.json +1 -1
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/pyproject.toml +1 -1
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/__init__.py +1 -1
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/report.py +81 -35
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/synthetic-ids.txt +1 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n9_docs.py +3 -3
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_plugin.py +4 -4
- agent_postmortem-0.3.6/tests/test_share_label_case.py +284 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/uv.lock +1 -1
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.claude-plugin/marketplace.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/confusing_output.yml +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/detector_request.yml +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/run_shape_not_covered.yml +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/wrong_verdict.yml +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/workflows/ci.yml +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/workflows/release.yml +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.gitignore +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/CLAUDE.md +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/CONTRIBUTING.md +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/LICENSE +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/README.md +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/plugin/README.md +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/plugin/hooks/hooks.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/plugin/hooks/run.sh +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/plugin/skills/postmortem/SKILL.md +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/plugin/skills/rescue/SKILL.md +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/scripts/check-privacy.sh +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/scripts/export-public.sh +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/argerrors.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/claims.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/cli.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/commands.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/config.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000002.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000002.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000003.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000003.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000004.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/agent-ac200000000000004.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-d30/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/demo/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/__init__.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/attempt_failed.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/base.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/bash_backgrounded.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/bash_timeout.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/claim_contradiction.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/classifier_unavailable.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/codex_unavailable.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/codex_write_denied.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/git_cwd_mismatch.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/mislabeled_kill.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/missing_artifact.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/permission_denied.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/silent_retry.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/structured_output_failure.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/tool_json_error.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/wasted_time.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/detectors/workflow_failed.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/disclosure.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/hooks/model_allocation_guard.mjs +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/hooks_cli.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/ledger.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/markers.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/models.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/observe.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/reader.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/redact.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/rescue.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/returns.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/rules.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/severity.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/state.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/trend.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/src/agent_postmortem/watch.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/conftest.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/README.md +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/demo__share.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_plan__local.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_plan__raw.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_plan__share.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_status__local.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_status__raw.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rescue_status__share.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules__local.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules__raw.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules__share.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_all__local.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_all__raw.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_all__share.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_propose__local.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_propose__raw.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_propose__share.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_review__local.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_review__raw.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_review__share.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_show__local.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_show__raw.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/rules_show__share.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/run__local.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/run__raw.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/run__share.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan__local.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan__raw.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan__share.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan_all__local.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan_all__raw.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/scan_all__share.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/trend__local.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/trend__raw.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/golden/schema3/trend__share.txt +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000002.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000002.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000003.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000003.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000004.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000004.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000005.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000005.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000006.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000006.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000008.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000008.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000009.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000009.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000010.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000010.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000011.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/agent-af200000000000011.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_facts/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af0/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000002.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000002.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000003.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000003.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000004.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000004.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000005.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000005.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000006.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000006.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000007.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af100000000000007.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a1.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a1.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a2.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a2.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a3.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a3.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a4.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/agent-af1000000000000a4.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_causes/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afa10000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afa10000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afa10000000000002.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afa10000000000002.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afb10000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/agent-afb10000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/attempt_failed_retry_tail/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/bash_backgrounded_timeout/agent-ac300000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/bash_backgrounded_timeout/agent-ac300000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/bash_backgrounded_timeout/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/claim_contradiction/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/clean_run/agent-ac100000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/clean_run/agent-ac100000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/clean_run/agent-ac100000000000002.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/clean_run/agent-ac100000000000002.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/clean_run/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000002.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000002.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000003.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000003.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000004.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/agent-ae100000000000004.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_unavailable/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000002.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000002.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000003.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/agent-ac500000000000003.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/codex_write_denied/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/evidence_noise/agent-acf00000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/evidence_noise/agent-acf00000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/evidence_noise/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ae300000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ae300000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-710/agent-ae100000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-710/agent-ae100000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-710/agent-ae100000000000002.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-710/agent-ae100000000000002.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-710/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-720/agent-ae200000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-720/agent-ae200000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-720/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/hook_session/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/incomplete_journal/agent-ad000000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/incomplete_journal/agent-ad000000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/incomplete_journal/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/agent-aee00000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/agent-aee00000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/agent-aee00000000000003.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/agent-aee00000000000003.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/agent-aee00000000000004.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/agent-aee00000000000004.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-af1/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_malformed_fields/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_orphan_failed/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad200000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad200000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad300000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad300000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad400000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad400000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad400000000000002.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad400000000000002.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad500000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad500000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad500000000000002.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad500000000000002.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad600000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad600000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad600000000000002.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad600000000000002.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad700000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad700000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad800000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/agent-ad800000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_resolved/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_unresolved/agent-ad900000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_unresolved/agent-ad900000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/journal_state_unresolved/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/missing_artifact/agent-ac600000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/missing_artifact/agent-ac600000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/missing_artifact/agent-ac600000000000002.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/missing_artifact/agent-ac600000000000002.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/missing_artifact/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_a0000000-001/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_b0000000-002/agent-a1111111111111111.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_b0000000-002/agent-a1111111111111111.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_b0000000-002/agent-a2222222222222222.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_b0000000-002/agent-a2222222222222222.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_b0000000-002/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/reader_minimal/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_c0000000-003/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/redaction_adversarial/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-960/agent-ad100000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/redaction_adversarial/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-960/agent-ad100000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/redaction_adversarial/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/workflows/wf_00000000-960/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000002.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000002.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000003.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000003.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000004.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000004.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000005.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/agent-af000000000000005.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/self_reference/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_bridge_only/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac700000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac700000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac700000000000002.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac700000000000002.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_clean/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_compaction/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-aca00000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_compaction/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-aca00000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_compaction/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_dedup/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_envelope/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac900000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_envelope/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ac900000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_envelope/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_human_interrupt/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acc00000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_human_interrupt/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acc00000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_human_interrupt/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_parent_stop/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acb00000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_parent_stop/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acb00000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_parent_stop/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_unattributed_long/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acd00000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_unattributed_long/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-acd00000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_unattributed_long/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_unattributed_short/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ace00000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_unattributed_short/-home-user-project/00000000-0000-4000-8000-000000000000/subagents/agent-ace00000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/session_unattributed_short/-home-user-project/00000000-0000-4000-8000-000000000000.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/structured_output_corrupt/agent-ac400000000000001.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/structured_output_corrupt/agent-ac400000000000001.meta.json +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/fixtures/runs/structured_output_corrupt/journal.jsonl +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/g_corpus_support.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/g_helpers.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/g_independent_return.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/n3b_helpers.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/n3b_planted.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/n4_reference_commands.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/n4b2_helpers.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/n5b_helpers.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/n5c1_helpers.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/n5c2_helpers.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/n6_helpers.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/privacy_rules.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/rule_fixtures.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_attempt_facts.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_attempt_failed.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_attribution.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_bug_report.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_claim_contradiction.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_cli_smoke.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_codex_unavailable.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_config.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_deep_lines.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_detectors_base.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_detectors_core.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_detectors_registry.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_detectors_tooling.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_disclosure_primitives.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_empty_state.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_export.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_export_public.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fa_commit_no_id.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fa_fork.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fa_generations.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fa_path_token.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fa_return_boundary.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fa_wasted.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fb_here.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fb_live_now.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fb_rescue_live.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix10_redact.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix11_redact.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix12_redact.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix1_commit.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix1_launch.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix1_poll.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix1_redact.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix2_launch.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix2_poll.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix2_redact.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix3_redact.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix4_fuzz.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix4_lexer.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix4_redact.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix4_sinks.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix5_lexer.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix5_redact.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix5_sinks.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix6_fuzz.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix6_hook.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix6_lexer.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix6_redact.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix6_sinks.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix6b_title.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix7_e2e.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix7_fuzz.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix7_redact.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix7_sinks.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix7_title.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix8_e2e.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix8_fuzz.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix8_redact.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix8_sinks.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix9_e2e.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix9_fuzz.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix9_redact.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_fix9_sinks.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_help.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_scan.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_table.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fc_wording.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_field_v03.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_field_v03_more.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_filter_scope.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fixa_discovery.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fixa_enqueue.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_fixa_reader.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_a1_hooks.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_a1_return.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_b1.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_c.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_commit_sentences.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_commits.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_consumers.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_corpus.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_denied.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_failed.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_here.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_hooks.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_registry.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_rescue.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_return.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_g_selfreport.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_hooks_benchmark.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_hooks_cli.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_journal_malformed_fields.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_journal_state.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_launch_docs.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_model_allocation_guard.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n1_markers.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n1_parent_index.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n2_lifecycle.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_apply.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_canonical_ids.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_context.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_demo.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_first_line.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_dedupe.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_demo.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_local_path.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_names.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_paths_c4.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_paths_c6.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_paths_s10.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_paths_s4.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixa_titles.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_hook_group.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_noident_pointer.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_repr_tokens.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_rescue_c1.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_run_ids.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixb_traversal.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixr2_ids.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixr2_paths.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixr2_raw_dupes.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_fixr2_schema2_hostile.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_flags.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_handler_errors.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_hooks.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_local_path.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_local_scrub.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_parser_errors.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_part2_slow_path.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_part3_sinks.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_pointers.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_reader.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_rescue.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_residual_sinks.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_rules_trend.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_run_fallback.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_run_local.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_run_noncanonical_agent.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_run_path_matrix.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_run_share.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_scan.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_slow_path.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n3b_watch.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4a_base_repo.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4a_commit_grammar.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4a_lexer.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4a_measure.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4a_readonly.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4a_rows.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4a_write_grammar.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b1_discovery.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b1_reader_facts.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b1_schema2.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b2_forms.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b2_measure.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b2_population.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b2_reasons.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b2_repo_groups.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4b2_rows.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixb_c3.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixb_differential.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixb_minor.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixb_s3.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixb_s4.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixb_s5_s10.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixc_a4.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixd_a5.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n4fixe_a5.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5_schema3_goldens.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5a1_schema3.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5a2_docs.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5b_detectors.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5b_inputs.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5b_severity.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5b_verdict.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c1_gaps.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c1_look.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c1_observation_export.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c1_observe.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c1_rescue.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c1_returned.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c1_work_at_risk.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c2_exit_codes.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c2_misc.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5c2_status_repos.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5fix1_misc.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5fix1_plan.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5fix1_returned.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5fix1_severity.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n5fix1_status.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_alias_state.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_cwd.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_docs.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_fix1.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_here_run.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_here_scan.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_pins.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_resolve.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_roundtrip.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n6_stderr.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n7_detectors.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n8_fix1.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n8_fix2.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n8_k1_killed.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n8_k2_what_to_do.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n8_k3_precursor.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n8_k4_rescue.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n8_k5_watch.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n8_k6_rules.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_n9_release_gate.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_no_lazy_fetch.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_no_write_surface.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_observe.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_privacy.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_privacy_matrix.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_r1_scan_risk_parity.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_reader.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_reader_session.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_readme.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_redact.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_rel_demo.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_rel_scan_all.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_rendered_privacy.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_report_session.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_report_v2.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_rescue.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_rules.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_rules_propose.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_rules_review.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_scan_triage.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_state.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_tooling_agent_scope.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_trend.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_watch.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_wheel.py +0 -0
- {agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/tests/test_workflows.py +0 -0
|
@@ -5,6 +5,20 @@ All notable changes to this project are documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.3.6]
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- The default (share) output could print an agent's own label. A story sentence starts with
|
|
13
|
+
a capital, and when an agent's whole story was its interrupt finding, whose title starts
|
|
14
|
+
with the label, the label was capitalized before the name substitution ran. That
|
|
15
|
+
substitution matched names case-sensitively, so a workflow label such as `impl:t2` or a
|
|
16
|
+
subagent description starting with a lowercase letter printed as `Impl:t2` in the
|
|
17
|
+
STORIES section of `run` and in `stories[].text` of `run --json`. A story clause is now
|
|
18
|
+
capitalized after its names are replaced, so it reads `Agent-1 interrupted after ...`.
|
|
19
|
+
`scan`, `run --bug-report`, `rescue` and the hook messages never carried it, and none of
|
|
20
|
+
the 382 runs on the maintainer's machine hit it. `--local` and `--raw` are unchanged.
|
|
21
|
+
|
|
8
22
|
## [0.3.5]
|
|
9
23
|
|
|
10
24
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: agent-postmortem
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.6
|
|
4
4
|
Summary: Reads the Claude Code logs already on your machine and tells you which agent's 'done' you can't trust, and what to run next.
|
|
5
5
|
Project-URL: Homepage, https://github.com/zeyusuntt/agent-postmortem
|
|
6
6
|
Project-URL: Issues, https://github.com/zeyusuntt/agent-postmortem/issues
|
|
@@ -4742,7 +4742,19 @@ trend row's target) and `Finding.title`, rendered through `Redactor.title()`
|
|
|
4742
4742
|
followed by structural `redact()`; **(N3b S1)** names come first, so a label
|
|
4743
4743
|
that holds a UUID, an email, or a `-Users-...` slug is replaced whole
|
|
4744
4744
|
instead of being half-rewritten by the structural pass and then missed)
|
|
4745
|
-
work exactly as before.
|
|
4745
|
+
work exactly as before. **(0.3.6)** A story clause is capitalized only after the sink
|
|
4746
|
+
substituted names in it (`report._render_pieces` renders each `_Clause` through
|
|
4747
|
+
`Redactor.title`, then upper-cases its first character), so a name meets the pattern as
|
|
4748
|
+
written and becomes `Agent-1` at a sentence start. Through 0.3.5 the clause was capitalized
|
|
4749
|
+
first: a `mislabeled_kill` title starts with the label, and when it was an agent's whole
|
|
4750
|
+
story the label `impl:x` reached share output as `Impl:x`, which the case-sensitive pattern
|
|
4751
|
+
never matched (`run` text and `run --json` stories only; `tests/test_share_label_case.py`).
|
|
4752
|
+
Matching stays case-sensitive, and every clause in the tool's own words is written with
|
|
4753
|
+
its capital already (`report._own_clause`: "Killed 1 time by the runtime", "Attempt 2
|
|
4754
|
+
failed: ...", "Wrote no paths."), so a label that is a plain word (`killed`, `attempt`,
|
|
4755
|
+
`wrote`) never rewrites them, and neither are finding titles, except the title of a
|
|
4756
|
+
detector that leads with its agent's own label (`report._LABEL_LED_TITLES`:
|
|
4757
|
+
`mislabeled_kill`), which is capitalized only after the substitution. Evidence, a diagnostic, and a metrics value are
|
|
4746
4758
|
never fed to the five *name* categories (agent/desc/phase/type/target): they
|
|
4747
4759
|
pass through structural `redact()` alone (plain `Redactor.__call__`),
|
|
4748
4760
|
because they are a faithful quote of transcript text (4.5), not a rendered
|
|
@@ -6707,7 +6719,7 @@ later events go positional).
|
|
|
6707
6719
|
|
|
6708
6720
|
### 8.1 Package
|
|
6709
6721
|
|
|
6710
|
-
`pyproject.toml`: name `agent-postmortem`, version `0.3.
|
|
6722
|
+
`pyproject.toml`: name `agent-postmortem`, version `0.3.6`, console scripts
|
|
6711
6723
|
`agent-postmortem` and `postmortem`, `requires-python >= 3.11`, no runtime
|
|
6712
6724
|
dependencies, `[project.optional-dependencies].dev = ["pytest>=8",
|
|
6713
6725
|
"ruff>=0.6"]`, classifiers, URLs (Homepage, Issues, Changelog). The wheel
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "agent-postmortem"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.6"
|
|
4
4
|
description = "Reads the Claude Code logs already on your machine and tells you which agent's 'done' you can't trust, and what to run next."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { text = "MIT" }
|
|
@@ -1759,9 +1759,11 @@ def _agent_story_pieces(agent, agent_findings: list[Finding]) -> list:
|
|
|
1759
1759
|
all_runtime = False
|
|
1760
1760
|
if all_runtime and silences:
|
|
1761
1761
|
silence_text = ", ".join(silences)
|
|
1762
|
-
lead =
|
|
1762
|
+
lead = _own_clause(
|
|
1763
|
+
f"killed {k} {_plural(k, 'time')} by the runtime ({silence_text} of silence)"
|
|
1764
|
+
)
|
|
1763
1765
|
else:
|
|
1764
|
-
lead = f"restarted {k} {_plural(k, 'time')}"
|
|
1766
|
+
lead = _own_clause(f"restarted {k} {_plural(k, 'time')}")
|
|
1765
1767
|
|
|
1766
1768
|
parent_stop = False
|
|
1767
1769
|
if final is not None:
|
|
@@ -1773,13 +1775,13 @@ def _agent_story_pieces(agent, agent_findings: list[Finding]) -> list:
|
|
|
1773
1775
|
elif lead is not None:
|
|
1774
1776
|
clauses.append(lead)
|
|
1775
1777
|
elif parent_stop:
|
|
1776
|
-
clauses.append("stopped by the parent")
|
|
1778
|
+
clauses.append(_own_clause("stopped by the parent"))
|
|
1777
1779
|
|
|
1778
1780
|
for finding in by_detector.get("attempt_failed", []):
|
|
1779
1781
|
ordinal = _finding_ordinal(finding, attempts_sorted)
|
|
1780
1782
|
phrase = _cause_phrase(finding.metrics.get("cause", "unattributed"))
|
|
1781
1783
|
reset_time = finding.metrics.get("reset_time")
|
|
1782
|
-
text = f"attempt {ordinal} failed: {phrase}"
|
|
1784
|
+
text = _own_clause(f"attempt {ordinal} failed: {phrase}")
|
|
1783
1785
|
if reset_time:
|
|
1784
1786
|
text += f", resets {reset_time}"
|
|
1785
1787
|
clauses.append(text)
|
|
@@ -1787,7 +1789,9 @@ def _agent_story_pieces(agent, agent_findings: list[Finding]) -> list:
|
|
|
1787
1789
|
for finding in by_detector.get("claim_contradiction", []):
|
|
1788
1790
|
ordinal = _finding_ordinal(finding, attempts_sorted)
|
|
1789
1791
|
phrases = _claim_contradiction_phrases(finding.metrics)
|
|
1790
|
-
clauses.append(
|
|
1792
|
+
clauses.append(
|
|
1793
|
+
_own_clause(f"attempt {ordinal} completed but reported {'; '.join(phrases)}")
|
|
1794
|
+
)
|
|
1791
1795
|
|
|
1792
1796
|
_paths_display, commits_count = _agent_facts_totals(agent)
|
|
1793
1797
|
path_count, paths_partial = _agent_paths(agent)
|
|
@@ -1818,30 +1822,68 @@ def _agent_story_pieces(agent, agent_findings: list[Finding]) -> list:
|
|
|
1818
1822
|
clauses.append("; ".join(tooling_bits))
|
|
1819
1823
|
|
|
1820
1824
|
if not clauses and agent_findings:
|
|
1821
|
-
clauses.append(agent_findings[0]
|
|
1825
|
+
clauses.append(_title_clause(agent_findings[0], agent.label))
|
|
1822
1826
|
|
|
1823
1827
|
return _sentences_pieces(clauses)
|
|
1824
1828
|
|
|
1825
1829
|
|
|
1830
|
+
def _sentence_case(text: str) -> str:
|
|
1831
|
+
"""`text` with its first character upper-cased: how a story sentence starts."""
|
|
1832
|
+
return text[:1].upper() + text[1:]
|
|
1833
|
+
|
|
1834
|
+
|
|
1835
|
+
def _own_clause(text: str) -> str:
|
|
1836
|
+
"""A story clause in the tool's own words, capitalized where it is written (0.4 review round
|
|
1837
|
+
2): every clause is capitalized again only after names are substituted, and a label that is
|
|
1838
|
+
the clause's first word (`killed`, `restarted`, `attempt`) must not meet that word in
|
|
1839
|
+
lowercase."""
|
|
1840
|
+
return _sentence_case(text)
|
|
1841
|
+
|
|
1842
|
+
|
|
1843
|
+
# Detectors whose title starts with the agent's own label ("<label> interrupted after ...").
|
|
1844
|
+
_LABEL_LED_TITLES = frozenset({"mislabeled_kill"})
|
|
1845
|
+
|
|
1846
|
+
|
|
1847
|
+
def _title_clause(finding: Finding, label: str | None) -> object:
|
|
1848
|
+
"""A finding title as a story clause (0.3.6 review round 3). The title of a detector that
|
|
1849
|
+
leads with the agent's own label stays as written, so the name substitution meets the label
|
|
1850
|
+
before the sentence is capitalized; every other title is in the tool's own words and is
|
|
1851
|
+
capitalized where it is used (`_own_clause`), so a label that is its first word ("the" in
|
|
1852
|
+
"the harness reported this workflow failed") never rewrites it."""
|
|
1853
|
+
if finding.title_parts:
|
|
1854
|
+
return finding.title_parts
|
|
1855
|
+
title = finding.title
|
|
1856
|
+
if (
|
|
1857
|
+
finding.detector in _LABEL_LED_TITLES
|
|
1858
|
+
and isinstance(label, str) and label and title.startswith(label)
|
|
1859
|
+
):
|
|
1860
|
+
return title
|
|
1861
|
+
return _own_clause(title)
|
|
1862
|
+
|
|
1863
|
+
|
|
1864
|
+
class _Clause(str):
|
|
1865
|
+
"""A story clause as written, without its final period. Its first character is upper-cased
|
|
1866
|
+
only after a sink rendered it (0.3.6): a clause can start with a user-authored name (a
|
|
1867
|
+
`mislabeled_kill` title starts with the label), and the case-sensitive name substitution
|
|
1868
|
+
must meet that name as written (docs/DESIGN.md 5.1)."""
|
|
1869
|
+
|
|
1870
|
+
|
|
1826
1871
|
def _sentences(clauses: list[str]) -> str:
|
|
1827
1872
|
"""Join clauses as sentences: each starts with a capital and the whole
|
|
1828
1873
|
ends with one period. Finding titles start lowercase by convention
|
|
1829
1874
|
(docs/DESIGN.md 4.3), so this is where a story gets its capitals."""
|
|
1830
1875
|
parts = [clause.rstrip(".") for clause in clauses if clause]
|
|
1831
|
-
text = ". ".join(c
|
|
1876
|
+
text = ". ".join(_sentence_case(c) for c in parts)
|
|
1832
1877
|
return f"{text}." if text else ""
|
|
1833
1878
|
|
|
1834
1879
|
|
|
1835
1880
|
def _sentences_pieces(clauses: list) -> list:
|
|
1836
|
-
"""`_sentences` as pieces (F fix 7, W7-2):
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
and
|
|
1841
|
-
the
|
|
1842
|
-
if not any(isinstance(clause, TitleParts) for clause in clauses):
|
|
1843
|
-
text = _sentences(clauses)
|
|
1844
|
-
return [text] if text else []
|
|
1881
|
+
"""`_sentences` as pieces (F fix 7, W7-2; 0.3.6): one piece per clause, with the ". "
|
|
1882
|
+
between clauses and the final "." as plain strings. A string clause is a `_Clause`, which a
|
|
1883
|
+
sink renders first and capitalizes after (`_render_pieces`), so a name at its start is
|
|
1884
|
+
substituted as written. The `TitleParts` of a finding title that names a path has its
|
|
1885
|
+
template capitalized and stripped of a final period here, since those words are the tool's
|
|
1886
|
+
own, and `_render_pieces` renders the path once and never scans them. No text, no piece."""
|
|
1845
1887
|
parts: list = []
|
|
1846
1888
|
for clause in clauses:
|
|
1847
1889
|
if not clause:
|
|
@@ -1849,35 +1891,39 @@ def _sentences_pieces(clauses: list) -> list:
|
|
|
1849
1891
|
if isinstance(clause, TitleParts):
|
|
1850
1892
|
head, placeholder, tail = clause.template.partition("{path}")
|
|
1851
1893
|
template = head + placeholder + tail.rstrip(".")
|
|
1852
|
-
parts.append(TitleParts(template
|
|
1894
|
+
parts.append(TitleParts(_sentence_case(template), clause.path))
|
|
1853
1895
|
else:
|
|
1854
|
-
|
|
1855
|
-
|
|
1896
|
+
parts.append(_Clause(clause.rstrip(".")))
|
|
1897
|
+
if all(isinstance(part, _Clause) and not part for part in parts):
|
|
1898
|
+
return []
|
|
1856
1899
|
pieces: list = []
|
|
1857
1900
|
for index, part in enumerate(parts):
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
pieces.append(piece)
|
|
1863
|
-
if pieces and isinstance(pieces[-1], str):
|
|
1864
|
-
pieces[-1] += "."
|
|
1865
|
-
else:
|
|
1866
|
-
pieces.append(".")
|
|
1901
|
+
if index:
|
|
1902
|
+
pieces.append(". ")
|
|
1903
|
+
pieces.append(part)
|
|
1904
|
+
pieces.append(".")
|
|
1867
1905
|
return pieces
|
|
1868
1906
|
|
|
1869
1907
|
|
|
1870
1908
|
def _pieces_raw(pieces: list) -> str:
|
|
1871
|
-
"""The pieces with the real path (the raw text of a story)."""
|
|
1872
|
-
return "".join(
|
|
1909
|
+
"""The pieces with the real path and real names (the raw text of a story)."""
|
|
1910
|
+
return "".join(
|
|
1911
|
+
piece.raw() if isinstance(piece, TitleParts)
|
|
1912
|
+
else _sentence_case(piece) if isinstance(piece, _Clause)
|
|
1913
|
+
else piece
|
|
1914
|
+
for piece in pieces
|
|
1915
|
+
)
|
|
1873
1916
|
|
|
1874
1917
|
|
|
1875
1918
|
def _render_pieces(pieces: list, redactor: Redactor) -> str:
|
|
1876
|
-
"""The pieces as a sink prints them: a
|
|
1877
|
-
rest of the scanner), a `TitleParts` through
|
|
1878
|
-
its words never scanned)
|
|
1919
|
+
"""The pieces as a sink prints them: a `_Clause` through `Redactor.title` (labels, paths and
|
|
1920
|
+
the rest of the scanner) and only then capitalized, a `TitleParts` through
|
|
1921
|
+
`Redactor.title_parts` (its path rendered once, its words never scanned), and the separators
|
|
1922
|
+
as they are."""
|
|
1879
1923
|
return "".join(
|
|
1880
|
-
redactor.title_parts(piece) if isinstance(piece, TitleParts)
|
|
1924
|
+
redactor.title_parts(piece) if isinstance(piece, TitleParts)
|
|
1925
|
+
else _sentence_case(redactor.title(piece)) if isinstance(piece, _Clause)
|
|
1926
|
+
else piece
|
|
1881
1927
|
for piece in pieces
|
|
1882
1928
|
)
|
|
1883
1929
|
|
|
@@ -1933,7 +1979,7 @@ def _story_records(run: Run, findings: list[Finding], verbose: bool) -> list[dic
|
|
|
1933
1979
|
run_relevant = [f for f in run_level if verbose or f.severity != "info"]
|
|
1934
1980
|
if run_relevant:
|
|
1935
1981
|
rank = min(_SEVERITIES.index(f.severity) for f in run_relevant)
|
|
1936
|
-
pieces = _sentences_pieces([f
|
|
1982
|
+
pieces = _sentences_pieces([_title_clause(f, None) for f in run_relevant])
|
|
1937
1983
|
entries.append({
|
|
1938
1984
|
"agent": "run",
|
|
1939
1985
|
"severity": _SEVERITIES[rank],
|
|
@@ -96,11 +96,11 @@ def test_changelog_unreleased_entry_is_first_and_grouped():
|
|
|
96
96
|
assert "http" not in entry
|
|
97
97
|
|
|
98
98
|
|
|
99
|
-
def
|
|
99
|
+
def test_the_package_version_is_0_3_6():
|
|
100
100
|
pyproject = (REPO_ROOT / "pyproject.toml").read_text(encoding="utf-8")
|
|
101
101
|
init = (REPO_ROOT / "src" / "agent_postmortem" / "__init__.py").read_text(encoding="utf-8")
|
|
102
|
-
assert re.search(r'^version = "0\.3\.
|
|
103
|
-
assert '__version__ = "0.3.
|
|
102
|
+
assert re.search(r'^version = "0\.3\.6"', pyproject, re.M)
|
|
103
|
+
assert '__version__ = "0.3.6"' in init
|
|
104
104
|
|
|
105
105
|
|
|
106
106
|
# ---- DESIGN ----
|
|
@@ -110,17 +110,17 @@ def test_plugin_version_equals_package_version():
|
|
|
110
110
|
assert plugin["version"] == package_version
|
|
111
111
|
|
|
112
112
|
|
|
113
|
-
def
|
|
113
|
+
def test_pyproject_plugin_and_package_versions_are_all_0_3_6():
|
|
114
114
|
"""docs/DESIGN.md 7.1's D1: the literal, not just mutual equality --
|
|
115
115
|
a version bump that only kept two of the three in sync would still
|
|
116
116
|
pass a pure-equality check."""
|
|
117
117
|
pyproject = tomllib.loads((REPO_ROOT / "pyproject.toml").read_text(encoding="utf-8"))
|
|
118
|
-
assert pyproject["project"]["version"] == "0.3.
|
|
118
|
+
assert pyproject["project"]["version"] == "0.3.6"
|
|
119
119
|
plugin = _load_json(PLUGIN_ROOT / ".claude-plugin" / "plugin.json")
|
|
120
|
-
assert plugin["version"] == "0.3.
|
|
120
|
+
assert plugin["version"] == "0.3.6"
|
|
121
121
|
import agent_postmortem
|
|
122
122
|
|
|
123
|
-
assert agent_postmortem.__version__ == "0.3.
|
|
123
|
+
assert agent_postmortem.__version__ == "0.3.6"
|
|
124
124
|
|
|
125
125
|
|
|
126
126
|
def test_pyproject_declares_agent_postmortem_as_primary_and_postmortem_as_alias():
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"""A user-authored name that starts with a lowercase letter must not reach share output
|
|
2
|
+
capitalized (docs/DESIGN.md 1 and 5.1: pseudonyms for every user-authored name in every
|
|
3
|
+
output; 4.13.5 share invariant).
|
|
4
|
+
|
|
5
|
+
A story sentence starts with a capital. When its first clause is a finding title that starts
|
|
6
|
+
with the agent's label (`mislabeled_kill`: "<label> interrupted after Ns of silence ..."), 0.3.5
|
|
7
|
+
capitalized the label before the case-sensitive name substitution ran, so "impl:x" printed as
|
|
8
|
+
"Impl:x". From 0.3.6 a story clause is capitalized after the sink substituted names
|
|
9
|
+
(`report._render_pieces`), so the tool's own capitalized words never meet a name either. The
|
|
10
|
+
planted names here start lowercase, unlike the sentinels of test_field_v03_more.py, and every
|
|
11
|
+
check is case-insensitive.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import io
|
|
17
|
+
import json
|
|
18
|
+
import os
|
|
19
|
+
from datetime import datetime, timedelta, timezone
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
|
|
22
|
+
import pytest
|
|
23
|
+
|
|
24
|
+
from agent_postmortem import cli, reader, report
|
|
25
|
+
from agent_postmortem.disclosure import DisclosureContext
|
|
26
|
+
from agent_postmortem.redact import Redactor
|
|
27
|
+
from tests.test_field_v03 import (
|
|
28
|
+
FAKE_SLUG,
|
|
29
|
+
FAKE_UUID,
|
|
30
|
+
_assistant_tool,
|
|
31
|
+
_kill,
|
|
32
|
+
_no_config,
|
|
33
|
+
_parent_path,
|
|
34
|
+
_tool_result,
|
|
35
|
+
_user,
|
|
36
|
+
_wf_dir,
|
|
37
|
+
_write_jsonl,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
_LABEL = "zz-lower-agent-nickname"
|
|
41
|
+
_PHASE = "zz-lower-phase-title"
|
|
42
|
+
_WF_ID = "wf_00000000-b36"
|
|
43
|
+
_AGENT = "ab36" + "0" * 12 + "1"
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _backdate(paths: list[Path], when: datetime) -> None:
|
|
47
|
+
for path in paths:
|
|
48
|
+
os.utime(path, (when.timestamp(), when.timestamp()))
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _killed_after_silence(agent_id: str, base: datetime) -> list[dict]:
|
|
52
|
+
"""One Bash call, then 400 s of silence and the interrupt marker: an unattributed
|
|
53
|
+
long-silence mislabeled_kill, whose title starts with the label and is the agent's
|
|
54
|
+
whole story (no path, no commit, no restart)."""
|
|
55
|
+
return [
|
|
56
|
+
_user("Investigate.", base, agent_id),
|
|
57
|
+
_assistant_tool("t1", "Bash", {"command": "ls"}, base + timedelta(seconds=1), agent_id),
|
|
58
|
+
_tool_result("t1", "ok", base + timedelta(seconds=2), agent_id),
|
|
59
|
+
_kill(base + timedelta(seconds=402), agent_id),
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _workflow(tmp_path: Path) -> tuple[Path, Path, Path]:
|
|
64
|
+
root = tmp_path / "root"
|
|
65
|
+
run_dir = _wf_dir(root, _WF_ID)
|
|
66
|
+
base = datetime.now(timezone.utc) - timedelta(days=1)
|
|
67
|
+
_write_jsonl(run_dir / "journal.jsonl", [
|
|
68
|
+
{"type": "started", "key": "v2:x", "agentId": _AGENT, "label": _LABEL, "phase": _PHASE},
|
|
69
|
+
])
|
|
70
|
+
transcript = run_dir / f"agent-{_AGENT}.jsonl"
|
|
71
|
+
_write_jsonl(transcript, _killed_after_silence(_AGENT, base))
|
|
72
|
+
main = _parent_path(root)
|
|
73
|
+
_write_jsonl(main, [{
|
|
74
|
+
"type": "user", "message": {"role": "user", "content": "start"},
|
|
75
|
+
"sessionId": FAKE_UUID, "timestamp": base.strftime("%Y-%m-%dT%H:%M:%SZ"),
|
|
76
|
+
}])
|
|
77
|
+
_backdate([run_dir / "journal.jsonl", transcript, main], base + timedelta(seconds=403))
|
|
78
|
+
return root, run_dir, main
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _session(tmp_path: Path) -> tuple[Path, Path, Path]:
|
|
82
|
+
root = tmp_path / "root"
|
|
83
|
+
main = root / FAKE_SLUG / f"{FAKE_UUID}.jsonl"
|
|
84
|
+
base = datetime.now(timezone.utc) - timedelta(days=1)
|
|
85
|
+
_write_jsonl(main, [{
|
|
86
|
+
"type": "user", "message": {"role": "user", "content": "start"},
|
|
87
|
+
"sessionId": FAKE_UUID, "timestamp": base.strftime("%Y-%m-%dT%H:%M:%SZ"),
|
|
88
|
+
}])
|
|
89
|
+
subagents = root / FAKE_SLUG / FAKE_UUID / "subagents"
|
|
90
|
+
transcript = subagents / f"agent-{_AGENT}.jsonl"
|
|
91
|
+
_write_jsonl(transcript, _killed_after_silence(_AGENT, base))
|
|
92
|
+
meta = subagents / f"agent-{_AGENT}.meta.json"
|
|
93
|
+
meta.write_text(json.dumps({"agentType": "general-purpose", "description": _LABEL}),
|
|
94
|
+
encoding="utf-8")
|
|
95
|
+
_backdate([main, transcript, meta], base + timedelta(seconds=403))
|
|
96
|
+
return root, main, main
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
_KINDS = {"workflow": _workflow, "session": _session}
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _outputs(capsys, monkeypatch, tmp_path, root: Path, run: Path, main: Path) -> dict[str, str]:
|
|
103
|
+
"""Every share sink that can carry a label, by command."""
|
|
104
|
+
# (argv, expected exit code): run and scan succeed; rescue exits 4 for a run whose risk
|
|
105
|
+
# population it cannot complete (docs/DESIGN.md 4.11)
|
|
106
|
+
commands = {
|
|
107
|
+
"run": (["run", str(run)], 0),
|
|
108
|
+
"run --json": (["run", str(run), "--json"], 0),
|
|
109
|
+
"run --verbose": (["run", str(run), "--verbose"], 0),
|
|
110
|
+
"run --bug-report": (["run", str(run), "--bug-report"], 0),
|
|
111
|
+
"scan": (["scan", "--root", str(root)], 0),
|
|
112
|
+
"scan --all": (["scan", "--root", str(root), "--all"], 0),
|
|
113
|
+
"scan --json": (["scan", "--root", str(root), "--all", "--json"], 0),
|
|
114
|
+
"rescue plan": (["rescue", "plan", str(run)], 4),
|
|
115
|
+
"rescue plan --json": (["rescue", "plan", str(run), "--json"], 4),
|
|
116
|
+
"rescue status": (["rescue", "status", str(run)], 4),
|
|
117
|
+
}
|
|
118
|
+
run_id = reader.load_run(run).run_id
|
|
119
|
+
out: dict[str, str] = {}
|
|
120
|
+
for name, (argv, expected) in commands.items():
|
|
121
|
+
code = cli.main(argv)
|
|
122
|
+
captured = capsys.readouterr()
|
|
123
|
+
assert code == expected and captured.out.strip(), (name, code, captured.err)
|
|
124
|
+
if name.endswith("--json"):
|
|
125
|
+
json.loads(captured.out)
|
|
126
|
+
record = {"rescue plan": "UNIT agent-1", "rescue plan --json": '"agent-1"',
|
|
127
|
+
"rescue status": None}.get(name, run_id)
|
|
128
|
+
if record is not None:
|
|
129
|
+
assert record in captured.out, (name, record)
|
|
130
|
+
out[name] = captured.out + captured.err
|
|
131
|
+
monkeypatch.setenv("XDG_STATE_HOME", str(tmp_path / "hookstate"))
|
|
132
|
+
payload = {"hook_event_name": "Stop", "transcript_path": str(main),
|
|
133
|
+
"session_id": FAKE_UUID, "stop_hook_active": False}
|
|
134
|
+
monkeypatch.setattr("sys.stdin", io.StringIO(json.dumps(payload)))
|
|
135
|
+
assert cli.main(["hook", "check"]) == 0
|
|
136
|
+
captured = capsys.readouterr()
|
|
137
|
+
out["hook check"] = captured.out + captured.err
|
|
138
|
+
return out
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@pytest.mark.parametrize("kind", sorted(_KINDS))
|
|
142
|
+
def test_a_lowercase_label_never_reaches_share_output_in_any_case(
|
|
143
|
+
kind, tmp_path, monkeypatch, capsys,
|
|
144
|
+
):
|
|
145
|
+
_no_config(monkeypatch, tmp_path)
|
|
146
|
+
root, run, main = _KINDS[kind](tmp_path)
|
|
147
|
+
outputs = _outputs(capsys, monkeypatch, tmp_path, root, run, main)
|
|
148
|
+
# the planted case is exercised: the story that used to carry the label is there, aliased
|
|
149
|
+
assert "Agent-1 interrupted after 400s" in outputs["run"]
|
|
150
|
+
stories = [entry["text"] for entry in json.loads(outputs["run --json"])["stories"]]
|
|
151
|
+
assert any(text.startswith("Agent-1 interrupted after 400s") for text in stories), stories
|
|
152
|
+
leaks = {
|
|
153
|
+
name: text for name, text in outputs.items()
|
|
154
|
+
if _LABEL in text.lower() or _PHASE in text.lower()
|
|
155
|
+
}
|
|
156
|
+
assert not leaks, {name: [line for line in text.splitlines()
|
|
157
|
+
if _LABEL in line.lower() or _PHASE in line.lower()]
|
|
158
|
+
for name, text in leaks.items()}
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
@pytest.mark.parametrize("kind", sorted(_KINDS))
|
|
162
|
+
def test_the_story_still_starts_with_a_capital_after_the_label_is_replaced(
|
|
163
|
+
kind, tmp_path, monkeypatch, capsys,
|
|
164
|
+
):
|
|
165
|
+
_no_config(monkeypatch, tmp_path)
|
|
166
|
+
_root, run, _main = _KINDS[kind](tmp_path)
|
|
167
|
+
cli.main(["run", str(run)])
|
|
168
|
+
out = capsys.readouterr().out
|
|
169
|
+
story = [line for line in out.splitlines() if "interrupted after 400s" in line]
|
|
170
|
+
assert len(story) == 1, out
|
|
171
|
+
sentence = story[0].strip().split(" ", 1)[1]
|
|
172
|
+
assert sentence.startswith("Agent-1 interrupted after 400s"), story[0]
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def test_local_still_prints_the_real_label_capitalized_where_the_sentence_starts(
|
|
176
|
+
tmp_path, monkeypatch, capsys,
|
|
177
|
+
):
|
|
178
|
+
_no_config(monkeypatch, tmp_path)
|
|
179
|
+
_root, run, _main = _workflow(tmp_path)
|
|
180
|
+
cli.main(["run", str(run), "--local"])
|
|
181
|
+
out = capsys.readouterr().out
|
|
182
|
+
assert "Zz-lower-agent-nickname interrupted after 400s" in out
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def _share_redactor(**names: str) -> Redactor:
|
|
186
|
+
redactor = Redactor(context=DisclosureContext(level="share", home="/home/user"))
|
|
187
|
+
registry = redactor.fresh_names(detailed=False)
|
|
188
|
+
for category, value in names.items():
|
|
189
|
+
getattr(registry, category)(value)
|
|
190
|
+
return redactor
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def _story(redactor: Redactor, *clauses) -> str:
|
|
194
|
+
return report._render_pieces(report._sentences_pieces(list(clauses)), redactor)
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def test_a_clause_that_starts_with_a_lowercase_label_is_aliased_then_capitalized():
|
|
198
|
+
redactor = _share_redactor(agent="zz-lower")
|
|
199
|
+
assert _story(redactor, "zz-lower interrupted after 400s", "Wrote no paths.") == (
|
|
200
|
+
"Agent-1 interrupted after 400s. Wrote no paths."
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def _demo_copy(tmp_path, label: str) -> Path:
|
|
205
|
+
"""The packaged demo workflow (two agents, each killed once by the runtime and restarted),
|
|
206
|
+
with every journal label replaced by `label`."""
|
|
207
|
+
import shutil
|
|
208
|
+
from importlib import resources
|
|
209
|
+
source = resources.files("agent_postmortem") / "demo" / "-home-user-project"
|
|
210
|
+
target = tmp_path / "root" / "-home-user-project"
|
|
211
|
+
with resources.as_file(source) as path:
|
|
212
|
+
shutil.copytree(path, target)
|
|
213
|
+
run_dir = next(target.glob("*/subagents/workflows/wf_*"))
|
|
214
|
+
journal = run_dir / "journal.jsonl"
|
|
215
|
+
rows = [json.loads(line) for line in journal.read_text(encoding="utf-8").splitlines()]
|
|
216
|
+
for row in rows:
|
|
217
|
+
if "label" in row:
|
|
218
|
+
row["label"] = label
|
|
219
|
+
journal.write_text("".join(json.dumps(row) + "\n" for row in rows), encoding="utf-8")
|
|
220
|
+
return run_dir
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def test_a_label_that_is_the_first_word_of_the_tools_own_clause_leaves_it_alone(
|
|
224
|
+
tmp_path, monkeypatch, capsys,
|
|
225
|
+
):
|
|
226
|
+
# Review round 2: a workflow agent labelled `killed` with a runtime retry. 0.3.5 printed
|
|
227
|
+
# "Killed 1 time by the runtime (416s of silence)." and so must 0.3.6, in text and JSON.
|
|
228
|
+
_no_config(monkeypatch, tmp_path)
|
|
229
|
+
run_dir = _demo_copy(tmp_path, "killed")
|
|
230
|
+
assert cli.main(["run", str(run_dir)]) == 0
|
|
231
|
+
text = capsys.readouterr().out
|
|
232
|
+
assert "Killed 1 time by the runtime (416s of silence)." in text, text
|
|
233
|
+
assert cli.main(["run", str(run_dir), "--json"]) == 0
|
|
234
|
+
stories = [entry["text"] for entry in json.loads(capsys.readouterr().out)["stories"]]
|
|
235
|
+
assert stories and all(
|
|
236
|
+
story.startswith("Killed 1 time by the runtime") for story in stories
|
|
237
|
+
), stories
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
@pytest.mark.parametrize(("label", "clause"), [
|
|
241
|
+
("restarted", "restarted 1 time"),
|
|
242
|
+
("attempt", "attempt 2 failed: usage limit"),
|
|
243
|
+
("stopped", "stopped by the parent"),
|
|
244
|
+
])
|
|
245
|
+
def test_the_tools_own_lowercase_clause_words_are_capitalized_before_any_name_meets_them(
|
|
246
|
+
label, clause,
|
|
247
|
+
):
|
|
248
|
+
shown = _story(_share_redactor(agent=label), report._own_clause(clause))
|
|
249
|
+
assert shown == clause[:1].upper() + clause[1:] + ".", shown
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
@pytest.mark.parametrize(("category", "name", "clause"), [
|
|
253
|
+
("agent", "wrote", "Wrote no paths."),
|
|
254
|
+
("type", "codex", "1 Codex call could not start"),
|
|
255
|
+
("agent", "killed", "Killed 1 time by the runtime (400s of silence)"),
|
|
256
|
+
])
|
|
257
|
+
def test_the_tools_own_capitalized_words_never_meet_a_name_of_another_case(
|
|
258
|
+
category, name, clause,
|
|
259
|
+
):
|
|
260
|
+
# A label or agent type that is a plain word only matches that word as written; the
|
|
261
|
+
# tool's own capitalized words around it stay as they are (no sentence-case matching).
|
|
262
|
+
assert _story(_share_redactor(**{category: name}), clause) == clause.rstrip(".") + "."
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def test_a_run_title_in_the_tools_own_words_keeps_its_capital_whatever_the_labels(
|
|
266
|
+
tmp_path, monkeypatch, capsys,
|
|
267
|
+
):
|
|
268
|
+
# Review round 3: a run-level story is a list of finding titles in the tool's own words; a
|
|
269
|
+
# label that is their first word (here "the") must not rewrite them. 0.3.5 printed
|
|
270
|
+
# "The harness reported this workflow failed." and so must 0.3.6.
|
|
271
|
+
from tests.test_field_v03 import _case5_fixture
|
|
272
|
+
run_dir, _parent = _case5_fixture(tmp_path, monkeypatch)
|
|
273
|
+
journal = run_dir / "journal.jsonl"
|
|
274
|
+
rows = [json.loads(line) for line in journal.read_text(encoding="utf-8").splitlines()]
|
|
275
|
+
for row in rows:
|
|
276
|
+
if "label" in row:
|
|
277
|
+
row["label"] = "the"
|
|
278
|
+
journal.write_text("".join(json.dumps(row) + "\n" for row in rows), encoding="utf-8")
|
|
279
|
+
assert cli.main(["run", str(run_dir)]) == 3 # a FAILED verdict
|
|
280
|
+
text = capsys.readouterr().out
|
|
281
|
+
assert "The harness reported this workflow failed." in text, text
|
|
282
|
+
assert cli.main(["run", str(run_dir), "--json"]) == 3
|
|
283
|
+
stories = [entry["text"] for entry in json.loads(capsys.readouterr().out)["stories"]]
|
|
284
|
+
assert "The harness reported this workflow failed." in stories, stories
|
|
File without changes
|
|
File without changes
|
{agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/confusing_output.yml
RENAMED
|
File without changes
|
{agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/detector_request.yml
RENAMED
|
File without changes
|
{agent_postmortem-0.3.5 → agent_postmortem-0.3.6}/.github/ISSUE_TEMPLATE/run_shape_not_covered.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|