Skip to content

chore(ci): reconcile protected main into review admission owner - #2192

Merged
seonghobae merged 129 commits into
fix/no-heuristic-review-admission-current-mainfrom
main
Sep 14, 2026
Merged

seonghobae merged 129 commits into
fix/no-heuristic-review-admission-current-mainfrom
main

Conversation

@seonghobae

@seonghobae seonghobae commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Ordinary/non-force reconciliation helper for canonical review-admission owner #1629.

This reverse PR originally exposed a real conflict between main@7f07029381a9ca770d0a68b7f3938dd652799d4d and owner head 1ca83c308a2e8982d721bb9ec7a2e2df3d1b5578. The conflict was repaired on the canonical owner branch with ordinary two-parent merge commit f9b019422817772ac89b84590a5595982da17a44, preserving protected-main ancestry while resolving the overlapping launcher/policy/sidecar contract intentionally. ADR-0029 was then superseded explicitly on the same owner branch.

Current comparison from the owner branch to protected main has ahead_by=0 for this reverse direction and no changed files: the protected-main delta this helper existed to carry is now fully inherited by #1629. This PR therefore has no remaining valid delta and is closed under the verified-complete-inheritance rule; #1629 remains the canonical owner.

seonghobae and others added 30 commits September 2, 2026 15:17
…cks are in flight (#1937)

A scheduler run that executes after a 2h+ queue wait finds its scanned PR
behind main and merges main into the head before any review is dispatched
(inspect_pr, pre-review path). That push cancels every queued check on the
old head (22/28 on #1926, 21/30 on #1484) and requeues the PR at the back,
so under a saturated queue no head ever finishes its checks: 76 of the 77
PRs merged since 2026-09-04 had 0/12 required contexts satisfied at merge.

has_in_flight_check_runs() reuses latest_check_runs()/running_check_state();
the pre-review path now decides "wait" while any newest current-head check
run is still queued or running. No age cap on purpose: a cap would restart
the loop. The post-approval update path is unchanged (main is strict=true).

CLAUDE.md described only the post-approval update; it now names both paths.

Refs #1935

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…roup per run id

The workflow-level concurrency key fell back to github.run_id for every
non-PR event, so each main push was its own group and no newer main head
ever retired an older, superseded scan. Measured 2026-09-05T14:27Z in
.github: nine push/main Strix runs outstanding at once (five running, one
past two hours; four queued) against a 10-30 minute normal scan, each
holding a slot under the shared 60-job ceiling.

Scope push events as push-<ref_name> with the existing cancel-in-progress:
true, so a newer head of the same protected branch supersedes the older
scan exactly as a newer PR head does. A push scan covers the whole tree and
publishes no strix commit status, so the newest head subsumes every older
one; schedule and PR-less repository_dispatch keep a unique run id and the
pr_number admission output is unchanged.

Contract: queue-contract docstring records the measurement and a new
assertion pins the push-{0} clause; the quick gate asserts it too; the
2026-09-04 doctoring record carries a dated amendment.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BV96rXhqoR3tYZ9AeAVur4
…cing

Requested in review on #1938: during a merge burst each new main head
cancels the previous scan, so the latest main is scanned once merging
pauses for one scan duration; the weekly schedule scan is the floor.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BV96rXhqoR3tYZ9AeAVur4
… the workflow comment

Peer measurement on #1938: 50 main pushes in 24 h, median gap 8.4 min,
mean 26.5 min, so only the final head of each merge burst completes a
scan. Stated next to the group key so a later coverage measurement does
not read the gaps as a defect.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BV96rXhqoR3tYZ9AeAVur4
…1939)

build_zdr_prioritized_catalog sorted eligible routes by (cost, ZDR,
provider, model) and filled the bounded catalog in that order, taking up
to account_cap per account. With the sidecar's ORCHESTRATOR_CATALOG_
ACCOUNT_CAP=8 and ORCHESTRATOR_CATALOG_LIMIT=12 the fill took 8 nvidia_nim
+ 4 nvidia_nim_sub and stopped before the alphabetically last account:
noema-review run 33969842312 admitted 62 free routes across three accounts
(free_account_diversity 3) and served 12 NVIDIA routes, of which runtime
preflight kept 2, so a stalled NVIDIA endpoint had no other account to
fail over to (contextual-orchestrator#1045).

Keep the sort; group the sorted rows by (cost, ZDR) tier and fill each
tier round-robin across provider accounts until limit, honouring
account_cap. Tier order, cap, limit and discovery-order independence are
unchanged; the same input now yields 4 + 4 + 4. The launcher's
evidence_only filter (#1476) is not the cause on the current pin
(2e414d15 includes contextual-orchestrator#949), so that PR stays a
complementary hardening.

Tests: three new cases (interleave within tier; ZDR tier still first;
exhausted accounts hand turns over) were RED against the old loop
(3 failed) and are GREEN now. Gate on this tree: 2896 passed, coverage 100%,
interrogate 100%.

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Rebinds workflow_sha so the required review runs pick up #1939's
round-robin catalog fill; the previous head's Noema run failed on the
single-upstream gateway stall that #1939 removes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BV96rXhqoR3tYZ9AeAVur4
…ew sidecar's stderr (#1943)

The review sidecar never configured its orchestrator process's logging,
so it ran at Python's default WARNING while contextual_orchestrator logs
every provider attempt, classified failure, backoff and circuit event at
DEBUG. A 3122 s noema-review 502 on 2026-09-05 (.github#1940) could only
be attributed by reading source: six preflight-ready routes, two retry
layers (TaskOrchestrator.tool_retry_attempts=1 over ModelClient
max_retries=2 at a 90 s per-recv timeout), about 548 s per hop.

The launcher now calls the vendored debug_logging.configure_logging
before serving, DEBUG by default and overridable through
ORCHESTRATOR_SIDECAR_LOG_LEVEL, and gives every root handler a
timestamped format so per-hop durations can be read off the trace. At the
vendored pin no DEBUG site logs a prompt, payload or response body; the
only free-text field (provider_attempt_failed's error_message) is kept
out of CI evidence by the sidecar's allow-list sanitizer, which a
companion change extends to admit these templates and upload the file.

Tests: level default, override, level-and-format application, invalid
level -> SystemExit, and a source-order contract that logging is
configured before credential work; all five fail against main's launcher.
Gate on this tree: 2901 passed, coverage 100%, interrogate 100% (the final
commit differs from the gated tree by a docstring only; the touched test
module and interrogate were re-run on the final text).

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…rcuit events (#1945)

* fix(sidecar): let the stream sanitizer pass orchestrator route and circuit events

Every provider_*/circuit_* line from the orchestrator was folded into
omitted_unstructured_lines, so even the provider_exhausted WARNING that
fires today never reached an artifact. Admit those templates field by
field against bounded charsets, cut provider_attempt_failed before its
free-text error_message, and accept both the default and the sidecar
formatter log prefixes (keeping the timestamp for durations).

Companion to #1943 and #1944. Refs #1935, #1939

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(sidecar): accept float circuit counters and pin the real formatter output

The orchestrator's circuit counters are floats (failures 0.0 += 1.0,
circuit_reset_seconds 30.0), so the lines that reach stderr say
failures=2.0 / reset_seconds=30.0; the integer-only pattern rejected both
circuit_failure and circuit_opened. Found by rendering the templates through
the sidecar's logging.Formatter, which the new test now does for all ten.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…erdict phase fails (#1944)

A failed noema-review run left artifacts=0, so a 3122 s walk across six
ready routes ending in HTTP 502 (run 33981136873) was diagnosable only from
the caller's one-line summary. Ship the sanitized sidecar stderr and the
preflight report on failure, using the same pinned upload-artifact and the
same file Strix already publishes in strix-reports.

Refs #1935, #1939

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…ilover

The review sidecar's preflight discarded a route the moment its 16-token
probe raised, including on 429 and 5xx, while the serving gateway treats
exactly those statuses as transient: it retries the route and fails over
across it (provider_errors.PROVIDER_STATUS_SURFACES marks 429 retryable;
orchestrator.TRANSIENT_HTTP_STATUS). Under concurrent CI load the probes
spend the per-key budgets themselves: noema-review run 33993637015
(.github#1687, 2026-09-05) rejected 11 of 12 routes -- six with 429, three
of them on NVIDIA keys whose sibling routes were ready -- served the single
ready route for 542 s and returned 502.

Routes whose probe answered with a status in the gateway's transient set
are now kept as deferred, ranked after every ready route by a catalog
priority penalty, so failover has somewhere to go. A probe that timed out
records no http_status and stays rejected, so the silent route whose
request costs the full two-layer retry budget is never admitted on that
evidence. ready_count is unchanged, deferred_count is reported, and with no
ready route the stage still fails, so ADR-0005's priced-catalog fallback
contract is untouched. The escalation path is not touched. The stream
sanitizer admits preflight_route_deferred next to preflight_route_rejected.

Tests: deferral order and priorities, all-transient still fails, frozen
and plain agent demotion, deferred log line, sanitizer pass/drop/scrub;
all five fail against main's launcher and sanitizer. Gate on this tree:
2909 passed, coverage 100%, interrogate 100% (final commit differs from the
gated tree by one comment; the touched module and interrogate re-run).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The review request is served by the passthrough path (one attempt per
candidate via proxy_send_once, stream=False), so a silent route costs one
socket-silence timeout, not a multi-layer retry budget. Comment-only.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… budget

The first noema-sidecar-evidence trace (.github#1661 run 33995553859)
shows the review path is _invoke: a silent route costs two rounds of
three 90 s timeouts. Word the constant's comment on that basis instead of
the single-attempt passthrough wording of the previous commit. Comment-only.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The catalog becomes a candidate list (up to 24, per-account cap 8, the
tier-then-round-robin order from #1939) and _preflight_review_agents probes it
in order, stopping at REVIEW_PREFLIGHT_TARGET_READY = 8 ready routes or
REVIEW_PREFLIGHT_MAX_PROBES = 16 probes, whichever comes first. A permanently
dead candidate (NIM lists gemma-3-12b/4b and answers 404 on every run) costs
one probe instead of a served slot; a healthy pool stops early.

Why: after #1939's four-per-account slice, each NVIDIA key's slots were its
first four models alphabetically -- deepseek-v4-flash, deepseek-v4-pro and the
two gemma-3 404s -- so each key served two contended routes. Preflight ready
fell from 6/12 to 1-3/12 and noema-review in .github went from 7 successes /
14 failures to 0 / 22 (lane jan's census on #1948, verdict-step conclusions).

- REVIEW_PREFLIGHT_MAX_TOTAL_ROUTES 12 -> 24, PRIMARY_ROUTE_LIMIT 8 -> 16;
  sidecar ORCHESTRATOR_CATALOG_LIMIT default and the composite action's
  catalog_limit default 12 -> 24.
- Report gains candidate_count, target_ready, probe_budget; probed_count now
  counts probes sent; rejected_count = probed - ready - deferred. #1947's
  deferral pass pairs exactly the probed prefix.
- ADR-0029 (new; 0028 is claimed by #1668), ADR-0003 section 2 stage-budget
  sentence amended, CHANGELOG.

Tests: four new lazy-fill tests plus the updated stage-limit invariant; all
five fail on #1947's tree (negative control). Gate: 2913 passed, 1 skipped,
coverage 100% (13150 statements, 0 missed), interrogate 100%.

Refs #1939, #1947, #1948.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… budget

Review fixes from lane peer 1's head verification of #1949:

- The production pool is `free` (sidecar default, no fallback stage), where
  _bounded_primary_catalog_limit returned the full 24 while the probe cap is
  16, so candidates 17-24 could never be probed and candidate_count minus
  probed_count would have been meaningless as evidence. Every stage's list
  is now min(total, REVIEW_PREFLIGHT_MAX_PROBES): the free pool lists 16
  candidates (12 before), the auto pool keeps 16 free + up to 8 priced.
- The launcher's own ORCHESTRATOR_CATALOG_LIMIT default follows the sidecar
  (12 -> 24).
- The sidecar's job-log echo of the preflight JSON grows from 160 to 400
  lines: 16 probed routes at 8-10 lines each plus the header overran the old
  cap exactly in the dead hour; the artifact copy was always complete.
- ADR-0029 and CHANGELOG state the free-pool bound and the wall-time cost of
  silent probes (one artifact: 19 probes, 805 s).

Test: the stage-limit test now asserts the free pool's single stage equals
the probe cap. Gate: 2913 passed, 1 skipped, coverage 100% (13150
statements, 0 missed), interrogate 100%.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The sidecar stream sanitizer collapsed every Python traceback into a single
"sidecar emitted an unexpected exception" line, printed once per stream. On
.github#1812's strix run 33993155419 the gateway answered 83 requests with
500 internal_error -- contextual-orchestrator's generic
`except Exception: traceback.print_exc(); _send_error(500, ...)` path -- and no
artifact could say which exception escaped, where, or how many times.

Each traceback now yields one bounded line,
`unexpected_exception type=<Type> frame=contextual_orchestrator/<module>.py:<line>:<fn>`:
opened at the header, closed at the column-0 terminal line (or the next
header, an allowlisted line, or end of stream -> type=unknown). Indented
frame/source lines are consumed rather than counted as omitted; only a
contextual_orchestrator frame's package path, line and function are kept, and
the exception message is never re-emitted. Chain sentences are consumed so a
chained exception yields cause then effect.

Tests render real tracebacks with traceback.format_exc() from code compiled
under a contextual_orchestrator/ filename (plain, dotted package type with a
`from` chain, truncated at end of stream, free-text column-0 line), and the
existing traceback expectation is updated. Only the sanitizer's own test
consumed the old sentence.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…trator/free retry-stacking

Advances ORCHESTRATOR_PIN_SHA from 2e414d15 (2 days stale) to 414f2297, the commit merging contextual-orchestrator#1081's retry-stacking fix. Independently verified: reproduced the bug on unmodified contextual-orchestrator main (6 real attempts), confirmed the fix (<=2), and byte-for-byte verified all 4 file edits (sidecar script, contract test, ADR, CHANGELOG) post-push. Bypass-merged per this cycle's standing authorization: this PR's own required reviews route through the base branch's still-stale sidecar script (pull_request_target trust boundary), so normal review would hit the exact bug being fixed here -- the chicken-and-egg case this bump exists to resolve.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPmJErfkcHer4UVEgrQxUX
Binds the sidecar pin bump to contextual-orchestrator@414f2297
(contextual-orchestrator#1081's retry-stacking fix, .github efb8926) and the
#1943/#1944/#1945 workflows to this head's required runs; the previous head's
Noema/Strix runs failed on the stalled-route loop that fix removes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BV96rXhqoR3tYZ9AeAVur4
Lane jan rebuilt the real 2026-09-06 candidate order from #1938's Strix
artifact (comment on #1949): under the plain sixteen-probe walk the served
set is about five ready + five deferred and the readiness target of eight is
unreachable, because the tier round-robin spends five probes on an account
whose every free route has answered 429 in every artifact since 21:00Z and
four on the two dead gemma-3 entries per key, while the routes that were
ready in every pre-#1939 artifact (llama-3.2-11b/90b, muse-glimmer-30b) sit
past the cap.

A 429 at preflight is a per-key answer. Once one credential account has
answered 429 to REVIEW_PREFLIGHT_ACCOUNT_SKIP_AFTER_429 = 2 consecutive
probes, its remaining candidates are skipped without a probe and the walk
continues with the other accounts' next candidates; the two probed routes
are still deferred (#1947). Under jan's order the same sixteen probes now
reach both keys' llama routes and the target; a fully rate-limited hour
costs two probes per account instead of the whole budget.

- The production free pool lists the full 24 candidates again (probe cap
  16): the tail past the cap is reachable exactly when an account is
  skipped, and the report separates skipped_count from the unreached
  remainder, which answers the earlier unreachable-tail objection.
- The deferral pass pairs rows with the agents actually probed (a new
  `probed` list), not positionally with `agents` -- with skips those no
  longer line up; the artifact-order test alone missed this because its
  skips fell after its deferred rows, so a dedicated ordering test pins it.
- Report gains skipped_count and account_skip_after_429. ADR-0029 and the
  CHANGELOG record the rule and the projection; jan's family-interleave
  layer is recorded as the reserve alternative.

Tests: dead-hour budget test now uses 404s (24 -> 16 probes, no skips);
three accounts x 8 all 429 -> 6 probes, 18 skipped; jan's order -> a llama
route on each key, ready 8 within 16 probes, deferred = the two probed
OpenRouter routes, skipped >= 3; row/agent pairing after skips. Negative
control: the new tests fail on this PR's previous head; the pairing test
fails on the pre-fix walk. Gate: 2916 passed, 1 skipped, coverage 100%
(0 missed), interrogate 100%.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…post-pin measurement

.github#1661 run 34008191123 (04:48Z, sidecar pin 414f2297): both NVIDIA
keys' deepseek-v4-pro preflight probes held for 90.06 s and 90.10 s -- a
16-token probe can spend the full receive timeout -- and the hour had zero
ready routes of twelve. So the probe cap is a wall-time bound as well: a
fully silent hour costs at most 16 x 90 s = 24 minutes of preflight against
18 today, and the account-skip rule cuts a rate-limited hour to two probes
per account. Docs only; no code change.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…-transient-routes

fix(sidecar): keep transient-rejected preflight routes as deferred failover instead of discarding them
…er-traceback-type-20260906

fix(sidecar): keep the exception type and innermost frame per traceback
…fill

fix(sidecar): fill the preflight served set lazily to a readiness target
…retry (#1953)

* fix(strix): name the sandbox bootstrap failure and give it a bounded retry

When Strix's sandbox container comes up without its Caido proxy, Strix fails
its fixed ten loginAsGuest attempts and exits; the gate then printed
"STRIX_PROVIDER_UNAVAILABLE: contextual-orchestrator/orchestrator/free
exhausted" -- blaming a component the run never called. The gate already
recognises this class (is_caido_bootstrap_timing_error) and documents a
same-model retry for it, but that retry draws on
STRIX_TRANSIENT_RETRY_PER_MODEL, which is 0 in production because the
gateway owns model failover, so it has never run.

- STRIX_SANDBOX_BOOTSTRAP_RETRIES (default 1): once the per-model budget is
  spent, a sandbox-class failure may extend the attempt loop by one, up to
  this budget. The budget is charged in the same branch that grants the
  attempt: an adversarial verification pass (three independent lenses)
  showed that the first draft, which charged it in the retry-reason elif
  chain behind the gateway classes, let a log matching both the sandbox
  class and a rate-limit or connection class extend the loop on every
  iteration without charging, with nothing in production bounding it but
  GitHub's six-hour default. Gateway failures at per-model budget 0 still
  get no retry.
- run_current_target_scan: for the sandbox class the verdict is
  "STRIX_PROVIDER_UNAVAILABLE: STRIX_SANDBOX_UNAVAILABLE: the last Strix
  attempt ended in the sandbox bootstrap (...) after N sandbox-specific
  same-model retries (budget B); this verdict names Strix's sandbox, not the
  LLM gateway." N is the observed count (SANDBOX_RETRIES_USED). The leading
  token is unchanged, so strix.yml's finding-free classification and its
  tests are untouched; the second token lets the review census split
  sandbox outages from gateway ones.

Evidence: argos Strix run 34013128112 (2026-09-06): sidecar preflight ready
4 / deferred 4, then "Docker image ready", loginAsGuest failed after 10
attempts on 127.0.0.1:48080, Strix exit after 240 s, one attempt, the
gateway verdict; a second artifact (9983313170) identical; two of the six
most recent strix-reports artifacts are this class.

Tests (tests/test_strix_caido_bootstrap_timing_retry.py, production
functions extracted, run_strix_once stubbed with a self-capping stub):
sandbox retry at per-model 0 (2 attempts), bounded (budget 2 -> 3, 0 -> 1),
gateway retries not widened, mixed sandbox+rate-limit log stays bounded,
sandbox budget on top of per-model (1+1 -> 3), verdict names the sandbox with
the observed count, gateway verdict unchanged. Negative controls: three fail
on main's gate; the mixed-log test fails on the first draft (runaway caught
by the stub cap). Gate: 2927 passed, 1 skipped, coverage 100% (0 missed),
interrogate 100%.

Refs #1948, #1935.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(strix): report only sandbox retries that actually ran

Lane peer 1's verification note on #1953: the reporting variable was set
where the extra attempt is granted, but a granted attempt can still be
vetoed by the timeout / transient checks that follow, so a log carrying both
the sandbox and a timeout signature was charged, not retried, and reported
as "after 1 sandbox-specific same-model retries". SANDBOX_RETRIES_USED is now
assigned only when the retry really proceeds (just before the attempt
counter advances); the budget charge stays in the grant branch, so the
bound is unchanged. The constant's comment notes that a sandbox retry waits
the same inter-attempt backoff as any other retry -- a pause between
container attempts, not an inference deadline.

Test: sandbox+timeout log -> 1 call, reported 0; plain sandbox log -> 2
calls, reported 1 (the harness echoes SANDBOX_RETRIES_USED). Module 14/14;
negative control on main's gate 7 failed / 7 passed. Gate: 2928 passed,
1 skipped, coverage 100% (0 missed), interrogate 100%.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
seonghobae and others added 25 commits September 13, 2026 13:24
…ource

The central bootstrap scans this repository's own pull requests with the
policy under test, and only tests/test_pingora_edge_policy.py is path-exempt.
PR #2144 run 34737529066 flagged five literal runtime paths in the new fixture
file; build the fixture at runtime instead so the diff never carries the form.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The comment still said the classifier verdict was consumed through
`needs`; nothing consumes it that way any more.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…te-consumer-read-permissions

fix(codeql): grant private consumers pull-request and status reads
…id-route-keys

fix(review-policy): key OpenRouter ZDR feed routes by model_id
…idence-2116

fix(pingora): admit bounded HWPX evidence documents without UTF-8 decoding
CodeRabbit on #2143: whole-workflow counts could pass if the same string
appeared in another step or log line while a scanner or reporter step lost
its flag. Check the four scan/retry steps and the reporter step by name.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
`gather_findings` consulted only `tool.driver.rules`, so results whose rule
lives in `tool.extensions` (every current CodeQL query pack: the real Python
artifact has 0 driver rules and 43 extension rules) lost their
security-severity and tags and passed the Medium+ gate fail-open (#2150).

- `_component_rules`: honour `result.rule.toolComponent` (index | guid | name);
  absent means driver; unmatched means unresolved, never the wrong component.
- `_rule_for_result`: resolve inside the referenced component only, so
  colliding rule ids stay distinct; validate `rule.index` against the declared
  id; `ruleId` != `rule.id`, bad indices, non-dict entries are unresolved.
- `_finding_from_result`: an unresolved reference with no result-level score
  gates as `level=unresolved-rule` instead of silently passing.

Driver-backed behaviour unchanged. Tests RED 8 -> GREEN 24; file coverage 100%.
Full suite under coverage: 3062 passed / 1 skipped / 100% coverage; 13
timing-sensitive failures reproduced as passing in isolation (CPU contention).

Closes #2150

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(scheduler): recheck cancellation races

* test(scheduler): bound cancellation race outcomes

* fix(scheduler): preserve runs started during cancellation

* fix: preserve runs after cancellation race

* test: document coalescer callbacks
…mplicit model timeout)

Advance ORCHESTRATOR_PIN_SHA from 414f2297 to protected
main@767e67fbc6b881a452761f32abb69b9971b9b03b, the merge of
contextual-orchestrator#1053. Under the old pin ModelClient defaulted to
timeout=90 and the review gateway inherited it, so NVIDIA NIM
google/gemma-4-31b-it attempts in the Noema sidecar timed out at exactly
90 s (15 of 27 attempts in fast-mlsirm#1860 run 34748511702) and the
gateway answered 502 provider_connection_error after ~20 min of circuit
retries. #1053 makes the model timeout null by default and administrator
configured per model.

Update the sidecar contract test constant, ADR-0003 (current pin and a
2026-09-13 amendment), and CHANGELOG. tests/test_contextual_orchestrator_*
and sidecar contract tests: 225 passed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ar-pin-1053

chore(sidecar): advance contextual-orchestrator pin to 767e67fb (no implicit model timeout)
…on-root-20260913

# Conflicts:
#	CHANGELOG.md
* fix(noema): extract office documents for review context

* fix(noema): harden document XML extraction

* fix(noema): install document XML dependency in quality CI
Follow-up to #2172. The required hosted workflows remained queued repository-wide with zero available Actions runners; local focused, fixture, security, and syntax validation passed for the exact head. Apply the reviewed document-reader fixes.
…thon-root-20260913

fix(opencode): admit immutable python source roots
…te-extension-rules-2150

fix(codeql): resolve SARIF rules from the referenced tool component
…s-sarif-checkout-path-2132

fix(security-scan): use current OSV output flags and bind SARIF upload to the head checkout
…te-fold-20260913

fix(sast-semgrep): fold the changed-scope gate into its single consumer job
@github-advanced-security

Copy link
Copy Markdown

You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool.

What Enabling Code Scanning Means:

  • The 'Security' tab will display more code scanning analysis results (e.g., for the default branch).
  • Depending on your configuration and choice of analysis tool, future pull requests will be annotated with code scanning analysis results.
  • You will be able to see the analysis results for the pull request's branch on this overview once the scans have completed and the checks have passed.

For more information about GitHub Code Scanning, check out the documentation.

1 similar comment
@github-advanced-security

Copy link
Copy Markdown

You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool.

What Enabling Code Scanning Means:

  • The 'Security' tab will display more code scanning analysis results (e.g., for the default branch).
  • Depending on your configuration and choice of analysis tool, future pull requests will be annotated with code scanning analysis results.
  • You will be able to see the analysis results for the pull request's branch on this overview once the scans have completed and the checks have passed.

For more information about GitHub Code Scanning, check out the documentation.

@coderabbitai

coderabbitai Bot commented Sep 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 6d3661b1-fbb6-424b-b79d-946298b80eab

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@seonghobae
seonghobae merged commit f9b0194 into fix/no-heuristic-review-admission-current-main Sep 14, 2026
269 of 477 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants