fix: exclude status/backlog from default agent queue - #207

Merged
joryirving merged 1 commit into
mainfrom
fix/agent-queue-backlog-claimable
May 25, 2026
Merged

fix: exclude status/backlog from default agent queue#207
joryirving merged 1 commit into
mainfrom
fix/agent-queue-backlog-claimable

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Goal

Make the Dispatch agent queue contract match worker semantics: backlog is triage-only, ready is claimable.

Problem

Dispatch currently has two related but separate concepts:

  • execution lane: Issue.currentLane (normal, escalated, backlog)
  • lifecycle status labels: status/backlog, status/ready, status/in-progress, status/in-review, status/done

Workers are instructed that status/backlog is not claimable and should not be consumed. However, /api/agents/:agentName/queue currently returns status/backlog issues as actionable work because src/lib/agent-queue.ts treated backlog status as claimable.

This created a false-ready pipeline state: the queue was non-empty, crons stayed enabled, but workers skipped backlog items and reported the pipeline is clear.

Changes

  • Added claimable?: boolean field to RankedIssue interface — marks whether an issue is claimable work
  • Added claimableOnly?: boolean option to buildAgentQueue() — defaults to true, excluding status/backlog from the default queue
  • Backlog items are now marked claimable: false so UI/diagnostics can distinguish them from claimable work

Acceptance criteria

  • /api/agents/:agentName/queue?lane=normal does not present status/backlog issues as claimable work by default
  • Backlog items are excluded from default queues; returned as non-claimable only when claimableOnly=false
  • Worker prompts/API behavior no longer disagree about whether backlog is consumable
  • Tests cover ready, backlog, no-status, claimed, Renovate, and lane-filter combinations (56 tests in agent-queue.test.ts)

Testing

All 735 tests pass. Added 14 new tests for claimable-only behavior across lane/status combinations.

fixes#201

@its-miso

its-misoBot commented May 25, 2026

Copy link
Copy Markdown
Contributor

Automated recommendation: APPROVE

Analysis engine: MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic)

PR Review: fix: exclude status/backlog from default agent queue

Recommendation

Approve. This PR correctly fixes the agent queue contract mismatch where status/backlog issues were being returned as claimable work despite workers being instructed to skip them. The implementation adds a claimable field and claimableOnly option that aligns the API behavior with documented worker semantics.

Change-by-Change Findings

src/lib/agent-queue.ts (+13/-0)

  • Added claimable?: boolean to RankedIssue interface
  • Added claimableOnly?: boolean option to buildAgentQueue() with default true
  • Filters out status/backlog when claimableOnly=true (the default)
  • Sets claimable: true for all non-backlog issues in result mapping
  • Updated JSDoc to document the new default behavior

Quality: Clean implementation with proper null-safe defaulting (options?.claimableOnly ?? true). The filter logic executes after isActionable() but before agent/renovate filtering, correctly treating backlog exclusion as a claimability filter rather than an actionable filter.

src/lib/agent-queue.test.ts (+153/-13)

  • Updated existing tests to use claimableOnly: false where backlog inclusion is expected
  • Renamed priority tests to reflect actual behavior (in-progress over ready not ready over backlog)
  • Added 14 new tests in buildAgentQueue with claimable-only behavior describe block

Coverage: New tests cover:

  • Default exclusion of status/backlog (claimableOnly=true by default)
  • Explicit inclusion with claimableOnly=false
  • claimable: true for ready, in-progress, and no-status issues
  • claimable: false for backlog when returned as diagnostics
  • Cross-priority exclusion behavior
  • Integration with includeClaimed, includeRenovate, and lane filters
  • Lane=backlog edge case (returns nothing when claimableOnly=true)

src/app/api/agents/[agentName]/queue/route.test.ts (+7/-7)

  • Removed status/backlog label from test fixtures that should represent claimable work
  • Ensures API-level tests align with the library behavior

Standards Compliance

Compliant. Matches repository conventions from AGENTS.md:

"Agents pick status/ready issues — status/backlog and unlabeled issues need triage and are excluded from the default queue."

"By default, BACKLOG issues are excluded from the normal agent queue."

The PR correctly:

  • Distinguishes currentLane (execution lane: normal/escalated/backlog) from status/backlog (lifecycle label)
  • Excludes status/backlog from default claimable queues
  • Provides opt-in claimableOnly=false for diagnostics/UI use cases
  • Marks backlog items as claimable: false when included

Linked Issue Fit

Acceptance CriterionStatus
/api/agents/:agentName/queue?lane=normal does not present status/backlog issues as claimable work by default✅ Met
Backlog items are excluded or returned as non-claimable diagnostics✅ Met (via claimableOnly option)
Worker prompts/API behavior no longer disagree about whether backlog is consumable✅ Met
Tests cover ready, backlog, no-status, claimed, Renovate, and lane-filter combinations✅ Met (14 new tests added)

Issue #201 is fully addressed. The false-ready pipeline state described in the problem statement is resolved by the default claimableOnly=true behavior.

Evidence Provider Findings

No evidence providers configured.

Tool Harness Findings

No tool requests executed.

Unknowns / Needs Verification

  1. Test count discrepancy: PR body states "56 tests in agent-queue.test.ts" but the diff shows +153 additions which appears to add ~14 new tests. The existing test suite likely already had baseline tests; the new tests cover the claimable-only behavior specifically. This is consistent with the "All 735 tests pass" claim.

  2. Linked source fetches failed: Could not verify that issues Add Saffron Phase 1 runtime smoke checklist #52-56, fix: v0.2 migration blockers — queue fields, status endpoint, move auth, claim behavior #99 referenced in the test fixtures actually contain the expected data. However, test fixture changes are purely label removal (changing test expectations), not functional code changes, so this does not affect correctness.

Conclusion

This is a well-scoped bug fix that correctly aligns API behavior with documented worker contracts. The implementation is internally consistent, test coverage is comprehensive for the new behavior, and all acceptance criteria from the linked issue are satisfied.

@joryirving
joryirving merged commit e25c61f into mainMay 25, 2026
3 checks passed
@joryirving
joryirving deleted the fix/agent-queue-backlog-claimable branch May 25, 2026 16:24
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.

Fix agent queue contract for backlog vs ready work

1 participant

@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

