Parent
#15
What to build
Move per-attempt lifecycle event and hook emission from Crawler into JobRunner. Run-level / decision events stay on the Crawler. Then delete dead helpers in crawler.rs that are no longer reachable.
Fires from JobRunner (inside run()): job_started, fetch_first_byte, render_navigated, challenge_detected, fetch_completed, extract_completed, job_failed.
Stays on Crawler: job_enqueued, job_dequeued, job_admitted, job_rejected, job_retried, job_dropped, job_persisted, frontier_seeded, run_started, run_stopped.
NDJSON event names and payloads must remain byte-for-byte unchanged; only the emitter changes. The regression test from #16 is the trip wire.
After events move, sweep src/crawler.rs for helpers that no longer have callers and delete them.
Acceptance criteria
Blocked by
Parent
#15
What to build
Move per-attempt lifecycle event and hook emission from
CrawlerintoJobRunner. Run-level / decision events stay on theCrawler. Then delete dead helpers incrawler.rsthat are no longer reachable.Fires from
JobRunner(insiderun()):job_started,fetch_first_byte,render_navigated,challenge_detected,fetch_completed,extract_completed,job_failed.Stays on
Crawler:job_enqueued,job_dequeued,job_admitted,job_rejected,job_retried,job_dropped,job_persisted,frontier_seeded,run_started,run_stopped.NDJSON event names and payloads must remain byte-for-byte unchanged; only the emitter changes. The regression test from #16 is the trip wire.
After events move, sweep
src/crawler.rsfor helpers that no longer have callers and delete them.Acceptance criteria
JobRunner::runvia the injectedArc<EventSink>/Arc<HookRegistry>CrawlerHookContextpayloadcrawler.rsdeleted (track LOC delta in PR description)cargo test --all-featuresgreencargo clippy --all-targets --all-features -- -D warningsgreensrc/crawler.rsBlocked by