Skip to content

fix(review): fold review.linkedIssueSatisfaction into the real gate as an alias (#4149) - #4811

Merged
JSONbored merged 1 commit into
mainfrom
fix/4149-linked-issue-satisfaction-alias
Jul 11, 2026
Merged

fix(review): fold review.linkedIssueSatisfaction into the real gate as an alias (#4149)#4811
JSONbored merged 1 commit into
mainfrom
fix/4149-linked-issue-satisfaction-alias

Conversation

@JSONbored

Copy link
Copy Markdown
Owner

Closes #4149.

Summary

Two near-identically-named fields existed, and only one did anything:

  • gate.linkedIssueSatisfaction (RepositorySettings.linkedIssueSatisfactionGateMode) — the real, DB-backed gate mode that actually runs the AI assessment and can block a PR (linked_issue_scope_mismatch, confirmed-contributor-gated).
  • review.linkedIssueSatisfaction (FocusManifestReviewConfig, feat(config): add review.linkedIssueSatisfaction config knob (off/advisory/block, default off) #2173) — parsed and validated, but never read anywhere in src/. A silent no-op: a self-host operator could easily set the wrong one by name confusion and get no warning, no effect.

resolveEffectiveSettings now falls back to review.linkedIssueSatisfaction when gate.linkedIssueSatisfaction is unset (null), mirroring the exact same gate: > alias precedence already established for #4618's linkedIssuePolicy fold-in earlier tonight. Setting either spelling now has the same real effect; an explicit gate.linkedIssueSatisfaction still always wins when both are set.

Both value sets are identical (GateRuleMode and LinkedIssueSatisfactionMode are both "off" | "advisory" | "block"), so the fold-in is a direct assignment with no value translation needed.

Test plan

  • npx tsc --noEmit — clean
  • Full unit + integration suite: 686/687 files passing (1 unrelated flaky real-subprocess test in selfhost-ai.test.ts, confirmed to pass cleanly in isolation — zero relation to this change, timing-sensitive under system load)
  • npm run docs:drift-check, npm run manifest:drift-check, npm run engine-parity:drift-check — all pass
  • npm audit --audit-level=moderate — 0 vulnerabilities
  • New tests cover: explicit review.linkedIssueSatisfaction taking effect when gate.linkedIssueSatisfaction is unset, gate.linkedIssueSatisfaction always winning when both are set, falling through to the DB value when neither is set, and review.linkedIssueSatisfaction: off applying as a real distinct value (not silently skipped as falsy)

…s an alias (#4149)

Two near-identically-named fields existed, and only one did anything:
gate.linkedIssueSatisfaction (RepositorySettings.linkedIssueSatisfactionGateMode)
is the real, DB-backed gate mode that actually runs the AI assessment and can
block a PR. review.linkedIssueSatisfaction (FocusManifestReviewConfig, #2173)
was parsed and validated but never read anywhere -- a silent no-op a self-host
operator could easily set by mistake given the near-identical name, with no
warning and no effect.

resolveEffectiveSettings now falls back to review.linkedIssueSatisfaction
when gate.linkedIssueSatisfaction is unset, mirroring the same gate: >
(alias) precedence already used for #4618's linkedIssuePolicy fold-in --
setting either spelling now has the same real effect, and an explicit
gate.linkedIssueSatisfaction still always wins when both are set.
@superagent-security

Copy link
Copy Markdown
Contributor

Superagent didn't find any vulnerabilities or security issues in this PR.

@JSONbored
JSONbored merged commit 02fd0d0 into main Jul 11, 2026
7 checks passed
@JSONbored
JSONbored deleted the fix/4149-linked-issue-satisfaction-alias branch July 11, 2026 00:28
@codecov

codecov Bot commented Jul 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 94.22%. Comparing base (9277537) to head (dba0497).
⚠️ Report is 5 commits behind head on main.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #4811   +/-   ##
=======================================
  Coverage   94.22%   94.22%           
=======================================
  Files         441      441           
  Lines       38745    38747    +2     
  Branches    14106    14107    +1     
=======================================
+ Hits        36508    36510    +2     
  Misses       1577     1577           
  Partials      660      660           
Files with missing lines Coverage Δ
src/signals/focus-manifest.ts 99.64% <100.00%> (+<0.01%) ⬆️
src/types.ts 100.00% <ø> (ø)
🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

docs(review): resolve the review.linked_issue_satisfaction / gate.linkedIssueSatisfaction phantom-field confusion

1 participant