fix: exclude status/backlog from default agent queue - #207

Merged
joryirving merged 1 commit into
mainfrom
fix/agent-queue-backlog-claimable
May 25, 2026
Merged

fix: exclude status/backlog from default agent queue#207
joryirving merged 1 commit into
mainfrom
fix/agent-queue-backlog-claimable

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Goal

Make the Dispatch agent queue contract match worker semantics: backlog is triage-only, ready is claimable.

Problem

Dispatch currently has two related but separate concepts:

  • execution lane: Issue.currentLane (normal, escalated, backlog)
  • lifecycle status labels: status/backlog, status/ready, status/in-progress, status/in-review, status/done

Workers are instructed that status/backlog is not claimable and should not be consumed. However, /api/agents/:agentName/queue currently returns status/backlog issues as actionable work because src/lib/agent-queue.ts treated backlog status as claimable.

This created a false-ready pipeline state: the queue was non-empty, crons stayed enabled, but workers skipped backlog items and reported the pipeline is clear.

Changes

  • Added claimable?: boolean field to RankedIssue interface — marks whether an issue is claimable work
  • Added claimableOnly?: boolean option to buildAgentQueue() — defaults to true, excluding status/backlog from the default queue
  • Backlog items are now marked claimable: false so UI/diagnostics can distinguish them from claimable work

Acceptance criteria

  • /api/agents/:agentName/queue?lane=normal does not present status/backlog issues as claimable work by default
  • Backlog items are excluded from default queues; returned as non-claimable only when claimableOnly=false
  • Worker prompts/API behavior no longer disagree about whether backlog is consumable
  • Tests cover ready, backlog, no-status, claimed, Renovate, and lane-filter combinations (56 tests in agent-queue.test.ts)

Testing

All 735 tests pass. Added 14 new tests for claimable-only behavior across lane/status combinations.

fixes#201

@its-miso

its-misoBot commented May 25, 2026

Copy link
Copy Markdown
Contributor

Automated recommendation: APPROVE

Analysis engine: MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic)

PR Review: fix: exclude status/backlog from default agent queue

Recommendation

Approve. This PR correctly fixes the agent queue contract mismatch where status/backlog issues were being returned as claimable work despite workers being instructed to skip them. The implementation adds a claimable field and claimableOnly option that aligns the API behavior with documented worker semantics.

Change-by-Change Findings

src/lib/agent-queue.ts (+13/-0)

  • Added claimable?: boolean to RankedIssue interface
  • Added claimableOnly?: boolean option to buildAgentQueue() with default true
  • Filters out status/backlog when claimableOnly=true (the default)
  • Sets claimable: true for all non-backlog issues in result mapping
  • Updated JSDoc to document the new default behavior

Quality: Clean implementation with proper null-safe defaulting (options?.claimableOnly ?? true). The filter logic executes after isActionable() but before agent/renovate filtering, correctly treating backlog exclusion as a claimability filter rather than an actionable filter.

src/lib/agent-queue.test.ts (+153/-13)

  • Updated existing tests to use claimableOnly: false where backlog inclusion is expected
  • Renamed priority tests to reflect actual behavior (in-progress over ready not ready over backlog)
  • Added 14 new tests in buildAgentQueue with claimable-only behavior describe block

Coverage: New tests cover:

  • Default exclusion of status/backlog (claimableOnly=true by default)
  • Explicit inclusion with claimableOnly=false
  • claimable: true for ready, in-progress, and no-status issues
  • claimable: false for backlog when returned as diagnostics
  • Cross-priority exclusion behavior
  • Integration with includeClaimed, includeRenovate, and lane filters
  • Lane=backlog edge case (returns nothing when claimableOnly=true)

src/app/api/agents/[agentName]/queue/route.test.ts (+7/-7)

  • Removed status/backlog label from test fixtures that should represent claimable work
  • Ensures API-level tests align with the library behavior

Standards Compliance

Compliant. Matches repository conventions from AGENTS.md:

"Agents pick status/ready issues — status/backlog and unlabeled issues need triage and are excluded from the default queue."

"By default, BACKLOG issues are excluded from the normal agent queue."

The PR correctly:

  • Distinguishes currentLane (execution lane: normal/escalated/backlog) from status/backlog (lifecycle label)
  • Excludes status/backlog from default claimable queues
  • Provides opt-in claimableOnly=false for diagnostics/UI use cases
  • Marks backlog items as claimable: false when included

Linked Issue Fit

Acceptance CriterionStatus
/api/agents/:agentName/queue?lane=normal does not present status/backlog issues as claimable work by default✅ Met
Backlog items are excluded or returned as non-claimable diagnostics✅ Met (via claimableOnly option)
Worker prompts/API behavior no longer disagree about whether backlog is consumable✅ Met
Tests cover ready, backlog, no-status, claimed, Renovate, and lane-filter combinations✅ Met (14 new tests added)

Issue #201 is fully addressed. The false-ready pipeline state described in the problem statement is resolved by the default claimableOnly=true behavior.

Evidence Provider Findings

No evidence providers configured.

Tool Harness Findings

No tool requests executed.

Unknowns / Needs Verification

  1. Test count discrepancy: PR body states "56 tests in agent-queue.test.ts" but the diff shows +153 additions which appears to add ~14 new tests. The existing test suite likely already had baseline tests; the new tests cover the claimable-only behavior specifically. This is consistent with the "All 735 tests pass" claim.

  2. Linked source fetches failed: Could not verify that issues Add Saffron Phase 1 runtime smoke checklist #52-56, fix: v0.2 migration blockers — queue fields, status endpoint, move auth, claim behavior #99 referenced in the test fixtures actually contain the expected data. However, test fixture changes are purely label removal (changing test expectations), not functional code changes, so this does not affect correctness.

Conclusion

This is a well-scoped bug fix that correctly aligns API behavior with documented worker contracts. The implementation is internally consistent, test coverage is comprehensive for the new behavior, and all acceptance criteria from the linked issue are satisfied.

@joryirving
joryirving merged commit e25c61f into mainMay 25, 2026
3 checks passed
@joryirving
joryirving deleted the fix/agent-queue-backlog-claimable branch May 25, 2026 16:24
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.

Fix agent queue contract for backlog vs ready work

1 participant

@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

