Repository navigation
Collapse per-repo hourly review-repair callers into one roster file #1362
Description
Decision
Per-repo *-hourly-review-repair.yml files are the wrong increment. The reusable engine stays pr-review-fix-scheduler.yml. Product identity (repository, cron minute, base branch, max_prs, max_dispatches, retry_hours) belongs in one roster file that calls that engine.
Do not add another thin caller, doctoring file, or per-product pytest that only asserts YAML strings. Stack the collapse on #1360 (vendored contextual-orchestrator / orchestrator/free / ZDR-first). Do not revive NVIDIA NIM, OpenRouter-direct, or OpenAI/Azure sequential fallback hops.
Why this is closed as a copy-PR class
#1288 (LineageWeave), #1267 (Inkspan), and #1361 (learning-interoperability-contracts) each add another 30-line caller plus a contract test and doctoring page. The only real difference is four inputs. That pattern already produced 17 copies on protected main.
Collapse these existing callers
accounting-information-platform-hourly-review-repair.ymlafipc-hourly-review-repair.ymlbandscope-hourly-review-repair.ymlclearfolio-hourly-review-repair.ymlcontextual-orchestrator-hourly-review-repair.ymldisksage-hourly-review-repair.ymlfast-mlsirm-hourly-review-repair.ymlgithub-hourly-review-repair.ymlgovernance-risk-compliance-hourly-review-repair.ymlinkspan-hourly-review-repair.ymlmetering-billing-platform-hourly-review-repair.ymlnonnest2-hourly-review-repair.ymlorgmetra-hourly-review-repair.ymloriginweave-hourly-review-repair.ymlpsychometrics-commons-hourly-review-repair.ymlquarantine-sandbox-hourly-review-repair.ymlsemantic-data-portal-hourly-review-repair.yml
Keep pr-review-fix-scheduler.yml and pr-review-autofix.yml. Replace hourly-nvidia-nim-review-repair.yml path-filter sprawl with the single roster plus its one contract test.
Acceptance
- One workflow file owns the hourly roster (matrix or equivalent data, not N YAML clones).
- Adding a product is a roster row, not a new workflow/PR.
- LineageWeave and learning-contracts enter as roster rows (
base_branch: "*"where stacked) after feat(ci): route central review through vendored contextual-orchestrator (orchestrator/free, ZDR-first) #1360, not as dedicated files. - No
secrets: inherit, no caller-scoped provider keys, noCOPILOT_GITHUB_TOKEN. - Protected merge, independent exact-head OpenCode APPROVE, and product-home lane ownership stay unchanged.
Activity
seonghobae commentedon Aug 28, 2026
Fresh protected-main evidence for the roster owner boundary: scheduled
Governance Risk Compliance Hourly Review Repairrun 33147619027 atmain@f6c2a2702b7b7578b2d1fc5f2f9a5125a0390d33failed in job 98772043280, stepValidate scheduler target and dispatch authority, before any checkout or mutation. The liveOPENCODE_REPOSITORY_DISPATCH_TARGETSvalue omittedContextualWisdomLab/governance-risk-compliance, so the reusable scheduler correctly failed closed withScheduler target repository is not allowlisted. This is configuration/roster drift, not a GRC source defect. The single-roster acceptance here should make caller identity and the scheduler allowlist derive from one authority (or audit their exact equality) so a protected-main caller cannot exist while its target is operationally absent. No leaf workaround or gate relaxation is appropriate.seonghobae commentedon Aug 28, 2026
Fresh Inkspan canary exposes a second roster-control failure class at the same central owner boundary.
Exact evidence:
4b02834fd56a676589afd6b57516da44f8f984beagainstmain@128a239f8b71ca16add4b9e15e21752d1ad63ff0has required OpenCode verifier run33170543483; job98915371357fails only because the Reviews API has no authenticatedAPPROVED/CHANGES_REQUESTEDverdict on that exact head. Bootstrap job98915371265successfully binds the exact target/base/head, so the leaf verifier is healthy.main@e1b03eebc6dc5c85aed393e5928927c96376cf46still contains.github/workflows/inkspan-hourly-review-repair.ymlwith an hourly schedule and the existing reusable scheduler.342735802has no current protected-main execution: the latest visibleInkspan Hourly Review Repairschedule run is33155225826(run 13), created2026-08-28T08:24:39Zon predecessor central headcdde0d82602d9568128fd0c1e985ea40b2292710; meanwhile other central scheduled workflows continued through2026-08-28T19:00Zon currentmain.repository_dispatchinventory around the Fix OpenCode coverage fetch authentication #389 verifier window contains OpenCode dispatches for other products but no dispatch bound to Inkspan head4b02834fd56a676589afd6b57516da44f8f984be.First causal boundary / falsifiable RCA: the dedicated Inkspan caller exists in protected source but is no longer producing hourly runs, so the exact-head verifier is starved before provider/model execution. This is central scheduler/workflow-lifecycle/roster ownership, not an Inkspan product defect and not evidence that a provider failed for this head. Falsify by showing a later run for workflow id
342735802or an authenticated dispatch bound to the exact Inkspan head.Smallest owner remedy should stay on this existing #1362 collapse path: make caller/roster membership and operational scheduling one authoritative machine-checkable state, and fail closed when a roster member has no durable tick/dispatch evidence instead of silently leaving the product verifier without a verdict. Do not add another Inkspan caller or leaf workaround.
RED acceptance: a registered Inkspan roster row/caller with no scheduled execution/dispatch during its bounded cadence is detected as non-passing with exact workflow/run/target evidence.
GREEN acceptance: on an unchanged Inkspan #389 head, the next governed roster tick creates a central dispatch explicitly bound to
4b02834fd56a676589afd6b57516da44f8f984be; that path posts a formal current-headAPPROVEDorCHANGES_REQUESTED, and required OpenCode consumes that exact verdict. Predecessor runs/status-only output must not satisfy the gate.seonghobae commentedon Aug 29, 2026
DiskSage consumer evidence for the roster/review-repair owner, observed on exact current
ContextualWisdomLab/disksage#264headd932e32f33782801bf5cf22c2b71213472541113against protectedmain@79067c1160ddedf7fc962cbf8067ce7e83c4564a:33190435837, Release33190435790, Security Scan33190435865, and SAST Semgrep33190435776are terminal-success on that unchanged head.COMMENTED, no qualifyingAPPROVEDcurrent-head review.33190433493attempt 3 materialized successfully, but job/check98983769761(opencode-review) fails specifically atFail closed without a current-head OpenCode verdictwhilecoverage-evidence98983770399andcoverage-source-tree98983770576succeed.Please treat this as a concrete DiskSage acceptance canary for the roster collapse: after the central owner change, the unchanged then-current DiskSage head must receive an authoritative Reviews API
APPROVEDorCHANGES_REQUESTEDverdict bound to that exact head, and the requiredopencode-reviewjob must reflect that verdict without synthetic status, self-approval, or a leaf-side provider path. If the head moves, re-evaluate the fresh head rather than transferring this evidence.