fix: project-wide audit — dormant bugs, silent failures, missing safety - #90
Merged
Conversation
- keep polling through transient 5xx/429 during device-flow sign-in - clamp host-supplied poll interval before nanosecond conversion - classify 403 secondary/abuse rate limits (reset header or body hint) - percent-encode literal '+' in search query values - log silent reviews-pagination truncation - specific error copy for merge 405/409/422 responses
- force refresh on addAccount so an in-flight poll can't starve the new account - cancel mergeReadinessTask on removeAccount - publish batched check folds per account so superseded waves can't strand banners - prune CI/gate maps and unblock repo-feed skeleton when rate-limited - all-neutral check runs roll up to neutral, not success - decode persisted accounts leniently so one bad element can't sign everyone out - clear rateLimitedUntil on sign-out; surface both errors in markAllRead
- GraphQL MERGED state normalizes to closed + merged flag (matches REST path) - null GraphQL check-run status maps to completed so conclusions classify - notification web URL rewrites only the resource path segment - defer search focus until the field is mounted
- require-milestone re-runs when a milestone is added - cask push no longer swallows real commit failures - cut-release validates marketingVersion is 3-part semver before bumping - commit-msg help text matches the enforced subject-length rule
A wave from the previous poll could re-publish its pre-prune snapshot, re-adding the stale CI dots/gates the rate-limited skip path just pruned.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Full-project audit (auth/networking, store/notifications, UI, CI/scripts) for dormant bugs, missing safety, and silent-failure paths. No stubs/TODOs/force-unwraps found; ~20 defects fixed below. All fixes have new or extended unit tests where testable.
Auth / networking
X-RateLimit-Resetor body hint) even withoutX-RateLimit-Remaining: 0/Retry-After, so the store backs off instead of re-polling into a longer lockout.+in saved search queries is percent-encoded (previously reached/search/issuesas a space).Store / notifications
addAccountforces a refresh so an in-flight poll built before the account existed can't starve it (previously the new account could stay empty indefinitely with polling off).removeAccountcancels the merge-readiness poll, which could linger holding removed-account state.rateLimitedUntilcleared on sign-out;markAllReadsurfaces both expired-session and generic failures instead of dropping the latter.UI / mapping
MERGEDto the REST representation (closed+ merged flag); null check-run status maps tocompletedso conclusions classify correctly. The two hydration paths now produce identical values.pullsno longer corrupts the link)..taskrefresh re-fires per open — NSPopover sends full appearance transitions on each show.CI / scripts / hooks
require-milestonere-runs when a milestone is added (previously onlydemilestonedwas a trigger, so a blocked PR could never clear).cut-releasevalidatesmarketingVersionis 3-part semver before bumping.commit-msghook help text corrected to match the enforced rule (history predates a stricter total-length cap, so the text was fixed rather than the rule tightened).Audited and deliberately unchanged
Defensive-but-unreachable
DeviceFlowErrorarms,Link-header substring parse, 50-item search window (by design), keychain delete-status ignoring (by design), RelativeAge math, badge-count projections, reorder logic, event-monitor lifecycle — all verified correct.Verification:
just checkclean, fulljust testsuite green locally.