fix: exclude status/backlog from default agent queue - #207

Merged
joryirving merged 1 commit into
mainfrom
fix/agent-queue-backlog-claimable
May 25, 2026
Merged

fix: exclude status/backlog from default agent queue#207
joryirving merged 1 commit into
mainfrom
fix/agent-queue-backlog-claimable

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Goal

Make the Dispatch agent queue contract match worker semantics: backlog is triage-only, ready is claimable.

Problem

Dispatch currently has two related but separate concepts:

  • execution lane: Issue.currentLane (normal, escalated, backlog)
  • lifecycle status labels: status/backlog, status/ready, status/in-progress, status/in-review, status/done

Workers are instructed that status/backlog is not claimable and should not be consumed. However, /api/agents/:agentName/queue currently returns status/backlog issues as actionable work because src/lib/agent-queue.ts treated backlog status as claimable.

This created a false-ready pipeline state: the queue was non-empty, crons stayed enabled, but workers skipped backlog items and reported the pipeline is clear.

Changes

  • Added claimable?: boolean field to RankedIssue interface — marks whether an issue is claimable work
  • Added claimableOnly?: boolean option to buildAgentQueue() — defaults to true, excluding status/backlog from the default queue
  • Backlog items are now marked claimable: false so UI/diagnostics can distinguish them from claimable work

Acceptance criteria

  • /api/agents/:agentName/queue?lane=normal does not present status/backlog issues as claimable work by default
  • Backlog items are excluded from default queues; returned as non-claimable only when claimableOnly=false
  • Worker prompts/API behavior no longer disagree about whether backlog is consumable
  • Tests cover ready, backlog, no-status, claimed, Renovate, and lane-filter combinations (56 tests in agent-queue.test.ts)

Testing

All 735 tests pass. Added 14 new tests for claimable-only behavior across lane/status combinations.

fixes#201

@its-miso

its-misoBot commented May 25, 2026

Copy link
Copy Markdown
Contributor

Automated recommendation: APPROVE

Analysis engine: MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic)

PR Review: fix: exclude status/backlog from default agent queue

Recommendation

Approve. This PR correctly fixes the agent queue contract mismatch where status/backlog issues were being returned as claimable work despite workers being instructed to skip them. The implementation adds a claimable field and claimableOnly option that aligns the API behavior with documented worker semantics.

Change-by-Change Findings

src/lib/agent-queue.ts (+13/-0)

  • Added claimable?: boolean to RankedIssue interface
  • Added claimableOnly?: boolean option to buildAgentQueue() with default true
  • Filters out status/backlog when claimableOnly=true (the default)
  • Sets claimable: true for all non-backlog issues in result mapping
  • Updated JSDoc to document the new default behavior

Quality: Clean implementation with proper null-safe defaulting (options?.claimableOnly ?? true). The filter logic executes after isActionable() but before agent/renovate filtering, correctly treating backlog exclusion as a claimability filter rather than an actionable filter.

src/lib/agent-queue.test.ts (+153/-13)

  • Updated existing tests to use claimableOnly: false where backlog inclusion is expected
  • Renamed priority tests to reflect actual behavior (in-progress over ready not ready over backlog)
  • Added 14 new tests in buildAgentQueue with claimable-only behavior describe block

Coverage: New tests cover:

  • Default exclusion of status/backlog (claimableOnly=true by default)
  • Explicit inclusion with claimableOnly=false
  • claimable: true for ready, in-progress, and no-status issues
  • claimable: false for backlog when returned as diagnostics
  • Cross-priority exclusion behavior
  • Integration with includeClaimed, includeRenovate, and lane filters
  • Lane=backlog edge case (returns nothing when claimableOnly=true)

src/app/api/agents/[agentName]/queue/route.test.ts (+7/-7)

  • Removed status/backlog label from test fixtures that should represent claimable work
  • Ensures API-level tests align with the library behavior

Standards Compliance

Compliant. Matches repository conventions from AGENTS.md:

"Agents pick status/ready issues — status/backlog and unlabeled issues need triage and are excluded from the default queue."

"By default, BACKLOG issues are excluded from the normal agent queue."

The PR correctly:

  • Distinguishes currentLane (execution lane: normal/escalated/backlog) from status/backlog (lifecycle label)
  • Excludes status/backlog from default claimable queues
  • Provides opt-in claimableOnly=false for diagnostics/UI use cases
  • Marks backlog items as claimable: false when included

Linked Issue Fit

Acceptance CriterionStatus
/api/agents/:agentName/queue?lane=normal does not present status/backlog issues as claimable work by default✅ Met
Backlog items are excluded or returned as non-claimable diagnostics✅ Met (via claimableOnly option)
Worker prompts/API behavior no longer disagree about whether backlog is consumable✅ Met
Tests cover ready, backlog, no-status, claimed, Renovate, and lane-filter combinations✅ Met (14 new tests added)

Issue #201 is fully addressed. The false-ready pipeline state described in the problem statement is resolved by the default claimableOnly=true behavior.

Evidence Provider Findings

No evidence providers configured.

Tool Harness Findings

No tool requests executed.

Unknowns / Needs Verification

  1. Test count discrepancy: PR body states "56 tests in agent-queue.test.ts" but the diff shows +153 additions which appears to add ~14 new tests. The existing test suite likely already had baseline tests; the new tests cover the claimable-only behavior specifically. This is consistent with the "All 735 tests pass" claim.

  2. Linked source fetches failed: Could not verify that issues Add Saffron Phase 1 runtime smoke checklist #52-56, fix: v0.2 migration blockers — queue fields, status endpoint, move auth, claim behavior #99 referenced in the test fixtures actually contain the expected data. However, test fixture changes are purely label removal (changing test expectations), not functional code changes, so this does not affect correctness.

Conclusion

This is a well-scoped bug fix that correctly aligns API behavior with documented worker contracts. The implementation is internally consistent, test coverage is comprehensive for the new behavior, and all acceptance criteria from the linked issue are satisfied.

@joryirving
joryirving merged commit e25c61f into mainMay 25, 2026
3 checks passed
@joryirving
joryirving deleted the fix/agent-queue-backlog-claimable branch May 25, 2026 16:24
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.

Fix agent queue contract for backlog vs ready work

1 participant

@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

fix: exclude status/backlog from default agent queue - #207

