Harden Grok review output handling - #40

Merged
logancsack merged 2 commits into
mainfrom
fix/grok-review-output-resilience
Jul 31, 2026
Merged

Harden Grok review output handling#40
logancsack merged 2 commits into
mainfrom
fix/grok-review-output-resilience

Conversation

@logancsack

@logancsacklogancsack commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Summary

  • decode model responses through a tolerant wire schema, then normalize them into the strict canonical review contract
  • clamp presentation bounds, normalize nullable optional fields, and retain valid findings instead of failing an entire swarm result
  • retry a failed medium verifier once with high reasoning while keeping medium as the default
  • mark reports partial and disclose when malformed or over-limit findings are omitted
  • include bounded specialist failure diagnostics in partial reports

Root cause

The first production review reached the verifier, but Grok output violated the strict presentation schema. That turned a useful run into HTTP 500 even though the durable queue and retry path were healthy.

Verification

  • pnpm exec vp test run apps/server/src/review/GrokReviewSwarm.test.ts apps/server/src/review/GrokReviewAgent.test.ts — 25 passed
  • T3_GROK_REVIEW_SWARM_PROBE=1 pnpm exec vp test run apps/server/src/review/GrokReviewSwarmProbe.test.ts — real Grok 4.5 swarm passed
  • pnpm exec vp run --filter t3 typecheck — passed (existing Effect suggestions only)
  • targeted vp lint on the three changed files — passed
  • pnpm build — passed
  • git diff --check — passed

No frontend behavior changed.

@coderabbitai

coderabbitaiBot commented Jul 31, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Grok review candidates and verification responses now use permissive wire schemas and normalization. Verification retries at high effort after medium-effort failure, reports failure details, and tracks actual high-effort usage.

Changes

Grok review resilience

Layer / File(s)Summary
Wire schemas and normalization
apps/server/src/review/GrokReviewModel.ts
Adds permissive candidate and verification schemas. Normalization trims and bounds text, sanitizes findings and line ranges, clamps confidence, limits lists, and applies defaults.
Verification fallback and accounting
apps/server/src/review/GrokReviewSwarm.ts
Normalizes agent output, retries failed medium verification at high effort, escalates qualifying findings, reports reviewer errors, and counts actual high-effort attempts.
Normalization and fallback tests
apps/server/src/review/GrokReviewSwarm.test.ts
Tests repaired verification output and high-effort recovery after medium-effort failure.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
participant ReviewSwarm
participant Verification
participant GrokAgent
ReviewSwarm->>Verification: Run medium-effort verification
Verification->>GrokAgent: Request structured response
GrokAgent-->>Verification: Result or GrokReviewError
Verification-->>ReviewSwarm: Normalized verification
ReviewSwarm->>Verification: Retry at high effort after failure
Verification->>GrokAgent: Request high-effort response
GrokAgent-->>Verification: High-effort result
Verification-->>ReviewSwarm: Normalized fallback result
Loading

Possibly related PRs

Poem

A rabbit checks each Grok reply,
Trims the tails and bounds the sky.
If medium effort loses track,
High effort hops and brings it back.
Clean reports now fill the burrow bright.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title clearly states that the PR hardens Grok review output handling, which matches the primary changes.
Description check✅ PassedThe description explains the changes, root cause, verification, and scope; it uses equivalent headings and omits the checklist.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/grok-review-output-resilience

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.

@logancsack
logancsack marked this pull request as ready for review July 31, 2026 17:01
@cursor

cursorBot commented Jul 31, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L labels Jul 31, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:7e10c7f86a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +189 to +193
.flatMap((finding) => {
const normalized = normalizeCandidateFinding(finding);
return normalized ? [normalized] : [];
})
.slice(0, MAX_REVIEW_FINDINGS);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Mark reviews partial when normalization drops findings

When a verifier returns a finding with a blank required text field, this filter silently removes it; the same helper also truncates outputs beyond 20 findings. Because the downstream partial calculation does not track either case, a response whose only finding is malformed can be reported as pass, and the later “Only the first 20...” limitation is unreachable. Preserve whether normalization discarded findings and use it to mark the report partial and disclose the omission.

