Repository navigation
feat(a2a): a thread's home is its project - #482
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
The welcome wizard loses its Squadron stage and imports into projects as upstream does. Branding and the Providers label stay. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Jacksondr5
force-pushed
the
fold/onboarding-back-to-upstream
branch
from
October 8, 2026 04:27
1912866 to
197e79c
Compare
Jacksondr5
force-pushed
the
fold/ledger-rekeys-to-projects
branch
from
October 8, 2026 04:27
8c2966e to
850fe82
Compare
Jacksondr5
force-pushed
the
fold/ledger-rekeys-to-projects
branch
from
October 8, 2026 04:40
850fe82 to
377247f
Compare
Jacksondr5
force-pushed
the
fold/ledger-rekeys-to-projects
branch
from
October 8, 2026 04:46
377247f to
eb3cba9
Compare
Jacksondr5
force-pushed
the
fold/ledger-rekeys-to-projects
branch
from
October 8, 2026 04:54
eb3cba9 to
b8a3915
Compare
Squadrons are retired (#412). The agent-to-agent ledger is keyed by project id, every thread except a provider Subagent is a participant in its own project, and everything an agent or a person reads says project. Migration 031 re-keys and renames the ledger in place: the Squadron table is never dropped, so nothing cascades, and no row is added, removed or renumbered. It refuses by name a project that several Squadrons share, keeps a record of the old ids and names, leaves a peer server's ids alone, and aborts if any table's row count changes or any row is left without a project. Registration moves off the launch path to the stored thread.created event, which every creation writes, including the two importers that bypass the thread.create command. A server that upgrades registers the threads it already has, and a caller without a home registers on its first agent-to-agent call. list_squadrons, join_squadron and the Squadron routes are removed. Tools, routes and contracts carry project ids and titles. A client refuses a server whose ledger is not keyed by project. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Jacksondr5
force-pushed
the
fold/ledger-rekeys-to-projects
branch
from
October 8, 2026 04:56
b8a3915 to
0cca778
Compare
5 of 7 tasks
Jacksondr5
marked this pull request as ready for review
October 8, 2026 05:29
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Jacksondr5
changed the base branch from
j5/fold-onboarding-back-to-upstream
to
j5/main
October 8, 2026 06:22
This was referenced Oct 8, 2026
This was referenced Oct 8, 2026
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Squadrons are being retired and folded into projects (decided 2026-10-05, #412). The client PRs put upstream's project UI back, but the server still kept its agent-to-agent ledger per Squadron, still told agents about Squadrons, and still left some threads (mobile, system-started, imported) outside the ledger.
This PR and #457 merge together. Part of #412.
What changed
After this, a thread's home is its project.
Migration 031 (
031_LedgerRekeysToProjects.ts)defer_foreign_keysdoes not hold a cascade back. A test pins that SQLite behaviour.squadron_idtoproject_id; the Squadron-to-project reference table is dropped;j5_a2a_retired_squadronkeeps every old id, name and project.peer:receivecommand prefix, and by the drop cause's kind.statev2.pre-j5-031.sqlite.Registration
thread.createdevent, which every creation writes, including the two importers that bypass thethread.createcommand.Tools, routes and contracts
list_squadrons,join_squadron, the Squadron routes, the homes read, thesquadron_idinput onstop_agent,stop_crewandarchive_crew, the same-Squadron checks on archive and merge-back (upstream's same-project rule is the only rule), and the scheduled-task guard.list_participantsandspawn_agentreturnproject_idandproject_title. Fleet, Inbox, Crew proposals, runtime requests, pre-archive facts and machine senders carry project ids.j5 a2a participant createtakes--project.in project <id> (<title>). The spawn identity block hasproject_idandproject_title. Error and tool text says project.Clients
j5Squadronsandj5HumanInbox, asfalse, so that client's Fleet, Inbox, Inbox count, Crew proposals and Crew runtime requests never read their changed routes. New clients gate every J5 read onj5ProjectLedger. Two older-client reads have no capability key and are accepted gaps: a Crew roster proposal does not appear above the composer, so it cannot be approved from an older client; and archiving shows that client's "could not check" warning without the toast explaining why a Crew seat cannot be archived alone (the server still refuses that archive).spawnedByAgent), with the same meaning as before.Where the word still appears
originSquadronIdon a delivery,squadronIdin a drop cause, andsquadronId/squadronNameon a roster row (packages/contracts/src/j5.ts). The values are project ids and titles; only the names are old. Renaming them means bumping the peer protocol version, after which every peer pair has to update together, so it is left out of this PR. Whether it is built is Jackson's call.j5Squadronsinpackages/contracts/src/environment.ts: kept so a client can recognize a J5 server that has not been updated.squadronId,SquadronId,readSquadron, the Fleet page's types): the next PR renames them with no behaviour change.j5_a2a_retired_squadron, and the readers for old stored messages, as agreed in Check that Squadron is gone from code, docs and agent text (on or after 2026-10-28) #476.UI changes
Playbooks settings, web (the author picker is gone; same projects, data, viewport and light theme). Captured by the crew's tester.
Playbooks settings, mobile (native iOS, empty library).
Fleet (same data, viewport and theme; the last row is a controlled fixture).
Inbox (same data, viewport and theme; the last row is a controlled fixture).
Sidebar, threads an agent spawned (same parent and seven children). The nesting is unchanged; its source moved to the spawned-children read.
Pinning a spawned child moves it to the top level, and unpinning nests it again:
Version skew.
Not captured: the loading, error and populated Playbooks states on mobile; those states are captured on web.
Upstream impact
orchestration-v2/ThreadLaunchService.ts,.test.ts,ws.ts,packages/contracts/src/orchestrationV2.tssquadronIdlaunch carrier and the registration block are removedscheduledTasks/ScheduledTaskService.tspackages/client-runtime/src/operations/commands.ts,.test.tsapps/web/src/components/Sidebar.tsxpackages/client-runtime/src/connection/compatibility.tspackages/contracts/src/environment.ts,environment/ServerEnvironment.ts,.test.tsj5ProjectLedgeradded and reported true;j5Squadronsandj5HumanInboxkept and reported falsemcp/toolkits/worktree/registration.test.ts,provider/T3OrchestrationInstructions.test.tspackages/client-runtime/package.json./j5/*exports removedRegister of divergences: D8, D9 and D11 retired; D29 added for the client gate. The gate changes nothing for upstream's own servers; it refuses only a J5 server from before this change. The decision behind it is the plan's strict version gate for clients in #412.
How it was checked
vp run typecheckin contracts, client-runtime, web, mobile, desktop and server: 0 errors each.vp test runin contracts (564), client-runtime (1,953), web (5,842) and mobile (1,861): all passed.foreign_key_checkandintegrity_checkclean, the snapshot written beside it.Checklist
packages/contracts, so it could not be cut further without a throwaway translation layerFORK.md(case text and file-table row) in this PRdocs/j5/product/upstream.mdAGENTS.md) — nothing here is provider-shaped; the mobile app and a second machine were not rundocs/j5/product/and user docs rewritten where this changes them — left for the docs PR by instruction; this PR edits only FORK.md, the register, one runbook section, and one sentence ofdocs/j5/product/a2a/agent-tools.mdthat a test holds byte-equal to thesend_messagetool descriptionClaude Opus 5.5 (1M context), Claude Code in J5 Code.
🤖 Generated with Claude Code