Native Reviewers Can Record Cross-Harness Provenance
The Broader Goal at the End of the Previous PR
The previous provenance work let a native implementation session record
cost_entries.pr_number so synlynk pr check could compare implementer and
reviewer harness/model identity. Dispatched reviewers were still the only
review identity the gate could resolve.
Strategic Shifts in This PR
During PR #2112 a real QA review from a different harness and model posted an
APPROVE, then synlynk pr check blocked with no reviewing job provenance found. The gate had no supported way to record an interactive reviewer
without fabricating a dispatch job. This PR adds that path, and it tags the
row with the reviewer role so a QA stub cannot be read as the implementer
(gh:#2095).
What This PR Shipped
synlynk cost log --pr <n> --harness <harness> --role qa --model <model>writes a native reviewer cost row (job_idnull,agent_role=qa)._cross_harness_review_verdictaccepts that row when no dispatched review job exists, and only when harness and model both differ from the implementer.- Native implementer lookup excludes
qarows, so a later reviewer stub cannot replace implementer identity. - Dispatched review jobs remain the preferred path when they resolve uniquely.
- Tests cover native accept, missing provenance, untagged rows, same harness+model rejection, the #2095 role split, and dispatched-review precedence.
No brainstorm visual informed this focused gate fix.
Summary Toward the Long-Arc Goal
Interactive QA sessions can now participate in the same measured cross-harness review gate as dispatched work, which is a prerequisite for fail-closed merge authority without forcing a second review dispatch.
The New Goalpost
A native reviewer who records role-tagged provenance should pass synlynk pr check on the same terms as a dispatched reviewer: different harness, different
model, and an exact PR-linked cost row.