Skip to content

fix(app): supervise helpers without blocking startup - #57

Merged
Dunky13 merged 8 commits into
mainfrom
marc-went/fix-install-startup-hang
Oct 30, 2026
Merged

Dunky13 merged 8 commits into
mainfrom
marc-went/fix-install-startup-hang

Conversation

@Dunky13

@Dunky13 Dunky13 commented Oct 30, 2026 •

Copy link
Copy Markdown
Owner

Summary

Opening the app could wait indefinitely for launchd daemon readiness. Setup now retires legacy helper registrations and registers only the login item; the menu bar app supervises the queue, resource controller and optional phone service.

open app -> show menu -> prepare installation -> supervise helpers
quit/crash -> stop helpers -> independent job workers continue

Review repairs preserve the drained-queue gate for removal and relocation, reconcile enabled phone settings after delayed service shutdown, and refuse helper startup when the crash lifeline cannot be allocated. Restart documentation matches the implementation.

The native CI follow-up records state transitions before delayed observers run and uses a controllable restart clock to verify exact throttle boundaries and cancellation. The production continuous clock and ten-second restart policy are preserved.

The Intel core CI follow-up distributes the complete ordinary backend inventory across two required shards per architecture. Race detection, two workers, the twelve-minute test timeout and twenty-minute job budget remain in place. HTTPS and live upgrade keep their own required jobs; the first core shard also runs the other runtime packages.

The paused banner now includes Resume in both the menu panel and queue window. It uses the existing controller action, disables concurrent mutations, shows progress and refreshes confirmed status. The empty state now describes the paused queue instead of saying it is ready.

Evidence

  • Before repair: regression tests reproduced removal and relocation accepting queued, starting, running and outcome work; missing lifelines allowing helper launch; and delayed phone reconfiguration leaving enabled access stopped.
  • Local follow-up: the full native suite (118 supervisor checks), source-boundary check and whitespace check pass. Earlier runtime repairs passed the four-package Go race batch and Go vet. Independent Standards and Spec rechecks found no remaining actionable findings in the final clock/test repair.
  • Local validation and final independent review results are recorded in docs/handoffs/pr-57-review-fixes.md.
  • All 20 hosted checks passed on the pre-Resume head 6bafe90, including both core shards on both architectures and ci-required. The new Resume head requires fresh CI.
  • Resume validation: full native suite, controller duplicate/error/retry regressions, real AppKit clicks in both surfaces, and workflow/static checks pass locally. The fixture verifies one exact resume command, retained jobs and removal of the paused banner.
  • Live login-item registration, graphical startup acceptance, Apple signing/notarization, publication and deployment are separate verification steps.

Screenshots

Matched dark-mode captures use only public simulated jobs. The historical baseline backports only the injected-provider constructor seam, leaving its view code unchanged. Native jobs retain before/after PNGs and verification receipts as Native-resume-macos-15-1 and Native-resume-macos-15-intel-1 (attempt suffix increments on reruns).

Screenshot artifact bundles for this head are pending hosted capture. Local captures have been visually checked.

Surface Before PNG After PNG
Empty menu, 500×650 points before/paused-menu-empty.png after/paused-menu-empty.png
Waiting-job window, 800×700 points before/paused-window-waiting.png after/paused-window-waiting.png

The bundle also includes the resumed state for both surfaces. No screenshot files are committed.

Merge Danger

Door: Two-way

Blast Radius: Runtime

Changes helper ownership, application startup/shutdown, managed installation and phone-access lifecycle. Existing durable job ownership, attempt recovery and executable custody remain authoritative.

Before confirming a squash merge:

  • Required checks pass on the reviewed head.
  • The final squash author name and email have an exactly matching Signed-off-by trailer. Check the selected email, including any GitHub noreply default.
  • For a maintainer-owned PR, select squash author Marc Went <marc@went.io> and retain exactly one maintainer trailer: Signed-off-by: Marc Went <marc@went.io>. Consolidate duplicate maintainer trailers and the maintainer's noreply alias; preserve other contributors' certifications. Follow the commit policy below for GitHub CLI author selection and post-merge verification.
  • After owner approval, use sh scripts/merge-pr.sh PR_NUMBER REVIEWED_HEAD SQUASH_BODY_FILE to bind the reviewed head, primary author email, and single maintainer certification, then verify the actual merged commit. Green PR checks do not validate a future web squash commit's author identity.
  • A maintainer takeover of a bot update uses a maintainer-owned PR so the final author and certification remain aligned.
  • Keep Verified signatures and branch protection enabled.

See the commit policy and squash author instructions.

Startup graphical fixture follow-up

On 38fd1ca, Resume graphical checks passed and published screenshots on both architectures. ARM then timed out in the existing startup fixture's status-item click; Intel passed. A controlled queued layout event reproduced a missed target and the same popover timeout. The fixture now sends mouse-down synchronously through its status window and prioritizes the paired mouse-up. A required queued-layout regression fails with the old delivery and passes with the repair. Production behavior, deadlines and required checks are unchanged. All twelve startup graphical scenarios pass locally; independent Standards and Spec reviews found no actionable issues. Fresh CI on f5a243b remains pending.

Published Resume evidence for the unchanged UI from 38fd1ca: Apple Silicon screenshots, Intel screenshots. These are prior-head visual evidence; the new head must pass its own required jobs.

Final validation on reviewed head

All 20 checks, including ci-required, passed on f5a243be7acfabae4a0b6a8f09511bf22a1884d9. The targeted Intel native retry passed without code or policy changes. The universal app build and installer/package validation passed. Independent Standards and Spec reviews have no remaining actionable findings.

Exact-head before/after Resume screenshots and verification: Apple Silicon, Intel rerun. Startup evidence: Apple Silicon, Intel rerun. Successful universal app build artifact.

Dunky13 and others added 4 commits October 30, 2026 10:28
Co-Authored-By: Claude Code <noreply@anthropic.com>
Signed-off-by: Marc Went <marc.went+git@teifi.com>
Co-Authored-By: Claude Code <noreply@anthropic.com>
Signed-off-by: Marc Went <marc.went+git@teifi.com>
Co-Authored-By: Claude Code <noreply@anthropic.com>
Signed-off-by: Marc Went <marc.went+git@teifi.com>
Signed-off-by: Marc Went <marc@went.io>
@Dunky13 Dunky13 changed the title Marc went/fix install startup hang fix(app): supervise helpers without blocking startup Oct 30, 2026
Signed-off-by: Marc Went <marc@went.io>
Signed-off-by: Marc Went <marc@went.io>
Signed-off-by: Marc Went <marc@went.io>
Queued layout could move the transferred status button before synthetic mouse-down reached AppKit. Deliver mouse-down through its window and prioritize the paired mouse-up, preserving the real native action path. Add a required pending-layout regression that fails with the previous delivery.

Signed-off-by: Marc Went <marc@went.io>
@Dunky13
Dunky13 merged commit 3678368 into main Oct 30, 2026
38 of 40 checks passed
@Dunky13
Dunky13 deleted the marc-went/fix-install-startup-hang branch October 30, 2026 18:15
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