Skip to content

feat(mobile): J5 daily-use parity — Squadrons, inbox, A2A, and lifecycle #40

Description

@Jacksondr5

Posted by an AI agent on Jackson's behalf

Outcome and ownership

Make the native J5 mobile client useful for daily Squadron work against the same J5 environment used from the browser: explicitly choose a Squadron, create and continue threads, see and answer human inbox requests, and read A2A messages.

On 2026-09-05 Jackson approved the desktop/mobile delivery sequence and assigned step 4 (mobile feature parity) to a separate agent through this issue. Jackson and the current distribution agent own steps 1–3: desktop installation, fork release automation (including removal of Blacksmith dependencies from J5 workflows), and mobile build/signing/distribution. This issue is an implementation handoff; no agent has been assigned or started by this edit.

Preserve the original umbrella: admitted to the dogfood queue by Jackson (board ask #33, 2026-09-01), board finding #150. This is the named return for DV5 mobile rows, the two mobile archive doors deferred by B4, and SQ1's mobile gap in docs/j5/product/dogfood-v0.md.

Current behavior and source anchors

Inspected at 51ee0fd64a2597d6ac4204b2096f164da240dbb3; refresh these findings against the implementation base.

  • apps/mobile/src/lib/projectThreadStartTurn.ts:buildProjectThreadStartTurnInput sends creationSource: "mobile" without Squadron context. Both features/threads/use-project-actions.ts and state/use-thread-outbox-drain.ts call it.
  • apps/server/src/j5/a2a/SquadronLaunchPolicy.ts explicitly assigns mobile launches to mobile-future-squadron. These launches are currently allowed as native threads outside Squadrons, not rejected merely for lacking a Squadron.
  • No native mobile integration for the J5 Squadron directory, human inbox, or J5 A2A renderer was found.
  • Existing server services/routes include SquadronThreadCreationService, ThreadHomesHttp, HumanInboxHttp, and J5AuthenticatedRoutes under apps/server/src/j5/a2a.
  • Web behavior references are apps/web/src/j5/squadron and apps/web/src/j5/a2a, especially ThreadHomesClient, HumanInboxPage, and ThreadA2ARenderer. Port the behavior to React Native; do not import DOM components.

Scope

  1. Explicit Squadron ownership. Add a truthful mobile directory/selection flow and visible existing-thread home. Thread creation must carry the explicit selected Squadron to the owning environment through immediate sends and the persisted offline outbox. A folder/project is an attribute, never a substitute for Squadron identity. Freeze ownership with the queued creation; changing the picker later must not retarget an already queued send.
  2. Creation and lifecycle entry points. Inventory all mobile new-task doors, shortcuts/deep links, offline drains, plan-to-implementation, and both deferred archive doors. Reuse durable home lookup and existing archive-facts contracts. Preserve explicit native/legacy states. Change the mobile policy exception only alongside a proven complete launch path and a documented older-client compatibility decision.
  3. Human inbox. Show actual requests, count, loading/error/offline states, and reply actions using server-returned person identity. Route answers to the owning environment and preserve existing exchange semantics.
  4. A2A rendering. Render supported inbound/outbound structured messages clearly with truthful identities and raw/generic fallback for unknown or malformed records. Preserve the shipped rule: “plain sends to a person are not surfaced in v0 — use expect_reply when the person should see it.”
  5. Connection correctness. Use the selected saved connection and existing authentication. Scope directory, home, inbox, and outbox state by environment. Start with one connected J5 host; do not infer the local/primary environment when the user selected a remote one.

Boundaries and dependencies

  • No signing, EAS/App Store configuration, release workflows, Blacksmith setup, binary publication, or OTA setup here; coordinate native dependency changes with the distribution owner because they can require a new binary.
  • No T3 Connect deployment, APNs/background notification infrastructure, cross-server exchanges, data migration between servers, or provider-adapter redesign.
  • Deferred: support remote Squadrons and inboxes in the local client #105 separately tracks web/desktop remote Squadron and inbox routing. Share findings and reusable connection logic where justified, but do not take over that deferred implementation. In particular, the web J5 clients currently hardwire primary-environment reads; copying them unchanged is not correct mobile remote routing.
  • Follow AGENTS.md and FORK.md: measure the exact integration scope, keep J5 behavior in fork-owned modules, and seek any specifically required protected-file ruling with the concrete proposed changes.
  • The handoff does not authorize changing the live installation/database, starting browsers/computer use, merging, or publishing releases. Use disposable state and arrange the integrated client pass under the repository's verification rules.
  • This is an umbrella: split implementation into narrow coordinated changes if needed, while retaining this issue as the acceptance checklist.

Acceptance

  • Selecting a Squadron launches on its owning J5 server and registers the thread's immutable home. Existing-thread labels come from Registrar truth.
  • Immediate and offline sends carry identical explicit ownership. Reconnect/retry delivers once; changing selection does not rewrite queued ownership.
  • Duplicate names, shared folders, and equal raw IDs across two fixture environments cannot cross-route launch, cache entries, inbox reads, or answers.
  • Invalid/missing ownership fails truthfully without guessing a Squadron; the old-mobile/native compatibility policy is explicit and tested before removing the exception.
  • An actual human request appears in the correct inbox/count and a reply closes the intended exchange exactly once. Failed reads never become fake empty lists or zero counts.
  • Supported A2A records render accurately; malformed/unknown records preserve readable fallback and never invent identity.
  • Mobile creation, plan handoff, and both deferred archive entry points are accounted for, with archive facts unavailable rendered as unknown rather than reassurance.
  • Focused tests follow the real connection lookup → URL/auth → request boundary, including a negative control that fails if routing is changed back to primary. Async proofs use receipts/controlled time, not sleeps.
  • After integration, one real mobile pass against disposable state proves pairing, existing-thread continuation, new Squadron thread, inbox reply, background/foreground return, and offline/reconnect behavior. Record source SHA and before/after evidence; identify iOS/Android coverage honestly.
  • Update docs/user/ for shipped mobile behavior and docs/j5/product/dogfood-v0.md for the exact deferrals retired. Do not claim parity for unverified surfaces.

Prepared with GPT-6 in the Codex harness.

Activity

  1. added
    dogfood-queueReserved J5-native dogfood work — not staffable in Traycer
    on Aug 31, 2026
  2. changed the title [-]E7 follow-up — mobile-Squadron milestone umbrella (board #150)[/-] [+]feat(mobile): J5 daily-use parity — Squadrons, inbox, A2A, and lifecycle[/+] on Sep 5, 2026
  3. Jacksondr5 commented on Sep 26, 2026

    @Jacksondr5
    OwnerAuthor

    Note from the 2026-09-26 Crews review: when this covers the deferred mobile archive entry points, include the Crew warning. Archiving a Captain retires its live Crews (server-side cascade, #312/#315), but mobile's archive swipe gives no warning. Web shows a dialog listing each live Crew's seats, running turns and open asks before confirming (crews.md AC17). Mobile should show the same facts, or an "unknown" state when the archive facts are unavailable.

  4. Jacksondr5 commented on Sep 28, 2026

    @Jacksondr5
    OwnerAuthor

    Mobile gap audit filed as #337: defects visible today, missing features by area, and the scope decisions. It needs an iOS Simulator pass on the Mac before implementation starts.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    dogfood-queueReserved J5-native dogfood work — not staffable in Traycer

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions