Skip to content

Latest commit

 

History

History
18 lines (16 loc) · 4.18 KB

File metadata and controls

18 lines (16 loc) · 4.18 KB

devctl backlog

Open work only; entries are removed by the change that resolves them.

  • Orphan re-adoption without the bounce: after a daemon crash, re-adopt live orphan servers (pid + start-time match, resume spool tailing) instead of group-kill + restart. Blocked on: exit codes are unknowable for non-children; needs a design for degraded forensics.
  • Reverse proxy on :80/:443 routing by host signature, making ports disappear from *.localhost URLs (Valet/Herd territory). Ephemeral worktree-*.<preferred>.localhost hosts are the unprivileged addressing half; the proxy would drop ports from URLs entirely.
  • MenuBarExtraAccess (orchetect) if .window presentation quirks bite in practice.
  • Populate Apple Developer ID + App Store Connect API secrets for .github/workflows/release-dmg.yml (and a Homebrew tap) so the Release→DMG dispatch can notarize on Actions; until then, mint locally (SIGN_IDENTITY=… make dmg + scripts/notarize.sh + gh release upload). v1.3.0 already has a stapled DMG from the local path.
  • App Intents / Shortcuts wrappers over the existing DeepLink verbs (open, ensure, stop, why) for Siri / Gemini-Siri and Control Center. The devctl:// URL table and DeepLinkRunner are the shared surface; intents should call the runner, not reimplement dispatch. Also the next plausible path for Spotlight ranking (IndexedEntity) once Core Spotlight levers are exhausted.
  • swift-subprocess 0.5 occasionally fatals in its kqueue AsyncIO cleanup at process exit ("Failed to close kqueue fds: Bad file descriptor"), seen once under parallel test load; harmless to the long-lived daemon but track against upstream releases (pinned revision in Package.swift).
  • Lock-release false crashed (2026-07-25 pnpm monorepo, healthy then exit 0 in ~230ms): unreproducible on fixture rapid acquire/release (N=20), grandchild fixture, and live pirl lock d1 cycles (2026-07-28). Resume now settles until the PortClaim is free or refuses to spawn dirty. Reopen with a failing repro that names exiting pid vs resumed pid before changing the exit classifier.
  • Spotlight thumbnails: confirm config icons render in the real Spotlight UI. Within-app ranking levers are maxed (lastUsed preserved across sync, incremental index updates, live/pinned rankingHint, alternateNames). Outranking filesystem / Cursor Top Hits remains an Apple ceiling; do not chase without a new system API.
  • Machine-wide resource lock opt-in: locks are already path-scoped (canonicalPath::resource) and pause only that path's declarers. A rare shared system resource (one Docker Postgres, a fixed system daemon) may still want an explicit machine-wide scope so two projects serialize. Not the Cloudflare worktree pause case (that was misread against path-scoped keys); defer until a concrete cross-project shared-resource incident.
  • healthcheck.type: "http" with no url silently degrades to a TCP probe on the declared port, or to .none (EffectiveHealthcheck.resolve), with no config-check warning. A typo in the url key yields a green server that was never HTTP-probed. The validator should warn (or error) on type: http with no resolvable url.
  • shell: true joins argv with spaces (ServerSupervisor.effectiveArgv), so any argv word containing a space or glob is re-split by zsh. The two spawn modes are not equivalent; a shell-quoting pass (or documenting the limit) would close the gap.
  • IntegrationTests is a single placeholder() while docs/design.md promises a real end-to-end suite there (port-conflict from a second project, concurrent double-ensure). Those now live in scripts/smoke.sh and unit suites; either build the integration target out or retire the promise in the design doc.
  • The <slug> algorithm exists twice, byte-identical: inline in Paths.serverLogDir and ProjectConfigLoader.defaultSlug. Consolidate to one home.
  • CLAUDE.md's codebase map lists Switch, Lock, Link as files under Sources/devctl and PortGuard under Health/; the first three are structs inside the ~1500-line CLI.swift and PortGuard sits in HealthProber.swift. Either fix the map or split those command structs into their own files (which also brings CLI.swift back under the size where splitting is worth asking about).