fix(signals): make blockers explain every not-ready registration report (#5946) - #5992
Conversation
…rt (JSONbored#5946) buildRegistrationReadiness computed `ready = blockers.length === 0 && !configFragile && !configNeedsAttention`, but `configNeedsAttention` only ever appeared in `warnings`, never in `blockers`. So a repo whose config quality is "needs attention" — with every other input healthy — returned `ready: false` alongside an empty `blockers` array, contradicting the field's contract that `blockers` lists the reasons registration is not ready. A caller could not render "why isn't this ready?" from `blockers` alone. Add `configNeedsAttention` to `blockers` (mirroring how the sibling "fragile" tier of the same configQuality.level is already handled), remove its now- duplicate `warnings` entry, and simplify `ready` to `blockers.length === 0`. `blockers` is now the single source of truth for every `ready === false` case. directPrReadiness/issueDiscoveryReadiness logic is unchanged. Extends the existing "config attention" test to assert `blockers` contents (the untested gap), adds a regression test for the config-needs-attention-only scenario, and updates the policy-sanitizer invariant test to check the message in its new `blockers` home while keeping its private-terms assertions intact.
|
🚨 Contributor flagged. Click here for more info: Superagent Dashboard |
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
|
Warning 🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨 ⏸️ LoopOver review result - manual review recommendedReview updated: 2026-07-15 06:17:32 UTC
⏸️ Suggested Action - Manual Review Review summary Nits — 3 non-blocking
Flagged checks (non-blocking)
Review context
Contributor next steps
Signal definitions
🧪 Chat with LoopOverAsk LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.
Full command reference: https://gittensory.aethereal.dev/docs/loopover-commands 🧪 Experimental — new and may change. 🟩 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 LoopOver, a quiet PR intelligence layer for OSS maintainers.
|
Summary
Closes #5946.
buildRegistrationReadiness(src/signals/registration-readiness.ts) computedready = blockers.length === 0 && !configFragile && !configNeedsAttention, butconfigNeedsAttentiononly everappeared in
warnings, never inblockers. So whenconfigQuality.level === "needs_attention"and every otherinput (
isRegistered,configFragile,intakeBlocked) is healthy, the report returnedready: falsewhileblockerswas[]— an empty list that contradicts the field's implied contract as "the reasons registrationisn't ready." A maintainer-facing caller rendering "why can't I register?" from
blockersalone would see nothing,and would have to separately cross-reference
warningsand re-derive that one of them is actually gatingready.The fix follows the approach the issue prefers, mirroring how the sibling "fragile" tier of the same
configQuality.levelis already handled (fragile is a blocker, not a warning, and is not duplicated inwarnings):configNeedsAttentiontoblockers(right afterconfigFragile, keeping the two tiers of the same fieldadjacent).
warningsentry, so the same fact isn't flagged as both — matching theconfigFragileprecedent, which appears only in
blockers.readytoblockers.length === 0, sinceconfigFragileandconfigNeedsAttentionare now bothblockers.
blockersis now the single source of truth for everyready === falsereason.directPrReadiness,issueDiscoveryReadiness, and every other field's logic are unchanged — the fix is scopedstrictly to the
blockers/readyconsistency for theconfigNeedsAttentioncondition.Scope
type(scope): short summaryConventional Commit format, for examplefix(api): restore profile access checks.CONTRIBUTING.mdand does not reintroduce GitHub Pages, VitePress,site/, orCNAME.Closes #123) — a linked open issue is required for every contributor PR.Validation
git diff --checknpm run actionlintnpm run typechecknpm run test:coveragelocally;codecov/patchrequires ≥99% coverage of the lines AND branches you changed (aim for 100% on your diff so CI variance does not fail near the threshold). Global coverage is a non-blocking trend with a loose 90% backstop, not the gate.npm run test:workersnpm run build:mcpnpm run test:mcp-packnpm run ui:openapi:checknpm run ui:lintnpm run ui:typechecknpm run ui:buildnpm audit --audit-level=moderateIf any required check was skipped, explain why:
npm run test:cigate (exit 0) plusnpm audit --audit-level=moderate(0 vulnerabilities). The newconfigNeedsAttentionblocker branch is covered on both arms (needs-attention present and absent) via the unshardednpm run test:coverage; thereadyline has no branch.Safety
UI Evidencesection below with JPG/JPEG or PNG screenshots arranged as organized, captioned, clickable thumbnails. SVG screenshots are not used as review evidence. Review-only screenshots or recordings are not committed to the repository.Notes on the Safety boxes: this is a pure, private/API-first advisory report builder with no UI, API/OpenAPI, or auth/CORS/session surface.
RegistrationReadinessReportis explicitly advisory and never emitted to public GitHub. Thepolicy-sanitizer.test.tsinvariant that asserts these report fields contain no private terms is preserved (updated to check the config-attention message in its newblockershome while keeping both private-terms assertions).UI Evidence
Not applicable — backend-only change to a deterministic report builder; no visible UI, frontend, docs, or extension surface.
Notes
test/unit/registration-readiness.test.ts— the existing "config attention and strained intake" test now asserts the config-attention message is inblockers(and not inwarnings), and a newregression for #5946test covers the config-needs-attention-only scenario, asserting non-emptyblockersexplainsready === false.test/unit/policy-sanitizer.test.ts— the "config-attention warnings free of private terms" invariant is updated to assert the message inblockersand the strained-intake note inwarnings, keeping bothPRIVATE_TERMS_PATTERNchecks.test/unit/registration-workspace-ui.test.tsalready placed this message inblockersin its fixtures — consistent with this change and unmodified.