Useful? React with 👍 / 👎.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/server/src/review/GrokReviewModel.ts`:
- Around line 219-235: Add focused tests for normalizeGrokReviewCandidate and
normalizeGrokReviewVerification that decode their outputs through the canonical
GrokReviewCandidate and GrokReviewVerification schemas. Use adversarial wire
inputs covering oversized text, null line fields, out-of-range confidence, and
oversized escalationReason, asserting the normalized results satisfy every
schema bound and filter.
- Line 65: Update the needsHighEffortReview schema definition to accept both
boolean and null values, matching the nullability of other optional wire fields.
Keep normalizeGrokReviewVerification unchanged because its existing nullish
fallback already converts null to false.
In `@apps/server/src/review/GrokReviewSwarm.test.ts`:
- Around line 393-441: Add focused tests alongside the existing “retries failed
medium verification at high effort” case in the GrokReviewSwarm test suite.
Cover both verification attempts failing and assert a GrokReviewError with
operation “GrokReviewSwarm.verify”; also cover successful medium verification
followed by failed high-effort escalation, asserting a partial report with
escalatedToHigh false and the limitation “High-effort escalation failed; the
medium-effort verification is shown.”
- Around line 381-387: Update the assertions in the report normalization test to
import and use the exported MAX_REVIEW_* bound constants instead of hard-coded
2_000, 8, and 240 values. Replace the summary length, coverage length, and
finding title length literals while preserving the existing assertions.
In `@apps/server/src/review/GrokReviewSwarm.ts`:
- Around line 262-332: Replace each repeated Effect.map plus Effect.catch
wrapper around runVerification in the medium and high-effort verification paths
with Effect.result. Preserve the existing tagged success/failure branching,
error propagation, verification assignment, and high-effort status flags while
using the result produced by Effect.result.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: b9d43dfd-4fdf-41cd-99b8-471a8175cf5d

📥 Commits

Reviewing files that changed from the base of the PR and between 2456a68 and 7e10c7f.

📒 Files selected for processing (3)
  • apps/server/src/review/GrokReviewModel.ts
  • apps/server/src/review/GrokReviewSwarm.test.ts
  • apps/server/src/review/GrokReviewSwarm.ts

Comment threadapps/server/src/review/GrokReviewModel.ts Outdated
Comment threadapps/server/src/review/GrokReviewModel.ts
Comment threadapps/server/src/review/GrokReviewSwarm.test.ts Outdated
Comment threadapps/server/src/review/GrokReviewSwarm.test.ts
Comment threadapps/server/src/review/GrokReviewSwarm.ts Outdated

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:fa089c4e02

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/server/src/review/GrokReviewSwarm.ts
@logancsack
logancsack merged commit dc811d3 into mainJul 31, 2026
12 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:Lvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@logancsack
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Harden Grok review output handling - #40

Merged
logancsack merged 2 commits into
mainfrom
fix/grok-review-output-resilience
Jul 31, 2026
Merged

Harden Grok review output handling#40
logancsack merged 2 commits into
mainfrom
fix/grok-review-output-resilience

Conversation

@logancsack

@logancsacklogancsack commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Summary

  • decode model responses through a tolerant wire schema, then normalize them into the strict canonical review contract
  • clamp presentation bounds, normalize nullable optional fields, and retain valid findings instead of failing an entire swarm result
  • retry a failed medium verifier once with high reasoning while keeping medium as the default
  • mark reports partial and disclose when malformed or over-limit findings are omitted
  • include bounded specialist failure diagnostics in partial reports

Root cause

The first production review reached the verifier, but Grok output violated the strict presentation schema. That turned a useful run into HTTP 500 even though the durable queue and retry path were healthy.

Verification

  • pnpm exec vp test run apps/server/src/review/GrokReviewSwarm.test.ts apps/server/src/review/GrokReviewAgent.test.ts — 25 passed
  • T3_GROK_REVIEW_SWARM_PROBE=1 pnpm exec vp test run apps/server/src/review/GrokReviewSwarmProbe.test.ts — real Grok 4.5 swarm passed
  • pnpm exec vp run --filter t3 typecheck — passed (existing Effect suggestions only)
  • targeted vp lint on the three changed files — passed
  • pnpm build — passed
  • git diff --check — passed

No frontend behavior changed.

@coderabbitai

coderabbitaiBot commented Jul 31, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Grok review candidates and verification responses now use permissive wire schemas and normalization. Verification retries at high effort after medium-effort failure, reports failure details, and tracks actual high-effort usage.

Changes

Grok review resilience

Layer / File(s)Summary
Wire schemas and normalization
apps/server/src/review/GrokReviewModel.ts
Adds permissive candidate and verification schemas. Normalization trims and bounds text, sanitizes findings and line ranges, clamps confidence, limits lists, and applies defaults.
Verification fallback and accounting
apps/server/src/review/GrokReviewSwarm.ts
Normalizes agent output, retries failed medium verification at high effort, escalates qualifying findings, reports reviewer errors, and counts actual high-effort attempts.
Normalization and fallback tests
apps/server/src/review/GrokReviewSwarm.test.ts
Tests repaired verification output and high-effort recovery after medium-effort failure.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
participant ReviewSwarm
participant Verification
participant GrokAgent
ReviewSwarm->>Verification: Run medium-effort verification
Verification->>GrokAgent: Request structured response
GrokAgent-->>Verification: Result or GrokReviewError
Verification-->>ReviewSwarm: Normalized verification
ReviewSwarm->>Verification: Retry at high effort after failure
Verification->>GrokAgent: Request high-effort response
GrokAgent-->>Verification: High-effort result
Verification-->>ReviewSwarm: Normalized fallback result
Loading

Possibly related PRs

Poem

A rabbit checks each Grok reply,
Trims the tails and bounds the sky.
If medium effort loses track,
High effort hops and brings it back.
Clean reports now fill the burrow bright.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title clearly states that the PR hardens Grok review output handling, which matches the primary changes.
Description check✅ PassedThe description explains the changes, root cause, verification, and scope; it uses equivalent headings and omits the checklist.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/grok-review-output-resilience

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.

@logancsack
logancsack marked this pull request as ready for review July 31, 2026 17:01
@cursor

cursorBot commented Jul 31, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L labels Jul 31, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:7e10c7f86a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +189 to +193
.flatMap((finding) => {
const normalized = normalizeCandidateFinding(finding);
return normalized ? [normalized] : [];
})
.slice(0, MAX_REVIEW_FINDINGS);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Mark reviews partial when normalization drops findings

When a verifier returns a finding with a blank required text field, this filter silently removes it; the same helper also truncates outputs beyond 20 findings. Because the downstream partial calculation does not track either case, a response whose only finding is malformed can be reported as pass, and the later “Only the first 20...” limitation is unreachable. Preserve whether normalization discarded findings and use it to mark the report partial and disclose the omission.

Useful? React with 👍 / 👎.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/server/src/review/GrokReviewModel.ts`:
- Around line 219-235: Add focused tests for normalizeGrokReviewCandidate and
normalizeGrokReviewVerification that decode their outputs through the canonical
GrokReviewCandidate and GrokReviewVerification schemas. Use adversarial wire
inputs covering oversized text, null line fields, out-of-range confidence, and
oversized escalationReason, asserting the normalized results satisfy every
schema bound and filter.
- Line 65: Update the needsHighEffortReview schema definition to accept both
boolean and null values, matching the nullability of other optional wire fields.
Keep normalizeGrokReviewVerification unchanged because its existing nullish
fallback already converts null to false.
In `@apps/server/src/review/GrokReviewSwarm.test.ts`:
- Around line 393-441: Add focused tests alongside the existing “retries failed
medium verification at high effort” case in the GrokReviewSwarm test suite.
Cover both verification attempts failing and assert a GrokReviewError with
operation “GrokReviewSwarm.verify”; also cover successful medium verification
followed by failed high-effort escalation, asserting a partial report with
escalatedToHigh false and the limitation “High-effort escalation failed; the
medium-effort verification is shown.”
- Around line 381-387: Update the assertions in the report normalization test to
import and use the exported MAX_REVIEW_* bound constants instead of hard-coded
2_000, 8, and 240 values. Replace the summary length, coverage length, and
finding title length literals while preserving the existing assertions.
In `@apps/server/src/review/GrokReviewSwarm.ts`:
- Around line 262-332: Replace each repeated Effect.map plus Effect.catch
wrapper around runVerification in the medium and high-effort verification paths
with Effect.result. Preserve the existing tagged success/failure branching,
error propagation, verification assignment, and high-effort status flags while
using the result produced by Effect.result.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: b9d43dfd-4fdf-41cd-99b8-471a8175cf5d

📥 Commits

Reviewing files that changed from the base of the PR and between 2456a68 and 7e10c7f.

📒 Files selected for processing (3)
  • apps/server/src/review/GrokReviewModel.ts
  • apps/server/src/review/GrokReviewSwarm.test.ts
  • apps/server/src/review/GrokReviewSwarm.ts

Comment threadapps/server/src/review/GrokReviewModel.ts Outdated
Comment threadapps/server/src/review/GrokReviewModel.ts
Comment threadapps/server/src/review/GrokReviewSwarm.test.ts Outdated
Comment threadapps/server/src/review/GrokReviewSwarm.test.ts
Comment threadapps/server/src/review/GrokReviewSwarm.ts Outdated

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:fa089c4e02

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/server/src/review/GrokReviewSwarm.ts
@logancsack
logancsack merged commit dc811d3 into mainJul 31, 2026
12 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:Lvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@logancsack
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Harden Grok review output handling - #40

Merged
logancsack merged 2 commits into
mainfrom
fix/grok-review-output-resilience
Jul 31, 2026
Merged

Harden Grok review output handling#40
logancsack merged 2 commits into
mainfrom
fix/grok-review-output-resilience

Conversation

@logancsack

@logancsacklogancsack commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Summary

  • decode model responses through a tolerant wire schema, then normalize them into the strict canonical review contract
  • clamp presentation bounds, normalize nullable optional fields, and retain valid findings instead of failing an entire swarm result
  • retry a failed medium verifier once with high reasoning while keeping medium as the default
  • mark reports partial and disclose when malformed or over-limit findings are omitted
  • include bounded specialist failure diagnostics in partial reports

Root cause

The first production review reached the verifier, but Grok output violated the strict presentation schema. That turned a useful run into HTTP 500 even though the durable queue and retry path were healthy.

Verification

  • pnpm exec vp test run apps/server/src/review/GrokReviewSwarm.test.ts apps/server/src/review/GrokReviewAgent.test.ts — 25 passed
  • T3_GROK_REVIEW_SWARM_PROBE=1 pnpm exec vp test run apps/server/src/review/GrokReviewSwarmProbe.test.ts — real Grok 4.5 swarm passed
  • pnpm exec vp run --filter t3 typecheck — passed (existing Effect suggestions only)
  • targeted vp lint on the three changed files — passed
  • pnpm build — passed
  • git diff --check — passed

No frontend behavior changed.

@coderabbitai

coderabbitaiBot commented Jul 31, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Grok review candidates and verification responses now use permissive wire schemas and normalization. Verification retries at high effort after medium-effort failure, reports failure details, and tracks actual high-effort usage.

Changes

Grok review resilience

Layer / File(s)Summary
Wire schemas and normalization
apps/server/src/review/GrokReviewModel.ts
Adds permissive candidate and verification schemas. Normalization trims and bounds text, sanitizes findings and line ranges, clamps confidence, limits lists, and applies defaults.
Verification fallback and accounting
apps/server/src/review/GrokReviewSwarm.ts
Normalizes agent output, retries failed medium verification at high effort, escalates qualifying findings, reports reviewer errors, and counts actual high-effort attempts.
Normalization and fallback tests
apps/server/src/review/GrokReviewSwarm.test.ts
Tests repaired verification output and high-effort recovery after medium-effort failure.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
participant ReviewSwarm
participant Verification
participant GrokAgent
ReviewSwarm->>Verification: Run medium-effort verification
Verification->>GrokAgent: Request structured response
GrokAgent-->>Verification: Result or GrokReviewError
Verification-->>ReviewSwarm: Normalized verification
ReviewSwarm->>Verification: Retry at high effort after failure
Verification->>GrokAgent: Request high-effort response
GrokAgent-->>Verification: High-effort result
Verification-->>ReviewSwarm: Normalized fallback result
Loading

Possibly related PRs

Poem

A rabbit checks each Grok reply,
Trims the tails and bounds the sky.
If medium effort loses track,
High effort hops and brings it back.
Clean reports now fill the burrow bright.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title clearly states that the PR hardens Grok review output handling, which matches the primary changes.
Description check✅ PassedThe description explains the changes, root cause, verification, and scope; it uses equivalent headings and omits the checklist.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/grok-review-output-resilience

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.

@logancsack
logancsack marked this pull request as ready for review July 31, 2026 17:01
@cursor

cursorBot commented Jul 31, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L labels Jul 31, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:7e10c7f86a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +189 to +193
.flatMap((finding) => {
const normalized = normalizeCandidateFinding(finding);
return normalized ? [normalized] : [];
})
.slice(0, MAX_REVIEW_FINDINGS);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Mark reviews partial when normalization drops findings

When a verifier returns a finding with a blank required text field, this filter silently removes it; the same helper also truncates outputs beyond 20 findings. Because the downstream partial calculation does not track either case, a response whose only finding is malformed can be reported as pass, and the later “Only the first 20...” limitation is unreachable. Preserve whether normalization discarded findings and use it to mark the report partial and disclose the omission.

