Skip to content

PR Monitor 1.0: accurate status, Liquid Glass UI, notarized releases - #8

Merged
BlockchainHB merged 6 commits into
mainfrom
hasaam/portfolio-overhaul
Sep 29, 2026
Merged

BlockchainHB merged 6 commits into
mainfrom
hasaam/portfolio-overhaul

Conversation

@BlockchainHB

Copy link
Copy Markdown
Owner

Summary

A ground-up rewrite of PR Monitor for 1.0: accurate status, far lighter use of GitHub's API, a native Liquid Glass UI, real tests, and a signed and notarized release pipeline. docs/AUDIT.md lists the problems in 0.x that motivated it, and docs/ARCHITECTURE.md explains the design.

Accuracy

  • Status now comes from check runs and commit statuses (Vercel, Netlify and others were invisible before), unresolved review threads, pending review requests, and review commit SHAs.
  • Agents that never report on a PR no longer leave it stuck on "Waiting" forever.
  • A failed job can no longer hide behind a later passing one: all matching checks are aggregated.
  • Notifications no longer fire in bulk on launch, and appear at most once per push (keyed by head commit), with a follow-up only for new feedback.

Architecture

  • A pure Core layer (StatusEngine, NotificationPlanner, PollingPolicy) with 39 Swift Testing tests.
  • Two-phase GraphQL: one aliased list query per 10 repositories, with details only for PRs that changed. That's about 1 point per repository per poll, down from about 5 REST calls per PR.
  • One structured-concurrency polling loop that refreshes after wake and network changes, backs off on errors, and waits out rate limits. A failing repository degrades on its own instead of blanking the list.
  • Swift 6 strict concurrency, Observation, and Xcode synchronized folders. No third-party dependencies.

UI

  • MenuBarExtra panel with two-line rows, palette status glyphs, skeleton loading states and a filter menu.
  • Settings moved to a neutral sidebar, with + actions in section headers and an iOS-style checkmark list for the agent mode.
  • A layered Icon Composer app icon for iOS, iPadOS and macOS, with dark and tinted variants.
  • Sign in with one click via the GitHub CLI, or use device flow or a personal access token.

Distribution

  • scripts/release.sh builds a Developer ID–signed, notarized and stapled PRMonitor.dmg and ZIP. It has been run locally: both notarizations were Accepted, and Gatekeeper reports "Notarized Developer ID".
  • A release.yml workflow runs the same script on v* tags (the secrets it needs are listed in docs/RELEASING.md), plus a Homebrew cask template.

Test plan

  • swift test: 39/39 passing
  • xcodebuild test and a Release build with no warnings
  • PRMonitor --diagnose against live repositories: correct statuses, partial failures isolated
  • Notarized DMG verified with spctl and stapler validate
  • CI green on this PR

Regenerate the Xcode project with file-system synchronized groups so new files
are picked up automatically, add a unit-test target and shared scheme, and
enable strict concurrency. Add a CI workflow that runs the tests and builds
the app.
Derive agent and pull request status from check runs, commit statuses,
review threads, review requests and review commit SHAs. Plan notifications
by diffing snapshots per head commit, with a silent first-poll baseline.
Covered by 39 Swift Testing tests.
Batch repositories into one aliased list query and fetch details only for
pull requests that changed, keeping each poll near one point per repository.
Map partial errors to their repository, handle primary and secondary rate
limits, and add device flow, GitHub CLI and token sign-in.
Replace the popover with a MenuBarExtra panel: light two-line rows, palette
status glyphs, skeleton loading and a filter menu. Move Settings to a
sidebar, run the polling loop on structured concurrency, and add a layered
Icon Composer app icon. Debug builds gain diagnose, snapshot and showcase
tools for verification and screenshots.
Rewrite the README with a light/dark hero, download button and FAQ, add
Liquid Glass screenshots of fictional data, and document the architecture,
the audit behind the rewrite, and the release process.
scripts/release.sh archives, signs with Developer ID, notarizes and staples
the app and a disk image. The release workflow runs it on v* tags and
publishes to GitHub Releases. Include a Homebrew cask template.
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-29T01:26:22.222857Z c355f7d PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@BlockchainHB
BlockchainHB merged commit 0fd8b3c into main Sep 29, 2026
2 checks passed

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c355f7d0ce

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = YES;
GENERATE_INFOPLIST_FILE = NO;
GITHUB_OAUTH_CLIENT_ID = "";

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Supply the OAuth client ID to release builds

The Release configuration hard-codes GITHUB_OAUTH_CLIENT_ID to an empty string, and neither release.yml nor scripts/release.sh overrides it. Consequently, every published DMG has an empty GitHubOAuthClientID; AppSettings.oauthClientID remains empty and the advertised “Sign in with GitHub” button is disabled, forcing downloaded-release users to install gh, paste a token, or create and enter their own OAuth app ID.

Useful? React with 👍 / 👎.

Comment on lines +173 to +176
let seeded: Set<String> = ["vercel", "cursor", "devin"]
let legacyAgents = legacy.agents ?? []
let isUntouched = Set(legacyAgents.map { $0.checkNamePattern.lowercased() }) == seeded && legacyAgents.count == seeded.count
if legacyAgents.isEmpty || isUntouched {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve legacy agents customized without renaming patterns

Determine whether the legacy list is untouched from all seeded fields, not only checkNamePattern. In 0.x users could edit displayName and commentAuthor; if they changed either while retaining the three default patterns, this comparison still sets isUntouched, switches them to automatic mode, and silently discards their custom names and reviewer mappings during the upgrade.

Useful? React with 👍 / 👎.

Comment on lines +105 to +107
statusCheckRollup {
state
contexts(first: 100) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Account for failures beyond the first check-context page

Paginate this connection or otherwise preserve a truncated failing roll-up. For a commit with more than 100 contexts, a failed context can fall outside this first page while all decoded contexts pass; although the DTO retains rollupState == "FAILURE", StatusEngine only synthesizes an agent for PENDING/EXPECTED, so the PR is incorrectly reported as ready despite GitHub's aggregate failure.

Useful? React with 👍 / 👎.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant