Skip to content

feat(config): add review.linkedIssueSatisfaction knob (off/advisory/block, default off) (#2173)#3665

Merged
loopover-orb[bot] merged 2 commits into
JSONbored:mainfrom
nickmopen:feat/linked-issue-satisfaction
Jul 6, 2026
Merged

feat(config): add review.linkedIssueSatisfaction knob (off/advisory/block, default off) (#2173)#3665
loopover-orb[bot] merged 2 commits into
JSONbored:mainfrom
nickmopen:feat/linked-issue-satisfaction

Conversation

@nickmopen

Copy link
Copy Markdown
Contributor

Closes #2173 (config slice for #1961). Re-submit of #3659, which was auto-closed on a stale CI run — the gate closed it based on the pre-fix run before the fix's re-run finished. The fix is included here and the full suite is green locally (npm run validate).

Wires the review.linkedIssueSatisfaction config-as-code knob through the FocusManifestReviewConfig parse path only — parse + normalize + default-off. Default null (unset) ⇒ byte-identical to today. Does not touch the merge/close decision (a separate maintainer slice reads the resolved mode).

What's here

  • focus-manifest.tsLinkedIssueSatisfactionMode ('off' | 'advisory' | 'block') + linkedIssueSatisfaction on FocusManifestReviewConfig; parsed with the shared normalizeOptionalEnum (warn + ignore on malformed), default null; reviewConfigToJson round-trip (omitted when null ⇒ byte-identical) + present + the EMPTY literals.
  • .gittensory.yml.example + config/examples/gittensory.full.yml — documented the knob in both synced mirrors (the config-templates parity test enforces they match).

Validation

Full local suite (npm run validate = tsc --noEmit && vitest run):

Test Files  493 passed | 2 skipped (495)
     Tests  9893 passed | 7 skipped   (0 failed)

Covers: absent → null (omitted on serialize), each valid mode round-trips + marks present, malformed / non-string → warn + null, plus the documents review.* doc-parity and config-templates sync tests.

nickmopen added 2 commits July 5, 2026 19:09
…lock, default off) (JSONbored#2173)

Config-as-code slice for JSONbored#1961: parse + normalize the per-repo knob through the
FocusManifestReviewConfig parse path only. Default null (unset) ⇒ byte-identical to
today. Does NOT touch the merge/close decision — that maintainer-only slice reads the
resolved mode separately.

- focus-manifest.ts: LinkedIssueSatisfactionMode ('off'|'advisory'|'block') +
  linkedIssueSatisfaction field; normalizeOptionalEnum parse (warn+ignore on malformed),
  default null; reviewConfigToJson round-trip (omitted when null ⇒ byte-identical) +
  present + EMPTY literals.
- .gittensory.yml.example: documented review.linkedIssueSatisfaction (distinct from the
  existing linkedIssuePolicy, which only checks a link EXISTS).
- Tests: absent→null (omitted), each valid mode round-trips + marks present, malformed +
  non-string → warn+null. Ships the .gittensory.yml parity per the config-as-code rule
  (enforced by the existing "documents review.*" parity test).
…rror (JSONbored#2173)

The config-templates test (JSONbored#1682) asserts gittensory.full.yml is byte-identical to
.gittensory.yml.example from the WHERE IT LIVES marker onward; mirror the new doc block.
@nickmopen
nickmopen requested a review from JSONbored as a code owner July 6, 2026 00:31
@superagent-security

Copy link
Copy Markdown
Contributor

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

@loopover-orb loopover-orb Bot added the gittensor:bug Gittensor-scored bug fix — scores a 0.05x multiplier. label Jul 6, 2026
@loopover-orb

loopover-orb Bot commented Jul 6, 2026

Copy link
Copy Markdown

Warning

🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨

⏸️ Gittensory review result - manual review recommended

Review updated: 2026-07-06 00:36:47 UTC

6 files · 1 AI reviewer · no blockers · readiness 80/100 · CI green · clean

⏸️ Suggested Action - Manual Review

Review summary
This is a narrow, well-scoped config-parsing slice that adds `review.linkedIssueSatisfaction` (off/advisory/block) to `FocusManifestReviewConfig`, following the existing `normalizeOptionalEnum` warn-and-ignore pattern used by other enum fields in this file. Default is `null`, `reviewConfigToJson` omits the field when null (byte-identical serialization when unset), and every touched `EMPTY_MANIFEST`/`emptyManifest`/test fixture object is updated consistently. Tests cover absent/valid/malformed/non-string cases and the doc-parity/config-templates sync tests are updated in both yml mirrors; CI is fully green. The one real defect is a naming inconsistency: every sibling `review.*` key in the YAML convention is snake_case (`labeling_rules`, `ai_model`, `finding_categories`, `pre_merge_checks`), but this PR introduces `linkedIssueSatisfaction` in camelCase both in the parser (`r.linkedIssueSatisfaction`) and in both yml example files, breaking the established config-key convention even though it's internally self-consistent and will parse correctly as documented.

Nits — 5 non-blocking
  • `src/signals/focus-manifest.ts` (parseReviewConfig) reads `r.linkedIssueSatisfaction` and both yml examples document `linkedIssueSatisfaction: off` in camelCase, breaking the snake_case convention every other `review.*` key follows (`labeling_rules`, `ai_model`, `finding_categories`, `pre_merge_checks`) — rename to `linked_issue_satisfaction` for consistency or justify the deviation.
  • The yml comment block claims `block` mode 'can become a hard blocker (confirmed-contributor-gated)', but this PR explicitly does not implement the merge/close decision — that behavioral detail belongs in the future maintainer slice's docs, not asserted here as settled behavior.
  • `LINKED_ISSUE_SATISFACTION_MODES`/`LinkedIssueSatisfactionMode` docblock references issue numbers (feat(config): add review.linkedIssueSatisfaction config knob (off/advisory/block, default off) #2173, AI linked-issue satisfaction assessment #1961) inline rather than a single canonical pointer, consistent with the file's existing style but worth double-checking against the doc-parity test if the issue is renumbered.
  • Align the YAML key casing with sibling `review.*` fields (`linked_issue_satisfaction`) before merge, updating the parser, both yml examples, and the field-exhaustiveness test token together.
  • Consider trimming the yml comment's forward-looking claim about `block` mode's gating behavior to 'reserved for a future gate slice' until that slice actually exists, to avoid documenting unimplemented behavior.
Signal Result Evidence
Code review ✅ No blockers 1 reviewer
Linked issue ✅ Linked #2173
Related work ✅ No active overlap found No same-issue or scoped active PR overlap found.
Change scope ✅ 20/20 Low review scope from cached public metadata (1 linked issue).
Validation posture ❌ 5/25 Preflight is holding this PR: the review lane is unavailable, so it is not ready for automated review.
Contributor workload ✅ 10/10 Author activity: 129 registered-repo PR(s), 86 merged, 0 issue(s).
Contributor context ✅ Confirmed Gittensor contributor nickmopen; Gittensor profile; 129 PR(s), 0 issue(s).
Gate result ✅ Passing No configured blocker found.
Review context
  • Author: nickmopen
  • Role context: outside_contributor
  • Public audience mode: oss maintainer
  • Lane context: Repository registration is not available in the local Gittensory cache.
  • Public profile languages: TypeScript
  • Official Gittensor activity: 129 PR(s), 0 issue(s).
  • PR-specific overlap: none found.
Contributor next steps
  • Await review-lane availability.
  • Refresh registry data or choose a registered active repo.
Signal definitions
  • Related work = same linked issue, overlapping active PRs, or title/path similarity.
  • Change scope = cached public metadata such as size labels, draft state, and review-burden hints.
  • Validation posture = whether the PR provides enough public validation/test evidence for maintainer review.
  • Contributor workload = public contributor activity and cleanup pressure, not a repo-wide quality failure.
  • Contributor context = public GitHub/Gittensor identity context; non-Gittensor status is not a blocker.

🟩 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.

  • Re-run Gittensory review

@codecov

codecov Bot commented Jul 6, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
⚠️ Please upload report for BASE (main@5c16be3). Learn more about missing BASE report.
⚠️ Report is 2 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #3665   +/-   ##
=======================================
  Coverage        ?   93.29%           
=======================================
  Files           ?      314           
  Lines           ?    32057           
  Branches        ?    11748           
=======================================
  Hits            ?    29906           
  Misses          ?     1517           
  Partials        ?      634           
Files with missing lines Coverage Δ
src/signals/focus-manifest.ts 99.03% <100.00%> (ø)
🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@loopover-orb loopover-orb Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gittensory approves — the gate is satisfied and CI is green.

@loopover-orb
loopover-orb Bot merged commit 5096588 into JSONbored:main Jul 6, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gittensor:bug Gittensor-scored bug fix — scores a 0.05x multiplier.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(config): add review.linkedIssueSatisfaction config knob (off/advisory/block, default off)

1 participant