Useful? React with 👍 / 👎.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/server/src/review/GrokReviewModel.ts`:
- Around line 219-235: Add focused tests for normalizeGrokReviewCandidate and
normalizeGrokReviewVerification that decode their outputs through the canonical
GrokReviewCandidate and GrokReviewVerification schemas. Use adversarial wire
inputs covering oversized text, null line fields, out-of-range confidence, and
oversized escalationReason, asserting the normalized results satisfy every
schema bound and filter.
- Line 65: Update the needsHighEffortReview schema definition to accept both
boolean and null values, matching the nullability of other optional wire fields.
Keep normalizeGrokReviewVerification unchanged because its existing nullish
fallback already converts null to false.
In `@apps/server/src/review/GrokReviewSwarm.test.ts`:
- Around line 393-441: Add focused tests alongside the existing “retries failed
medium verification at high effort” case in the GrokReviewSwarm test suite.
Cover both verification attempts failing and assert a GrokReviewError with
operation “GrokReviewSwarm.verify”; also cover successful medium verification
followed by failed high-effort escalation, asserting a partial report with
escalatedToHigh false and the limitation “High-effort escalation failed; the
medium-effort verification is shown.”
- Around line 381-387: Update the assertions in the report normalization test to
import and use the exported MAX_REVIEW_* bound constants instead of hard-coded
2_000, 8, and 240 values. Replace the summary length, coverage length, and
finding title length literals while preserving the existing assertions.
In `@apps/server/src/review/GrokReviewSwarm.ts`:
- Around line 262-332: Replace each repeated Effect.map plus Effect.catch
wrapper around runVerification in the medium and high-effort verification paths
with Effect.result. Preserve the existing tagged success/failure branching,
error propagation, verification assignment, and high-effort status flags while
using the result produced by Effect.result.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: b9d43dfd-4fdf-41cd-99b8-471a8175cf5d

📥 Commits

Reviewing files that changed from the base of the PR and between 2456a68 and 7e10c7f.

📒 Files selected for processing (3)
  • apps/server/src/review/GrokReviewModel.ts
  • apps/server/src/review/GrokReviewSwarm.test.ts
  • apps/server/src/review/GrokReviewSwarm.ts

Comment threadapps/server/src/review/GrokReviewModel.ts Outdated
Comment threadapps/server/src/review/GrokReviewModel.ts
Comment threadapps/server/src/review/GrokReviewSwarm.test.ts Outdated
Comment threadapps/server/src/review/GrokReviewSwarm.test.ts
Comment threadapps/server/src/review/GrokReviewSwarm.ts Outdated

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:fa089c4e02

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/server/src/review/GrokReviewSwarm.ts
@logancsack
logancsack merged commit dc811d3 into mainJul 31, 2026
12 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:Lvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@logancsack
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Harden Grok review output handling - #40

Merged
logancsack merged 2 commits into
mainfrom
fix/grok-review-output-resilience
Jul 31, 2026
Merged

Harden Grok review output handling#40
logancsack merged 2 commits into
mainfrom
fix/grok-review-output-resilience

Conversation

@logancsack

@logancsacklogancsack commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Summary

  • decode model responses through a tolerant wire schema, then normalize them into the strict canonical review contract
  • clamp presentation bounds, normalize nullable optional fields, and retain valid findings instead of failing an entire swarm result
  • retry a failed medium verifier once with high reasoning while keeping medium as the default
  • mark reports partial and disclose when malformed or over-limit findings are omitted
  • include bounded specialist failure diagnostics in partial reports

Root cause

The first production review reached the verifier, but Grok output violated the strict presentation schema. That turned a useful run into HTTP 500 even though the durable queue and retry path were healthy.

Verification

  • pnpm exec vp test run apps/server/src/review/GrokReviewSwarm.test.ts apps/server/src/review/GrokReviewAgent.test.ts — 25 passed
  • T3_GROK_REVIEW_SWARM_PROBE=1 pnpm exec vp test run apps/server/src/review/GrokReviewSwarmProbe.test.ts — real Grok 4.5 swarm passed
  • pnpm exec vp run --filter t3 typecheck — passed (existing Effect suggestions only)
  • targeted vp lint on the three changed files — passed
  • pnpm build — passed
  • git diff --check — passed

No frontend behavior changed.

@coderabbitai

coderabbitaiBot commented Jul 31, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Grok review candidates and verification responses now use permissive wire schemas and normalization. Verification retries at high effort after medium-effort failure, reports failure details, and tracks actual high-effort usage.

Changes

Grok review resilience

Layer / File(s)Summary
Wire schemas and normalization
apps/server/src/review/GrokReviewModel.ts
Adds permissive candidate and verification schemas. Normalization trims and bounds text, sanitizes findings and line ranges, clamps confidence, limits lists, and applies defaults.
Verification fallback and accounting
apps/server/src/review/GrokReviewSwarm.ts
Normalizes agent output, retries failed medium verification at high effort, escalates qualifying findings, reports reviewer errors, and counts actual high-effort attempts.
Normalization and fallback tests
apps/server/src/review/GrokReviewSwarm.test.ts
Tests repaired verification output and high-effort recovery after medium-effort failure.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
participant ReviewSwarm
participant Verification
participant GrokAgent
ReviewSwarm->>Verification: Run medium-effort verification
Verification->>GrokAgent: Request structured response
GrokAgent-->>Verification: Result or GrokReviewError
Verification-->>ReviewSwarm: Normalized verification
ReviewSwarm->>Verification: Retry at high effort after failure
Verification->>GrokAgent: Request high-effort response
GrokAgent-->>Verification: High-effort result
Verification-->>ReviewSwarm: Normalized fallback result
Loading

Possibly related PRs

Poem

A rabbit checks each Grok reply,
Trims the tails and bounds the sky.
If medium effort loses track,
High effort hops and brings it back.
Clean reports now fill the burrow bright.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title clearly states that the PR hardens Grok review output handling, which matches the primary changes.
Description check✅ PassedThe description explains the changes, root cause, verification, and scope; it uses equivalent headings and omits the checklist.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/grok-review-output-resilience

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.

@logancsack
logancsack marked this pull request as ready for review July 31, 2026 17:01
@cursor

cursorBot commented Jul 31, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L labels Jul 31, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:7e10c7f86a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +189 to +193
.flatMap((finding) => {
const normalized = normalizeCandidateFinding(finding);
return normalized ? [normalized] : [];
})
.slice(0, MAX_REVIEW_FINDINGS);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Mark reviews partial when normalization drops findings

When a verifier returns a finding with a blank required text field, this filter silently removes it; the same helper also truncates outputs beyond 20 findings. Because the downstream partial calculation does not track either case, a response whose only finding is malformed can be reported as pass, and the later “Only the first 20...” limitation is unreachable. Preserve whether normalization discarded findings and use it to mark the report partial and disclose the omission.

Useful? React with 👍 / 👎.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/server/src/review/GrokReviewModel.ts`:
- Around line 219-235: Add focused tests for normalizeGrokReviewCandidate and
normalizeGrokReviewVerification that decode their outputs through the canonical
GrokReviewCandidate and GrokReviewVerification schemas. Use adversarial wire
inputs covering oversized text, null line fields, out-of-range confidence, and
oversized escalationReason, asserting the normalized results satisfy every
schema bound and filter.
- Line 65: Update the needsHighEffortReview schema definition to accept both
boolean and null values, matching the nullability of other optional wire fields.
Keep normalizeGrokReviewVerification unchanged because its existing nullish
fallback already converts null to false.
In `@apps/server/src/review/GrokReviewSwarm.test.ts`:
- Around line 393-441: Add focused tests alongside the existing “retries failed
medium verification at high effort” case in the GrokReviewSwarm test suite.
Cover both verification attempts failing and assert a GrokReviewError with
operation “GrokReviewSwarm.verify”; also cover successful medium verification
followed by failed high-effort escalation, asserting a partial report with
escalatedToHigh false and the limitation “High-effort escalation failed; the
medium-effort verification is shown.”
- Around line 381-387: Update the assertions in the report normalization test to
import and use the exported MAX_REVIEW_* bound constants instead of hard-coded
2_000, 8, and 240 values. Replace the summary length, coverage length, and
finding title length literals while preserving the existing assertions.
In `@apps/server/src/review/GrokReviewSwarm.ts`:
- Around line 262-332: Replace each repeated Effect.map plus Effect.catch
wrapper around runVerification in the medium and high-effort verification paths
with Effect.result. Preserve the existing tagged success/failure branching,
error propagation, verification assignment, and high-effort status flags while
using the result produced by Effect.result.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: b9d43dfd-4fdf-41cd-99b8-471a8175cf5d

📥 Commits

Reviewing files that changed from the base of the PR and between 2456a68 and 7e10c7f.

📒 Files selected for processing (3)
  • apps/server/src/review/GrokReviewModel.ts
  • apps/server/src/review/GrokReviewSwarm.test.ts
  • apps/server/src/review/GrokReviewSwarm.ts

Comment threadapps/server/src/review/GrokReviewModel.ts Outdated
Comment threadapps/server/src/review/GrokReviewModel.ts
Comment threadapps/server/src/review/GrokReviewSwarm.test.ts Outdated
Comment threadapps/server/src/review/GrokReviewSwarm.test.ts
Comment threadapps/server/src/review/GrokReviewSwarm.ts Outdated

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:fa089c4e02

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/server/src/review/GrokReviewSwarm.ts
@logancsack
logancsack merged commit dc811d3 into mainJul 31, 2026
12 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:Lvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@logancsack
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Harden Grok review output handling - #40

