Skip to content

claim-reaper evidence-collector archives checked-in repo fixtures instead of the engineer transcript/exit-status #4449

Description

@rysweet

Summary

The stale-engineer claim-reaper investigation evidence collector
(collect_worktree_evidence in src/overseer/claim_reaper.rs:945) captures
diagnostically-useless checked-in repo fixtures instead of the engineer's
own transcript / recipe-runner tail / exit-status. When an engineer wrote no
transcript to its worktree, evidence.txt ends up full of repo JSON fixtures,
so a stale-engineer investigation has no real signal to root-cause a death.

Evidence (durable archive, read-only)

~/.simard/reaped-engineers/rysweet_Simard_advance-rysweet-agent-kgpacks-rs-to-full-parity-f29bb15c-1784721147/

  • manifest.json carries only claim_key / goal_id / idle_age_secs=24830 / archived_unix_ts / worktreeno worktree_tail, recipe_runner_tail,
    or exit_status.
  • evidence.txt contains 8 blocks, ALL checked-in repo fixtures, all sharing
    the ~04:58 worktree-checkout mtime:
    tests/gadugi/fixtures/ci-health-green.json,
    tests/gadugi/fixtures/ci-health-failing.json,
    tests/fixtures/atelier/bookcase-brief.json,
    src/coin_gym/fixtures/sample_snapshot.json,
    src/coin_gym/fixtures/improve_loop_snapshot.json,
    scripts/dashboard-audit/package.json,
    prompt_assets/simard/terminal_recipes/copilot-submit.json,
    package.json.
  • No .log/.jsonl/.out/.err engineer-output file was ever written to the
    worktree after the 04:59 checkout.

Root cause

collect_worktree_evidence walks the whole worktree and treats any file
with extension log|txt|json|out|err|jsonl as "evidence"
(src/overseer/claim_reaper.rs:975-982), sorts newest-mtime-first, and takes
the top 8 (:985-988). It has:

  1. No targeting of the engineer's actual output paths (transcript /
    recipe-runner tail / captured exit-status).
  2. No exclusion of checked-in repo artifacts (tests/**/fixtures/**,
    src/**/fixtures/**, package.json, tracked prompt_assets/**).
  3. No fallback signal recorded when no genuine engineer transcript exists — it
    silently substitutes repo fixtures rather than emitting
    (no engineer transcript/exit-status captured).

Because a git checkout stamps every tracked file with the same mtime, the
"newest file" heuristic then surfaces arbitrary repo fixtures.

Impact

  • Stale-engineer investigations get zero real diagnostic signal; a future
    investigation could be misled into fabricating a dead:<cause> verdict from
    fixture contents. (This sweep correctly failed closed to still-alive.)
  • Wasted archive space and agentic-investigation dispatch cost.

Suggested systemic fix (dispatch via smart-orchestrator, not inline)

  • Capture the engineer transcript / recipe-runner tail / exit-status from their
    known locations first; only then fall back to worktree scanning.
  • Exclude tracked repo fixtures/manifests from the candidate set.
  • When no genuine engineer output exists, write an explicit
    (no engineer transcript/exit-status captured — cannot demonstrate death)
    marker so the investigator fails closed by design.
  • Prefer files whose mtime is after the worktree-checkout mtime.

Notes

Filed by the claim-reaper stale-engineer investigation (self-improvement signal).

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions