Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action - #784

Merged
joryirving merged 1 commit into
mainfrom
foreman/wl-misospace-dispatch-771/issue-771
Aug 18, 2026
Merged

Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action#784
joryirving merged 1 commit into
mainfrom
foreman/wl-misospace-dispatch-771/issue-771

Conversation

@itsmiso-ai

Copy link
Copy Markdown
Contributor

Issue #771 implemented: routes BLOCKED PR-fix items into NEEDS_HUMAN lane and adds requeue action to return BLOCKED items to QUEUED. All changes are well-scoped, properly tested with 6 requeue tests covering edge cases (merged/closed PR, wrong status, not found), and no scope …

Fixes#771

Opened by foreman on review GO (workload wl-misospace-dispatch-771).

its-saffron[bot]

This comment was marked as outdated.

its-saffron[bot]

This comment was marked as outdated.

When a pr-fix item is marked BLOCKED after exhausting its attempts, the
mark path now also sets lane=NEEDS_HUMAN. The bridge already refuses to
action that lane (bridge/prfix.py ACTIONABLE_LANES), so this is purely a
visibility/bucketing change — the existing red NEEDS_HUMAN badge on the
queue page then reflects the items the loop has given up on.
Blocked items can now be returned to QUEUED with a single action:
* `requeuePrFixItem` in src/lib/pr-fix-queue.ts resets the row to
QUEUED + NORMAL and writes a `requeue` audit row, refusing when the
upstream PR is already merged or closed (consistent with
`classify_pr_lifecycle`).
* `POST /api/pr-fix-queue/requeue` exposes it to the UI/MCP.
* `requeue_pr_fix` MCP tool wraps the same call.
* A "Requeue" button on each BLOCKED row of
src/app/automation/pr-fix-queue/page.tsx triggers it; the page looks
up the current PR state and passes the merged/closed flag so the
refusal happens before the write.
Fixes#771
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

AI Automated Review

Full PR review.

Analysis engine: MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic) — routed smart (risk match: public_route_changes)

PR PR 784: Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action

Recommendation: Approve

This PR correctly implements issue PR 771's acceptance criteria: routing blocked items to NEEDS_HUMAN lane and providing a requeue action reachable from the UI.


Change-by-Change Findings

src/app/api/pr-fix-queue/requeue/route.ts (new endpoint)

  • Adds a POST /api/pr-fix-queue/requeue handler with standard authorizeRequest auth guard, JSON parsing, input validation via parseRequeuePrFixInput, and appropriate HTTP status codes (400, 401, 404).

src/lib/pr-fix-queue.ts (core logic)

  • markPrFixItem: Now sets lane = "NEEDS_HUMAN" when transitioning to BLOCKED, and lane = "NORMAL" when transitioning to QUEUED. The existing bridge ACTIONABLE_LANES filter will now skip these items, which is the intended behavior per the linked issue.
  • requeuePrFixItem: Pure DB function that transitions BLOCKED → QUEUED + NORMAL lane, resets attempt counter, and writes a requeue history row. Refuses if PR is already merged/closed.
  • parseRequeuePrFixInput: Validates required repo and pr fields with proper type checking.

src/app/automation/pr-fix-queue/page.tsx (UI)

  • Adds "Requeue" button on each BLOCKED row (line 162).
  • Client-side pre-flight check fetches /api/github/prs/{repo}/{pr} to detect merged/closed upstream PRs before calling requeue.

src/lib/mc-client.ts and src/mcp/server.ts

  • Exposes requeuePrFix as an MCP tool with full input schema, enabling programmatic requeue from agent tools.

Required Checks

✅ verify route access controls are in place

The new POST /api/pr-fix-queue/requeue route calls authorizeRequest(request) at line 7 and returns 401 Unauthorized when auth.authorized is false. This is the canonical auth pattern used across Dispatch API routes per the repository's auth conventions (AGENTS.md §Code Standards). The MCP tool routes through mc-client.ts which uses bearer token auth, consistent with the existing markPrFix tool and the DISPATCH_AGENT_TOKEN bearer pattern.

✅ check for unintended public endpoints

No new GET routes were added. The only new route is a POST handler with mandatory auth. No middleware changes or route configuration modifications appear in the diff. The requeue endpoint is gated behind authorizeRequest and cannot be reached anonymously.


Linked Issue Fit

Acceptance CriterionStatus
1. BLOCKED items land in NEEDS_HUMAN lane✅ Implemented in markPrFixItem (lines 215–219)
2. Blocked items can be returned to QUEUED with attempt reset✅ Implemented in requeuePrFixItem (lines 340–363)
3. Requeue action reachable from /automation/pr-fix-queue page✅ Button added to BLOCKED rows (line 162)
4. Requeueing writes an audit rowprFixHistory.create with action: "requeue" (line 355)
5. Refuse requeue when PR is merged or closed✅ Check in requeuePrFixItem (line 344) and client-side pre-flight (page.tsx line 67)

Tool Harness Findings

No tool harness output was provided; reviewing corpus directly.


Unknowns / Needs Verification

None. All acceptance criteria are directly verifiable from the diff. CI passed (Build, Typecheck, Tests, Lint, Docker Build, npm audit).


Standards Compliance

Per AGENTS.md conventions:

  • API routes return appropriate HTTP status codes: ✅ 401, 400, 404, 200/500
  • Error handling uses error instanceof Error pattern: ✅ err instanceof Error ? err.message : "Failed to requeue pr-fix item"
  • Validation before database operations: ✅ parseRequeuePrFixInput validates fields before calling requeuePrFixItem
  • No commit of secrets: ✅ No .env or credentials in diff

@joryirving
joryirving merged commit 8790ae7 into mainAug 18, 2026
7 checks passed
@joryirving
joryirving deleted the foreman/wl-misospace-dispatch-771/issue-771 branch August 18, 2026 02:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PR-fix items marked BLOCKED cannot be requeued: route them to NEEDS_HUMAN and add a requeue action

2 participants

@itsmiso-ai@joryirving
, '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

Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action - #784

Merged
joryirving merged 1 commit into
mainfrom
foreman/wl-misospace-dispatch-771/issue-771
Aug 18, 2026
Merged

Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action#784
joryirving merged 1 commit into
mainfrom
foreman/wl-misospace-dispatch-771/issue-771

Conversation

@itsmiso-ai

Copy link
Copy Markdown
Contributor

Issue #771 implemented: routes BLOCKED PR-fix items into NEEDS_HUMAN lane and adds requeue action to return BLOCKED items to QUEUED. All changes are well-scoped, properly tested with 6 requeue tests covering edge cases (merged/closed PR, wrong status, not found), and no scope …

Fixes#771

Opened by foreman on review GO (workload wl-misospace-dispatch-771).

its-saffron[bot]

This comment was marked as outdated.

its-saffron[bot]

This comment was marked as outdated.

When a pr-fix item is marked BLOCKED after exhausting its attempts, the
mark path now also sets lane=NEEDS_HUMAN. The bridge already refuses to
action that lane (bridge/prfix.py ACTIONABLE_LANES), so this is purely a
visibility/bucketing change — the existing red NEEDS_HUMAN badge on the
queue page then reflects the items the loop has given up on.
Blocked items can now be returned to QUEUED with a single action:
* `requeuePrFixItem` in src/lib/pr-fix-queue.ts resets the row to
QUEUED + NORMAL and writes a `requeue` audit row, refusing when the
upstream PR is already merged or closed (consistent with
`classify_pr_lifecycle`).
* `POST /api/pr-fix-queue/requeue` exposes it to the UI/MCP.
* `requeue_pr_fix` MCP tool wraps the same call.
* A "Requeue" button on each BLOCKED row of
src/app/automation/pr-fix-queue/page.tsx triggers it; the page looks
up the current PR state and passes the merged/closed flag so the
refusal happens before the write.
Fixes#771
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

AI Automated Review

Full PR review.

Analysis engine: MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic) — routed smart (risk match: public_route_changes)

PR PR 784: Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action

Recommendation: Approve

This PR correctly implements issue PR 771's acceptance criteria: routing blocked items to NEEDS_HUMAN lane and providing a requeue action reachable from the UI.


Change-by-Change Findings

src/app/api/pr-fix-queue/requeue/route.ts (new endpoint)

  • Adds a POST /api/pr-fix-queue/requeue handler with standard authorizeRequest auth guard, JSON parsing, input validation via parseRequeuePrFixInput, and appropriate HTTP status codes (400, 401, 404).

src/lib/pr-fix-queue.ts (core logic)

  • markPrFixItem: Now sets lane = "NEEDS_HUMAN" when transitioning to BLOCKED, and lane = "NORMAL" when transitioning to QUEUED. The existing bridge ACTIONABLE_LANES filter will now skip these items, which is the intended behavior per the linked issue.
  • requeuePrFixItem: Pure DB function that transitions BLOCKED → QUEUED + NORMAL lane, resets attempt counter, and writes a requeue history row. Refuses if PR is already merged/closed.
  • parseRequeuePrFixInput: Validates required repo and pr fields with proper type checking.

src/app/automation/pr-fix-queue/page.tsx (UI)

  • Adds "Requeue" button on each BLOCKED row (line 162).
  • Client-side pre-flight check fetches /api/github/prs/{repo}/{pr} to detect merged/closed upstream PRs before calling requeue.

src/lib/mc-client.ts and src/mcp/server.ts

  • Exposes requeuePrFix as an MCP tool with full input schema, enabling programmatic requeue from agent tools.

Required Checks

✅ verify route access controls are in place

The new POST /api/pr-fix-queue/requeue route calls authorizeRequest(request) at line 7 and returns 401 Unauthorized when auth.authorized is false. This is the canonical auth pattern used across Dispatch API routes per the repository's auth conventions (AGENTS.md §Code Standards). The MCP tool routes through mc-client.ts which uses bearer token auth, consistent with the existing markPrFix tool and the DISPATCH_AGENT_TOKEN bearer pattern.

✅ check for unintended public endpoints

No new GET routes were added. The only new route is a POST handler with mandatory auth. No middleware changes or route configuration modifications appear in the diff. The requeue endpoint is gated behind authorizeRequest and cannot be reached anonymously.


Linked Issue Fit

Acceptance CriterionStatus
1. BLOCKED items land in NEEDS_HUMAN lane✅ Implemented in markPrFixItem (lines 215–219)
2. Blocked items can be returned to QUEUED with attempt reset✅ Implemented in requeuePrFixItem (lines 340–363)
3. Requeue action reachable from /automation/pr-fix-queue page✅ Button added to BLOCKED rows (line 162)
4. Requeueing writes an audit rowprFixHistory.create with action: "requeue" (line 355)
5. Refuse requeue when PR is merged or closed✅ Check in requeuePrFixItem (line 344) and client-side pre-flight (page.tsx line 67)

Tool Harness Findings

No tool harness output was provided; reviewing corpus directly.


Unknowns / Needs Verification

None. All acceptance criteria are directly verifiable from the diff. CI passed (Build, Typecheck, Tests, Lint, Docker Build, npm audit).


Standards Compliance

Per AGENTS.md conventions:

  • API routes return appropriate HTTP status codes: ✅ 401, 400, 404, 200/500
  • Error handling uses error instanceof Error pattern: ✅ err instanceof Error ? err.message : "Failed to requeue pr-fix item"
  • Validation before database operations: ✅ parseRequeuePrFixInput validates fields before calling requeuePrFixItem
  • No commit of secrets: ✅ No .env or credentials in diff

@joryirving
joryirving merged commit 8790ae7 into mainAug 18, 2026
7 checks passed
@joryirving
joryirving deleted the foreman/wl-misospace-dispatch-771/issue-771 branch August 18, 2026 02:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PR-fix items marked BLOCKED cannot be requeued: route them to NEEDS_HUMAN and add a requeue action

2 participants

@itsmiso-ai@joryirving
, '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

Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action - #784

Merged
joryirving merged 1 commit into
mainfrom
foreman/wl-misospace-dispatch-771/issue-771
Aug 18, 2026
Merged

Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action#784
joryirving merged 1 commit into
mainfrom
foreman/wl-misospace-dispatch-771/issue-771

Conversation

@itsmiso-ai

Copy link
Copy Markdown
Contributor

Issue #771 implemented: routes BLOCKED PR-fix items into NEEDS_HUMAN lane and adds requeue action to return BLOCKED items to QUEUED. All changes are well-scoped, properly tested with 6 requeue tests covering edge cases (merged/closed PR, wrong status, not found), and no scope …

Fixes#771

Opened by foreman on review GO (workload wl-misospace-dispatch-771).

its-saffron[bot]

This comment was marked as outdated.

its-saffron[bot]

This comment was marked as outdated.

When a pr-fix item is marked BLOCKED after exhausting its attempts, the
mark path now also sets lane=NEEDS_HUMAN. The bridge already refuses to
action that lane (bridge/prfix.py ACTIONABLE_LANES), so this is purely a
visibility/bucketing change — the existing red NEEDS_HUMAN badge on the
queue page then reflects the items the loop has given up on.
Blocked items can now be returned to QUEUED with a single action:
* `requeuePrFixItem` in src/lib/pr-fix-queue.ts resets the row to
QUEUED + NORMAL and writes a `requeue` audit row, refusing when the
upstream PR is already merged or closed (consistent with
`classify_pr_lifecycle`).
* `POST /api/pr-fix-queue/requeue` exposes it to the UI/MCP.
* `requeue_pr_fix` MCP tool wraps the same call.
* A "Requeue" button on each BLOCKED row of
src/app/automation/pr-fix-queue/page.tsx triggers it; the page looks
up the current PR state and passes the merged/closed flag so the
refusal happens before the write.
Fixes#771
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

AI Automated Review

Full PR review.

Analysis engine: MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic) — routed smart (risk match: public_route_changes)

PR PR 784: Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action

Recommendation: Approve

This PR correctly implements issue PR 771's acceptance criteria: routing blocked items to NEEDS_HUMAN lane and providing a requeue action reachable from the UI.


Change-by-Change Findings

src/app/api/pr-fix-queue/requeue/route.ts (new endpoint)

  • Adds a POST /api/pr-fix-queue/requeue handler with standard authorizeRequest auth guard, JSON parsing, input validation via parseRequeuePrFixInput, and appropriate HTTP status codes (400, 401, 404).

src/lib/pr-fix-queue.ts (core logic)

  • markPrFixItem: Now sets lane = "NEEDS_HUMAN" when transitioning to BLOCKED, and lane = "NORMAL" when transitioning to QUEUED. The existing bridge ACTIONABLE_LANES filter will now skip these items, which is the intended behavior per the linked issue.
  • requeuePrFixItem: Pure DB function that transitions BLOCKED → QUEUED + NORMAL lane, resets attempt counter, and writes a requeue history row. Refuses if PR is already merged/closed.
  • parseRequeuePrFixInput: Validates required repo and pr fields with proper type checking.

src/app/automation/pr-fix-queue/page.tsx (UI)

  • Adds "Requeue" button on each BLOCKED row (line 162).
  • Client-side pre-flight check fetches /api/github/prs/{repo}/{pr} to detect merged/closed upstream PRs before calling requeue.

src/lib/mc-client.ts and src/mcp/server.ts

  • Exposes requeuePrFix as an MCP tool with full input schema, enabling programmatic requeue from agent tools.

Required Checks

✅ verify route access controls are in place

The new POST /api/pr-fix-queue/requeue route calls authorizeRequest(request) at line 7 and returns 401 Unauthorized when auth.authorized is false. This is the canonical auth pattern used across Dispatch API routes per the repository's auth conventions (AGENTS.md §Code Standards). The MCP tool routes through mc-client.ts which uses bearer token auth, consistent with the existing markPrFix tool and the DISPATCH_AGENT_TOKEN bearer pattern.

✅ check for unintended public endpoints

No new GET routes were added. The only new route is a POST handler with mandatory auth. No middleware changes or route configuration modifications appear in the diff. The requeue endpoint is gated behind authorizeRequest and cannot be reached anonymously.


Linked Issue Fit

Acceptance CriterionStatus
1. BLOCKED items land in NEEDS_HUMAN lane✅ Implemented in markPrFixItem (lines 215–219)
2. Blocked items can be returned to QUEUED with attempt reset✅ Implemented in requeuePrFixItem (lines 340–363)
3. Requeue action reachable from /automation/pr-fix-queue page✅ Button added to BLOCKED rows (line 162)
4. Requeueing writes an audit rowprFixHistory.create with action: "requeue" (line 355)
5. Refuse requeue when PR is merged or closed✅ Check in requeuePrFixItem (line 344) and client-side pre-flight (page.tsx line 67)

Tool Harness Findings

No tool harness output was provided; reviewing corpus directly.


Unknowns / Needs Verification

None. All acceptance criteria are directly verifiable from the diff. CI passed (Build, Typecheck, Tests, Lint, Docker Build, npm audit).


Standards Compliance

Per AGENTS.md conventions:

  • API routes return appropriate HTTP status codes: ✅ 401, 400, 404, 200/500
  • Error handling uses error instanceof Error pattern: ✅ err instanceof Error ? err.message : "Failed to requeue pr-fix item"
  • Validation before database operations: ✅ parseRequeuePrFixInput validates fields before calling requeuePrFixItem
  • No commit of secrets: ✅ No .env or credentials in diff

@joryirving
joryirving merged commit 8790ae7 into mainAug 18, 2026
7 checks passed
@joryirving
joryirving deleted the foreman/wl-misospace-dispatch-771/issue-771 branch August 18, 2026 02:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PR-fix items marked BLOCKED cannot be requeued: route them to NEEDS_HUMAN and add a requeue action

2 participants

@itsmiso-ai@joryirving
, '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

Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action - #784

Merged
joryirving merged 1 commit into
mainfrom
foreman/wl-misospace-dispatch-771/issue-771
Aug 18, 2026
Merged

Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action#784
joryirving merged 1 commit into
mainfrom
foreman/wl-misospace-dispatch-771/issue-771

Conversation

@itsmiso-ai

Copy link
Copy Markdown
Contributor

Issue #771 implemented: routes BLOCKED PR-fix items into NEEDS_HUMAN lane and adds requeue action to return BLOCKED items to QUEUED. All changes are well-scoped, properly tested with 6 requeue tests covering edge cases (merged/closed PR, wrong status, not found), and no scope …

Fixes#771

Opened by foreman on review GO (workload wl-misospace-dispatch-771).

its-saffron[bot]

This comment was marked as outdated.

its-saffron[bot]

This comment was marked as outdated.

When a pr-fix item is marked BLOCKED after exhausting its attempts, the
mark path now also sets lane=NEEDS_HUMAN. The bridge already refuses to
action that lane (bridge/prfix.py ACTIONABLE_LANES), so this is purely a
visibility/bucketing change — the existing red NEEDS_HUMAN badge on the
queue page then reflects the items the loop has given up on.
Blocked items can now be returned to QUEUED with a single action:
* `requeuePrFixItem` in src/lib/pr-fix-queue.ts resets the row to
QUEUED + NORMAL and writes a `requeue` audit row, refusing when the
upstream PR is already merged or closed (consistent with
`classify_pr_lifecycle`).
* `POST /api/pr-fix-queue/requeue` exposes it to the UI/MCP.
* `requeue_pr_fix` MCP tool wraps the same call.
* A "Requeue" button on each BLOCKED row of
src/app/automation/pr-fix-queue/page.tsx triggers it; the page looks
up the current PR state and passes the merged/closed flag so the
refusal happens before the write.
Fixes#771
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

AI Automated Review

Full PR review.

Analysis engine: MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic) — routed smart (risk match: public_route_changes)

PR PR 784: Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action

Recommendation: Approve

This PR correctly implements issue PR 771's acceptance criteria: routing blocked items to NEEDS_HUMAN lane and providing a requeue action reachable from the UI.


Change-by-Change Findings

src/app/api/pr-fix-queue/requeue/route.ts (new endpoint)

  • Adds a POST /api/pr-fix-queue/requeue handler with standard authorizeRequest auth guard, JSON parsing, input validation via parseRequeuePrFixInput, and appropriate HTTP status codes (400, 401, 404).

src/lib/pr-fix-queue.ts (core logic)

  • markPrFixItem: Now sets lane = "NEEDS_HUMAN" when transitioning to BLOCKED, and lane = "NORMAL" when transitioning to QUEUED. The existing bridge ACTIONABLE_LANES filter will now skip these items, which is the intended behavior per the linked issue.
  • requeuePrFixItem: Pure DB function that transitions BLOCKED → QUEUED + NORMAL lane, resets attempt counter, and writes a requeue history row. Refuses if PR is already merged/closed.
  • parseRequeuePrFixInput: Validates required repo and pr fields with proper type checking.

src/app/automation/pr-fix-queue/page.tsx (UI)

  • Adds "Requeue" button on each BLOCKED row (line 162).
  • Client-side pre-flight check fetches /api/github/prs/{repo}/{pr} to detect merged/closed upstream PRs before calling requeue.

src/lib/mc-client.ts and src/mcp/server.ts

  • Exposes requeuePrFix as an MCP tool with full input schema, enabling programmatic requeue from agent tools.

Required Checks

✅ verify route access controls are in place

The new POST /api/pr-fix-queue/requeue route calls authorizeRequest(request) at line 7 and returns 401 Unauthorized when auth.authorized is false. This is the canonical auth pattern used across Dispatch API routes per the repository's auth conventions (AGENTS.md §Code Standards). The MCP tool routes through mc-client.ts which uses bearer token auth, consistent with the existing markPrFix tool and the DISPATCH_AGENT_TOKEN bearer pattern.

✅ check for unintended public endpoints

No new GET routes were added. The only new route is a POST handler with mandatory auth. No middleware changes or route configuration modifications appear in the diff. The requeue endpoint is gated behind authorizeRequest and cannot be reached anonymously.


Linked Issue Fit

Acceptance CriterionStatus
1. BLOCKED items land in NEEDS_HUMAN lane✅ Implemented in markPrFixItem (lines 215–219)
2. Blocked items can be returned to QUEUED with attempt reset✅ Implemented in requeuePrFixItem (lines 340–363)
3. Requeue action reachable from /automation/pr-fix-queue page✅ Button added to BLOCKED rows (line 162)
4. Requeueing writes an audit rowprFixHistory.create with action: "requeue" (line 355)
5. Refuse requeue when PR is merged or closed✅ Check in requeuePrFixItem (line 344) and client-side pre-flight (page.tsx line 67)

Tool Harness Findings

No tool harness output was provided; reviewing corpus directly.


Unknowns / Needs Verification

None. All acceptance criteria are directly verifiable from the diff. CI passed (Build, Typecheck, Tests, Lint, Docker Build, npm audit).


Standards Compliance

Per AGENTS.md conventions:

  • API routes return appropriate HTTP status codes: ✅ 401, 400, 404, 200/500
  • Error handling uses error instanceof Error pattern: ✅ err instanceof Error ? err.message : "Failed to requeue pr-fix item"
  • Validation before database operations: ✅ parseRequeuePrFixInput validates fields before calling requeuePrFixItem
  • No commit of secrets: ✅ No .env or credentials in diff

@joryirving
joryirving merged commit 8790ae7 into mainAug 18, 2026
7 checks passed
@joryirving
joryirving deleted the foreman/wl-misospace-dispatch-771/issue-771 branch August 18, 2026 02:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PR-fix items marked BLOCKED cannot be requeued: route them to NEEDS_HUMAN and add a requeue action

2 participants

@itsmiso-ai@joryirving
, '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

Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action - #784

Merged
joryirving merged 1 commit into
mainfrom
foreman/wl-misospace-dispatch-771/issue-771
Aug 18, 2026
Merged

Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action#784
joryirving merged 1 commit into
mainfrom
foreman/wl-misospace-dispatch-771/issue-771

Conversation

@itsmiso-ai

Copy link
Copy Markdown
Contributor

Issue #771 implemented: routes BLOCKED PR-fix items into NEEDS_HUMAN lane and adds requeue action to return BLOCKED items to QUEUED. All changes are well-scoped, properly tested with 6 requeue tests covering edge cases (merged/closed PR, wrong status, not found), and no scope …

Fixes#771

Opened by foreman on review GO (workload wl-misospace-dispatch-771).

its-saffron[bot]

This comment was marked as outdated.

its-saffron[bot]

This comment was marked as outdated.

When a pr-fix item is marked BLOCKED after exhausting its attempts, the
mark path now also sets lane=NEEDS_HUMAN. The bridge already refuses to
action that lane (bridge/prfix.py ACTIONABLE_LANES), so this is purely a
visibility/bucketing change — the existing red NEEDS_HUMAN badge on the
queue page then reflects the items the loop has given up on.
Blocked items can now be returned to QUEUED with a single action:
* `requeuePrFixItem` in src/lib/pr-fix-queue.ts resets the row to
QUEUED + NORMAL and writes a `requeue` audit row, refusing when the
upstream PR is already merged or closed (consistent with
`classify_pr_lifecycle`).
* `POST /api/pr-fix-queue/requeue` exposes it to the UI/MCP.
* `requeue_pr_fix` MCP tool wraps the same call.
* A "Requeue" button on each BLOCKED row of
src/app/automation/pr-fix-queue/page.tsx triggers it; the page looks
up the current PR state and passes the merged/closed flag so the
refusal happens before the write.
Fixes#771
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

AI Automated Review

Full PR review.

Analysis engine: MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic) — routed smart (risk match: public_route_changes)

PR PR 784: Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action

Recommendation: Approve

This PR correctly implements issue PR 771's acceptance criteria: routing blocked items to NEEDS_HUMAN lane and providing a requeue action reachable from the UI.


Change-by-Change Findings

src/app/api/pr-fix-queue/requeue/route.ts (new endpoint)

  • Adds a POST /api/pr-fix-queue/requeue handler with standard authorizeRequest auth guard, JSON parsing, input validation via parseRequeuePrFixInput, and appropriate HTTP status codes (400, 401, 404).

src/lib/pr-fix-queue.ts (core logic)

  • markPrFixItem: Now sets lane = "NEEDS_HUMAN" when transitioning to BLOCKED, and lane = "NORMAL" when transitioning to QUEUED. The existing bridge ACTIONABLE_LANES filter will now skip these items, which is the intended behavior per the linked issue.
  • requeuePrFixItem: Pure DB function that transitions BLOCKED → QUEUED + NORMAL lane, resets attempt counter, and writes a requeue history row. Refuses if PR is already merged/closed.
  • parseRequeuePrFixInput: Validates required repo and pr fields with proper type checking.

src/app/automation/pr-fix-queue/page.tsx (UI)

  • Adds "Requeue" button on each BLOCKED row (line 162).
  • Client-side pre-flight check fetches /api/github/prs/{repo}/{pr} to detect merged/closed upstream PRs before calling requeue.

src/lib/mc-client.ts and src/mcp/server.ts

  • Exposes requeuePrFix as an MCP tool with full input schema, enabling programmatic requeue from agent tools.

Required Checks

✅ verify route access controls are in place

The new POST /api/pr-fix-queue/requeue route calls authorizeRequest(request) at line 7 and returns 401 Unauthorized when auth.authorized is false. This is the canonical auth pattern used across Dispatch API routes per the repository's auth conventions (AGENTS.md §Code Standards). The MCP tool routes through mc-client.ts which uses bearer token auth, consistent with the existing markPrFix tool and the DISPATCH_AGENT_TOKEN bearer pattern.

✅ check for unintended public endpoints

No new GET routes were added. The only new route is a POST handler with mandatory auth. No middleware changes or route configuration modifications appear in the diff. The requeue endpoint is gated behind authorizeRequest and cannot be reached anonymously.


Linked Issue Fit

Acceptance CriterionStatus
1. BLOCKED items land in NEEDS_HUMAN lane✅ Implemented in markPrFixItem (lines 215–219)
2. Blocked items can be returned to QUEUED with attempt reset✅ Implemented in requeuePrFixItem (lines 340–363)
3. Requeue action reachable from /automation/pr-fix-queue page✅ Button added to BLOCKED rows (line 162)
4. Requeueing writes an audit rowprFixHistory.create with action: "requeue" (line 355)
5. Refuse requeue when PR is merged or closed✅ Check in requeuePrFixItem (line 344) and client-side pre-flight (page.tsx line 67)

Tool Harness Findings

No tool harness output was provided; reviewing corpus directly.


Unknowns / Needs Verification

None. All acceptance criteria are directly verifiable from the diff. CI passed (Build, Typecheck, Tests, Lint, Docker Build, npm audit).


Standards Compliance

Per AGENTS.md conventions:

  • API routes return appropriate HTTP status codes: ✅ 401, 400, 404, 200/500
  • Error handling uses error instanceof Error pattern: ✅ err instanceof Error ? err.message : "Failed to requeue pr-fix item"
  • Validation before database operations: ✅ parseRequeuePrFixInput validates fields before calling requeuePrFixItem
  • No commit of secrets: ✅ No .env or credentials in diff

@joryirving
joryirving merged commit 8790ae7 into mainAug 18, 2026
7 checks passed
@joryirving
joryirving deleted the foreman/wl-misospace-dispatch-771/issue-771 branch August 18, 2026 02:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PR-fix items marked BLOCKED cannot be requeued: route them to NEEDS_HUMAN and add a requeue action

2 participants

@itsmiso-ai@joryirving
, '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

Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action - #784

Merged
joryirving merged 1 commit into
mainfrom
foreman/wl-misospace-dispatch-771/issue-771
Aug 18, 2026
Merged

Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action#784
joryirving merged 1 commit into
mainfrom
foreman/wl-misospace-dispatch-771/issue-771

Conversation

@itsmiso-ai

Copy link
Copy Markdown
Contributor

Issue #771 implemented: routes BLOCKED PR-fix items into NEEDS_HUMAN lane and adds requeue action to return BLOCKED items to QUEUED. All changes are well-scoped, properly tested with 6 requeue tests covering edge cases (merged/closed PR, wrong status, not found), and no scope …

Fixes#771

Opened by foreman on review GO (workload wl-misospace-dispatch-771).

its-saffron[bot]

This comment was marked as outdated.

its-saffron[bot]

This comment was marked as outdated.

When a pr-fix item is marked BLOCKED after exhausting its attempts, the
mark path now also sets lane=NEEDS_HUMAN. The bridge already refuses to
action that lane (bridge/prfix.py ACTIONABLE_LANES), so this is purely a
visibility/bucketing change — the existing red NEEDS_HUMAN badge on the
queue page then reflects the items the loop has given up on.
Blocked items can now be returned to QUEUED with a single action:
* `requeuePrFixItem` in src/lib/pr-fix-queue.ts resets the row to
QUEUED + NORMAL and writes a `requeue` audit row, refusing when the
upstream PR is already merged or closed (consistent with
`classify_pr_lifecycle`).
* `POST /api/pr-fix-queue/requeue` exposes it to the UI/MCP.
* `requeue_pr_fix` MCP tool wraps the same call.
* A "Requeue" button on each BLOCKED row of
src/app/automation/pr-fix-queue/page.tsx triggers it; the page looks
up the current PR state and passes the merged/closed flag so the
refusal happens before the write.
Fixes#771
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

AI Automated Review

Full PR review.

Analysis engine: MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic) — routed smart (risk match: public_route_changes)

PR PR 784: Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action

Recommendation: Approve

This PR correctly implements issue PR 771's acceptance criteria: routing blocked items to NEEDS_HUMAN lane and providing a requeue action reachable from the UI.


Change-by-Change Findings

src/app/api/pr-fix-queue/requeue/route.ts (new endpoint)

  • Adds a POST /api/pr-fix-queue/requeue handler with standard authorizeRequest auth guard, JSON parsing, input validation via parseRequeuePrFixInput, and appropriate HTTP status codes (400, 401, 404).

src/lib/pr-fix-queue.ts (core logic)

  • markPrFixItem: Now sets lane = "NEEDS_HUMAN" when transitioning to BLOCKED, and lane = "NORMAL" when transitioning to QUEUED. The existing bridge ACTIONABLE_LANES filter will now skip these items, which is the intended behavior per the linked issue.
  • requeuePrFixItem: Pure DB function that transitions BLOCKED → QUEUED + NORMAL lane, resets attempt counter, and writes a requeue history row. Refuses if PR is already merged/closed.
  • parseRequeuePrFixInput: Validates required repo and pr fields with proper type checking.

src/app/automation/pr-fix-queue/page.tsx (UI)

  • Adds "Requeue" button on each BLOCKED row (line 162).
  • Client-side pre-flight check fetches /api/github/prs/{repo}/{pr} to detect merged/closed upstream PRs before calling requeue.

src/lib/mc-client.ts and src/mcp/server.ts

  • Exposes requeuePrFix as an MCP tool with full input schema, enabling programmatic requeue from agent tools.

Required Checks

✅ verify route access controls are in place

The new POST /api/pr-fix-queue/requeue route calls authorizeRequest(request) at line 7 and returns 401 Unauthorized when auth.authorized is false. This is the canonical auth pattern used across Dispatch API routes per the repository's auth conventions (AGENTS.md §Code Standards). The MCP tool routes through mc-client.ts which uses bearer token auth, consistent with the existing markPrFix tool and the DISPATCH_AGENT_TOKEN bearer pattern.

✅ check for unintended public endpoints

No new GET routes were added. The only new route is a POST handler with mandatory auth. No middleware changes or route configuration modifications appear in the diff. The requeue endpoint is gated behind authorizeRequest and cannot be reached anonymously.


Linked Issue Fit

Acceptance CriterionStatus
1. BLOCKED items land in NEEDS_HUMAN lane✅ Implemented in markPrFixItem (lines 215–219)
2. Blocked items can be returned to QUEUED with attempt reset✅ Implemented in requeuePrFixItem (lines 340–363)
3. Requeue action reachable from /automation/pr-fix-queue page✅ Button added to BLOCKED rows (line 162)
4. Requeueing writes an audit rowprFixHistory.create with action: "requeue" (line 355)
5. Refuse requeue when PR is merged or closed✅ Check in requeuePrFixItem (line 344) and client-side pre-flight (page.tsx line 67)

Tool Harness Findings

No tool harness output was provided; reviewing corpus directly.


Unknowns / Needs Verification

None. All acceptance criteria are directly verifiable from the diff. CI passed (Build, Typecheck, Tests, Lint, Docker Build, npm audit).


Standards Compliance

Per AGENTS.md conventions:

  • API routes return appropriate HTTP status codes: ✅ 401, 400, 404, 200/500
  • Error handling uses error instanceof Error pattern: ✅ err instanceof Error ? err.message : "Failed to requeue pr-fix item"
  • Validation before database operations: ✅ parseRequeuePrFixInput validates fields before calling requeuePrFixItem
  • No commit of secrets: ✅ No .env or credentials in diff

@joryirving
joryirving merged commit 8790ae7 into mainAug 18, 2026
7 checks passed
@joryirving
joryirving deleted the foreman/wl-misospace-dispatch-771/issue-771 branch August 18, 2026 02:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PR-fix items marked BLOCKED cannot be requeued: route them to NEEDS_HUMAN and add a requeue action

2 participants

@itsmiso-ai@joryirving
, '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

Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action - #784

Merged
joryirving merged 1 commit into
mainfrom
foreman/wl-misospace-dispatch-771/issue-771
Aug 18, 2026
Merged

Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action#784
joryirving merged 1 commit into
mainfrom
foreman/wl-misospace-dispatch-771/issue-771

Conversation

@itsmiso-ai

Copy link
Copy Markdown
Contributor

Issue #771 implemented: routes BLOCKED PR-fix items into NEEDS_HUMAN lane and adds requeue action to return BLOCKED items to QUEUED. All changes are well-scoped, properly tested with 6 requeue tests covering edge cases (merged/closed PR, wrong status, not found), and no scope …

Fixes#771

Opened by foreman on review GO (workload wl-misospace-dispatch-771).

its-saffron[bot]

This comment was marked as outdated.

its-saffron[bot]

This comment was marked as outdated.

When a pr-fix item is marked BLOCKED after exhausting its attempts, the
mark path now also sets lane=NEEDS_HUMAN. The bridge already refuses to
action that lane (bridge/prfix.py ACTIONABLE_LANES), so this is purely a
visibility/bucketing change — the existing red NEEDS_HUMAN badge on the
queue page then reflects the items the loop has given up on.
Blocked items can now be returned to QUEUED with a single action:
* `requeuePrFixItem` in src/lib/pr-fix-queue.ts resets the row to
QUEUED + NORMAL and writes a `requeue` audit row, refusing when the
upstream PR is already merged or closed (consistent with
`classify_pr_lifecycle`).
* `POST /api/pr-fix-queue/requeue` exposes it to the UI/MCP.
* `requeue_pr_fix` MCP tool wraps the same call.
* A "Requeue" button on each BLOCKED row of
src/app/automation/pr-fix-queue/page.tsx triggers it; the page looks
up the current PR state and passes the merged/closed flag so the
refusal happens before the write.
Fixes#771
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

AI Automated Review

Full PR review.

Analysis engine: MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic) — routed smart (risk match: public_route_changes)

PR PR 784: Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action

Recommendation: Approve

This PR correctly implements issue PR 771's acceptance criteria: routing blocked items to NEEDS_HUMAN lane and providing a requeue action reachable from the UI.


Change-by-Change Findings

src/app/api/pr-fix-queue/requeue/route.ts (new endpoint)

  • Adds a POST /api/pr-fix-queue/requeue handler with standard authorizeRequest auth guard, JSON parsing, input validation via parseRequeuePrFixInput, and appropriate HTTP status codes (400, 401, 404).

src/lib/pr-fix-queue.ts (core logic)

  • markPrFixItem: Now sets lane = "NEEDS_HUMAN" when transitioning to BLOCKED, and lane = "NORMAL" when transitioning to QUEUED. The existing bridge ACTIONABLE_LANES filter will now skip these items, which is the intended behavior per the linked issue.
  • requeuePrFixItem: Pure DB function that transitions BLOCKED → QUEUED + NORMAL lane, resets attempt counter, and writes a requeue history row. Refuses if PR is already merged/closed.
  • parseRequeuePrFixInput: Validates required repo and pr fields with proper type checking.

src/app/automation/pr-fix-queue/page.tsx (UI)

  • Adds "Requeue" button on each BLOCKED row (line 162).
  • Client-side pre-flight check fetches /api/github/prs/{repo}/{pr} to detect merged/closed upstream PRs before calling requeue.

src/lib/mc-client.ts and src/mcp/server.ts

  • Exposes requeuePrFix as an MCP tool with full input schema, enabling programmatic requeue from agent tools.

Required Checks

✅ verify route access controls are in place

The new POST /api/pr-fix-queue/requeue route calls authorizeRequest(request) at line 7 and returns 401 Unauthorized when auth.authorized is false. This is the canonical auth pattern used across Dispatch API routes per the repository's auth conventions (AGENTS.md §Code Standards). The MCP tool routes through mc-client.ts which uses bearer token auth, consistent with the existing markPrFix tool and the DISPATCH_AGENT_TOKEN bearer pattern.

✅ check for unintended public endpoints

No new GET routes were added. The only new route is a POST handler with mandatory auth. No middleware changes or route configuration modifications appear in the diff. The requeue endpoint is gated behind authorizeRequest and cannot be reached anonymously.


Linked Issue Fit

Acceptance CriterionStatus
1. BLOCKED items land in NEEDS_HUMAN lane✅ Implemented in markPrFixItem (lines 215–219)
2. Blocked items can be returned to QUEUED with attempt reset✅ Implemented in requeuePrFixItem (lines 340–363)
3. Requeue action reachable from /automation/pr-fix-queue page✅ Button added to BLOCKED rows (line 162)
4. Requeueing writes an audit rowprFixHistory.create with action: "requeue" (line 355)
5. Refuse requeue when PR is merged or closed✅ Check in requeuePrFixItem (line 344) and client-side pre-flight (page.tsx line 67)

Tool Harness Findings

No tool harness output was provided; reviewing corpus directly.


Unknowns / Needs Verification

None. All acceptance criteria are directly verifiable from the diff. CI passed (Build, Typecheck, Tests, Lint, Docker Build, npm audit).


Standards Compliance

Per AGENTS.md conventions:

  • API routes return appropriate HTTP status codes: ✅ 401, 400, 404, 200/500
  • Error handling uses error instanceof Error pattern: ✅ err instanceof Error ? err.message : "Failed to requeue pr-fix item"
  • Validation before database operations: ✅ parseRequeuePrFixInput validates fields before calling requeuePrFixItem
  • No commit of secrets: ✅ No .env or credentials in diff

@joryirving
joryirving merged commit 8790ae7 into mainAug 18, 2026
7 checks passed
@joryirving
joryirving deleted the foreman/wl-misospace-dispatch-771/issue-771 branch August 18, 2026 02:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PR-fix items marked BLOCKED cannot be requeued: route them to NEEDS_HUMAN and add a requeue action

2 participants

@itsmiso-ai@joryirving
, '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

Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action - #784