Merged
logancsack merged 2 commits into
mainfrom
fix/grok-review-output-resilience
Jul 31, 2026
Merged

Harden Grok review output handling#40
logancsack merged 2 commits into
mainfrom
fix/grok-review-output-resilience

Conversation

@logancsack

@logancsacklogancsack commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Summary

  • decode model responses through a tolerant wire schema, then normalize them into the strict canonical review contract
  • clamp presentation bounds, normalize nullable optional fields, and retain valid findings instead of failing an entire swarm result
  • retry a failed medium verifier once with high reasoning while keeping medium as the default
  • mark reports partial and disclose when malformed or over-limit findings are omitted
  • include bounded specialist failure diagnostics in partial reports

Root cause

The first production review reached the verifier, but Grok output violated the strict presentation schema. That turned a useful run into HTTP 500 even though the durable queue and retry path were healthy.

Verification

  • pnpm exec vp test run apps/server/src/review/GrokReviewSwarm.test.ts apps/server/src/review/GrokReviewAgent.test.ts — 25 passed
  • T3_GROK_REVIEW_SWARM_PROBE=1 pnpm exec vp test run apps/server/src/review/GrokReviewSwarmProbe.test.ts — real Grok 4.5 swarm passed
  • pnpm exec vp run --filter t3 typecheck — passed (existing Effect suggestions only)
  • targeted vp lint on the three changed files — passed
  • pnpm build — passed
  • git diff --check — passed

No frontend behavior changed.

@coderabbitai

coderabbitaiBot commented Jul 31, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Grok review candidates and verification responses now use permissive wire schemas and normalization. Verification retries at high effort after medium-effort failure, reports failure details, and tracks actual high-effort usage.

Changes

Grok review resilience

Layer / File(s)Summary
Wire schemas and normalization
apps/server/src/review/GrokReviewModel.ts
Adds permissive candidate and verification schemas. Normalization trims and bounds text, sanitizes findings and line ranges, clamps confidence, limits lists, and applies defaults.
Verification fallback and accounting
apps/server/src/review/GrokReviewSwarm.ts
Normalizes agent output, retries failed medium verification at high effort, escalates qualifying findings, reports reviewer errors, and counts actual high-effort attempts.
Normalization and fallback tests
apps/server/src/review/GrokReviewSwarm.test.ts
Tests repaired verification output and high-effort recovery after medium-effort failure.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
participant ReviewSwarm
participant Verification
participant GrokAgent
ReviewSwarm->>Verification: Run medium-effort verification
Verification->>GrokAgent: Request structured response
GrokAgent-->>Verification: Result or GrokReviewError
Verification-->>ReviewSwarm: Normalized verification
ReviewSwarm->>Verification: Retry at high effort after failure
Verification->>GrokAgent: Request high-effort response
GrokAgent-->>Verification: High-effort result
Verification-->>ReviewSwarm: Normalized fallback result
Loading

Possibly related PRs

Poem

A rabbit checks each Grok reply,
Trims the tails and bounds the sky.
If medium effort loses track,
High effort hops and brings it back.
Clean reports now fill the burrow bright.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title clearly states that the PR hardens Grok review output handling, which matches the primary changes.
Description check✅ PassedThe description explains the changes, root cause, verification, and scope; it uses equivalent headings and omits the checklist.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/grok-review-output-resilience

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.

@logancsack
logancsack marked this pull request as ready for review July 31, 2026 17:01
@cursor

cursorBot commented Jul 31, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L labels Jul 31, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:7e10c7f86a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +189 to +193
.flatMap((finding) => {
const normalized = normalizeCandidateFinding(finding);
return normalized ? [normalized] : [];
})
.slice(0, MAX_REVIEW_FINDINGS);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Mark reviews partial when normalization drops findings

When a verifier returns a finding with a blank required text field, this filter silently removes it; the same helper also truncates outputs beyond 20 findings. Because the downstream partial calculation does not track either case, a response whose only finding is malformed can be reported as pass, and the later “Only the first 20...” limitation is unreachable. Preserve whether normalization discarded findings and use it to mark the report partial and disclose the omission.

Useful? React with 👍 / 👎.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/server/src/review/GrokReviewModel.ts`:
- Around line 219-235: Add focused tests for normalizeGrokReviewCandidate and
normalizeGrokReviewVerification that decode their outputs through the canonical
GrokReviewCandidate and GrokReviewVerification schemas. Use adversarial wire
inputs covering oversized text, null line fields, out-of-range confidence, and
oversized escalationReason, asserting the normalized results satisfy every
schema bound and filter.
- Line 65: Update the needsHighEffortReview schema definition to accept both
boolean and null values, matching the nullability of other optional wire fields.
Keep normalizeGrokReviewVerification unchanged because its existing nullish
fallback already converts null to false.
In `@apps/server/src/review/GrokReviewSwarm.test.ts`:
- Around line 393-441: Add focused tests alongside the existing “retries failed
medium verification at high effort” case in the GrokReviewSwarm test suite.
Cover both verification attempts failing and assert a GrokReviewError with
operation “GrokReviewSwarm.verify”; also cover successful medium verification
followed by failed high-effort escalation, asserting a partial report with
escalatedToHigh false and the limitation “High-effort escalation failed; the
medium-effort verification is shown.”
- Around line 381-387: Update the assertions in the report normalization test to
import and use the exported MAX_REVIEW_* bound constants instead of hard-coded
2_000, 8, and 240 values. Replace the summary length, coverage length, and
finding title length literals while preserving the existing assertions.
In `@apps/server/src/review/GrokReviewSwarm.ts`:
- Around line 262-332: Replace each repeated Effect.map plus Effect.catch
wrapper around runVerification in the medium and high-effort verification paths
with Effect.result. Preserve the existing tagged success/failure branching,
error propagation, verification assignment, and high-effort status flags while
using the result produced by Effect.result.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: b9d43dfd-4fdf-41cd-99b8-471a8175cf5d

📥 Commits

Reviewing files that changed from the base of the PR and between 2456a68 and 7e10c7f.

📒 Files selected for processing (3)
  • apps/server/src/review/GrokReviewModel.ts
  • apps/server/src/review/GrokReviewSwarm.test.ts
  • apps/server/src/review/GrokReviewSwarm.ts

Comment threadapps/server/src/review/GrokReviewModel.ts Outdated
Comment threadapps/server/src/review/GrokReviewModel.ts
Comment threadapps/server/src/review/GrokReviewSwarm.test.ts Outdated
Comment threadapps/server/src/review/GrokReviewSwarm.test.ts
Comment threadapps/server/src/review/GrokReviewSwarm.ts Outdated

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:fa089c4e02

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/server/src/review/GrokReviewSwarm.ts
@logancsack
logancsack merged commit dc811d3 into mainJul 31, 2026
12 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:Lvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@logancsack
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Harden Grok review output handling - #40

Merged
logancsack merged 2 commits into
mainfrom
fix/grok-review-output-resilience
Jul 31, 2026
Merged

Harden Grok review output handling#40
logancsack merged 2 commits into
mainfrom
fix/grok-review-output-resilience

Conversation

@logancsack

@logancsacklogancsack commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Summary

  • decode model responses through a tolerant wire schema, then normalize them into the strict canonical review contract
  • clamp presentation bounds, normalize nullable optional fields, and retain valid findings instead of failing an entire swarm result
  • retry a failed medium verifier once with high reasoning while keeping medium as the default
  • mark reports partial and disclose when malformed or over-limit findings are omitted
  • include bounded specialist failure diagnostics in partial reports

Root cause

The first production review reached the verifier, but Grok output violated the strict presentation schema. That turned a useful run into HTTP 500 even though the durable queue and retry path were healthy.

Verification

  • pnpm exec vp test run apps/server/src/review/GrokReviewSwarm.test.ts apps/server/src/review/GrokReviewAgent.test.ts — 25 passed
  • T3_GROK_REVIEW_SWARM_PROBE=1 pnpm exec vp test run apps/server/src/review/GrokReviewSwarmProbe.test.ts — real Grok 4.5 swarm passed
  • pnpm exec vp run --filter t3 typecheck — passed (existing Effect suggestions only)
  • targeted vp lint on the three changed files — passed
  • pnpm build — passed
  • git diff --check — passed

No frontend behavior changed.

@coderabbitai

coderabbitaiBot commented Jul 31, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Grok review candidates and verification responses now use permissive wire schemas and normalization. Verification retries at high effort after medium-effort failure, reports failure details, and tracks actual high-effort usage.

Changes

Grok review resilience

Layer / File(s)Summary
Wire schemas and normalization
apps/server/src/review/GrokReviewModel.ts
Adds permissive candidate and verification schemas. Normalization trims and bounds text, sanitizes findings and line ranges, clamps confidence, limits lists, and applies defaults.
Verification fallback and accounting
apps/server/src/review/GrokReviewSwarm.ts
Normalizes agent output, retries failed medium verification at high effort, escalates qualifying findings, reports reviewer errors, and counts actual high-effort attempts.
Normalization and fallback tests
apps/server/src/review/GrokReviewSwarm.test.ts
Tests repaired verification output and high-effort recovery after medium-effort failure.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
participant ReviewSwarm
participant Verification
participant GrokAgent
ReviewSwarm->>Verification: Run medium-effort verification
Verification->>GrokAgent: Request structured response
GrokAgent-->>Verification: Result or GrokReviewError
Verification-->>ReviewSwarm: Normalized verification
ReviewSwarm->>Verification: Retry at high effort after failure
Verification->>GrokAgent: Request high-effort response
GrokAgent-->>Verification: High-effort result
Verification-->>ReviewSwarm: Normalized fallback result
Loading

Possibly related PRs

Poem

A rabbit checks each Grok reply,
Trims the tails and bounds the sky.
If medium effort loses track,
High effort hops and brings it back.
Clean reports now fill the burrow bright.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title clearly states that the PR hardens Grok review output handling, which matches the primary changes.
Description check✅ PassedThe description explains the changes, root cause, verification, and scope; it uses equivalent headings and omits the checklist.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/grok-review-output-resilience

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.

@logancsack
logancsack marked this pull request as ready for review July 31, 2026 17:01
@cursor

cursorBot commented Jul 31, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L labels Jul 31, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:7e10c7f86a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +189 to +193
.flatMap((finding) => {
const normalized = normalizeCandidateFinding(finding);
return normalized ? [normalized] : [];
})
.slice(0, MAX_REVIEW_FINDINGS);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Mark reviews partial when normalization drops findings

When a verifier returns a finding with a blank required text field, this filter silently removes it; the same helper also truncates outputs beyond 20 findings. Because the downstream partial calculation does not track either case, a response whose only finding is malformed can be reported as pass, and the later “Only the first 20...” limitation is unreachable. Preserve whether normalization discarded findings and use it to mark the report partial and disclose the omission.

Useful? React with 👍 / 👎.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/server/src/review/GrokReviewModel.ts`:
- Around line 219-235: Add focused tests for normalizeGrokReviewCandidate and
normalizeGrokReviewVerification that decode their outputs through the canonical
GrokReviewCandidate and GrokReviewVerification schemas. Use adversarial wire
inputs covering oversized text, null line fields, out-of-range confidence, and
oversized escalationReason, asserting the normalized results satisfy every
schema bound and filter.
- Line 65: Update the needsHighEffortReview schema definition to accept both
boolean and null values, matching the nullability of other optional wire fields.
Keep normalizeGrokReviewVerification unchanged because its existing nullish
fallback already converts null to false.
In `@apps/server/src/review/GrokReviewSwarm.test.ts`:
- Around line 393-441: Add focused tests alongside the existing “retries failed
medium verification at high effort” case in the GrokReviewSwarm test suite.
Cover both verification attempts failing and assert a GrokReviewError with
operation “GrokReviewSwarm.verify”; also cover successful medium verification
followed by failed high-effort escalation, asserting a partial report with
escalatedToHigh false and the limitation “High-effort escalation failed; the
medium-effort verification is shown.”
- Around line 381-387: Update the assertions in the report normalization test to
import and use the exported MAX_REVIEW_* bound constants instead of hard-coded
2_000, 8, and 240 values. Replace the summary length, coverage length, and
finding title length literals while preserving the existing assertions.
In `@apps/server/src/review/GrokReviewSwarm.ts`:
- Around line 262-332: Replace each repeated Effect.map plus Effect.catch
wrapper around runVerification in the medium and high-effort verification paths
with Effect.result. Preserve the existing tagged success/failure branching,
error propagation, verification assignment, and high-effort status flags while
using the result produced by Effect.result.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: b9d43dfd-4fdf-41cd-99b8-471a8175cf5d

📥 Commits

Reviewing files that changed from the base of the PR and between 2456a68 and 7e10c7f.

📒 Files selected for processing (3)
  • apps/server/src/review/GrokReviewModel.ts
  • apps/server/src/review/GrokReviewSwarm.test.ts
  • apps/server/src/review/GrokReviewSwarm.ts

Comment threadapps/server/src/review/GrokReviewModel.ts Outdated
Comment threadapps/server/src/review/GrokReviewModel.ts
Comment threadapps/server/src/review/GrokReviewSwarm.test.ts Outdated
Comment threadapps/server/src/review/GrokReviewSwarm.test.ts
Comment threadapps/server/src/review/GrokReviewSwarm.ts Outdated

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:fa089c4e02

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/server/src/review/GrokReviewSwarm.ts
@logancsack
logancsack merged commit dc811d3 into mainJul 31, 2026
12 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:Lvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@logancsack
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Harden Grok review output handling - #40

Merged
logancsack merged 2 commits into
mainfrom
fix/grok-review-output-resilience
Jul 31, 2026
Merged

Harden Grok review output handling#40
logancsack merged 2 commits into
mainfrom
fix/grok-review-output-resilience

Conversation

@logancsack

@logancsacklogancsack commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Summary

  • decode model responses through a tolerant wire schema, then normalize them into the strict canonical review contract
  • clamp presentation bounds, normalize nullable optional fields, and retain valid findings instead of failing an entire swarm result
  • retry a failed medium verifier once with high reasoning while keeping medium as the default
  • mark reports partial and disclose when malformed or over-limit findings are omitted
  • include bounded specialist failure diagnostics in partial reports

Root cause

The first production review reached the verifier, but Grok output violated the strict presentation schema. That turned a useful run into HTTP 500 even though the durable queue and retry path were healthy.

Verification

  • pnpm exec vp test run apps/server/src/review/GrokReviewSwarm.test.ts apps/server/src/review/GrokReviewAgent.test.ts — 25 passed
  • T3_GROK_REVIEW_SWARM_PROBE=1 pnpm exec vp test run apps/server/src/review/GrokReviewSwarmProbe.test.ts — real Grok 4.5 swarm passed
  • pnpm exec vp run --filter t3 typecheck — passed (existing Effect suggestions only)
  • targeted vp lint on the three changed files — passed
  • pnpm build — passed
  • git diff --check — passed

No frontend behavior changed.

@coderabbitai

coderabbitaiBot commented Jul 31, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Grok review candidates and verification responses now use permissive wire schemas and normalization. Verification retries at high effort after medium-effort failure, reports failure details, and tracks actual high-effort usage.

Changes

Grok review resilience

Layer / File(s)Summary
Wire schemas and normalization
apps/server/src/review/GrokReviewModel.ts
Adds permissive candidate and verification schemas. Normalization trims and bounds text, sanitizes findings and line ranges, clamps confidence, limits lists, and applies defaults.
Verification fallback and accounting
apps/server/src/review/GrokReviewSwarm.ts
Normalizes agent output, retries failed medium verification at high effort, escalates qualifying findings, reports reviewer errors, and counts actual high-effort attempts.
Normalization and fallback tests
apps/server/src/review/GrokReviewSwarm.test.ts
Tests repaired verification output and high-effort recovery after medium-effort failure.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
participant ReviewSwarm
participant Verification
participant GrokAgent
ReviewSwarm->>Verification: Run medium-effort verification
Verification->>GrokAgent: Request structured response
GrokAgent-->>Verification: Result or GrokReviewError
Verification-->>ReviewSwarm: Normalized verification
ReviewSwarm->>Verification: Retry at high effort after failure
Verification->>GrokAgent: Request high-effort response
GrokAgent-->>Verification: High-effort result
Verification-->>ReviewSwarm: Normalized fallback result
Loading

Possibly related PRs

Poem

A rabbit checks each Grok reply,
Trims the tails and bounds the sky.
If medium effort loses track,
High effort hops and brings it back.
Clean reports now fill the burrow bright.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title clearly states that the PR hardens Grok review output handling, which matches the primary changes.
Description check✅ PassedThe description explains the changes, root cause, verification, and scope; it uses equivalent headings and omits the checklist.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/grok-review-output-resilience

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.

@logancsack
logancsack marked this pull request as ready for review July 31, 2026 17:01
@cursor

cursorBot commented Jul 31, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L labels Jul 31, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:7e10c7f86a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +189 to +193
.flatMap((finding) => {
const normalized = normalizeCandidateFinding(finding);
return normalized ? [normalized] : [];
})
.slice(0, MAX_REVIEW_FINDINGS);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Mark reviews partial when normalization drops findings

When a verifier returns a finding with a blank required text field, this filter silently removes it; the same helper also truncates outputs beyond 20 findings. Because the downstream partial calculation does not track either case, a response whose only finding is malformed can be reported as pass, and the later “Only the first 20...” limitation is unreachable. Preserve whether normalization discarded findings and use it to mark the report partial and disclose the omission.

