Repository navigation
Enforce issue dependencies: a derived blocked label, an assignment guard and a required pull-request check #1034
Copy link
Copy link
Closed
Labels
area: dev-toolingCode area: dev-toolingCode area: dev-toolingenhancementNew feature or requestNew feature or requestseverity: lowMinor defect, inaccuracy or rough edgeMinor defect, inaccuracy or rough edgewave: 4Roadmap wave 4: low / info / watch, when touching the moduleRoadmap wave 4: low / info / watch, when touching the module
Description
Summary
Work that depends on other work is recorded only in prose today ("after S8", "Settle #706 first", "don't start without coordinating on #894"). Nothing stops a contributor from claiming or opening a pull request for an issue whose prerequisite is still open, and nothing tells them when it opens up. This issue turns dependencies into an enforced contract.
What exists today
- GitHub's native Blocked by links mark an issue as blocked in the sidebar, the Issues list and the project board, but they cannot be filtered (
is:blockedreturns nothing), they do not reach the project views or thegood first issuepage, and no workflow event fires when a link is added or removed. tools/assign_on_comment.pyrefusesdeferred,security,needs-triage,epicandphase: 16issues, but knows nothing about dependencies.- No pull-request check looks at the issues a pull request links.
Design
- Source of truth: native Blocked by links, set by a maintainer in the issue's sidebar. A dependency written only in prose does not count.
- A blocker is resolved only when it is closed as completed. A blocker closed as not planned or as a duplicate did not deliver what the dependent waits for, so the dependent stays blocked, gets
needs-triageand one comment asking a maintainer to re-plan it. blockedis a derived label, never set by hand: asyncjob adds it to every open issue with an unresolved blocker and removes it everywhere else. It runs when an issue is closed or reopened, hourly as a backstop for link edits, and on demand. When it removes the label from an issue that was waiting, it posts one comment; no comment when an issue becomes blocked.- Contributor gates:
/assignrefuses a blocked issue and says why; a pull-request check, Issue dependencies, fails while an issue the pull request links (Fixes/Closes/Resolves/Refs #N) is blocked, unless the same pull request closes every open blocker (in the form GitHub closes on merge) or a maintainer labels itdependency-override(the label set by anyone else is ignored). The check runs onpull_request_target, so both the workflow and the script come from the default branch and no pull-request code is checked out. Everysyncrun also re-runs the check of each open pull request whose last result no longer matches its linked issues. - Views: the project gets a Blocked view; Front door and Small tasks hide blocked issues.
Dependencies recorded with this change
From a review of all open issues (bodies and comments; the prose matches that describe code behaviour, such as "the digest depends on whether xxhash is installed", are not dependencies):
- Phase 16 runs in step order ("each with verified findings fixed and committed before the next step begins"): S5 ← S4, …, S16 ← S15, plus S12 ← [Phase 16] Write the SBOM / supply-chain standard (prerequisite of S12) #889 and S13 ← [Phase 16] Write the Docker standard (prerequisite of S13) #888.
- Deferred items whose recorded condition is another issue: Split
forgelm/trainer.pyinto a sub-package (_kwargs,_runtime,_finalize,_artifacts) — deferred until Phase 16 S4 and S8 have landed #904, Splitforgelm/compliance.pyinto a sub-package (_audit_log,_annex_iv,_provenance,_gdpr) — deferred until Phase 16 S9 has landed #906, Splitforgelm/cli/_parser.pyinto a sub-package (_train,_inspect,_data,_run) — deferred until Phase 16 S5, S7 and S11 have landed #907, Splitforgelm/cli/subcommands/_purge.pyinto a sub-package (_row_id,_run_id,_check_policy,_shared) — deferred until Phase 16 S9 has landed #908, Make the anonymous-operator audit gate config-driven: addcompliance.allow_anonymous_operatorbesideFORGELM_ALLOW_ANONYMOUS_OPERATOR#913, verify-gguf: fail closed by default when no strong layer ran (magic-only verdict) — deferred until the next MAJOR release #915, Publish an official ForgeLM container image — deferred until a weight-redistribution position and the Docker standard exist #916. - The 72 review issues whose every finding is a unit of one Phase 16 step are blocked by that step; the step's pull request is expected to close them. Grouped issues where only some findings belong to a step are not blocked as a whole: each such finding already carries a
KNOWN-OPEN … (Sx open)marker, and CONTRIBUTING asks contributors not to take those finding IDs.
Acceptance criteria
-
tools/issue_dependencies.py(sync,check-pr) and its tests; the decision rules are pure functions, the GitHub calls are injected and limited to fixed endpoints. -
.github/workflows/issue-dependencies.ymland.github/workflows/pr-dependencies.yml, least privilege, pinned actions, no${{ }}in arun:line; tests pin these properties. -
/assignrefuses a blocked issue (label or an open native blocker), with a test. - CONTRIBUTING (labels table, Working on an issue, required checks), CLAUDE.md / AGENTS.md and the CHANGELOG describe the rule.
- Labels
blockedanddependency-overrideexist; the dependencies above are recorded as native links and the labels match them. - After merge, before 2026-11-02: a repository Actions policy allows
pull_request_targetfor.github/workflows/pr-dependencies.ymlonly (POST /repos/HodeTech/ForgeLM/actions/policies); GitHub blocks that event in public repositories by default from that date, and the check would stop reporting. - After merge: the Issue dependencies check is seen attached to a pull request's head commit (it runs on
pull_request_target), then added to the required checks ofdevelopment, and CONTRIBUTING's "not yet among the required checks" sentence is removed.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area: dev-toolingCode area: dev-toolingCode area: dev-toolingenhancementNew feature or requestNew feature or requestseverity: lowMinor defect, inaccuracy or rough edgeMinor defect, inaccuracy or rough edgewave: 4Roadmap wave 4: low / info / watch, when touching the moduleRoadmap wave 4: low / info / watch, when touching the module
Type
Projects
- StatusShow more project fieldsDone
Activity
fix(ci): harden the issue-dependency check after review
fix(ci): strip multi-backtick code spans before reading closing links
fix(ci): drop indented code blocks before reading closing links
fix(ci): keep block boundaries when reading closing links
fix(ci): let GitHub decide what a pull request closes; isolate sync f…
cemililik commentedon Oct 20, 2026
Reopening: the merge of #1035 closed this through the first commit's
Fixes #1034, but the post-merge criteria are still open (the Actions policy forpull_request_target, the required check and the CONTRIBUTING sentence). The pull request that finishes them will close it.chore(ci): enforce issue dependencies with a blocked label and a requ…
docs: the Issue dependencies check is required on development