Merged
joryirving merged 1 commit into
mainfrom
fix/agent-queue-backlog-claimable
May 25, 2026
Merged

fix: exclude status/backlog from default agent queue#207
joryirving merged 1 commit into
mainfrom
fix/agent-queue-backlog-claimable

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Goal

Make the Dispatch agent queue contract match worker semantics: backlog is triage-only, ready is claimable.

Problem

Dispatch currently has two related but separate concepts:

  • execution lane: Issue.currentLane (normal, escalated, backlog)
  • lifecycle status labels: status/backlog, status/ready, status/in-progress, status/in-review, status/done

Workers are instructed that status/backlog is not claimable and should not be consumed. However, /api/agents/:agentName/queue currently returns status/backlog issues as actionable work because src/lib/agent-queue.ts treated backlog status as claimable.

This created a false-ready pipeline state: the queue was non-empty, crons stayed enabled, but workers skipped backlog items and reported the pipeline is clear.

Changes

  • Added claimable?: boolean field to RankedIssue interface — marks whether an issue is claimable work
  • Added claimableOnly?: boolean option to buildAgentQueue() — defaults to true, excluding status/backlog from the default queue
  • Backlog items are now marked claimable: false so UI/diagnostics can distinguish them from claimable work

Acceptance criteria

  • /api/agents/:agentName/queue?lane=normal does not present status/backlog issues as claimable work by default
  • Backlog items are excluded from default queues; returned as non-claimable only when claimableOnly=false
  • Worker prompts/API behavior no longer disagree about whether backlog is consumable
  • Tests cover ready, backlog, no-status, claimed, Renovate, and lane-filter combinations (56 tests in agent-queue.test.ts)

Testing

All 735 tests pass. Added 14 new tests for claimable-only behavior across lane/status combinations.

fixes#201

@its-miso

its-misoBot commented May 25, 2026

Copy link
Copy Markdown
Contributor

Automated recommendation: APPROVE

Analysis engine: MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic)

PR Review: fix: exclude status/backlog from default agent queue

Recommendation

Approve. This PR correctly fixes the agent queue contract mismatch where status/backlog issues were being returned as claimable work despite workers being instructed to skip them. The implementation adds a claimable field and claimableOnly option that aligns the API behavior with documented worker semantics.

Change-by-Change Findings

src/lib/agent-queue.ts (+13/-0)

  • Added claimable?: boolean to RankedIssue interface
  • Added claimableOnly?: boolean option to buildAgentQueue() with default true
  • Filters out status/backlog when claimableOnly=true (the default)
  • Sets claimable: true for all non-backlog issues in result mapping
  • Updated JSDoc to document the new default behavior

Quality: Clean implementation with proper null-safe defaulting (options?.claimableOnly ?? true). The filter logic executes after isActionable() but before agent/renovate filtering, correctly treating backlog exclusion as a claimability filter rather than an actionable filter.

src/lib/agent-queue.test.ts (+153/-13)

  • Updated existing tests to use claimableOnly: false where backlog inclusion is expected
  • Renamed priority tests to reflect actual behavior (in-progress over ready not ready over backlog)
  • Added 14 new tests in buildAgentQueue with claimable-only behavior describe block

Coverage: New tests cover:

  • Default exclusion of status/backlog (claimableOnly=true by default)
  • Explicit inclusion with claimableOnly=false
  • claimable: true for ready, in-progress, and no-status issues
  • claimable: false for backlog when returned as diagnostics
  • Cross-priority exclusion behavior
  • Integration with includeClaimed, includeRenovate, and lane filters
  • Lane=backlog edge case (returns nothing when claimableOnly=true)

src/app/api/agents/[agentName]/queue/route.test.ts (+7/-7)

  • Removed status/backlog label from test fixtures that should represent claimable work
  • Ensures API-level tests align with the library behavior

Standards Compliance

Compliant. Matches repository conventions from AGENTS.md:

"Agents pick status/ready issues — status/backlog and unlabeled issues need triage and are excluded from the default queue."

"By default, BACKLOG issues are excluded from the normal agent queue."

The PR correctly:

  • Distinguishes currentLane (execution lane: normal/escalated/backlog) from status/backlog (lifecycle label)
  • Excludes status/backlog from default claimable queues
  • Provides opt-in claimableOnly=false for diagnostics/UI use cases
  • Marks backlog items as claimable: false when included

Linked Issue Fit

Acceptance CriterionStatus
/api/agents/:agentName/queue?lane=normal does not present status/backlog issues as claimable work by default✅ Met
Backlog items are excluded or returned as non-claimable diagnostics✅ Met (via claimableOnly option)
Worker prompts/API behavior no longer disagree about whether backlog is consumable✅ Met
Tests cover ready, backlog, no-status, claimed, Renovate, and lane-filter combinations✅ Met (14 new tests added)

Issue #201 is fully addressed. The false-ready pipeline state described in the problem statement is resolved by the default claimableOnly=true behavior.

Evidence Provider Findings

No evidence providers configured.

Tool Harness Findings

No tool requests executed.

Unknowns / Needs Verification

  1. Test count discrepancy: PR body states "56 tests in agent-queue.test.ts" but the diff shows +153 additions which appears to add ~14 new tests. The existing test suite likely already had baseline tests; the new tests cover the claimable-only behavior specifically. This is consistent with the "All 735 tests pass" claim.

  2. Linked source fetches failed: Could not verify that issues Add Saffron Phase 1 runtime smoke checklist #52-56, fix: v0.2 migration blockers — queue fields, status endpoint, move auth, claim behavior #99 referenced in the test fixtures actually contain the expected data. However, test fixture changes are purely label removal (changing test expectations), not functional code changes, so this does not affect correctness.

Conclusion

This is a well-scoped bug fix that correctly aligns API behavior with documented worker contracts. The implementation is internally consistent, test coverage is comprehensive for the new behavior, and all acceptance criteria from the linked issue are satisfied.

@joryirving
joryirving merged commit e25c61f into mainMay 25, 2026
3 checks passed
@joryirving
joryirving deleted the fix/agent-queue-backlog-claimable branch May 25, 2026 16:24
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.

Fix agent queue contract for backlog vs ready work

1 participant

@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

fix: exclude status/backlog from default agent queue - #207

Merged
joryirving merged 1 commit into
mainfrom
fix/agent-queue-backlog-claimable
May 25, 2026
Merged

fix: exclude status/backlog from default agent queue#207
joryirving merged 1 commit into
mainfrom
fix/agent-queue-backlog-claimable

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Goal

Make the Dispatch agent queue contract match worker semantics: backlog is triage-only, ready is claimable.

Problem

Dispatch currently has two related but separate concepts:

  • execution lane: Issue.currentLane (normal, escalated, backlog)
  • lifecycle status labels: status/backlog, status/ready, status/in-progress, status/in-review, status/done

Workers are instructed that status/backlog is not claimable and should not be consumed. However, /api/agents/:agentName/queue currently returns status/backlog issues as actionable work because src/lib/agent-queue.ts treated backlog status as claimable.

This created a false-ready pipeline state: the queue was non-empty, crons stayed enabled, but workers skipped backlog items and reported the pipeline is clear.

Changes

  • Added claimable?: boolean field to RankedIssue interface — marks whether an issue is claimable work
  • Added claimableOnly?: boolean option to buildAgentQueue() — defaults to true, excluding status/backlog from the default queue
  • Backlog items are now marked claimable: false so UI/diagnostics can distinguish them from claimable work

Acceptance criteria

  • /api/agents/:agentName/queue?lane=normal does not present status/backlog issues as claimable work by default
  • Backlog items are excluded from default queues; returned as non-claimable only when claimableOnly=false
  • Worker prompts/API behavior no longer disagree about whether backlog is consumable
  • Tests cover ready, backlog, no-status, claimed, Renovate, and lane-filter combinations (56 tests in agent-queue.test.ts)

Testing

All 735 tests pass. Added 14 new tests for claimable-only behavior across lane/status combinations.

fixes#201

@its-miso

its-misoBot commented May 25, 2026

Copy link
Copy Markdown
Contributor

Automated recommendation: APPROVE

Analysis engine: MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic)

PR Review: fix: exclude status/backlog from default agent queue

Recommendation

Approve. This PR correctly fixes the agent queue contract mismatch where status/backlog issues were being returned as claimable work despite workers being instructed to skip them. The implementation adds a claimable field and claimableOnly option that aligns the API behavior with documented worker semantics.

Change-by-Change Findings

src/lib/agent-queue.ts (+13/-0)

  • Added claimable?: boolean to RankedIssue interface
  • Added claimableOnly?: boolean option to buildAgentQueue() with default true
  • Filters out status/backlog when claimableOnly=true (the default)
  • Sets claimable: true for all non-backlog issues in result mapping
  • Updated JSDoc to document the new default behavior

Quality: Clean implementation with proper null-safe defaulting (options?.claimableOnly ?? true). The filter logic executes after isActionable() but before agent/renovate filtering, correctly treating backlog exclusion as a claimability filter rather than an actionable filter.

src/lib/agent-queue.test.ts (+153/-13)

  • Updated existing tests to use claimableOnly: false where backlog inclusion is expected
  • Renamed priority tests to reflect actual behavior (in-progress over ready not ready over backlog)
  • Added 14 new tests in buildAgentQueue with claimable-only behavior describe block

Coverage: New tests cover:

  • Default exclusion of status/backlog (claimableOnly=true by default)
  • Explicit inclusion with claimableOnly=false
  • claimable: true for ready, in-progress, and no-status issues
  • claimable: false for backlog when returned as diagnostics
  • Cross-priority exclusion behavior
  • Integration with includeClaimed, includeRenovate, and lane filters
  • Lane=backlog edge case (returns nothing when claimableOnly=true)

src/app/api/agents/[agentName]/queue/route.test.ts (+7/-7)

  • Removed status/backlog label from test fixtures that should represent claimable work
  • Ensures API-level tests align with the library behavior

Standards Compliance

Compliant. Matches repository conventions from AGENTS.md:

"Agents pick status/ready issues — status/backlog and unlabeled issues need triage and are excluded from the default queue."

"By default, BACKLOG issues are excluded from the normal agent queue."

The PR correctly:

  • Distinguishes currentLane (execution lane: normal/escalated/backlog) from status/backlog (lifecycle label)
  • Excludes status/backlog from default claimable queues
  • Provides opt-in claimableOnly=false for diagnostics/UI use cases
  • Marks backlog items as claimable: false when included

Linked Issue Fit

Acceptance CriterionStatus
/api/agents/:agentName/queue?lane=normal does not present status/backlog issues as claimable work by default✅ Met
Backlog items are excluded or returned as non-claimable diagnostics✅ Met (via claimableOnly option)
Worker prompts/API behavior no longer disagree about whether backlog is consumable✅ Met
Tests cover ready, backlog, no-status, claimed, Renovate, and lane-filter combinations✅ Met (14 new tests added)

Issue #201 is fully addressed. The false-ready pipeline state described in the problem statement is resolved by the default claimableOnly=true behavior.

Evidence Provider Findings

No evidence providers configured.

Tool Harness Findings

No tool requests executed.

Unknowns / Needs Verification

  1. Test count discrepancy: PR body states "56 tests in agent-queue.test.ts" but the diff shows +153 additions which appears to add ~14 new tests. The existing test suite likely already had baseline tests; the new tests cover the claimable-only behavior specifically. This is consistent with the "All 735 tests pass" claim.

  2. Linked source fetches failed: Could not verify that issues Add Saffron Phase 1 runtime smoke checklist #52-56, fix: v0.2 migration blockers — queue fields, status endpoint, move auth, claim behavior #99 referenced in the test fixtures actually contain the expected data. However, test fixture changes are purely label removal (changing test expectations), not functional code changes, so this does not affect correctness.

Conclusion

This is a well-scoped bug fix that correctly aligns API behavior with documented worker contracts. The implementation is internally consistent, test coverage is comprehensive for the new behavior, and all acceptance criteria from the linked issue are satisfied.

@joryirving
joryirving merged commit e25c61f into mainMay 25, 2026
3 checks passed
@joryirving
joryirving deleted the fix/agent-queue-backlog-claimable branch May 25, 2026 16:24
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.

Fix agent queue contract for backlog vs ready work

1 participant

@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

fix: exclude status/backlog from default agent queue - #207

Merged
joryirving merged 1 commit into
mainfrom
fix/agent-queue-backlog-claimable
May 25, 2026
Merged

fix: exclude status/backlog from default agent queue#207
joryirving merged 1 commit into
mainfrom
fix/agent-queue-backlog-claimable

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Goal

Make the Dispatch agent queue contract match worker semantics: backlog is triage-only, ready is claimable.

Problem

Dispatch currently has two related but separate concepts:

  • execution lane: Issue.currentLane (normal, escalated, backlog)
  • lifecycle status labels: status/backlog, status/ready, status/in-progress, status/in-review, status/done

Workers are instructed that status/backlog is not claimable and should not be consumed. However, /api/agents/:agentName/queue currently returns status/backlog issues as actionable work because src/lib/agent-queue.ts treated backlog status as claimable.

This created a false-ready pipeline state: the queue was non-empty, crons stayed enabled, but workers skipped backlog items and reported the pipeline is clear.

Changes

  • Added claimable?: boolean field to RankedIssue interface — marks whether an issue is claimable work
  • Added claimableOnly?: boolean option to buildAgentQueue() — defaults to true, excluding status/backlog from the default queue
  • Backlog items are now marked claimable: false so UI/diagnostics can distinguish them from claimable work

Acceptance criteria

  • /api/agents/:agentName/queue?lane=normal does not present status/backlog issues as claimable work by default
  • Backlog items are excluded from default queues; returned as non-claimable only when claimableOnly=false
  • Worker prompts/API behavior no longer disagree about whether backlog is consumable
  • Tests cover ready, backlog, no-status, claimed, Renovate, and lane-filter combinations (56 tests in agent-queue.test.ts)

Testing

All 735 tests pass. Added 14 new tests for claimable-only behavior across lane/status combinations.

fixes#201

@its-miso

its-misoBot commented May 25, 2026

Copy link
Copy Markdown
Contributor

Automated recommendation: APPROVE

Analysis engine: MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic)

PR Review: fix: exclude status/backlog from default agent queue

Recommendation

Approve. This PR correctly fixes the agent queue contract mismatch where status/backlog issues were being returned as claimable work despite workers being instructed to skip them. The implementation adds a claimable field and claimableOnly option that aligns the API behavior with documented worker semantics.

Change-by-Change Findings

src/lib/agent-queue.ts (+13/-0)

  • Added claimable?: boolean to RankedIssue interface
  • Added claimableOnly?: boolean option to buildAgentQueue() with default true
  • Filters out status/backlog when claimableOnly=true (the default)
  • Sets claimable: true for all non-backlog issues in result mapping
  • Updated JSDoc to document the new default behavior

Quality: Clean implementation with proper null-safe defaulting (options?.claimableOnly ?? true). The filter logic executes after isActionable() but before agent/renovate filtering, correctly treating backlog exclusion as a claimability filter rather than an actionable filter.

src/lib/agent-queue.test.ts (+153/-13)

  • Updated existing tests to use claimableOnly: false where backlog inclusion is expected
  • Renamed priority tests to reflect actual behavior (in-progress over ready not ready over backlog)
  • Added 14 new tests in buildAgentQueue with claimable-only behavior describe block

Coverage: New tests cover:

  • Default exclusion of status/backlog (claimableOnly=true by default)
  • Explicit inclusion with claimableOnly=false
  • claimable: true for ready, in-progress, and no-status issues
  • claimable: false for backlog when returned as diagnostics
  • Cross-priority exclusion behavior
  • Integration with includeClaimed, includeRenovate, and lane filters
  • Lane=backlog edge case (returns nothing when claimableOnly=true)

src/app/api/agents/[agentName]/queue/route.test.ts (+7/-7)

  • Removed status/backlog label from test fixtures that should represent claimable work
  • Ensures API-level tests align with the library behavior

Standards Compliance

Compliant. Matches repository conventions from AGENTS.md:

"Agents pick status/ready issues — status/backlog and unlabeled issues need triage and are excluded from the default queue."

"By default, BACKLOG issues are excluded from the normal agent queue."

The PR correctly:

  • Distinguishes currentLane (execution lane: normal/escalated/backlog) from status/backlog (lifecycle label)
  • Excludes status/backlog from default claimable queues
  • Provides opt-in claimableOnly=false for diagnostics/UI use cases
  • Marks backlog items as claimable: false when included

Linked Issue Fit

Acceptance CriterionStatus
/api/agents/:agentName/queue?lane=normal does not present status/backlog issues as claimable work by default✅ Met
Backlog items are excluded or returned as non-claimable diagnostics✅ Met (via claimableOnly option)
Worker prompts/API behavior no longer disagree about whether backlog is consumable✅ Met
Tests cover ready, backlog, no-status, claimed, Renovate, and lane-filter combinations✅ Met (14 new tests added)

Issue #201 is fully addressed. The false-ready pipeline state described in the problem statement is resolved by the default claimableOnly=true behavior.

Evidence Provider Findings

No evidence providers configured.

Tool Harness Findings

No tool requests executed.

Unknowns / Needs Verification

  1. Test count discrepancy: PR body states "56 tests in agent-queue.test.ts" but the diff shows +153 additions which appears to add ~14 new tests. The existing test suite likely already had baseline tests; the new tests cover the claimable-only behavior specifically. This is consistent with the "All 735 tests pass" claim.

  2. Linked source fetches failed: Could not verify that issues Add Saffron Phase 1 runtime smoke checklist #52-56, fix: v0.2 migration blockers — queue fields, status endpoint, move auth, claim behavior #99 referenced in the test fixtures actually contain the expected data. However, test fixture changes are purely label removal (changing test expectations), not functional code changes, so this does not affect correctness.

Conclusion

This is a well-scoped bug fix that correctly aligns API behavior with documented worker contracts. The implementation is internally consistent, test coverage is comprehensive for the new behavior, and all acceptance criteria from the linked issue are satisfied.

@joryirving
joryirving merged commit e25c61f into mainMay 25, 2026
3 checks passed
@joryirving
joryirving deleted the fix/agent-queue-backlog-claimable branch May 25, 2026 16:24
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.

Fix agent queue contract for backlog vs ready work

1 participant

@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

fix: exclude status/backlog from default agent queue - #207

