Skip to content

Fixes from the docs: pairing security, hand-off permissions, updates, uninstaller - #44

Merged
MasterYoav merged 14 commits into
masterfrom
fixes-from-docs
Oct 12, 2026
Merged

MasterYoav merged 14 commits into
masterfrom
fixes-from-docs

Conversation

@MasterYoav

Copy link
Copy Markdown
Owner

Fixes for what the documentation rewrite (#43) found. Two parts, each test-first.

Pairing and the remote

  • An unused pairing code is withdrawn when its sheet closes, expires after 10 minutes, and is cleared at relaunch. Only paired devices and live codes are accepted, on either lane.
  • One code pairs one device: the phone's hello now carries an install id, and a key is refused from any other installation once claimed.
  • Local lane: the hello must name the key the TLS-PSK handshake actually used.
  • iCloud lane: sender, recipient and sequence number are sealed in as AES-GCM authenticated data; the replay mark survives relaunches; only accepted batches move it.
  • Phone: Paste a pairing link (clipboard or typed), and opening an xbot://pair link while paired asks before replacing the pairing.

Everything else

  • Hand-offs never get more permission than the manager's chat has; an Antigravity member stays read-only unless the manager has full access, and the reply says so.
  • Secrets in MCP command lines and URLs are masked on the Abilities page and before reaching the phone.
  • ⌘↩: Commit only while the commit field has focus, so it never collides with Run plan.
  • Home's no-agent state names all four CLIs.
  • Sparkle: no update installs mid-turn; the daily check is scheduled; an unconfigured build says so.
  • Info.plist: version from XBOT_VERSION (2.0.0-dev), copyright no longer credits the old engine.
  • uninstall-xbot.command removes the automations LaunchAgent and the pairing keys; create-dmg.sh and sign-mac-remote.sh tidied.
  • HarnessKind comment fixed; the live plan test only runs for CLIs that can plan; dead iOS code removed; Compass became Spark (Marketer).
  • Docs updated to match (security, packaging, checklist, UI spec, first run, iPhone and iPad).

Verified: 473 package tests pass (30 new; new remote suites run 10×). Live phone tests against a debug Mac: new chat, abilities, org chart, terminal, world sync, projects all pass (abilities flaked once on the first ability refresh after relaunch, then passed). iOS builds. Phone and Mac must be updated together (older phones without an install id are refused).

…ravity stays read-only unless the manager has full access, and says so
…one with their secrets masked (URL userinfo and query values, token/key flags and assignments, Bearer values)
…ds aside then, so the two never share the shortcut
…le the daily check at launch, and say so when a build has no update feed
… pairing's Keychain items and drops 1.x wording; create-dmg's usage and hints match the release; sign-mac-remote's DerivedData is repo-local
…rketer replaces the Product planner that overlapped the Product manager in suggested agents
…urns, the 2.0 uninstaller and Info.plist, ⌘↩ and Home's four CLIs, as the code now is
… the key used; iCloud batches authenticated

- Invites are withdrawn when the pairing sheet closes, expire after 10 minutes, and are removed
  at relaunch if never used. Only paired devices' keys and live invites are accepted, on both
  lanes; other keys in the Keychain open nothing. The sheet says how long the code works and
  offers a new one once it expires.
- A code pairs one device: the phone sends an installation id in its hello; the first
  installation to use a key is the device, and the key is refused from any other.
- Local lane: the listener's PSK selection block records which key each handshake used
  (PSKChoices); a hello naming any other identity closes the connection.
- iCloud lane: sender, recipient and sequence number are AES-GCM authenticated data; only
  accepted batches move the replay mark, and the mark persists across relaunches on both sides.
  Every phone batch starts with its hello, checked against the paired installation. Mail from
  keys the Mac doesn't accept is deleted unread.
- iOS: "Paste a pairing link" (clipboard or a text field); opening a pairing link while paired
  asks "Replace the pairing with <Mac>?".
- Docs: security and iPhone pages describe the new behaviour; fixed weaknesses removed.
@MasterYoav
MasterYoav changed the base branch from docs-refresh to master October 12, 2026 12:00
@MasterYoav
MasterYoav merged commit a5eb530 into master Oct 12, 2026
1 check passed
@MasterYoav
MasterYoav deleted the fixes-from-docs branch October 12, 2026 12:03
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