Tracking issue for the Low / advisory findings deferred during the review-severity-binary stack (PRs #168–#173). All correctness and feature-breaking issues from those PRs were fixed and verified across multiple review rounds; the items below are non-blocking polish surfaced by roborev and the GitHub review bot, consciously deferred so the stack could land. None affect correctness or CI.
Source attribution in each item (roborev job numbers, bot reviews). Knock these off individually or in a small cleanup PR — split this issue if you'd prefer separate tracking.
Observability
Stuck-watchdog refinement
Eval-runner robustness
Cleanup nits
🤖 Generated with Claude Code
Tracking issue for the Low / advisory findings deferred during the review-severity-binary stack (PRs #168–#173). All correctness and feature-breaking issues from those PRs were fixed and verified across multiple review rounds; the items below are non-blocking polish surfaced by roborev and the GitHub review bot, consciously deferred so the stack could land. None affect correctness or CI.
Source attribution in each item (roborev job numbers, bot reviews). Knock these off individually or in a small cleanup PR — split this issue if you'd prefer separate tracking.
Observability
SAAdjudicationanalytics event lacks acyclefield. — DONE in feat(orchestrator): SA adjudication of persistent review findings #173 (commit addscycleto the event + emit + test). Its siblingReviewFindingPersistedcarriescycle: int, which anchors the event to the ticket timeline; without it you can't tell from the log whether an adjudication fired early (first blocked round) or late (after the cap), making rate calibration harder. Addcycle: intto the event and pass it from_run_sa_adjudication. (jig/analytics/events.py; roborev 590 / feat(orchestrator): SA adjudication of persistent review findings #173 bot. Note: feat(orchestrator): SA adjudication of persistent review findings #173 is the stack tip and unmerged — this could fold into feat(orchestrator): SA adjudication of persistent review findings #173 directly instead.)Stuck-watchdog refinement
proposedticket can mask a genuine deadlock._check_stuck'shas_pending_proposedtreats any non-review-notablePROPOSEDticket as "alive", so a front-door issue with no dependency relationship to a stuck cycle (x → y → x) suppressesproject_stuckuntil that unrelated issue is approved/rejected. Tighten so aproposedticket only counts as alive when it's actually a dependency of a stuck candidate (approving it could unblock something). (jig/orchestrator.py_check_stuck; roborev 586.)Eval-runner robustness
analysis_dirdiscarded on the build-failureCOMPLETED_WITH_FAILURESpath. Ifanalysis_completearrived before the build ran,analysis_out_diris set but the early-return manifest path returnsanalysis_dir=None, dropping the analysis artifact from the result. Carry it through. (jig/eval/runner.py; roborev 587.)tickets_failed > 0. Themanifest.tracer is Nonesite is covered; the tracer-nonzero-exit site (samefail_outcomevariable) isn't exercised on the COMPLETED_WITH_FAILURES path. Patch_check_tracer_outcometo returnTRACER_FAILon a_FailWS-style run and assertCOMPLETED_WITH_FAILURES. (tests/test_eval_runner.py; feat(eval): classify ticket-failure and stuck outcomes distinctly #170 bot, minor.)Cleanup nits
_run_review_federation. Still reads "notable comments … RESOLVED but deferred via the Coordinator (DEFERRED queue)" — the pre-binary-severity wording. Actual behavior is "filed as proposed issues." (jig/orchestrator.py~line 781; roborev 543/585.)coordlocals in disposition tests.tests/test_reviewers_disposition.pystill unpackscoordfrom_build_storesin severalTestCriticalDisposition/TestImportantDispositioncases thoughapply_severity_dispositionno longer takes a coordinator. Harmless today (CI lints onlyjig/, nottests/) butruffF841 fires iftests/is ever linted. (roborev 585.)from jig.worktree import _run_git._worktree_headreaches into a private symbol; a thin publicasync def get_head_commit(path: Path) -> strinjig.worktreewould be cleaner and avoid silent degradation (theexcept Exception → return Nonefallback) on a future rename. (jig/orchestrator.py; feat(review): multi-pass first review, delta-scoped re-review #171 bot, low-priority refactor.)test_sweep_fails_late_ticket_with_failed_depcomments that it verifies blame attribution to the original failed dependency, but only asserts aticket_failedevent exists — theroot_failure_idattribution is actually pinned by the separatetest_sweep_blame_attributes_to_original_dep. Reword the comment. (tests/test_orchestrator_failure_cascade.py; roborev 586.)🤖 Generated with Claude Code