Part of #3665 (split): an agent run's log says where its time went, as deploys already do with timing: from src/apps/timing.ts. Two attempts (pulls #3689 and #3776) did everything in one change, across the runner, early.ts, the stand-in helper and a shared class, and went red. This is one piece of it.
Done:
[ ] When a run's pull opens at its first push (watchForPull in src/crew/early.ts), the log gets timing: first push …s after the run started — clone … · brief … · harness to first push … from the run's Stopwatch, through an onOpened callback.
[ ] A follow-up run on an existing pull writes no first-push line.
[ ] test/crew-run-timing.test.ts gains a case that reads the first-push line before the end line, and fails without the change.
Files: src/crew/early.ts, src/crew/runner.ts (pass the callback), test/crew-run-timing.test.ts.
Risk: the callback must never throw into the watcher. Wrap it, and log a failure.
Part of #3665 (split): an agent run's log says where its time went, as deploys already do with
timing:fromsrc/apps/timing.ts. Two attempts (pulls #3689 and #3776) did everything in one change, across the runner,early.ts, the stand-in helper and a shared class, and went red. This is one piece of it.Done:
watchForPullinsrc/crew/early.ts), the log getstiming: first push …s after the run started — clone … · brief … · harness to first push …from the run'sStopwatch, through anonOpenedcallback.test/crew-run-timing.test.tsgains a case that reads the first-push line before the end line, and fails without the change.Files: src/crew/early.ts, src/crew/runner.ts (pass the callback), test/crew-run-timing.test.ts. Risk: the callback must never throw into the watcher. Wrap it, and log a failure.