Useful? React with 👍 / 👎.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/server/src/review/GrokReviewModel.ts`:
- Around line 219-235: Add focused tests for normalizeGrokReviewCandidate and
normalizeGrokReviewVerification that decode their outputs through the canonical
GrokReviewCandidate and GrokReviewVerification schemas. Use adversarial wire
inputs covering oversized text, null line fields, out-of-range confidence, and
oversized escalationReason, asserting the normalized results satisfy every
schema bound and filter.
- Line 65: Update the needsHighEffortReview schema definition to accept both
boolean and null values, matching the nullability of other optional wire fields.
Keep normalizeGrokReviewVerification unchanged because its existing nullish
fallback already converts null to false.
In `@apps/server/src/review/GrokReviewSwarm.test.ts`:
- Around line 393-441: Add focused tests alongside the existing “retries failed
medium verification at high effort” case in the GrokReviewSwarm test suite.
Cover both verification attempts failing and assert a GrokReviewError with
operation “GrokReviewSwarm.verify”; also cover successful medium verification
followed by failed high-effort escalation, asserting a partial report with
escalatedToHigh false and the limitation “High-effort escalation failed; the
medium-effort verification is shown.”
- Around line 381-387: Update the assertions in the report normalization test to
import and use the exported MAX_REVIEW_* bound constants instead of hard-coded
2_000, 8, and 240 values. Replace the summary length, coverage length, and
finding title length literals while preserving the existing assertions.
In `@apps/server/src/review/GrokReviewSwarm.ts`:
- Around line 262-332: Replace each repeated Effect.map plus Effect.catch
wrapper around runVerification in the medium and high-effort verification paths
with Effect.result. Preserve the existing tagged success/failure branching,
error propagation, verification assignment, and high-effort status flags while
using the result produced by Effect.result.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: b9d43dfd-4fdf-41cd-99b8-471a8175cf5d

📥 Commits

Reviewing files that changed from the base of the PR and between 2456a68 and 7e10c7f.

📒 Files selected for processing (3)
  • apps/server/src/review/GrokReviewModel.ts
  • apps/server/src/review/GrokReviewSwarm.test.ts
  • apps/server/src/review/GrokReviewSwarm.ts

Comment threadapps/server/src/review/GrokReviewModel.ts Outdated
Comment threadapps/server/src/review/GrokReviewModel.ts
Comment threadapps/server/src/review/GrokReviewSwarm.test.ts Outdated
Comment threadapps/server/src/review/GrokReviewSwarm.test.ts
Comment threadapps/server/src/review/GrokReviewSwarm.ts Outdated

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:fa089c4e02

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/server/src/review/GrokReviewSwarm.ts
@logancsack
logancsack merged commit dc811d3 into mainJul 31, 2026
12 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:Lvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@logancsack
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Harden Grok review output handling - #40

Merged
logancsack merged 2 commits into
mainfrom
fix/grok-review-output-resilience
Jul 31, 2026
Merged

Harden Grok review output handling#40
logancsack merged 2 commits into
mainfrom
fix/grok-review-output-resilience

Conversation

@logancsack

@logancsacklogancsack commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Summary

  • decode model responses through a tolerant wire schema, then normalize them into the strict canonical review contract
  • clamp presentation bounds, normalize nullable optional fields, and retain valid findings instead of failing an entire swarm result
  • retry a failed medium verifier once with high reasoning while keeping medium as the default
  • mark reports partial and disclose when malformed or over-limit findings are omitted
  • include bounded specialist failure diagnostics in partial reports

Root cause

The first production review reached the verifier, but Grok output violated the strict presentation schema. That turned a useful run into HTTP 500 even though the durable queue and retry path were healthy.

Verification

  • pnpm exec vp test run apps/server/src/review/GrokReviewSwarm.test.ts apps/server/src/review/GrokReviewAgent.test.ts — 25 passed
  • T3_GROK_REVIEW_SWARM_PROBE=1 pnpm exec vp test run apps/server/src/review/GrokReviewSwarmProbe.test.ts — real Grok 4.5 swarm passed
  • pnpm exec vp run --filter t3 typecheck — passed (existing Effect suggestions only)
  • targeted vp lint on the three changed files — passed
  • pnpm build — passed
  • git diff --check — passed

No frontend behavior changed.

@coderabbitai

coderabbitaiBot commented Jul 31, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Grok review candidates and verification responses now use permissive wire schemas and normalization. Verification retries at high effort after medium-effort failure, reports failure details, and tracks actual high-effort usage.

Changes

Grok review resilience

Layer / File(s)Summary
Wire schemas and normalization
apps/server/src/review/GrokReviewModel.ts
Adds permissive candidate and verification schemas. Normalization trims and bounds text, sanitizes findings and line ranges, clamps confidence, limits lists, and applies defaults.
Verification fallback and accounting
apps/server/src/review/GrokReviewSwarm.ts
Normalizes agent output, retries failed medium verification at high effort, escalates qualifying findings, reports reviewer errors, and counts actual high-effort attempts.
Normalization and fallback tests
apps/server/src/review/GrokReviewSwarm.test.ts
Tests repaired verification output and high-effort recovery after medium-effort failure.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
participant ReviewSwarm
participant Verification
participant GrokAgent
ReviewSwarm->>Verification: Run medium-effort verification
Verification->>GrokAgent: Request structured response
GrokAgent-->>Verification: Result or GrokReviewError
Verification-->>ReviewSwarm: Normalized verification
ReviewSwarm->>Verification: Retry at high effort after failure
Verification->>GrokAgent: Request high-effort response
GrokAgent-->>Verification: High-effort result
Verification-->>ReviewSwarm: Normalized fallback result
Loading

Possibly related PRs

Poem

A rabbit checks each Grok reply,
Trims the tails and bounds the sky.
If medium effort loses track,
High effort hops and brings it back.
Clean reports now fill the burrow bright.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title clearly states that the PR hardens Grok review output handling, which matches the primary changes.
Description check✅ PassedThe description explains the changes, root cause, verification, and scope; it uses equivalent headings and omits the checklist.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/grok-review-output-resilience

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.

@logancsack
logancsack marked this pull request as ready for review July 31, 2026 17:01
@cursor

cursorBot commented Jul 31, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L labels Jul 31, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:7e10c7f86a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +189 to +193
.flatMap((finding) => {
const normalized = normalizeCandidateFinding(finding);
return normalized ? [normalized] : [];
})
.slice(0, MAX_REVIEW_FINDINGS);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Mark reviews partial when normalization drops findings

When a verifier returns a finding with a blank required text field, this filter silently removes it; the same helper also truncates outputs beyond 20 findings. Because the downstream partial calculation does not track either case, a response whose only finding is malformed can be reported as pass, and the later “Only the first 20...” limitation is unreachable. Preserve whether normalization discarded findings and use it to mark the report partial and disclose the omission.

Useful? React with 👍 / 👎.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/server/src/review/GrokReviewModel.ts`:
- Around line 219-235: Add focused tests for normalizeGrokReviewCandidate and
normalizeGrokReviewVerification that decode their outputs through the canonical
GrokReviewCandidate and GrokReviewVerification schemas. Use adversarial wire
inputs covering oversized text, null line fields, out-of-range confidence, and
oversized escalationReason, asserting the normalized results satisfy every
schema bound and filter.
- Line 65: Update the needsHighEffortReview schema definition to accept both
boolean and null values, matching the nullability of other optional wire fields.
Keep normalizeGrokReviewVerification unchanged because its existing nullish
fallback already converts null to false.
In `@apps/server/src/review/GrokReviewSwarm.test.ts`:
- Around line 393-441: Add focused tests alongside the existing “retries failed
medium verification at high effort” case in the GrokReviewSwarm test suite.
Cover both verification attempts failing and assert a GrokReviewError with
operation “GrokReviewSwarm.verify”; also cover successful medium verification
followed by failed high-effort escalation, asserting a partial report with
escalatedToHigh false and the limitation “High-effort escalation failed; the
medium-effort verification is shown.”
- Around line 381-387: Update the assertions in the report normalization test to
import and use the exported MAX_REVIEW_* bound constants instead of hard-coded
2_000, 8, and 240 values. Replace the summary length, coverage length, and
finding title length literals while preserving the existing assertions.
In `@apps/server/src/review/GrokReviewSwarm.ts`:
- Around line 262-332: Replace each repeated Effect.map plus Effect.catch
wrapper around runVerification in the medium and high-effort verification paths
with Effect.result. Preserve the existing tagged success/failure branching,
error propagation, verification assignment, and high-effort status flags while
using the result produced by Effect.result.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: b9d43dfd-4fdf-41cd-99b8-471a8175cf5d

📥 Commits

Reviewing files that changed from the base of the PR and between 2456a68 and 7e10c7f.

📒 Files selected for processing (3)
  • apps/server/src/review/GrokReviewModel.ts
  • apps/server/src/review/GrokReviewSwarm.test.ts
  • apps/server/src/review/GrokReviewSwarm.ts

Comment threadapps/server/src/review/GrokReviewModel.ts Outdated
Comment threadapps/server/src/review/GrokReviewModel.ts
Comment threadapps/server/src/review/GrokReviewSwarm.test.ts Outdated
Comment threadapps/server/src/review/GrokReviewSwarm.test.ts
Comment threadapps/server/src/review/GrokReviewSwarm.ts Outdated

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:fa089c4e02

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/server/src/review/GrokReviewSwarm.ts
@logancsack
logancsack merged commit dc811d3 into mainJul 31, 2026
12 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:Lvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@logancsack