Merged
joryirving merged 1 commit into
mainfrom
fix/agent-queue-backlog-claimable
May 25, 2026
Merged

fix: exclude status/backlog from default agent queue#207
joryirving merged 1 commit into
mainfrom
fix/agent-queue-backlog-claimable

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Goal

Make the Dispatch agent queue contract match worker semantics: backlog is triage-only, ready is claimable.

Problem

Dispatch currently has two related but separate concepts:

  • execution lane: Issue.currentLane (normal, escalated, backlog)
  • lifecycle status labels: status/backlog, status/ready, status/in-progress, status/in-review, status/done

Workers are instructed that status/backlog is not claimable and should not be consumed. However, /api/agents/:agentName/queue currently returns status/backlog issues as actionable work because src/lib/agent-queue.ts treated backlog status as claimable.

This created a false-ready pipeline state: the queue was non-empty, crons stayed enabled, but workers skipped backlog items and reported the pipeline is clear.

Changes

  • Added claimable?: boolean field to RankedIssue interface — marks whether an issue is claimable work
  • Added claimableOnly?: boolean option to buildAgentQueue() — defaults to true, excluding status/backlog from the default queue
  • Backlog items are now marked claimable: false so UI/diagnostics can distinguish them from claimable work

Acceptance criteria

  • /api/agents/:agentName/queue?lane=normal does not present status/backlog issues as claimable work by default
  • Backlog items are excluded from default queues; returned as non-claimable only when claimableOnly=false
  • Worker prompts/API behavior no longer disagree about whether backlog is consumable
  • Tests cover ready, backlog, no-status, claimed, Renovate, and lane-filter combinations (56 tests in agent-queue.test.ts)

Testing

All 735 tests pass. Added 14 new tests for claimable-only behavior across lane/status combinations.

fixes#201

@its-miso

its-misoBot commented May 25, 2026

Copy link
Copy Markdown
Contributor

Automated recommendation: APPROVE

Analysis engine: MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic)

PR Review: fix: exclude status/backlog from default agent queue

Recommendation

Approve. This PR correctly fixes the agent queue contract mismatch where status/backlog issues were being returned as claimable work despite workers being instructed to skip them. The implementation adds a claimable field and claimableOnly option that aligns the API behavior with documented worker semantics.

Change-by-Change Findings

src/lib/agent-queue.ts (+13/-0)

  • Added claimable?: boolean to RankedIssue interface
  • Added claimableOnly?: boolean option to buildAgentQueue() with default true
  • Filters out status/backlog when claimableOnly=true (the default)
  • Sets claimable: true for all non-backlog issues in result mapping
  • Updated JSDoc to document the new default behavior

Quality: Clean implementation with proper null-safe defaulting (options?.claimableOnly ?? true). The filter logic executes after isActionable() but before agent/renovate filtering, correctly treating backlog exclusion as a claimability filter rather than an actionable filter.

src/lib/agent-queue.test.ts (+153/-13)

  • Updated existing tests to use claimableOnly: false where backlog inclusion is expected
  • Renamed priority tests to reflect actual behavior (in-progress over ready not ready over backlog)
  • Added 14 new tests in buildAgentQueue with claimable-only behavior describe block

Coverage: New tests cover:

  • Default exclusion of status/backlog (claimableOnly=true by default)
  • Explicit inclusion with claimableOnly=false
  • claimable: true for ready, in-progress, and no-status issues
  • claimable: false for backlog when returned as diagnostics
  • Cross-priority exclusion behavior
  • Integration with includeClaimed, includeRenovate, and lane filters
  • Lane=backlog edge case (returns nothing when claimableOnly=true)

src/app/api/agents/[agentName]/queue/route.test.ts (+7/-7)

  • Removed status/backlog label from test fixtures that should represent claimable work
  • Ensures API-level tests align with the library behavior

Standards Compliance

Compliant. Matches repository conventions from AGENTS.md:

"Agents pick status/ready issues — status/backlog and unlabeled issues need triage and are excluded from the default queue."

"By default, BACKLOG issues are excluded from the normal agent queue."

The PR correctly:

  • Distinguishes currentLane (execution lane: normal/escalated/backlog) from status/backlog (lifecycle label)
  • Excludes status/backlog from default claimable queues
  • Provides opt-in claimableOnly=false for diagnostics/UI use cases
  • Marks backlog items as claimable: false when included

Linked Issue Fit

Acceptance CriterionStatus
/api/agents/:agentName/queue?lane=normal does not present status/backlog issues as claimable work by default✅ Met
Backlog items are excluded or returned as non-claimable diagnostics✅ Met (via claimableOnly option)
Worker prompts/API behavior no longer disagree about whether backlog is consumable✅ Met
Tests cover ready, backlog, no-status, claimed, Renovate, and lane-filter combinations✅ Met (14 new tests added)

Issue #201 is fully addressed. The false-ready pipeline state described in the problem statement is resolved by the default claimableOnly=true behavior.

Evidence Provider Findings

No evidence providers configured.

Tool Harness Findings

No tool requests executed.

Unknowns / Needs Verification

  1. Test count discrepancy: PR body states "56 tests in agent-queue.test.ts" but the diff shows +153 additions which appears to add ~14 new tests. The existing test suite likely already had baseline tests; the new tests cover the claimable-only behavior specifically. This is consistent with the "All 735 tests pass" claim.

  2. Linked source fetches failed: Could not verify that issues Add Saffron Phase 1 runtime smoke checklist #52-56, fix: v0.2 migration blockers — queue fields, status endpoint, move auth, claim behavior #99 referenced in the test fixtures actually contain the expected data. However, test fixture changes are purely label removal (changing test expectations), not functional code changes, so this does not affect correctness.

Conclusion

This is a well-scoped bug fix that correctly aligns API behavior with documented worker contracts. The implementation is internally consistent, test coverage is comprehensive for the new behavior, and all acceptance criteria from the linked issue are satisfied.

@joryirving
joryirving merged commit e25c61f into mainMay 25, 2026
3 checks passed
@joryirving
joryirving deleted the fix/agent-queue-backlog-claimable branch May 25, 2026 16:24
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.

Fix agent queue contract for backlog vs ready work

1 participant

@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

fix: exclude status/backlog from default agent queue - #207

