The supervisor creates the worker's response file before spawning it. A
worker that exited 0 without writing that file left it empty, and
slurp_worker_response read the empty file as "" with status OK. The run
then counted as a SUCCESS with an empty response (the daemon marked the
job successful). The clean-exit branch of worker_terminal_log also
deleted the worker log, the only record of where the run stopped. Only
an oversized response was treated as a failure.
- index_supervisor: an empty response file is WORKER_RESPONSE_READ_EMPTY.
A clean exit with no readable response sets response_missing, keeps the
worker log, records its path, and records the last structured event
the log holds (text or JSON format, last 64 KiB) as last_phase. It is
logged as index.supervisor.no_response with the log path and the last
phase. The outcome stays CLEAN, so the disposition is FALLBACK: an
explicit error, with no in-process fallback and no recovery re-run of a
worker that did not crash.
- mcp: cbm_mcp_index_worker_no_response_failure builds the error
(reason "no_response", last_phase, worker_log, hint). It is used for
the first attempt and for a recovery run.
- daemon application: the job failure message says the worker exited
cleanly without writing a response, and gives the last phase and the
log to inspect.
- pipeline_incremental: the legacy per-file purge loop now logs
incremental.purge.start (changed/deleted counts) and
incremental.purge.progress. Progress lines carry counts only, use a
ceiling stride (at most ~20 lines plus the final one) and never log one
line per file. Before this, nothing was logged between
incremental.edge_snapshot and incremental.purge.
Tests (RED before, green after, RED on revert):
- index_supervisor_clean_exit_without_response_is_named_failure_issue1300
(a real worker subprocess logs a phase and exits 0 without a response)
- daemon_application_clean_exit_without_response_is_named_failure_issue1300
- incr_purge_reports_bounded_progress_issue1300
- index_supervisor_clean_exit_without_response_response_issue1300 (the
contract of the response builder)
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>