ci(github-action): update action https://github.com/misospace/pr-reviewer-action (v3.7.0 ➔ v3.8.0) #2499

Merged
GiorgioAresu merged 1 commit from renovate/https-github.com-misospace-pr-reviewer-action-3.x into main 2026-10-26 09:20:10 +01:00
Collaborator

This PR contains the following updates:

Package Type Update Change
https://github.com/misospace/pr-reviewer-action action minor v3.7.0 → v3.8.0

⚠️ Warning

Some dependencies could not be looked up. Check the Dependency Dashboard for more information.


Release Notes

misospace/pr-reviewer-action (https://github.com/misospace/pr-reviewer-action)

v3.8.0

Compare Source

3.8.0 is about drift, found and fixed. Almost every change in this release is a place where behavior had silently drifted from what was configured or documented: an empty ai-temperature was sent as 0.0 and killed the tool loop on newer Anthropic models, an explicit 0 was rewritten to 0.1, the wall-clock deadline only applied to one tier, an exhausted provider quota burned thirteen minutes on retries before the configured fallback ever ran, and findings could vanish from a review when its inline comments raced a push. It's also an observability release — every model turn and every specialist attempt now reports latency and token usage from normal logs — and the review engine itself becomes a standalone library the Action and future self-hosted workers share.

If you've watched a review hang or wondered where the tokens went, this is the release to pin.

Every silent drift got found

  • Terminal provider failures fail over immediately (#​1126, closes #​1080): an HTTP 429 that says the quota is exhausted, or a 4xx naming a retired model, is now classified once at the transport and routed straight to the configured fallback — one bounded log line, no retries a later attempt can't fix. Previously a terminal 429 looped the retry budget for 13m40s before failover. Classification is deliberately narrow: exact structured codes and decisive phrases, with any transient marker in the same body vetoing the match.
  • Empty temperature stays empty; zero stays zero (#​1209, #​1246): a ?? 0.0 fallback sent "temperature": 0 on every native-loop round when the input was empty, and models that no longer accept the parameter (Sonnet/Opus 5.5) answered 400 — the loop died with no tool calls and the review fell through to corpus-only, finishing green. Omitted now means omitted. Separately, an explicit ai-temperature: "0" survived || 0.1 rewriting and now reaches the wire as 0.
  • tool-loop-wall-clock-sec is a whole-exchange deadline on every native-loop tier (#​1201, fixes #​1198; #​1239, closes #​1216): previously only the smart tier carried the absolute deadline, so a primary-tier investigation could overrun the ceiling by a full per-turn timeout — observed at ~620s against a 600s limit, with the verdict turn unclamped on top. One deadline now covers the entire exchange.
  • Forgejo gh_api handles query strings (#​1228, closes #​1225): issues?state=open failed segment matching and reported "endpoint not supported" where GitHub served the same call. The query string now splits before matching and re-attaches verbatim.
  • platform: tangled validates (#​1271, closes #​1247): the contract documented it and the resolver implemented it, but the typed config schema rejected the enum — an explicit value failed before resolution. The missing TANGLED_REPO_DID still fails closed.
  • Specialists get their own Anthropic effort assertion (#​1197): the specialist lane inherits the configured reasoning effort but had no output_config.effort capability flag of its own, so inherited effort silently never reached an Anthropic-format endpoint.
  • The documented empty baseSha sentinel works (#​1206, fixes #​1193): the acquisition workspace's own docs said "" means "base not required"; the SHA validator rejected it anyway.

Claims about the action get verified before they can block

  • Source-contradicted claims can no longer drive request_changes (#​1240, fixes #​1238): the deterministic source-claim boundary now recognizes two shapes an incident exposed — fabricated claims about the reviewing action's own declared inputs, and metadata-derived gate-absence claims — at every severity, and verifies them against revision-bound witnesses: the executing revision from build-embedded bytes, and a consumer-pinned revision from a content-addressed fetch at the exact pinned commit. A claim the source contradicts neither survives as substantiated nor forces request-changes with zero blockers.
  • Claim units span path dots and semicolons (#​1243, fixes #​1242): scanners split finding messages into assertions before testing cue families, so "The action never filters labels; metadata declares no label input" — one claim spread across a semicolon or a parenthesized path citation — is recognized whole instead of dissolving into unverifiable halves.
  • Contradiction can't hide unknown evidence (#​1276, closes #​1262): claim classification composes all kinds a message actually carries instead of first-match, so a message that is both source-contradicted and unknown-evidence gets both labels — neither can mask the other into a stricter outcome.
  • Version-like tokens stop qualifying as revisions (#​1270, closes #​1263): every standalone major.minor.patch or 7–40-hex token used to count as a revision qualifier, so an incidental "Node 20.11.1" left a claim unverified and forced request_changes. Only v-prefixed versions, suffixed stamps, and full 40-hex SHAs qualify standalone; bare tokens need an introducer (at, pin, …).

Publishing keeps its promises

  • Superseded managed reviews actually disappear (#​1172, closes #​1144): after a newer managed review is published and verified at the current head, every older managed review from the same publishing identity stops being visible — stale approvals and change-requests are dismissed, advisory bodies minimized — even when the replacement is partial, its trace incomplete, or it went out through the fallback path. Destructive cleanup (inline retirement, thread resolution) stays behind the unchanged complete-replacement gate.
  • Forgejo can delete what it couldn't hide (#​1181, closes #​1176): GitHub hid superseded reviews via GraphQL minimization; Forgejo had no equivalent, so stale managed reviews piled up. The Forgejo adapter gains author-side review deletion — narrow by design: only note-based reviews with no code comments, only under the same verified-newer-checkpoint gate, owner-proven, with a route-level 404 treated as failure rather than assumed success. (This one never made the generated changelog; the commit type wasn't conventional.)
  • publish-review-comment is deprecated (#​1224, closes #​1158): two publication paths disagreed on whether the legacy v2 flag gated comment mode. It now gates nothing — publish-mode alone decides — and setting it logs a deprecation warning pointing at publish-mode: comment.
  • The body-only fallback keeps your findings (#​1281, fixes #​1249): when commit-bound inline review submission fails (anchors raced a push), the retry fell back to a body-only review — and under non-strict policy the findings table isn't in that body, so every finding silently dropped from publication. The fallback now appends the bounded findings summary.
  • One trusted-owner proof per publish run (#​1147, closes #​1116): the outcomes contract's three new reads each re-resolved the trusted owner, so a Forgejo repo-scoped PAT drove up to three reaction-probe notification cycles per publish run. One resolution now threads through all of them.
  • Sticky upsert fails closed on truncated enumeration (#​1185, closes #​1121): if comment pagination broke after older comments arrived, the upsert could patch a stale sticky or duplicate it. An incomplete enumeration now fails before any write. As a side effect, pagination follows Link: rel="next", so PRs past 1000 issue comments stop reporting complete: false forever.

Fences and transports hold

  • Untrusted bytes can't close their own fence (#​1261, refs #​1258): the fixed ```diff wrapper around the PR diff was closable by PR-controlled context lines (a leading space is legal inside a diff fence) — hostile content could forge # Tool Harness Findings headings or swallow real sections. Every fence around untrusted bytes now picks its delimiter from the payload itself, through one canonical seam.
  • web_fetch can't reach non-public addresses (#​1259): the tool's fetch now resolves hosts through a public-only resolver before connecting and re-gates every redirect hop — a 302 to an internal address is refused, and DNS can't smuggle a private IP past the host allowlist.
  • MCP stops at redirects and size ceilings (#​1218, closes #​1217; #​1241, closes #​1233): an MCP 307 previously forwarded the session header and repository-scoped tool arguments verbatim to an unapproved origin — every 3xx is now refused before headers are read. Separately, MCP response bodies stream under a 32 MiB cap instead of buffering unbounded JSON.
  • PEM-shaped secrets join the redaction vocabulary (#​1188, closes #​1170): private_key: / client_key: block scalars — how certificates ship in YAML — matched no key-name alternative, so a PEM body persisted verbatim into the diff artifact and the corpus. The flat masker is now derived from the vocabulary so the two can't drift apart.
  • Confidence notes can't be forged by the model (#​1231, closes #​1166; #​1267, closes #​1230; #​1268): model-authored text ending in a [deterministic cap: …] look-alike was published verbatim while the real caps stayed empty — claiming a ceiling never fired. Look-alikes are now reveal-stripped on every cut the publish path can make, and the action's own cap note is split off before masking so a redaction pass can never complete a half-written forgery.
  • NUL-bearing finding paths are rejected at every copy (#​1211, closes #​1163): three mirrored safePath implementations now share one predicate; a model-authored NUL in file can no longer push a raw NUL byte into a workflow ::error annotation.

The model loop, observable and cache-friendly

  • Per-round latency and token usage in native_loop (#​1205, closes #​1199): every model turn records bounded, content-free telemetry — elapsed request time, provider-reported prompt/completion/cached tokens (null when unreported, never inferred), tool counts, remaining budgets, streamed-vs-not — on the harness artifact and in normal workflow logs. Token accounting is format-aware: Anthropic's prompt total includes cache read/write, OpenAI's prompt_tokens already does.
  • Per-attempt retry telemetry for specialists (#​1204, closes #​1200): every actual provider attempt — initial, transport-retry, overrun-retry, wire-retry — records its own timing, usage, and stop reason, so cost overruns and transport recovery on the deep-review phase are measurable instead of invisible inside aggregate elapsed time.
  • Malformed provider usage can't publish negatives (#​1234, closes #​1207; #​1237, closes #​1235): a negative token count from a broken provider body propagated into the artifact, the PR marker, and the cache-hit-ratio output. Negatives are now treated as "not reported", per field, on the loop aggregate and every specialist surface.
  • Anthropic cache breakpoints advance through history (#​1221, closes #​1220; #​1223, closes #​1222): native_loop requests previously cached only the static system/tool prefix and left the growing transcript uncached; a moving breakpoint now advances through history. Budget notes became append-only historical state instead of replacing the previous note — which had the same prefix-destroying effect for OpenAI-style automatic caching. A regression pins that each request's messages begin with the previous request byte-for-byte.
  • Cancellation can't outrun a gate launch (#​1232, closes #​1183): a gate fork registered only after await could leave the cancellation rejection observable while the child's termination wasn't yet awaited. Launches are now claimed synchronously and drained by finalize.

Toward the self-hosted controller

  • The review engine stands alone (#​1117, closes #​726, parent #​725): the v3 pipeline is extracted behind a canonical engine contract — runReviewEngine(request, dependencies) — with a standalone engine CLI entry point, so the Action adapter and future self-hosted workers call the same engine instead of a second implementation drifting away from it. Stage order, artifact names, and decision points are unchanged. (Also absent from the generated changelog — the commit type wasn't conventional.)
  • Tangled degrades honestly (#​1184, closes #​589): native-review cleanup sweeps, inline builds, and feedback reads now run only on platforms that declare a native review surface. On Tangled the action publishes its managed record and emits exactly one deterministic note — zero native operations, no misleading "cleanup skipped" spam. Tangled publication itself stays fail-closed until a trustworthy current-head source lands (#​1165).
  • Acquisition hardening (#​1219, closes #​1194): stale-workspace sweeping now proves per-mirror ownership through the worktree's gitdir pointer before deleting — sweeping mirror A can no longer remove mirror B's aged checkout. (#​1206 above fixes the same library's documented sentinel.)

Upgrading

Pin to v3.8.0, or the floating v3 tag, which now follows this build. Immutable-version and SHA pins must be bumped deliberately.

No inputs changed meaning, but several behaviors changed — all in the direction of doing what the configuration already said:

  • Terminal provider errors fail over fast: exhausted quotas and retired models now route to the configured fallback immediately. Reviews that previously burned their retry budget (observed: 13+ minutes) complete via fallback instead.
  • Empty ai-temperature omits the field, so native-loop tool reviews now work on models that reject the sampling parameter (Sonnet/Opus 5.5) — where they previously died mid-loop and finished as corpus-only reviews with zero tool calls. An explicit 0 is preserved.
  • tool-loop-wall-clock-sec now bounds the whole exchange on the primary native-loop tier, not just the smart tier. Long investigations that previously overran the ceiling now stop at it.
  • The PR timeline gets cleaner: superseded managed reviews are hidden after a verified newer checkpoint even when the replacement is partial or fallback-submitted. If you audit old approvals, note they are dismissed, not deleted.
  • publish-review-comment is deprecated and ignored — publication is decided by publish-mode alone. Workflows still setting the flag should move to publish-mode: comment.
  • Artifact redaction widened again (following 3.7.0's wave): private_key/client_key block scalars and provider-invented credential shapes are masked where they previously persisted verbatim.

Every input's current contract lives in docs/inputs.md.

Full changelog: v3.7.0...v3.8.0

Generated changelog (release-please)
Features
Bug Fixes
Chores
Documentation
Refactors
  • v3: one Python str.strip implementation on platform/py (#​1245) (e452897)

Configuration

📅 Schedule: (in timezone Europe/Rome)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Mend Renovate CLI.

This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [https://github.com/misospace/pr-reviewer-action](https://github.com/misospace/pr-reviewer-action) | action | minor | `v3.7.0` → `v3.8.0` | --- > ⚠️ **Warning** > > Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/6) for more information. --- ### Release Notes <details> <summary>misospace/pr-reviewer-action (https://github.com/misospace/pr-reviewer-action)</summary> ### [`v3.8.0`](https://github.com/misospace/pr-reviewer-action/releases/tag/v3.8.0) [Compare Source](https://github.com/misospace/pr-reviewer-action/compare/v3.7.0...v3.8.0) 3.8.0 is about **drift, found and fixed**. Almost every change in this release is a place where behavior had silently drifted from what was configured or documented: an empty `ai-temperature` was sent as `0.0` and killed the tool loop on newer Anthropic models, an explicit `0` was rewritten to `0.1`, the wall-clock deadline only applied to one tier, an exhausted provider quota burned thirteen minutes on retries before the configured fallback ever ran, and findings could vanish from a review when its inline comments raced a push. It's also an observability release — every model turn and every specialist attempt now reports latency and token usage from normal logs — and the review engine itself becomes a standalone library the Action and future self-hosted workers share. If you've watched a review hang or wondered where the tokens went, this is the release to pin. #### Every silent drift got found - **Terminal provider failures fail over immediately** ([#&#8203;1126](https://github.com/misospace/pr-reviewer-action/pull/1126), closes [#&#8203;1080](https://github.com/misospace/pr-reviewer-action/issues/1080)): an HTTP 429 that says the quota is *exhausted*, or a 4xx naming a retired model, is now classified once at the transport and routed straight to the configured fallback — one bounded log line, no retries a later attempt can't fix. Previously a terminal 429 looped the retry budget for 13m40s before failover. Classification is deliberately narrow: exact structured codes and decisive phrases, with any transient marker in the same body vetoing the match. - **Empty temperature stays empty; zero stays zero** ([#&#8203;1209](https://github.com/misospace/pr-reviewer-action/pull/1209), [#&#8203;1246](https://github.com/misospace/pr-reviewer-action/issues/1246)): a `?? 0.0` fallback sent `"temperature": 0` on every native-loop round when the input was empty, and models that no longer accept the parameter (Sonnet/Opus 5.5) answered 400 — the loop died with no tool calls and the review fell through to corpus-only, *finishing green*. Omitted now means omitted. Separately, an explicit `ai-temperature: "0"` survived `|| 0.1` rewriting and now reaches the wire as 0. - **`tool-loop-wall-clock-sec` is a whole-exchange deadline on every native-loop tier** ([#&#8203;1201](https://github.com/misospace/pr-reviewer-action/pull/1201), fixes [#&#8203;1198](https://github.com/misospace/pr-reviewer-action/issues/1198); [#&#8203;1239](https://github.com/misospace/pr-reviewer-action/pull/1239), closes [#&#8203;1216](https://github.com/misospace/pr-reviewer-action/issues/1216)): previously only the smart tier carried the absolute deadline, so a primary-tier investigation could overrun the ceiling by a full per-turn timeout — observed at \~620s against a 600s limit, with the verdict turn unclamped on top. One deadline now covers the entire exchange. - **Forgejo `gh_api` handles query strings** ([#&#8203;1228](https://github.com/misospace/pr-reviewer-action/pull/1228), closes [#&#8203;1225](https://github.com/misospace/pr-reviewer-action/issues/1225)): `issues?state=open` failed segment matching and reported "endpoint not supported" where GitHub served the same call. The query string now splits before matching and re-attaches verbatim. - **`platform: tangled` validates** ([#&#8203;1271](https://github.com/misospace/pr-reviewer-action/pull/1271), closes [#&#8203;1247](https://github.com/misospace/pr-reviewer-action/issues/1247)): the contract documented it and the resolver implemented it, but the typed config schema rejected the enum — an explicit value failed before resolution. The missing `TANGLED_REPO_DID` still fails closed. - **Specialists get their own Anthropic effort assertion** ([#&#8203;1197](https://github.com/misospace/pr-reviewer-action/pull/1197)): the specialist lane inherits the configured reasoning effort but had no `output_config.effort` capability flag of its own, so inherited effort silently never reached an Anthropic-format endpoint. - **The documented empty `baseSha` sentinel works** ([#&#8203;1206](https://github.com/misospace/pr-reviewer-action/pull/1206), fixes [#&#8203;1193](https://github.com/misospace/pr-reviewer-action/issues/1193)): the acquisition workspace's own docs said `""` means "base not required"; the SHA validator rejected it anyway. #### Claims about the action get verified before they can block - **Source-contradicted claims can no longer drive `request_changes`** ([#&#8203;1240](https://github.com/misospace/pr-reviewer-action/pull/1240), fixes [#&#8203;1238](https://github.com/misospace/pr-reviewer-action/issues/1238)): the deterministic source-claim boundary now recognizes two shapes an incident exposed — fabricated claims about the reviewing action's *own declared inputs*, and metadata-derived gate-absence claims — at every severity, and verifies them against revision-bound witnesses: the executing revision from build-embedded bytes, and a consumer-pinned revision from a content-addressed fetch at the exact pinned commit. A claim the source contradicts neither survives as substantiated nor forces request-changes with zero blockers. - **Claim units span path dots and semicolons** ([#&#8203;1243](https://github.com/misospace/pr-reviewer-action/pull/1243), fixes [#&#8203;1242](https://github.com/misospace/pr-reviewer-action/issues/1242)): scanners split finding messages into assertions before testing cue families, so "`The action never filters labels; metadata declares no label input`" — one claim spread across a semicolon or a parenthesized path citation — is recognized whole instead of dissolving into unverifiable halves. - **Contradiction can't hide unknown evidence** ([#&#8203;1276](https://github.com/misospace/pr-reviewer-action/pull/1276), closes [#&#8203;1262](https://github.com/misospace/pr-reviewer-action/issues/1262)): claim classification composes all kinds a message actually carries instead of first-match, so a message that is both source-contradicted *and* unknown-evidence gets both labels — neither can mask the other into a stricter outcome. - **Version-like tokens stop qualifying as revisions** ([#&#8203;1270](https://github.com/misospace/pr-reviewer-action/pull/1270), closes [#&#8203;1263](https://github.com/misospace/pr-reviewer-action/issues/1263)): every standalone `major.minor.patch` or 7–40-hex token used to count as a revision qualifier, so an incidental "`Node 20.11.1`" left a claim unverified and forced `request_changes`. Only `v`-prefixed versions, suffixed stamps, and full 40-hex SHAs qualify standalone; bare tokens need an introducer (`at`, `pin`, …). #### Publishing keeps its promises - **Superseded managed reviews actually disappear** ([#&#8203;1172](https://github.com/misospace/pr-reviewer-action/pull/1172), closes [#&#8203;1144](https://github.com/misospace/pr-reviewer-action/issues/1144)): after a newer managed review is published and verified at the current head, every older managed review from the same publishing identity stops being visible — stale approvals and change-requests are dismissed, advisory bodies minimized — even when the replacement is partial, its trace incomplete, or it went out through the fallback path. Destructive cleanup (inline retirement, thread resolution) stays behind the unchanged complete-replacement gate. - **Forgejo can delete what it couldn't hide** ([#&#8203;1181](https://github.com/misospace/pr-reviewer-action/pull/1181), closes [#&#8203;1176](https://github.com/misospace/pr-reviewer-action/issues/1176)): GitHub hid superseded reviews via GraphQL minimization; Forgejo had no equivalent, so stale managed reviews piled up. The Forgejo adapter gains author-side review deletion — narrow by design: only note-based reviews with no code comments, only under the same verified-newer-checkpoint gate, owner-proven, with a route-level 404 treated as failure rather than assumed success. (This one never made the generated changelog; the commit type wasn't conventional.) - **`publish-review-comment` is deprecated** ([#&#8203;1224](https://github.com/misospace/pr-reviewer-action/pull/1224), closes [#&#8203;1158](https://github.com/misospace/pr-reviewer-action/issues/1158)): two publication paths disagreed on whether the legacy v2 flag gated `comment` mode. It now gates nothing — `publish-mode` alone decides — and setting it logs a deprecation warning pointing at `publish-mode: comment`. - **The body-only fallback keeps your findings** ([#&#8203;1281](https://github.com/misospace/pr-reviewer-action/pull/1281), fixes [#&#8203;1249](https://github.com/misospace/pr-reviewer-action/issues/1249)): when commit-bound inline review submission fails (anchors raced a push), the retry fell back to a body-only review — and under non-strict policy the findings table isn't in that body, so every finding silently dropped from publication. The fallback now appends the bounded findings summary. - **One trusted-owner proof per publish run** ([#&#8203;1147](https://github.com/misospace/pr-reviewer-action/pull/1147), closes [#&#8203;1116](https://github.com/misospace/pr-reviewer-action/issues/1116)): the outcomes contract's three new reads each re-resolved the trusted owner, so a Forgejo repo-scoped PAT drove up to three reaction-probe notification cycles per publish run. One resolution now threads through all of them. - **Sticky upsert fails closed on truncated enumeration** ([#&#8203;1185](https://github.com/misospace/pr-reviewer-action/pull/1185), closes [#&#8203;1121](https://github.com/misospace/pr-reviewer-action/issues/1121)): if comment pagination broke after older comments arrived, the upsert could patch a stale sticky or duplicate it. An incomplete enumeration now fails before any write. As a side effect, pagination follows `Link: rel="next"`, so PRs past 1000 issue comments stop reporting `complete: false` forever. #### Fences and transports hold - **Untrusted bytes can't close their own fence** ([#&#8203;1261](https://github.com/misospace/pr-reviewer-action/pull/1261), refs [#&#8203;1258](https://github.com/misospace/pr-reviewer-action/issues/1258)): the fixed ` ```diff ` wrapper around the PR diff was closable by PR-controlled context lines (a leading space is legal inside a diff fence) — hostile content could forge `# Tool Harness Findings` headings or swallow real sections. Every fence around untrusted bytes now picks its delimiter from the payload itself, through one canonical seam. - **`web_fetch` can't reach non-public addresses** ([#&#8203;1259](https://github.com/misospace/pr-reviewer-action/issues/1259)): the tool's fetch now resolves hosts through a public-only resolver before connecting and re-gates every redirect hop — a 302 to an internal address is refused, and DNS can't smuggle a private IP past the host allowlist. - **MCP stops at redirects and size ceilings** ([#&#8203;1218](https://github.com/misospace/pr-reviewer-action/pull/1218), closes [#&#8203;1217](https://github.com/misospace/pr-reviewer-action/issues/1217); [#&#8203;1241](https://github.com/misospace/pr-reviewer-action/pull/1241), closes [#&#8203;1233](https://github.com/misospace/pr-reviewer-action/issues/1233)): an MCP 307 previously forwarded the session header and repository-scoped tool arguments verbatim to an unapproved origin — every 3xx is now refused before headers are read. Separately, MCP response bodies stream under a 32 MiB cap instead of buffering unbounded JSON. - **PEM-shaped secrets join the redaction vocabulary** ([#&#8203;1188](https://github.com/misospace/pr-reviewer-action/pull/1188), closes [#&#8203;1170](https://github.com/misospace/pr-reviewer-action/issues/1170)): `private_key:` / `client_key:` block scalars — how certificates ship in YAML — matched no key-name alternative, so a PEM body persisted verbatim into the diff artifact and the corpus. The flat masker is now *derived from* the vocabulary so the two can't drift apart. - **Confidence notes can't be forged by the model** ([#&#8203;1231](https://github.com/misospace/pr-reviewer-action/pull/1231), closes [#&#8203;1166](https://github.com/misospace/pr-reviewer-action/issues/1166); [#&#8203;1267](https://github.com/misospace/pr-reviewer-action/pull/1267), closes [#&#8203;1230](https://github.com/misospace/pr-reviewer-action/issues/1230); [#&#8203;1268](https://github.com/misospace/pr-reviewer-action/issues/1268)): model-authored text ending in a `[deterministic cap: …]` look-alike was published verbatim while the real caps stayed empty — claiming a ceiling never fired. Look-alikes are now reveal-stripped on every cut the publish path can make, and the action's own cap note is split off before masking so a redaction pass can never complete a half-written forgery. - **NUL-bearing finding paths are rejected at every copy** ([#&#8203;1211](https://github.com/misospace/pr-reviewer-action/pull/1211), closes [#&#8203;1163](https://github.com/misospace/pr-reviewer-action/issues/1163)): three mirrored `safePath` implementations now share one predicate; a model-authored NUL in `file` can no longer push a raw NUL byte into a workflow `::error` annotation. #### The model loop, observable and cache-friendly - **Per-round latency and token usage in native_loop** ([#&#8203;1205](https://github.com/misospace/pr-reviewer-action/pull/1205), closes [#&#8203;1199](https://github.com/misospace/pr-reviewer-action/issues/1199)): every model turn records bounded, content-free telemetry — elapsed request time, provider-reported prompt/completion/cached tokens (null when unreported, never inferred), tool counts, remaining budgets, streamed-vs-not — on the harness artifact and in normal workflow logs. Token accounting is format-aware: Anthropic's prompt total includes cache read/write, OpenAI's `prompt_tokens` already does. - **Per-attempt retry telemetry for specialists** ([#&#8203;1204](https://github.com/misospace/pr-reviewer-action/pull/1204), closes [#&#8203;1200](https://github.com/misospace/pr-reviewer-action/issues/1200)): every actual provider attempt — initial, transport-retry, overrun-retry, wire-retry — records its own timing, usage, and stop reason, so cost overruns and transport recovery on the deep-review phase are measurable instead of invisible inside aggregate elapsed time. - **Malformed provider usage can't publish negatives** ([#&#8203;1234](https://github.com/misospace/pr-reviewer-action/pull/1234), closes [#&#8203;1207](https://github.com/misospace/pr-reviewer-action/issues/1207); [#&#8203;1237](https://github.com/misospace/pr-reviewer-action/pull/1237), closes [#&#8203;1235](https://github.com/misospace/pr-reviewer-action/issues/1235)): a negative token count from a broken provider body propagated into the artifact, the PR marker, and the cache-hit-ratio output. Negatives are now treated as "not reported", per field, on the loop aggregate and every specialist surface. - **Anthropic cache breakpoints advance through history** ([#&#8203;1221](https://github.com/misospace/pr-reviewer-action/pull/1221), closes [#&#8203;1220](https://github.com/misospace/pr-reviewer-action/issues/1220); [#&#8203;1223](https://github.com/misospace/pr-reviewer-action/pull/1223), closes [#&#8203;1222](https://github.com/misospace/pr-reviewer-action/issues/1222)): native_loop requests previously cached only the static system/tool prefix and left the growing transcript uncached; a moving breakpoint now advances through history. Budget notes became append-only historical state instead of replacing the previous note — which had the same prefix-destroying effect for OpenAI-style automatic caching. A regression pins that each request's messages begin with the previous request byte-for-byte. - **Cancellation can't outrun a gate launch** ([#&#8203;1232](https://github.com/misospace/pr-reviewer-action/pull/1232), closes [#&#8203;1183](https://github.com/misospace/pr-reviewer-action/issues/1183)): a gate fork registered only after `await` could leave the cancellation rejection observable while the child's termination wasn't yet awaited. Launches are now claimed synchronously and drained by finalize. #### Toward the self-hosted controller - **The review engine stands alone** ([#&#8203;1117](https://github.com/misospace/pr-reviewer-action/pull/1117), closes [#&#8203;726](https://github.com/misospace/pr-reviewer-action/issues/726), parent [#&#8203;725](https://github.com/misospace/pr-reviewer-action/issues/725)): the v3 pipeline is extracted behind a canonical engine contract — `runReviewEngine(request, dependencies)` — with a standalone engine CLI entry point, so the Action adapter and future self-hosted workers call the *same* engine instead of a second implementation drifting away from it. Stage order, artifact names, and decision points are unchanged. (Also absent from the generated changelog — the commit type wasn't conventional.) - **Tangled degrades honestly** ([#&#8203;1184](https://github.com/misospace/pr-reviewer-action/pull/1184), closes [#&#8203;589](https://github.com/misospace/pr-reviewer-action/issues/589)): native-review cleanup sweeps, inline builds, and feedback reads now run only on platforms that declare a native review surface. On Tangled the action publishes its managed record and emits exactly one deterministic note — zero native operations, no misleading "cleanup skipped" spam. Tangled publication itself stays fail-closed until a trustworthy current-head source lands ([#&#8203;1165](https://github.com/misospace/pr-reviewer-action/issues/1165)). - **Acquisition hardening** ([#&#8203;1219](https://github.com/misospace/pr-reviewer-action/pull/1219), closes [#&#8203;1194](https://github.com/misospace/pr-reviewer-action/issues/1194)): stale-workspace sweeping now proves per-mirror ownership through the worktree's gitdir pointer before deleting — sweeping mirror A can no longer remove mirror B's aged checkout. ([#&#8203;1206](https://github.com/misospace/pr-reviewer-action/pull/1206) above fixes the same library's documented sentinel.) #### Upgrading Pin to `v3.8.0`, or the floating `v3` tag, which now follows this build. Immutable-version and SHA pins must be bumped deliberately. No inputs changed meaning, but several behaviors changed — all in the direction of doing what the configuration already said: - **Terminal provider errors fail over fast**: exhausted quotas and retired models now route to the configured fallback immediately. Reviews that previously burned their retry budget (observed: 13+ minutes) complete via fallback instead. - **Empty `ai-temperature` omits the field**, so native-loop tool reviews now work on models that reject the sampling parameter (Sonnet/Opus 5.5) — where they previously died mid-loop and finished as corpus-only reviews with zero tool calls. An explicit `0` is preserved. - **`tool-loop-wall-clock-sec` now bounds the whole exchange** on the primary native-loop tier, not just the smart tier. Long investigations that previously overran the ceiling now stop at it. - **The PR timeline gets cleaner**: superseded managed reviews are hidden after a verified newer checkpoint even when the replacement is partial or fallback-submitted. If you audit old approvals, note they are dismissed, not deleted. - **`publish-review-comment` is deprecated and ignored** — publication is decided by `publish-mode` alone. Workflows still setting the flag should move to `publish-mode: comment`. - **Artifact redaction widened again** (following 3.7.0's wave): `private_key`/`client_key` block scalars and provider-invented credential shapes are masked where they previously persisted verbatim. Every input's current contract lives in [docs/inputs.md](https://github.com/misospace/pr-reviewer-action/blob/v3.8.0/docs/inputs.md). **Full changelog:** [v3.7.0...v3.8.0](https://github.com/misospace/pr-reviewer-action/compare/v3.7.0...v3.8.0) <details><summary>Generated changelog (release-please)</summary> ##### Features - **[#&#8203;1199](https://github.com/misospace/pr-reviewer-action/issues/1199):** log per-round model latency and provider token usage in native_loop ([#&#8203;1205](https://github.com/misospace/pr-reviewer-action/issues/1205)) ([4027e09](https://github.com/misospace/pr-reviewer-action/commit/4027e09064ea00fd781f4c2c5a9bc49556a672c9)) - **[#&#8203;1200](https://github.com/misospace/pr-reviewer-action/issues/1200):** expose per-attempt retry timing and usage in specialist telemetry ([#&#8203;1204](https://github.com/misospace/pr-reviewer-action/issues/1204)) ([c686241](https://github.com/misospace/pr-reviewer-action/commit/c686241dd86c373e8b97af64d82786f9d2487726)) - **[#&#8203;589](https://github.com/misospace/pr-reviewer-action/issues/589):** gate native-review cleanup and inline builds on the platform review surface ([#&#8203;1184](https://github.com/misospace/pr-reviewer-action/issues/1184)) ([b9fdd3a](https://github.com/misospace/pr-reviewer-action/commit/b9fdd3a13cbb0d35f86485a3ff8a8526909212cf)) ##### Bug Fixes - **[#&#8203;1080](https://github.com/misospace/pr-reviewer-action/issues/1080):** fast-fail exhausted quotas and retired models to configured fallback ([#&#8203;1126](https://github.com/misospace/pr-reviewer-action/issues/1126)) ([ecbfbb8](https://github.com/misospace/pr-reviewer-action/commit/ecbfbb81b6aac82c81590d4b445d5dc6bf14458c)) - **[#&#8203;1116](https://github.com/misospace/pr-reviewer-action/issues/1116):** share one trusted-owner proof across the publish run ([#&#8203;1147](https://github.com/misospace/pr-reviewer-action/issues/1147)) ([0fdc281](https://github.com/misospace/pr-reviewer-action/commit/0fdc281298415963a353d1c457ac9aa1679a1aa2)) - **[#&#8203;1121](https://github.com/misospace/pr-reviewer-action/issues/1121):** fail the sticky upsert's patch-target selection closed on a truncated issue-comment enumeration ([#&#8203;1185](https://github.com/misospace/pr-reviewer-action/issues/1185)) ([31d0d8b](https://github.com/misospace/pr-reviewer-action/commit/31d0d8b1702c7e2277e0cdf77f7e85b86369b65c)) - **[#&#8203;1127](https://github.com/misospace/pr-reviewer-action/issues/1127):** bound the feedback outcome count at MAX_FEEDBACK_COUNT, rejecting over-ceiling events fail-closed ([#&#8203;1192](https://github.com/misospace/pr-reviewer-action/issues/1192)) ([f582f8a](https://github.com/misospace/pr-reviewer-action/commit/f582f8a580c6e782871a3811aea87884b9f00b57)) - **[#&#8203;1128](https://github.com/misospace/pr-reviewer-action/issues/1128):** withhold the outcomes artifact when the envelope head is unproven ([#&#8203;1156](https://github.com/misospace/pr-reviewer-action/issues/1156)) ([106c81f](https://github.com/misospace/pr-reviewer-action/commit/106c81f7f4f9cf2438ebf7489185c2c3a07ed483)) - **[#&#8203;1137](https://github.com/misospace/pr-reviewer-action/issues/1137):** reserve Unicode-space-terminated suggestion info strings (fail closed on the unverified tail) ([#&#8203;1179](https://github.com/misospace/pr-reviewer-action/issues/1179)) ([82c3348](https://github.com/misospace/pr-reviewer-action/commit/82c33484e8cc8b5f9dbd32bae73dd532d099f1c8)) - **[#&#8203;1144](https://github.com/misospace/pr-reviewer-action/issues/1144):** keep only the latest managed bot review visible on every published replacement ([#&#8203;1172](https://github.com/misospace/pr-reviewer-action/issues/1172)) ([7f128a8](https://github.com/misospace/pr-reviewer-action/commit/7f128a8fb24c1115b43e0dfef48b1448250fe6f8)) - **[#&#8203;1151](https://github.com/misospace/pr-reviewer-action/issues/1151):** reject control characters in an outcome event's `at` timestamp ([#&#8203;1186](https://github.com/misospace/pr-reviewer-action/issues/1186)) ([4c162fd](https://github.com/misospace/pr-reviewer-action/commit/4c162fd40b0a9e59cb2ac80a92b7c23b6fbff747)) - **[#&#8203;1152](https://github.com/misospace/pr-reviewer-action/issues/1152):** fingerprint lane credentials as one-way digests so rotation invalidates a cached review ([#&#8203;1173](https://github.com/misospace/pr-reviewer-action/issues/1173)) ([c25a846](https://github.com/misospace/pr-reviewer-action/commit/c25a846ffb5785aba2e24e02e982ed75cc66e275)) - **[#&#8203;1155](https://github.com/misospace/pr-reviewer-action/issues/1155):** fail confidence scorer to unscored on unresolved proof-context pins ([#&#8203;1187](https://github.com/misospace/pr-reviewer-action/issues/1187)) ([bdaa027](https://github.com/misospace/pr-reviewer-action/commit/bdaa027ee57c18507b1828b0ba3688b88b08db18)) - **[#&#8203;1158](https://github.com/misospace/pr-reviewer-action/issues/1158):** publish-mode comment publishes the sticky comment with no legacy flag ([#&#8203;1224](https://github.com/misospace/pr-reviewer-action/issues/1224)) ([87423f4](https://github.com/misospace/pr-reviewer-action/commit/87423f402b50fb0c8ebea5b8caecf35bf5184f84)) - **[#&#8203;1163](https://github.com/misospace/pr-reviewer-action/issues/1163):** reject NUL-bearing finding paths in every safePath copy via one shared predicate ([#&#8203;1211](https://github.com/misospace/pr-reviewer-action/issues/1211)) ([2cf9621](https://github.com/misospace/pr-reviewer-action/commit/2cf9621775dc0dbe86b0ff2a7ab4ca3eb872bb58)) - **[#&#8203;1166](https://github.com/misospace/pr-reviewer-action/issues/1166):** strip model-authored deterministic-cap look-alike from confidence reason ([#&#8203;1231](https://github.com/misospace/pr-reviewer-action/issues/1231)) ([dc4e1b6](https://github.com/misospace/pr-reviewer-action/commit/dc4e1b60fcd772c0a72cece7e81c5e3c0f022900)) - **[#&#8203;1170](https://github.com/misospace/pr-reviewer-action/issues/1170):** widen the secret key-name vocabulary and derive the flat masker from it ([#&#8203;1188](https://github.com/misospace/pr-reviewer-action/issues/1188)) ([4d9e8bb](https://github.com/misospace/pr-reviewer-action/commit/4d9e8bb93849695dfd33765d5f351a11ba9ed878)) - **[#&#8203;1178](https://github.com/misospace/pr-reviewer-action/issues/1178):** reserve the multi-line suggestion opener spellings (fail closed on the range grammar) ([#&#8203;1180](https://github.com/misospace/pr-reviewer-action/issues/1180)) ([135737b](https://github.com/misospace/pr-reviewer-action/commit/135737b02a46b1a6d69b62322823910c0de3366f)) - **[#&#8203;1183](https://github.com/misospace/pr-reviewer-action/issues/1183):** claim gate fork launches before awaiting them ([#&#8203;1232](https://github.com/misospace/pr-reviewer-action/issues/1232)) ([7b8c0e7](https://github.com/misospace/pr-reviewer-action/commit/7b8c0e7e32ee3c7e54fc8b8df6264068a35daed1)) - **[#&#8203;1193](https://github.com/misospace/pr-reviewer-action/issues/1193):** honor the documented empty baseSha sentinel in createReviewWorkspace ([#&#8203;1206](https://github.com/misospace/pr-reviewer-action/issues/1206)) ([9bc172c](https://github.com/misospace/pr-reviewer-action/commit/9bc172c5d20cc4a5d3d87f5a1fabf1229d6f252a)) - **[#&#8203;1194](https://github.com/misospace/pr-reviewer-action/issues/1194):** isolate stale-workspace sweeping by mirror ownership ([#&#8203;1219](https://github.com/misospace/pr-reviewer-action/issues/1219)) ([799d93c](https://github.com/misospace/pr-reviewer-action/commit/799d93c6970e6228fb52e664f915617fe6b287db)) - **[#&#8203;1198](https://github.com/misospace/pr-reviewer-action/issues/1198):** enforce tool-loop-wall-clock-sec as a whole-exchange deadline on both native-loop tiers ([#&#8203;1201](https://github.com/misospace/pr-reviewer-action/issues/1201)) ([1c6975f](https://github.com/misospace/pr-reviewer-action/commit/1c6975f383ec2ca8c75f2ffd93fbda219597ac0e)) - **[#&#8203;1207](https://github.com/misospace/pr-reviewer-action/issues/1207):** clamp negative provider-reported token counts in the loop usage aggregate ([#&#8203;1234](https://github.com/misospace/pr-reviewer-action/issues/1234)) ([2f2165b](https://github.com/misospace/pr-reviewer-action/commit/2f2165bbb746d332785a0c42d9e350f2a4f78bfc)) - **[#&#8203;1210](https://github.com/misospace/pr-reviewer-action/issues/1210):** route native-loop gh_api and repo_contents through the configured forge capability ([#&#8203;1215](https://github.com/misospace/pr-reviewer-action/issues/1215)) ([c89e88e](https://github.com/misospace/pr-reviewer-action/commit/c89e88e01e60098105f98f46f21f3b25e88b38ac)) - **[#&#8203;1216](https://github.com/misospace/pr-reviewer-action/issues/1216):** remove dead deadline-null branches left by the [#&#8203;1198](https://github.com/misospace/pr-reviewer-action/issues/1198) tier-neutral deadline (CodeQL) ([#&#8203;1239](https://github.com/misospace/pr-reviewer-action/issues/1239)) ([6fe7ea5](https://github.com/misospace/pr-reviewer-action/commit/6fe7ea5dd250f1c46725a5681d1ee15a684bb643)) - **[#&#8203;1217](https://github.com/misospace/pr-reviewer-action/issues/1217):** refuse MCP redirects outside the configured server endpoint ([#&#8203;1218](https://github.com/misospace/pr-reviewer-action/issues/1218)) ([c1c3b58](https://github.com/misospace/pr-reviewer-action/commit/c1c3b58f1ede3b8f7f1df77531a7d9dfd913d7d7)) - **[#&#8203;1220](https://github.com/misospace/pr-reviewer-action/issues/1220):** advance Anthropic prompt cache through native-loop history ([#&#8203;1221](https://github.com/misospace/pr-reviewer-action/issues/1221)) ([0c1f6a7](https://github.com/misospace/pr-reviewer-action/commit/0c1f6a7aeb27dd217f793282ff28098ea7cd7293)) - **[#&#8203;1222](https://github.com/misospace/pr-reviewer-action/issues/1222):** preserve native-loop conversation prefixes across rounds ([#&#8203;1223](https://github.com/misospace/pr-reviewer-action/issues/1223)) ([bc27284](https://github.com/misospace/pr-reviewer-action/commit/bc2728460af0623f0521a5e2ddb65e7d0c69f211)) - **[#&#8203;1225](https://github.com/misospace/pr-reviewer-action/issues/1225):** split the query string before Forgejo segment matching ([#&#8203;1228](https://github.com/misospace/pr-reviewer-action/issues/1228)) ([665854e](https://github.com/misospace/pr-reviewer-action/commit/665854e7e9c8942f12687c43345a7b170451acbd)) - **[#&#8203;1230](https://github.com/misospace/pr-reviewer-action/issues/1230):** strip cap-note look-alikes the publish-side confidence cut reveals ([#&#8203;1267](https://github.com/misospace/pr-reviewer-action/issues/1267)) ([e0d5119](https://github.com/misospace/pr-reviewer-action/commit/e0d5119ce98e02689801f6ed84debea93471e0a7)) - **[#&#8203;1233](https://github.com/misospace/pr-reviewer-action/issues/1233):** stream-cap MCP response bodies before buffering or parsing ([#&#8203;1241](https://github.com/misospace/pr-reviewer-action/issues/1241)) ([57d3aff](https://github.com/misospace/pr-reviewer-action/commit/57d3aff58f80bfa6b7c3410c2f047390dcc371be)) - **[#&#8203;1235](https://github.com/misospace/pr-reviewer-action/issues/1235):** clamp negative provider-reported usage in the specialist/gate accounting ([#&#8203;1237](https://github.com/misospace/pr-reviewer-action/issues/1237)) ([c33bd08](https://github.com/misospace/pr-reviewer-action/commit/c33bd08f06c5686ddb2dcad04325db5d2d1f155a)) - **[#&#8203;1238](https://github.com/misospace/pr-reviewer-action/issues/1238):** refute source-contradicted input claims before they drive request_changes ([#&#8203;1240](https://github.com/misospace/pr-reviewer-action/issues/1240)) ([b882a28](https://github.com/misospace/pr-reviewer-action/commit/b882a28c86367204ae7b4b9569b90e5ffef74059)) - **[#&#8203;1242](https://github.com/misospace/pr-reviewer-action/issues/1242):** rebase claim-unit path and semicolon handling onto current main ([#&#8203;1243](https://github.com/misospace/pr-reviewer-action/issues/1243)) ([a73a135](https://github.com/misospace/pr-reviewer-action/commit/a73a135777297cad0ea502d8307dde932571a3f5)) - **[#&#8203;1246](https://github.com/misospace/pr-reviewer-action/issues/1246):** preserve explicit ai-temperature zero ([f5c7151](https://github.com/misospace/pr-reviewer-action/commit/f5c715119b95190fee4abb27e1dc25fb06195983)) - **[#&#8203;1247](https://github.com/misospace/pr-reviewer-action/issues/1247):** accept explicit platform=tangled in typed config ([#&#8203;1271](https://github.com/misospace/pr-reviewer-action/issues/1271)) ([9cfc3d4](https://github.com/misospace/pr-reviewer-action/commit/9cfc3d41ef4c21a6a22a57e0d1aca86ac7c60ecb)) - **[#&#8203;1248](https://github.com/misospace/pr-reviewer-action/issues/1248):** preserve enforcement verdict-source after relax-then-force ([#&#8203;1266](https://github.com/misospace/pr-reviewer-action/issues/1266)) ([a31fe13](https://github.com/misospace/pr-reviewer-action/commit/a31fe13e90dc2d1243323127b60e3501ccf45731)) - **[#&#8203;1249](https://github.com/misospace/pr-reviewer-action/issues/1249):** keep findings in the body-only native review fallback ([#&#8203;1281](https://github.com/misospace/pr-reviewer-action/issues/1281)) ([4128abd](https://github.com/misospace/pr-reviewer-action/commit/4128abd28dcdb5686db74cacc50d1e9cfba986a2)) - **[#&#8203;1258](https://github.com/misospace/pr-reviewer-action/issues/1258):** adaptively fence untrusted diff/manifest/evidence bytes ([#&#8203;1261](https://github.com/misospace/pr-reviewer-action/issues/1261)) ([3b2a224](https://github.com/misospace/pr-reviewer-action/commit/3b2a22493d25407e179bb7dff171f7fd77d25c6a)) - **[#&#8203;1259](https://github.com/misospace/pr-reviewer-action/issues/1259):** secure web_fetch DNS and transport ([126b251](https://github.com/misospace/pr-reviewer-action/commit/126b25103ae03ba4743e0e3950c87cbef1f145bb)) - **[#&#8203;1262](https://github.com/misospace/pr-reviewer-action/issues/1262):** rebase independent claim-kind decisions onto current main ([#&#8203;1276](https://github.com/misospace/pr-reviewer-action/issues/1276)) ([ff43184](https://github.com/misospace/pr-reviewer-action/commit/ff431847d2d5351df6d4d46248d9363e189d6b8a)) - **[#&#8203;1263](https://github.com/misospace/pr-reviewer-action/issues/1263):** narrow the revision-qualifier scan so incidental version-like tokens cannot block a refutation ([#&#8203;1270](https://github.com/misospace/pr-reviewer-action/issues/1270)) ([9c8ff4a](https://github.com/misospace/pr-reviewer-action/commit/9c8ff4a32649bff9d320988ffd6b3eb5b10b6d75)) - **[#&#8203;1268](https://github.com/misospace/pr-reviewer-action/issues/1268):** prevent forged confidence cap notes ([0fb75e9](https://github.com/misospace/pr-reviewer-action/commit/0fb75e90f623159c655a47014689daf4a5971df5)) - **[#&#8203;1272](https://github.com/misospace/pr-reviewer-action/issues/1272):** start the bootstrap-runtime stubs under a shell-less PATH ([#&#8203;1275](https://github.com/misospace/pr-reviewer-action/issues/1275)) ([fac1343](https://github.com/misospace/pr-reviewer-action/commit/fac13431630df00afc3103e4f4591c4ea352cf6f)) - **[#&#8203;1274](https://github.com/misospace/pr-reviewer-action/issues/1274):** resolve the bootstrap's own directory without external dirname ([#&#8203;1277](https://github.com/misospace/pr-reviewer-action/issues/1277)) ([cde6ef9](https://github.com/misospace/pr-reviewer-action/commit/cde6ef9b855ce06751f74e718213b216f42db3b6)) - **deps:** update dependency astro (7.4.1 → 7.4.2) ([#&#8203;1190](https://github.com/misospace/pr-reviewer-action/issues/1190)) ([29386e3](https://github.com/misospace/pr-reviewer-action/commit/29386e36fc0e4b88b0e81d54dfb56f38eb12fdfe)) - **deps:** update node.js (24.22.0 → v24.22.1) ([#&#8203;1189](https://github.com/misospace/pr-reviewer-action/issues/1189)) ([0808afd](https://github.com/misospace/pr-reviewer-action/commit/0808afd775ed84b6229c3f71804582d7c5bb0b39)) - **review:** enable specialist Anthropic effort support ([#&#8203;1197](https://github.com/misospace/pr-reviewer-action/issues/1197)) ([e647d9b](https://github.com/misospace/pr-reviewer-action/commit/e647d9bfbe06a5ccd877bf6ab91e01cf3bbcba5c)) - **test:** allow dogfood specialist effort assertion ([#&#8203;1212](https://github.com/misospace/pr-reviewer-action/issues/1212)) ([2a7c1d3](https://github.com/misospace/pr-reviewer-action/commit/2a7c1d30a43c74fbee313a024284d551a68962ba)) - **tool-loop:** keep an omitted temperature omitted on native_loop turns ([#&#8203;1209](https://github.com/misospace/pr-reviewer-action/issues/1209)) ([46b6b7b](https://github.com/misospace/pr-reviewer-action/commit/46b6b7b4b8f161316bfa1ba6f55dc6c2223f62e6)) ##### Chores - **[#&#8203;1203](https://github.com/misospace/pr-reviewer-action/issues/1203):** scope real-PR corpus candidate_count to pre-audit candidates ([#&#8203;1236](https://github.com/misospace/pr-reviewer-action/issues/1236)) ([2139ce4](https://github.com/misospace/pr-reviewer-action/commit/2139ce408bb2989a888cc39769180bbd97ff1cf5)) ##### Documentation - **[#&#8203;1124](https://github.com/misospace/pr-reviewer-action/issues/1124):** document harness-unreadable and coverage:unknown in the telemetry field table ([#&#8203;1208](https://github.com/misospace/pr-reviewer-action/issues/1208)) ([deac6f1](https://github.com/misospace/pr-reviewer-action/commit/deac6f1097e48b2c88f1270de5e6afb3514bed2b)) - **eval:** document semantic-fixture directory placement ([#&#8203;1167](https://github.com/misospace/pr-reviewer-action/issues/1167)) ([#&#8203;1227](https://github.com/misospace/pr-reviewer-action/issues/1227)) ([76ac941](https://github.com/misospace/pr-reviewer-action/commit/76ac941c88ff69c7020fd39a8acdc40e72a26ca7)) ##### Refactors - **v3:** one Python str.strip implementation on platform/py ([#&#8203;1245](https://github.com/misospace/pr-reviewer-action/issues/1245)) ([e452897](https://github.com/misospace/pr-reviewer-action/commit/e4528975262f053ffec8f81bb794e75333fe4237)) </details> </details> --- ### Configuration 📅 **Schedule**: (in timezone Europe/Rome) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xODEuNyIsInVwZGF0ZWRJblZlciI6IjQ0LjE4MS43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9naXRodWItYWN0aW9uIiwicmVub3ZhdGUvZ2l0aHViLXJlbGVhc2UiLCJ0eXBlL21pbm9yIl19-->
ci(github-action): update action https://github.com/misospace/pr-reviewer-action (v3.7.0 ➔ v3.8.0)
All checks were successful
Labeler / Labeler (pull_request) Successful in 4s
Konflate 0 resources changed
Lint / yamllint (pull_request) Successful in 15s
Lint / actionlint (pull_request) Successful in 17s
AI PR Review / AI PR Review (pull_request) Successful in 3m10s
50bdb08c91
Collaborator

No rendered changes.

konflate 0.6.6 · rendered 50bdb08 · full diff →

<!-- konflate:pr-2499 --> No rendered changes. <sub>konflate 0.6.6 · rendered `50bdb08` · [full diff →](https://konflate.aresu.eu/#/pr/2499)</sub>

AI Automated Review

Analysis engine: (model unavailable) · pr-reviewer-action v3.8.0

AI review could not run

The configured model endpoint(s) did not return a usable review for this run (reason: Fallback model failed).

This is an automated notice, not a substantive review. Re-run the workflow once the endpoint is reachable; see the action logs for the underlying error.

<!-- ai-pr-reviewer --> <!-- ai-pr-reviewer:{"version":1,"head_sha":"50bdb08c914544f8e5dcfa9918d16164bb3ceeb4","base_sha":"52537f6ecb7ff412127315fab0a6a6baa623cfb5","review_result":"issues","review_route":"primary","ci_state":"pending","tool_budget":24,"tool_budget_source":"tier-default","tool_calls":0,"tool_rounds":0,"max_rounds":24,"context_budget":65536,"context_peak":8600,"action_version":"v3.8.0","degraded_gate_bypass":true,"tool_stop_reason":"request-error"} --> <!-- ai-pr-review-sha:50bdb08c914544f8e5dcfa9918d16164bb3ceeb4 --> <!-- ai-pr-review-fingerprint:545344a70b2a6ce31b18071e9c10526a0d4afed886c211a7c2922ba7b2cc5cd7|cfg:77ed7d921f71bfc63f82332774e1a957309ac48ed65240779314c8b3e147794f --> # AI Automated Review _Analysis engine: (model unavailable) · pr-reviewer-action v3.8.0_ ## AI review could not run The configured model endpoint(s) did not return a usable review for this run (reason: Fallback model failed). This is an automated notice, not a substantive review. Re-run the workflow once the endpoint is reachable; see the action logs for the underlying error.
Sign in to join this conversation.
No description provided.