Merged
joryirving merged 1 commit into
mainfrom
foreman/wl-misospace-dispatch-771/issue-771
Aug 18, 2026
Merged

Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action#784
joryirving merged 1 commit into
mainfrom
foreman/wl-misospace-dispatch-771/issue-771

Conversation

@itsmiso-ai

Copy link
Copy Markdown
Contributor

Issue #771 implemented: routes BLOCKED PR-fix items into NEEDS_HUMAN lane and adds requeue action to return BLOCKED items to QUEUED. All changes are well-scoped, properly tested with 6 requeue tests covering edge cases (merged/closed PR, wrong status, not found), and no scope …

Fixes#771

Opened by foreman on review GO (workload wl-misospace-dispatch-771).

its-saffron[bot]

This comment was marked as outdated.

its-saffron[bot]

This comment was marked as outdated.

When a pr-fix item is marked BLOCKED after exhausting its attempts, the
mark path now also sets lane=NEEDS_HUMAN. The bridge already refuses to
action that lane (bridge/prfix.py ACTIONABLE_LANES), so this is purely a
visibility/bucketing change — the existing red NEEDS_HUMAN badge on the
queue page then reflects the items the loop has given up on.
Blocked items can now be returned to QUEUED with a single action:
* `requeuePrFixItem` in src/lib/pr-fix-queue.ts resets the row to
QUEUED + NORMAL and writes a `requeue` audit row, refusing when the
upstream PR is already merged or closed (consistent with
`classify_pr_lifecycle`).
* `POST /api/pr-fix-queue/requeue` exposes it to the UI/MCP.
* `requeue_pr_fix` MCP tool wraps the same call.
* A "Requeue" button on each BLOCKED row of
src/app/automation/pr-fix-queue/page.tsx triggers it; the page looks
up the current PR state and passes the merged/closed flag so the
refusal happens before the write.
Fixes#771
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

AI Automated Review

Full PR review.

Analysis engine: MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic) — routed smart (risk match: public_route_changes)

PR PR 784: Route BLOCKED PR-fix items into NEEDS_HUMAN lane and add a requeue action

Recommendation: Approve

This PR correctly implements issue PR 771's acceptance criteria: routing blocked items to NEEDS_HUMAN lane and providing a requeue action reachable from the UI.


Change-by-Change Findings

src/app/api/pr-fix-queue/requeue/route.ts (new endpoint)

  • Adds a POST /api/pr-fix-queue/requeue handler with standard authorizeRequest auth guard, JSON parsing, input validation via parseRequeuePrFixInput, and appropriate HTTP status codes (400, 401, 404).

src/lib/pr-fix-queue.ts (core logic)

  • markPrFixItem: Now sets lane = "NEEDS_HUMAN" when transitioning to BLOCKED, and lane = "NORMAL" when transitioning to QUEUED. The existing bridge ACTIONABLE_LANES filter will now skip these items, which is the intended behavior per the linked issue.
  • requeuePrFixItem: Pure DB function that transitions BLOCKED → QUEUED + NORMAL lane, resets attempt counter, and writes a requeue history row. Refuses if PR is already merged/closed.
  • parseRequeuePrFixInput: Validates required repo and pr fields with proper type checking.

src/app/automation/pr-fix-queue/page.tsx (UI)

  • Adds "Requeue" button on each BLOCKED row (line 162).
  • Client-side pre-flight check fetches /api/github/prs/{repo}/{pr} to detect merged/closed upstream PRs before calling requeue.

src/lib/mc-client.ts and src/mcp/server.ts

  • Exposes requeuePrFix as an MCP tool with full input schema, enabling programmatic requeue from agent tools.

Required Checks

✅ verify route access controls are in place

The new POST /api/pr-fix-queue/requeue route calls authorizeRequest(request) at line 7 and returns 401 Unauthorized when auth.authorized is false. This is the canonical auth pattern used across Dispatch API routes per the repository's auth conventions (AGENTS.md §Code Standards). The MCP tool routes through mc-client.ts which uses bearer token auth, consistent with the existing markPrFix tool and the DISPATCH_AGENT_TOKEN bearer pattern.

✅ check for unintended public endpoints

No new GET routes were added. The only new route is a POST handler with mandatory auth. No middleware changes or route configuration modifications appear in the diff. The requeue endpoint is gated behind authorizeRequest and cannot be reached anonymously.


Linked Issue Fit

Acceptance CriterionStatus
1. BLOCKED items land in NEEDS_HUMAN lane✅ Implemented in markPrFixItem (lines 215–219)
2. Blocked items can be returned to QUEUED with attempt reset✅ Implemented in requeuePrFixItem (lines 340–363)
3. Requeue action reachable from /automation/pr-fix-queue page✅ Button added to BLOCKED rows (line 162)
4. Requeueing writes an audit rowprFixHistory.create with action: "requeue" (line 355)
5. Refuse requeue when PR is merged or closed✅ Check in requeuePrFixItem (line 344) and client-side pre-flight (page.tsx line 67)

Tool Harness Findings

No tool harness output was provided; reviewing corpus directly.


Unknowns / Needs Verification

None. All acceptance criteria are directly verifiable from the diff. CI passed (Build, Typecheck, Tests, Lint, Docker Build, npm audit).


Standards Compliance

Per AGENTS.md conventions:

  • API routes return appropriate HTTP status codes: ✅ 401, 400, 404, 200/500
  • Error handling uses error instanceof Error pattern: ✅ err instanceof Error ? err.message : "Failed to requeue pr-fix item"
  • Validation before database operations: ✅ parseRequeuePrFixInput validates fields before calling requeuePrFixItem
  • No commit of secrets: ✅ No .env or credentials in diff

@joryirving
joryirving merged commit 8790ae7 into mainAug 18, 2026
7 checks passed
@joryirving
joryirving deleted the foreman/wl-misospace-dispatch-771/issue-771 branch August 18, 2026 02:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PR-fix items marked BLOCKED cannot be requeued: route them to NEEDS_HUMAN and add a requeue action

2 participants

@itsmiso-ai@joryirving