Auto-remove the blocked label once its named dependency issue closes - #6235
Merged
Conversation
issue-reconcile's daily deterministic pre-step now also unblocks issues: one whose body names its dependency as "Blocked by #N" (documented in the portos-file-issue skill) has the blocked label stripped, with a comment, once every named issue is closed. No coordinator agent or LLM call — the decision is mechanical, mirroring the existing releaseAbandonedClaims step. Forge-agnostic (GitHub via gh, GitLab via glab). Also lifts the shared open/closed state normalizer out of layeredIntelligence/forgeFiler.js into server/lib/forgeIssueState.js so the new module doesn't need a cross-subsystem import.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
blockedon a dependency ("waiting on issue #N"), but nothing ever removes the label once #N ships — the claim queue skips everyblockedissue forever, whether the block is a human/hardware case or a shipped dependency.Blocked by #Nconvention (documented in theportos-file-issueskill) and a deterministic check, folded into the existingissue-reconcilescheduled task's daily pre-step: for every openblockedissue naming its blocker(s) that way, if all of them are now closed, the label is removed and a comment posted. No coordinator agent, no LLM call — mirrors the existingreleaseAbandonedClaimsstep in the same pre-step.Blocked byline is left untouched (the human/hardware block case is unaffected).gh, GitLab viaglab.layeredIntelligence/forgeFiler.jsintoserver/lib/forgeIssueState.jsso the new module doesn't need a cross-subsystem import.Test plan
server/services/blockedIssueReconcile.test.js(26 tests):Blocked by #Nparsing (including non-matches likeRefs #N/Related: #N), the absent-blocker-state-must-not-read-as-closed classifier discipline, gather over mockedgh/glabon both forges, and the unblock write path (comment-then-unlabel ordering, failure isolation) on both forges.npm testinserver/) passes: 1942 files, 39176 tests./simplify(4 parallel reviewers: reuse, simplification, efficiency, altitude) against the diff and applied its findings — extracted the sharednormalizeIssueStatehelper, replaced a nested ternary withif/else if, simplified theBlocked byregex, dropped a redundant forge guard, and added a missing GitLab comment-failure log.