Commit Graph
3844 Commits
Author SHA1 Message Date
OrcaWinandOrcaWin b0c0377664 test: remove subprocess and mobile navigation projections (#41842)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 21:49:42 -08:00
OrcaWinandOrcaWin 86cacb133c test: remove low-value runtime, daemon, and automation cases (#41839)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 21:34:24 -08:00
Neil 98bcd7943a refactor: organize text generation around concrete owners (#41838)
* refactor: organize text-generation modules around concrete owners

* refactor: combine imports from the defining CLI command owner
2026-11-12 21:30:08 -08:00
OrcaWinandOrcaWin f5c9075f0e test: remove low-value provider and branch cleanup coverage (#41825)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 21:02:30 -08:00
OrcaWinandOrcaWin aa736b6650 test: remove narrow mobile and settings navigation samples (#41818)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 20:49:14 -08:00
Neil 2050d9fbc6 refactor: group source-control modules by operation ownership (#41812) 2026-11-12 20:41:35 -08:00
OrcaWinandOrcaWin 55753811c5 test: trim issue labeler coverage to mutation reconciliation (#41810)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 20:29:15 -08:00
Neil cc29ae4820 refactor: organize provider modules by defining owner (#41772)
* refactor: organize provider modules by defining owner

* refactor: bind cleanup runner to provider owners
2026-11-12 20:04:13 -08:00
OrcaWinandOrcaWin ddf4aa8d74 test: trim worker release checks and remove precheck suites (#41796)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 19:53:48 -08:00
Neil 25eba813d3 feat(markdown): open clicked URLs in Orca, middle-click in system browser, and show link menu on hover (#41767)
* feat(markdown): open clicked URLs in Orca, middle-click in system browser, and show link menu on hover

* fix(markdown): share click handling and dismiss stale link edits

* fix(markdown): respect disabled editors and browser availability
2026-11-12 19:38:26 -08:00
Brennan Benson e4fdb8db89 Attribute Git demand and make setup path discovery asynchronous (#41325)
* Attribute Git demand and resolve setup paths asynchronously

* Check detached attribution without requiring an exact span envelope

* Keep invalid setup repository fixtures inside disposable directories

* Retire setup runner synchronous launch allowance

* test: type the canonical Git executor mock import
2026-11-12 19:36:24 -08:00
Brennan Benson 6968a60fb1 Keep Orca responsive during macOS permission helper cleanup (#41764)
* Keep Computer Use permission cleanup off Electron main

* Verify queued permission setup resumes after cleanup
2026-11-12 19:27:57 -08:00
Jinjing c75b43bc86 Improve bug report template for desktop, remote, and mobile (#11140)
* Improve bug report template for desktop, remote, and mobile

Capture where users hit the bug (local desktop, SSH, remote server, WSL, mobile, web) without extra host jargon, and collect remote OS when relevant. Extend the OS labeler for mobile.

* Reconcile OS and mobile labels from the bug form's current state

Form: one "Where were you using Orca?" choice (Desktop only, + SSH host,
+ Orca server, + WSL, Mobile app, Web browser, Other), device OS with iOS
and Android, optional remote host OS, shorter help copy and per-platform
version instructions. Main's English request is kept.

Labeler: read the issue as it is now instead of the webhook snapshot,
recognize only a bug form at the very start of the body (optionally after
the exact machine-translation note line), and stop at the free-text
heading. Unknown, repeated, out-of-order or multi-line metadata leaves
labels untouched. Only os:macos, os:Windows, os:linux, os:mobile and
mobile are ever added or removed, one label at a time, so labels added
concurrently by people or other workflows survive. Each pass is verified
by a re-read and retried up to three times; runs are serialized per issue.

Fixes stale mobile labels after an edit to desktop, stale OS labels after
an edit to Other or blank, empty sections reading the next heading as a
value, quoted form sections relabeling unrelated issues, and prototype
names such as "constructor" being sent as labels. Retired Where option
strings and the Client / Host operating system headings keep working for
open issues.

Tests run the workflow's inline script against a stateful mock of the
issues API.

* Trim OS labeler tests to behaviour that fails when the fix is reverted

Review finding F11140-C1-1: several added tests pinned form copy, option
inventories, schema keys, workflow constants or script source, and kept
passing with the production change reverted.

- Delete bug-report-issue-form.test.mjs (schema keys, copy, option lists,
  About-menu source regexes). The form/labeler contract is kept as one
  behavioural case: every option the shipped form offers is recognised.
- Drop the workflow-constant and script-source regex tests, the log-copy
  assertion, the note-length check and the plain-string label case.
- Replace the Where x OS matrix (with its test-side oracle) and the other
  Cartesian tables with one literal case per distinct behaviour.
- Point negative fixtures at an OS the old script would label, so each
  kept case fails against the reverted workflow rather than passing because
  the old script skipped iOS.

220 -> 59 tests; all 59 fail with only the workflow reverted to main.
Test-only change; no runtime path changed.

* Keep the shadowed legacy value case in the heading-presence test

It covers a distinct rule (an invalid legacy value is ignored when the
current heading is present) and was dropped by mistake in the trim.
2026-11-12 19:23:31 -08:00
Neil 69dc20ed33 refactor(automations): group run lifecycle modules by ownership (#41737) 2026-11-12 17:44:20 -08:00
Neil aa03cfb7c7 refactor: organize worker and federation lifecycle owners (#41716) 2026-11-12 17:00:29 -08:00
Kelvin Amoaba c5657bd5a7 feat(computer): type into a named text field without focusing it on Linux and macOS (#41421)
* feat(computer): type into a named text field without focusing it on Linux and macOS

* fix(computer): report unconfirmed Linux text readback and cover element typing

* test(computer): send an element with benchmark text only for targeted typing

* test(computer): pick gedit's editor, not its hidden overview map, in Linux e2e

* docs(computer): confirm focus before the unindexed type-text fallback

* fix(computer): report unreadable element text readback as readback_unsupported
2026-11-13 00:28:06 +00:00
Neil f9c7d17f9d refactor: organize sidebar inputs by concrete owners (#41698) 2026-11-12 16:24:24 -08:00
Brennan Benson 912a723f6c Give terminal agents a lasting Agent ID with Copy Agent ID (#41286)
* Give terminal agents a lasting Orca Agent ID

Terminal agents now get an Orca ID (orca_session_id:<agent>_<uuid>) derived
from their own conversation id on the host that runs them, so it stays the
same across worktree sleep/wake, app restart and a hand-run resume in any
pane. The terminal pane menu gets Copy Agent ID beside Copy Session ID, and
worktree ps --json agent rows carry orcaSessionId. Messaging a terminal
agent by that ID is refused with a message naming its pane until terminal
delivery lands.

* Name terminal agents at row admission and fix review round 1

- Perf: a row's Agent ID is resolved once, when its provider key changes at
  admission (legacy rows via the status adapter's prepareRow hook, tmux rows at
  canonical commit) and carried on the row as runtime-only agentIdentity.
  Snapshots, publications and internal notifications only copy it; no key
  serialization, cache lookup or database access per walk. Drops the pane FIFO
  cache.
- Refusal: the identity service keeps a reverse index id -> rows, kept exact by
  the adapter's rowChanged hook; a terminal refusal reads only matching panes
  and names only confirmed running ones (no resume seeds, exited or
  unconfirmed restored rows).
- Retry: a read-only identity file is lookup-only and never mints; any store
  failure backs off all SQLite work for 30 s; a Copy click retries once.
- Menu: Copy Agent ID shows for a live pane only when its host stamped an ID,
  and for a sleeping pane only when this app owns it on macOS/Linux.
- SSH: a sleeping record keeps its connection; a foreign (non-WSL) one resolves
  no ID.
- Renderer keeps an existing ID only for the same agent, owner and provider key
  including the Pi transcript locator.
- tmux-selected terminal rows carry their ID at every snapshot seam and in Copy
  resolution; structured chat rows stay excluded.

* Keep Agent ID work out of notifications and reach Copy wherever a host can answer

- Internal status/provider notifications walk rows without Agent ID work:
  canonical (tmux-selected) rows are decorated only for outputs that carry
  the id (snapshots, live emit, ps, Copy). The tmux publish body is now
  publishTmuxSelectedStatus so tests drive the production path.
- A row this host can name but has not yet (failed or pending link) is
  published with orcaSessionId: null; older hosts omit the field. The
  renderer offers Copy Agent ID on a live row whenever the field is present,
  and the click retries through terminal.agentId.
- Hosts advertise terminal.agent-id.v1. A sleeping pane offers Copy Agent ID
  when its owner is this app on macOS/Linux, or a remote owner that advertises
  the capability on a known non-Windows platform, and its record names no
  foreign connection.
- "Running in pane" places require that this runtime observed the row; a
  saved status, Done included, is history.

* Guard the pane menu subscription and stop offering Copy where it can never succeed

- A settled read-only miss (no link in a newer build's identity file) no
  longer publishes orcaSessionId; only a resolved id or a pending failed link
  does, so Copy Agent ID is offered only where a click can succeed.
- Render contract for the per-pane menu selection: another pane's or host's
  status change re-renders no unaffected pane; a pane's own stamp flips its
  availability.

* Move terminal agent identity SQL into a worker thread

Main's blocking-SQLite ratchet forbids the synchronous identity store, so
(per the decider ruling) agent-identities.db is now owned by one lazy
worker-thread entry per hook-server owner, desktop and orcad alike.

- The schema, open/version handling, mint/link transaction and read-only
  behaviour move unchanged into agent-identity-worker-entry.ts; main keeps
  only the key type, path and an async client over WorkerThreadRequestQueue.
- Admission stays synchronous: a new key is published pending (null), one
  request per exact key is shared by every row and click, and the committed
  answer re-stamps the current rows still pending on that key (legacy and
  tmux-selected) as identity-only replays. Replies are fenced by store
  generation, key and current subscription; failures back off 30 s and a
  Copy click retries once.
- terminal.agentId and the terminal-ID refusal are async: Copy waits for the
  pending lookup and revalidates the pane; send/task routing resolves the
  terminal recipient (awaiting the store's has() on an index miss) before
  any synchronous routing or effects.
- The renderer treats the host's row naming a conversation as authoritative
  for its id, so a settled miss clears a pending null, while ID-less local
  updates keep it.
- Packaged for desktop and orcad; registered as a worker entry, no baseline
  growth.

* Own identity demand per key, publish settled ids as projections, recheck authority

Implements the second decider ruling for the identity worker:

- One owner-level demand table replaces the per-key promise backlog and the
  settled-row scan: each exact key a current row or caller needs has one
  record (identity, places, waiters); the pump sends the worker one operation
  at a time, only for keys still needed, so a healthy burst completes and
  detached keys are never sent. Operation deadlines start at dispatch; a
  caller's wait expiring never drops a row's demand.
- One failure gate for lookups and membership: after a failure nothing is
  sent for 30 s except one coalesced Copy attempt; a single owner wake
  retries while rows still wait, and cancels with the last demand or close.
- The retirement barrier outlives a client: a replaced worker must exit
  before another starts; a different store path is a different authority.
- Settlement re-stamps the stored row and publishes a projection only: window
  readers get the row without its hook event (no agent-state record) and
  session.tabs is woken by a row touch; no enriched subscriber, plugin event
  or freshness heartbeat runs again.
- Copy and terminal membership check the owner generation after their waits.
  A known chat is decided by the chat store alone; send, peer mail, reply and
  assignee admission resolve the terminal recipient before reading the facts
  they act on, recheck the sender after the wait, and group send reselects
  its audience and mailboxes after each wait before writing.

* Scope identity answers to their store authority, expire Copy grants with callers, index provider aliases

- One synchronized authority token before Copy/reverse fast paths, compared after their awaits;
  answers carry their authority and an ended store turns rows, tmux subjects and the reverse
  index pending together. Status path changes sync the authority outside admission.
- A failed operation reschedules the pump so a queued click gets its attempt; grants belong to
  live waiters and a click joining a running attempt earns none.
- Provider-native ids resolve through a commit-maintained alias index at the record store.
- Group fan-out no longer classifies authoritative candidates; @idle rereads statuses with
  current candidates before the final synchronous selection.
- Hook-server unit fixtures use an in-memory identity client; a real worker load/stop failure
  check covers the worker boundary.

* Pick a shared provider alias's owner among its owners only

The alias index keeps the store's listing order (readable, then unreadable) as derived ranks, updated from the draft's appended keys on commit, so a duplicate alias no longer walks the history per lookup.

* Ask a remote pane's host for its Agent ID by the host's own pane key

Copy Agent ID on a web-terminal surface sent the client's mirrored pane key, which the execution host does not know, so it answered null.

* Keep focus where the user moved, recover a missed identity re-stamp, ack peer-mail replays first

Copy Agent ID refocuses its pane only when focus is unclaimed or still in the pane; a carried pending row takes its key's settled answer; an already-delivered peer-mail retry is acknowledged before recipient preparation.
2026-11-12 16:18:16 -08:00
Brennan Benson 4fb159a95f perf: restore terminal history without synchronous IPC (#41660)
* perf: restore terminal history without synchronous IPC

* fix: follow moved terminal topology imports

* Consume queued terminal commands when startup dispatches
2026-11-12 16:12:57 -08:00
Brennan Benson 5cdce4da25 Antigravity chat setup: install from Chat UI settings, sign in from the chat (#41506)
* Chat UI settings: install an agent's chat runtime from its row

* Keep the install line while Orca installs over an external copy or can't read status

* Keep Removing… visible in the Chat UI install line

* Chat UI and new chats: show Antigravity sign-in as the next step after install

* Record NativeChatStructuredSession's cleared React Compiler bailout

* Keep the Chat UI row install-only; open sign-in on the chat's host and skip chats on the host's agy
2026-11-12 16:11:42 -08:00
Brennan Benson 8a65291fb3 fix(settings): show healthy orca.yaml status as a collapsed row (#41395)
* fix(settings): drop nested cards from Worktree hooks

The orca.yaml status, its parse-error callout and the local-scripts notice drew bordered panels inside the Worktree hooks card. Render them as flat rows; code blocks and inputs keep their borders.

* fix(settings): show healthy orca.yaml status as a collapsed row

Loaded and missing orca.yaml now render as a disclosure row under Command source instead of a tinted card inside the Worktree hooks card; the script preview or template is collapsed by default. Parse-error and update-available keep their warning card. Advanced content is indented to line up with its label. Restores the local-scripts notice card from main.

* chore(i18n): drop orca.yaml status strings the new row no longer uses

* fix(settings): keep orca.yaml row inside design-system lint rules
2026-11-12 16:08:30 -08:00
OrcaWinandOrcaWin b663c756cb test: retire low-value draft and CDP lifecycle examples (#41704)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 16:08:18 -08:00
OrcaWinandOrcaWin b546bd0a23 test: retire low-value mobile composer and CDP suites (#41699)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 15:52:58 -08:00
Neil 5859a505e0 refactor: organize terminal topology by persistence owner (#41690) 2026-11-12 15:22:50 -08:00
OrcaWinandOrcaWin 43df511fad test: remove low-value mobile, focus, and prompt coverage (#41692)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 15:16:17 -08:00
OrcaWinandOrcaWin bb09acd71c test: remove low-value authoring, CLI, and preload suites (#41688)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 15:03:11 -08:00
Neil d634063ef2 refactor: organize mobile cloud relay by lifecycle owner (#41681) 2026-11-12 14:36:07 -08:00
OrcaWinandOrcaWin 4578eed703 test: remove low-value plugin policy and frame suites (#41679)
* test: prune catalog policy examples and source-module floor suite

* test: remove low-value plugin frame and wrapper suites

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 14:30:02 -08:00
OrcaWinandOrcaWin e388a69394 test: remove low-value plugin policy and graph GC suites (#41675)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 14:07:58 -08:00
OrcaWinandOrcaWin 3265616c56 test: prune low-value plugin artifact and contribution tests (#41663)
* test: prune low-value theme and icon artifact samples

* test: remove plugin syntax limits and contribution inventories

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 13:55:06 -08:00
Neil cab3a67382 refactor(orcad): organize runtime, launch, and host lifecycle owners (#41659) 2026-11-12 13:54:51 -08:00
OrcaWinandOrcaWin ed3062af09 test: remove low-value catalog and marketplace inventories (#41655)
* test: remove low-value catalog detail and policy samples

* test: remove low-value marketplace and kill-list inventories

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 13:19:53 -08:00
OrcaWinandOrcaWin 918bbcbe6e test: remove manifest inventories and one profile policy sample (#41648)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 13:06:44 -08:00
OrcaWinandOrcaWin 45dfd93499 test: remove low-value plugin schema inventories (#41647)
* test: remove low-value panel and settings schema cases

* test: remove status bar schema inventory cases

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 12:51:45 -08:00
Jinjing 3bf30ca1d5 fix(ci): skip closed-PR cleanup when the PR was reopened before it ran (#41646) 2026-11-12 12:48:01 -08:00
Neil c3f8f4100c refactor(native-chat): organize launch, transcript, and conversation owners (#41643) 2026-11-12 12:45:03 -08:00
Kelvin Amoaba 41c8b81372 fix(computer): capture covered Windows windows, refuse elevated targets, time-box hung windows (#41468) 2026-11-12 20:40:24 +00:00
OrcaWinandOrcaWin 0b83894696 test: remove low-value schema and unused-reader tests (#41638)
* test: remove routine relay response schema examples

* test: remove suite for unused automation jobs reader

* test: remove Box schema inventory and duplicate warning tests

* test: remove unused relay predicate and schema budget examples

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 12:18:09 -08:00
OrcaWinandOrcaWin 3c46c57682 test: remove low-value launch and contract tests plus unused fixtures (#41636)
* test: remove unused comparator coverage and orphan fixtures

* test: retire redundant CLI agent launch composition suite

* test: remove connector hello limit mirror

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 11:48:47 -08:00
Neil e1d4314a46 refactor(window): organize clipboard, lifecycle, security, and relay owners (#41634)
* refactor(window): group clipboard, lifecycle, security, and relay owners

* refactor(window): keep Electron paste handling with desktop clipboard
2026-11-12 11:47:00 -08:00
OrcaWinandOrcaWin 908ab68ca0 test: remove low-value popup, plugin visibility and teardown checks (#41629)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 11:26:07 -08:00
Jinwoo Hong fb5bf4450d fix(mobile): let the chat transcript scroll by touch on the phone's web pages (#41578)
* fix(mobile): let the chat transcript scroll by touch on the phone's web pages

Gesture handler 3 (Expo 58 upgrade, #37935) gives a GestureDetector's view
touch-action: none on web by default. The chat transcript's pinch-to-zoom
detector sits on its scroller, so in the phone's WebView pages the browser
refused every touch pan and no chat could scroll. Gesture handler 2 left it
at auto.

The row list now wraps its own scroller in MobileNativeChatPinchZoom, which
keeps touch-action: auto. A browser render check pins the scroller's
touch-action under the detector.

* fix(mobile): keep the transcript pinch on its text size, not page zoom

touch-action: auto let a two-finger pinch on the transcript zoom the whole
page in the phone's web pages, so the transcript's text-size pinch never ran
and a zoomed page stopped the composer lifting over the keyboard.
pan-x pan-y keeps one-finger scrolling (and sideways code blocks) with the
browser and hands the pinch to the detector.

The render check now pans the transcript with one finger and pinches it
with two, asserting it scrolls, the text scale changes and the page stays
at scale 1.
2026-11-12 14:10:05 -05:00
Neil b10c07fbc3 refactor(startup): organize remaining lifecycle and service owners (#41624)
* refactor(startup): organize remaining lifecycle and service owners

* fix(tests): bind quit mocks to concrete shutdown owners
2026-11-12 11:08:38 -08:00
Brennan Benson d0007451eb Antigravity settings: flatten into agy terminal and Chats cards (#41531)
* Antigravity settings: flatten into agy terminal and Chats cards

Replace the nested Antigravity card with two flat settings cards. Saved agy
accounts become Codex-style rows (click to select, Active badge, Remove), the
current login gets an inline Save, and usage refreshes from the active row.
Chats lists Sign in with (Enterprise fields inline), Account status with its
action, then Chat runtime.

* Use primitive variants for Antigravity row buttons and badge

* Antigravity settings: speak usage values and keep the /logout step
2026-11-12 11:08:36 -08:00
OrcaWinandOrcaWin 1fbd7c2356 test: retire low-value scanner, account, browser, and terminal suites (#41623)
* test: retire vault corpus and account setup suites

* test: retire synthetic browser and document host suites

* test: retire synthetic terminal motion suites

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 11:06:33 -08:00
OrcaWinandOrcaWin 50e702d51f test: retire scanner, runtime status, and chat windowing suites (#41621)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 10:43:51 -08:00
Brennan BensonandClaude Opus 5.5 5d34b135ab perf(worktrees): one owner for each repository's worktree list (#41480)
* perf(worktrees): give each repository's worktree list one owner

The sidebar and the runtime catalog each kept their own copy of a
repository's `git worktree list` result and their own staleness rule, so
the same change was often listed twice. One owner per repository, host
and Git runtime now holds the observation, its flight and invalidation;
each reader keeps its accepted age (sidebar 5 s, runtime 30 s plus the
admin-file verifier up to the 5-minute ceiling) and shares the scan.

Settled rows now go stale on Git-level mutations too, overtaken readers
follow one trailing scan, store hygiene uses the facts captured before
the scan that produced the rows (once per observation), and a cooled-
down watcher failure defers its catalog refresh instead of dropping it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(worktrees): fence the catalog owner by runtime, single flight and hygiene claims

Sidebar reads age from scan start, so runtime verifications no longer
stretch them; probes only certify rows fingerprinted before their scan.
One flight per owner, with a single trailing scan after invalidation.
Switching a repo's Git runtime retires the old owner, and a reader whose
owner was retired mid-read returns non-authoritative rows. Only pruning
readers claim hygiene, failed scans keep the evidence gate's no-retry
claim, overflow invalidates at once, and the stopped-distro fallback
serves only current rows.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(worktrees): let only the live route own a repository's catalog

The catalog owner now asks the live registration which path and Git
runtime are current instead of trusting whichever request arrives last.
A request admitted for a replaced route runs no Git, retires nothing and
answers non-authoritatively; liveness is rechecked before a flight
starts and when it publishes. Route-changing writes retire obsolete
owners after they land. Adapters re-resolve the route after the WSL
admission check, a mismatching verification probe becomes the rescan's
fingerprint, and runtime scans share the strict true-empty-aware reader.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(worktrees): bound live-route checks and recheck authority before pruning

Live-route checks read the repo registry once per synchronous pass
instead of hydrating every repo per check. WSL discovery answers that
change a repo's Git route retire obsolete owners like other route
writes, and desktop and headless pruning recheck the owner's authority
for the observation after their own awaits.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(worktrees): revision the live-route snapshot and carry owner authority to publication

Route checks use one registry and project pass per route-input revision,
which repo, project-membership and runtime-setting writes advance
synchronously; WSL discovery answers retire obsolete owners at once.
Repair-state and SSH routes never acquire local Git authority. Metadata
pruning rechecks owner authority after its path probes, fleet lineage
claims require a current observation, and final desktop and runtime
listings stay non-authoritative once the owner has retired their route.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(worktrees): keep remote-owned repos out of local Git routes

Registrations owned by another host never get a local Git route, WSL
discovery notifies after the distro list is written and isolates its
listeners, and tests cover idle retirement on route-input and discovery
changes plus pruning that loses owner authority mid-helper.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(worktrees): cover catalog route authority at its production seams

Real repo-removal writer revokes the route at once, and desktop and
runtime listings never publish owner rows as authoritative after their
route was retired.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(worktrees): prove catalog authority at the pruning helper and Git conversion writer

The runtime listing loses route authority during its own metadata prune
and stays non-authoritative; a real held path probe deletes nothing once
the owner retires the route; a folder converted to Git is admitted as a
live route as soon as the write lands.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(worktrees): keep strict true-empty listing behind the mockable lister

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(worktrees): start each worktree.ps case from an unobserved catalog owner

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* build(typecheck): list the WSL discovery change module in the web project

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(worktrees): withdraw catalog authority from a replaced observation

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-11-12 10:32:22 -08:00
Neil 7fea1779d0 refactor(startup): group launch and platform startup owners (#41613)
* refactor(startup): group launch and platform startup owners

* refactor(startup): preserve ACL recovery copy protection
2026-11-12 10:15:54 -08:00
OrcaWinandOrcaWin a1034d5bd8 test: retire mobile presence and native-chat fixture suites (#41617)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 10:02:51 -08:00
OrcaWinandOrcaWin d34c829237 test: retire low-value draft, crypto, and lifecycle coverage (#41614)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 10:02:35 -08:00