Merged
joryirving merged 1 commit into
mainfrom
fix/agent-queue-backlog-claimable
May 25, 2026
Merged

fix: exclude status/backlog from default agent queue#207
joryirving merged 1 commit into
mainfrom
fix/agent-queue-backlog-claimable

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Goal

Make the Dispatch agent queue contract match worker semantics: backlog is triage-only, ready is claimable.

Problem

Dispatch currently has two related but separate concepts:

  • execution lane: Issue.currentLane (normal, escalated, backlog)
  • lifecycle status labels: status/backlog, status/ready, status/in-progress, status/in-review, status/done

Workers are instructed that status/backlog is not claimable and should not be consumed. However, /api/agents/:agentName/queue currently returns status/backlog issues as actionable work because src/lib/agent-queue.ts treated backlog status as claimable.

This created a false-ready pipeline state: the queue was non-empty, crons stayed enabled, but workers skipped backlog items and reported the pipeline is clear.

Changes

  • Added claimable?: boolean field to RankedIssue interface — marks whether an issue is claimable work
  • Added claimableOnly?: boolean option to buildAgentQueue() — defaults to true, excluding status/backlog from the default queue
  • Backlog items are now marked claimable: false so UI/diagnostics can distinguish them from claimable work

Acceptance criteria

  • /api/agents/:agentName/queue?lane=normal does not present status/backlog issues as claimable work by default
  • Backlog items are excluded from default queues; returned as non-claimable only when claimableOnly=false
  • Worker prompts/API behavior no longer disagree about whether backlog is consumable
  • Tests cover ready, backlog, no-status, claimed, Renovate, and lane-filter combinations (56 tests in agent-queue.test.ts)

Testing

All 735 tests pass. Added 14 new tests for claimable-only behavior across lane/status combinations.

fixes#201

@its-miso

its-misoBot commented May 25, 2026

Copy link
Copy Markdown
Contributor

Automated recommendation: APPROVE

Analysis engine: MiniMax-M2.7@https://litellm.jory.dev/v1 (anthropic)

PR Review: fix: exclude status/backlog from default agent queue

Recommendation

Approve. This PR correctly fixes the agent queue contract mismatch where status/backlog issues were being returned as claimable work despite workers being instructed to skip them. The implementation adds a claimable field and claimableOnly option that aligns the API behavior with documented worker semantics.

Change-by-Change Findings

src/lib/agent-queue.ts (+13/-0)

  • Added claimable?: boolean to RankedIssue interface
  • Added claimableOnly?: boolean option to buildAgentQueue() with default true
  • Filters out status/backlog when claimableOnly=true (the default)
  • Sets claimable: true for all non-backlog issues in result mapping
  • Updated JSDoc to document the new default behavior

Quality: Clean implementation with proper null-safe defaulting (options?.claimableOnly ?? true). The filter logic executes after isActionable() but before agent/renovate filtering, correctly treating backlog exclusion as a claimability filter rather than an actionable filter.

src/lib/agent-queue.test.ts (+153/-13)

  • Updated existing tests to use claimableOnly: false where backlog inclusion is expected
  • Renamed priority tests to reflect actual behavior (in-progress over ready not ready over backlog)
  • Added 14 new tests in buildAgentQueue with claimable-only behavior describe block

Coverage: New tests cover:

  • Default exclusion of status/backlog (claimableOnly=true by default)
  • Explicit inclusion with claimableOnly=false
  • claimable: true for ready, in-progress, and no-status issues
  • claimable: false for backlog when returned as diagnostics
  • Cross-priority exclusion behavior
  • Integration with includeClaimed, includeRenovate, and lane filters
  • Lane=backlog edge case (returns nothing when claimableOnly=true)

src/app/api/agents/[agentName]/queue/route.test.ts (+7/-7)

  • Removed status/backlog label from test fixtures that should represent claimable work
  • Ensures API-level tests align with the library behavior

Standards Compliance

Compliant. Matches repository conventions from AGENTS.md:

"Agents pick status/ready issues — status/backlog and unlabeled issues need triage and are excluded from the default queue."

"By default, BACKLOG issues are excluded from the normal agent queue."

The PR correctly:

  • Distinguishes currentLane (execution lane: normal/escalated/backlog) from status/backlog (lifecycle label)
  • Excludes status/backlog from default claimable queues
  • Provides opt-in claimableOnly=false for diagnostics/UI use cases
  • Marks backlog items as claimable: false when included

Linked Issue Fit

Acceptance CriterionStatus
/api/agents/:agentName/queue?lane=normal does not present status/backlog issues as claimable work by default✅ Met
Backlog items are excluded or returned as non-claimable diagnostics✅ Met (via claimableOnly option)
Worker prompts/API behavior no longer disagree about whether backlog is consumable✅ Met
Tests cover ready, backlog, no-status, claimed, Renovate, and lane-filter combinations✅ Met (14 new tests added)

Issue #201 is fully addressed. The false-ready pipeline state described in the problem statement is resolved by the default claimableOnly=true behavior.

Evidence Provider Findings

No evidence providers configured.

Tool Harness Findings

No tool requests executed.

Unknowns / Needs Verification

  1. Test count discrepancy: PR body states "56 tests in agent-queue.test.ts" but the diff shows +153 additions which appears to add ~14 new tests. The existing test suite likely already had baseline tests; the new tests cover the claimable-only behavior specifically. This is consistent with the "All 735 tests pass" claim.

  2. Linked source fetches failed: Could not verify that issues Add Saffron Phase 1 runtime smoke checklist #52-56, fix: v0.2 migration blockers — queue fields, status endpoint, move auth, claim behavior #99 referenced in the test fixtures actually contain the expected data. However, test fixture changes are purely label removal (changing test expectations), not functional code changes, so this does not affect correctness.

Conclusion

This is a well-scoped bug fix that correctly aligns API behavior with documented worker contracts. The implementation is internally consistent, test coverage is comprehensive for the new behavior, and all acceptance criteria from the linked issue are satisfied.

@joryirving
joryirving merged commit e25c61f into mainMay 25, 2026
3 checks passed
@joryirving
joryirving deleted the fix/agent-queue-backlog-claimable branch May 25, 2026 16:24
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.

Fix agent queue contract for backlog vs ready work

1 participant

@joryirving