fix(review): fold linkedIssuePolicy into linkedIssueGateMode's promotion (#4618) - #4755
Conversation
…ion (#4618) Three independent knobs claimed to express "require a linked issue": settings.requireLinkedIssue, gate.linkedIssue (linkedIssueGateMode), and the yml-only top-level linkedIssuePolicy. requireLinkedIssue already auto-promoted linkedIssueGateMode to "block" when it was off (#797), but linkedIssuePolicy: required had no such promotion -- a self-hoster who set only linkedIssuePolicy: required got an advisory manifest_linked_issue_required nudge, never a real gate blocker, because that finding's own escalation was keyed to manifestPolicyGateMode (an unrelated gate that also governs missing-tests policy), not linkedIssueGateMode. Fixes both halves of the gap: - resolveEffectiveSettings now promotes linkedIssueGateMode to "block" for linkedIssuePolicy: required too, mirroring the requireLinkedIssue promotion (an explicit gate.linkedIssue override still wins, since the promotion only fires when the gate is still "off"). - manifest_linked_issue_required now escalates to a hard blocker via EITHER manifestPolicyGateMode: block (back-compat) OR linkedIssueGateMode: block (the new promoted path) -- without this, the promotion above would be a no-op. manifest_missing_tests is unaffected; it stays keyed to manifestPolicyGateMode alone. Mirrored in the gate-decision engine twin (gate-advisory.ts) and documented in both .gittensory.yml.example and its canonical copy.
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
gittensory-ui | 5ff3d71 | Commit Preview URL Branch Preview URL |
Jul 10 2026, 11:10 PM |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #4755 +/- ##
=======================================
Coverage 94.21% 94.22%
=======================================
Files 440 440
Lines 38712 38716 +4
Branches 14101 14105 +4
=======================================
+ Hits 36474 36479 +5
Misses 1577 1577
+ Partials 661 660 -1
🚀 New features to boost your workflow:
|
|
Warning 🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨 ⏸️ Gittensory review result - manual review recommendedReview updated: 2026-07-10 23:21:46 UTC
⏸️ Suggested Action - Manual Review
Review summary Nits — 3 non-blocking
Concerns raised — review before merging
Review context
Contributor next steps
Signal definitions
🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed 💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →. Checked by Gittensory, a quiet PR intelligence layer for OSS maintainers.
|
Summary
Part of #4618's item 1 (config-surface-reduction epic). Three independent knobs claimed to express "require a linked issue":
settings.requireLinkedIssue,gate.linkedIssue(linkedIssueGateMode), and the yml-only top-levellinkedIssuePolicy.requireLinkedIssuealready auto-promotedlinkedIssueGateModeto"block"when it was off (#797), butlinkedIssuePolicy: requiredhad no such promotion — a self-hoster who set onlylinkedIssuePolicy: requiredgot an advisorymanifest_linked_issue_requirednudge, never a real gate blocker, because that finding's own escalation was keyed tomanifestPolicyGateMode(an unrelated gate that also governs missing-tests policy), notlinkedIssueGateMode.Fixes both halves of the gap:
resolveEffectiveSettingsnow promoteslinkedIssueGateModeto"block"forlinkedIssuePolicy: requiredtoo, mirroring therequireLinkedIssuepromotion (an explicitgate.linkedIssueoverride still wins, since the promotion only fires when the gate is still"off").manifest_linked_issue_requirednow escalates to a hard blocker via EITHERmanifestPolicyGateMode: block(back-compat) ORlinkedIssueGateMode: block(the new promoted path) — without this, the promotion above would be a no-op.manifest_missing_testsis unaffected; it stays keyed tomanifestPolicyGateModealone.Mirrored in the gate-decision engine twin (
gate-advisory.ts) and documented in both.gittensory.yml.exampleand its canonical copy (config/examples/gittensory.full.yml).Test plan
npx tsc --noEmit— cleannpm run test:coverage(unsharded) — zero uncovered statements/branches on every changed line, including the new dual-??-fallback branches introduced by the OR'd escalation checknpm run engine-parity:drift-check,npm run docs:drift-check,npm run manifest:drift-check— all passnpm audit --audit-level=moderate— 0 vulnerabilities