Skip to content

refactor(web): new-thread doors and drafts go back to upstream's projects - #455

Merged
Jacksondr5 merged 4 commits into
j5/mainfrom
fold/doors-back-to-upstream
Oct 8, 2026
Merged

Jacksondr5 merged 4 commits into
j5/mainfrom
fold/doors-back-to-upstream

Conversation

@Jacksondr5

@Jacksondr5 Jacksondr5 commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Merges back to back with #456. Until #456 lands, Create Squadron is still offered and can put a second Squadron on a project, which then refuses new threads. #456 removes those doors and guards the welcome wizard.

Problem

Every new-thread door in J5 asks for a Squadron, and a draft without one cannot send. The plan in #412 retires Squadrons into upstream's projects, so these doors go back to upstream's project versions. #430 made that possible: the server now accepts a launch that names no Squadron and puts the thread in its project's Squadron.

What changed

Fourth PR of the fold stack, on top of #454.

Back to the upstream pin, with no Squadron edit left

Back to the pin, keeping non-Squadron J5 edits

  • ChatView.tsx: the first-send carrier, draft chip, freeze, environment lock and header Squadron target are removed. Kept: Crew roster gate, playbooks, artifacts panel, persona launch and the persona fan-out refusal.
  • ChatComposer.tsx: the placeholder says "Choose a project above…" again. Persona and playbook edits stay.
  • Sidebar.tsx, Sidebar.logic.ts: the new-thread button, shift-click with its tooltip hint, and the row menu's new-thread-on-branch are upstream's. The Squadron filter, the empty state and Create Squadron stay for the next PR. Archive preflight and card identity stay.
  • hooks/useThreadActionMenu.ts: new-thread-on-branch is upstream's; archive preflight stays.
  • CommandPalette.tsx, CommandPalette.logic.ts: "New thread in…" lists projects, and search has upstream's Projects group in place of Squadrons. Kept: the source picker, the per-environment thread value, and the Add Project carrier that the next PR removes.

Launches

  • No launch sends squadronId. The server puts the thread in its project's Squadron, creating one named after the project when there is none.
  • After a first send, refreshAfterThreadLaunch re-reads that thread's home and the Squadron directory. The new thread then shows while a Squadron filter is selected, and a Squadron the launch created appears in the filter.

Deleted J5 files

SquadronPicker.logic, SquadronDraftChip, retargetSquadronDraft, FirstRunGate, FirstRunGate.logic, useSquadronNewThreadOnBranch, with their tests. SquadronDraftState keeps only the sidebar's ambient scope.

Every new-thread door, and what it does now

Door Now
Opening the app (index route) Opens a draft in the most recently active project. With no projects, shows upstream's no-projects screen.
Sidebar "+" button One project: opens a draft there. Several: opens the palette's "New thread in…" list of projects.
Sidebar "+" with Shift Opens a draft in the current project, skipping the list.
chat.new shortcut Same as the "+" button.
chat.newLocal shortcut Opens a draft in the current project.
Palette "New thread in ⟨project⟩" Opens a draft in the active project.
Palette "New thread in…" Lists projects; picking one opens a draft there.
Palette search, a project result Opens the project's latest thread, or a draft if it has none.
Chat header project name Opens a draft in the thread's project.
Thread menu "New thread on branch" (header and sidebar row) Opens a draft in the thread's project on its branch or worktree.
Add Project on a folder that already exists Opens that project's latest thread, or a draft.
First send of any draft Sends with no Squadron. A draft never blocks on "Choose a Squadron".
Multi-model send Each thread launches with no Squadron. Still refused from a saved-agent draft.
Background send The fresh composer opens in the same project.
Plan "implement in a new thread" Unchanged single launch, now with no Squadron; the thread takes its plan parent's Squadron. A child of a parent with no Squadron home stays without one.
Welcome wizard's last step Opens a draft in the chosen project.

Behavior notes

  • Plan-to-implementation stays on J5's single launch. Upstream creates the thread with the plain create command, which registers no Squadron home, so the thread could not message anyone and would be missing from Fleet. It returns to upstream in the ledger migration PR, when every thread registers at creation. FORK.md case 11's client half retires then.
  • No other door uses the plain create command. Every door above opens a local draft and launches on first send.
  • A draft's machine is no longer locked. The environment picker and automatic balancing work as upstream's do, because a draft no longer holds a Squadron.
  • Mixed wording for one PR. On a fresh install the no-projects screen's Add Project button, and the sidebar's add-folder button, still open Create Squadron. The sidebar filter and empty state still say Squadron. The next PR puts those back.

UI changes

Captured by the tester on the base branch and on this PR, with the same data, viewport and theme.

New-thread draft. The headline names the project and opens upstream's project menu; the Squadron chip above the composer is gone.

Before After
Before After

The draft headline's project menu, open.

Before After
Before After

Chat header. The project icon and name lead, where the Squadron name did.

Before After
Before After

Palette, "New thread in…". The list is projects, where it was Squadrons.

Before After
Before After

Palette search. Results have a Projects group, where they had a Squadrons group.

Before After
Before After

Sidebar new-thread button's tooltip. The Shift+click hint is back.

Before After
Before After

One project. The new-thread button opens a draft directly.

Before After
Before After

Projects exist but no Squadron does. Before: the Create Squadron gate. After: a draft in the most recent project.

Before After
Before After

No projects. Before: the Create Squadron gate. After: upstream's no-projects screen.

Before After
Before After

Opening a new thread and choosing its project.

Before After
Before After
Dark theme and 390px captures of the same states

New-thread draft, dark.

Before After
Before After

New-thread draft at 390px, light.

Before After
Before After

New-thread draft at 390px, dark.

Before After
Before After

Draft headline project menu, dark.

Before After
Before After

Chat header, dark.

Before After
Before After

Chat header at 390px, light.

Before After
Before After

Chat header at 390px, dark.

Before After
Before After

Palette "New thread in…", dark.

Before After
Before After

Palette search, dark.

Before After
Before After

New-thread tooltip, dark.

Before After
Before After

One project at 390px, light.

Before After
Before After

One project, dark.

Before After
Before After

One project at 390px, dark.

Before After
Before After

Projects with no Squadron at 390px, light.

Before After
Before After

Projects with no Squadron, dark.

Before After
Before After

Projects with no Squadron at 390px, dark.

Before After
Before After

No projects at 390px, light.

Before After
Before After

No projects, dark.

Before After
Before After

No projects at 390px, dark.

Before After
Before After

Limits of this evidence:

Upstream impact

Each file above is upstream-owned. FORK.md changes:

  • Retired: case 15b (palette Squadron search), case 20 (picker row shape).
  • Retired except two remainders: case 19. What remains is the persona fan-out refusal and the clone toast and pull-request copy the next PR handles.
  • Rewritten to what is left: case 9 (sidebar scope, Create Squadron, route aggregate, the post-launch refresh), case 16 (Create Squadron doors), case 34 (scoped identities; the draft environment lock is gone), case 39 (welcome.tsx is upstream's again).
  • Case 11: the plan launch sends no Squadron; its client half retires with the migration.
  • File table: rows removed for the seven files that match the pin; case lists trimmed on the rest.

Register (docs/j5/product/upstream.md): D8 no longer lists the doors, headline or placeholder. D9 is rewritten: first run lands in a draft, and the server creates the Squadron. D12 shrinks to the persona refusal. The decision is Jackson's, in the plan for #412.

Checklist

  • One concern: the description has no "also"
  • Tests cover the changed behavior (backend changes ship with focused tests). Upstream's tests for the restored logic are restored; J5 tests for removed logic are removed.
  • UI changes: before/after screenshots above, and a video for motion or interaction
  • Upstream-owned files: each one is recorded in FORK.md (case text and file-table row) in this PR
  • Upstream product: any change to what upstream's product does has a human decision linked above and a register entry in docs/j5/product/upstream.md
  • Surfaces: entry points, clients, providers, contracts, reverse states, connection modes (see AGENTS.md)
  • Docs: definitions under docs/j5/product/ and user docs rewritten where this changes them. The Squadron feature definition is left for the stack's docs PR, per the plan.

Surfaces walked

  • Entry points: every door in the table above, including shortcuts, the palette, the header, both thread menus and onboarding's last step.
  • Clients: web and desktop. The legacy sidebar already used upstream's doors. Mobile is out of scope for this stack and already launches without a Squadron.
  • Providers: not provider-shaped.
  • Contracts: unchanged. The optional squadronId launch field stays, unused by the web client.
  • Reverse states: a draft can change project and machine before its first send again.
  • Connection modes: the post-launch refresh reads the launching thread's own environment.
  • Docs: FORK.md and the register, as above.

Verification

  • vp test run src/components/ChatView.logic.test.ts src/components/Sidebar.logic.test.ts src/components/CommandPalette.logic.test.ts src/j5/squadron src/j5/onboarding src/j5/threads src/lib/chatThreadActions.test.ts src/commandPaletteBus.test.ts in apps/web: 19 files, 380 tests pass.
  • tsc --noEmit in apps/web: no errors.
  • vp lint on the changed files: no errors.
  • Live, by the tester: every door in the table except the plan door, the persona refusal and the machine picker (see the limits above). A first send with no Squadron chosen works. In a project with no Squadron, the first send creates one and it appears in the sidebar filter without a reload. With a filter selected, a new thread shows straight away. A multi-model send creates one thread per model, each with a home.

Claude Opus 5.5 (1M context), Claude Code harness.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • New threads now start in the active project. With multiple projects, the new-thread picker lets you choose a destination.
    • Project search and the draft headline now include project details and environment information. Selecting a project can apply its default model when no model has been chosen.
    • The home screen starts a thread in the most recently updated project, or shows a retry option if creation fails.
    • Creating a thread from a branch carries over its branch and worktree settings.
  • Bug Fixes

    • Thread creation failures now show an error message in branch-based flows.

@vercel

vercel Bot commented Oct 4, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
j5-code Ready Ready Preview Oct 8, 2026 1:43am UTC

Request Review

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL 1,000+ effective changed lines (test files excluded in mixed PRs). labels Oct 4, 2026
@Jacksondr5
Jacksondr5 force-pushed the fold/doors-back-to-upstream branch from 4ed4ca2 to e739e67 Compare October 4, 2026 22:21
@Jacksondr5
Jacksondr5 force-pushed the fold/doors-back-to-upstream branch from e739e67 to 762aa66 Compare October 4, 2026 22:23
@Jacksondr5
Jacksondr5 marked this pull request as ready for review October 4, 2026 22:48
@Jacksondr5
Jacksondr5 added this pull request to stack #471 October 5, 2026 19:53

@bryantderosier bryantderosier left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed this as part of the 454–457 stack. One real problem if this PR can land on its own, and a few stale FORK.md lines. I checked the higher PRs first and dropped anything they fix.

Medium: Create Squadron can leave a project unable to start threads. The web doors stop sending squadronId, but Create Squadron is still offered, and SquadronManagementService.create doesn't check whether another Squadron already references the project. Once two do, resolveProjectSquadron throws SquadronThreadCreationAmbiguousProjectError and no door can send the Squadron it asks for. Example: first send in project P auto-creates Squadron "P", then the user clicks New Squadron on folder P, and every later new thread in P fails on first send. #456 removes the Create Squadron doors, so this only bites if 455 merges without 456. Either merge them together or have create refuse a second reference to the same project. D9's repair text also undersells the fix: delete is refused while the Squadron has unarchived agents or Crews (SquadronDeleteBlockedError).

Stale FORK.md text (still wrong at the top of the stack):

  • Case 11 promises the child takes its parent's home "or else its project's Squadron". ThreadLaunchService returns legacy-plan-child-native for a homeless parent and skips registration, so the child stays homeless.
  • Case 10 still says the web client refuses to send without a Squadron. This PR is the one that returns those doors.
  • "Replacement scope" (around line 428) still says DraftHeroHeadline.tsx replaces upstream's full implementation and the palette does Registrar-derived selection. Neither is true now.
  • Nit: Sidebar.logic.test.ts lost upstream's shouldCreateNewThreadInCurrentProject import, which is restored now.

Comment thread docs/j5/product/upstream.md Outdated
**Why:** agents need a home in the ledger, and the ledger is still keyed by Squadron. The server rule is a step of retiring Squadrons into projects ([#412](https://github.com/Jacksondr5/j5code/issues/412)), where a thread's home is its project. A Squadron created this way carries its project's name, so it isn't the unnamed junk drawer the first-run gate used to guard against.

**Consequences:** because a folder is required, a Squadron with no repository isn't possible. That rules out a real future use: non-coding work such as a support rotation. A failed read offers only a retry, never a guessed home. The web client still sends a Squadron with every launch, so the gate is what a person sees until the client's new-thread doors return to upstream. Until then the server rule is reached only by launches that send none, such as ACP session import.
**Consequences:** the person no longer creates a Squadron before the first thread; the gate is gone. Create Squadron is still offered from the sidebar and from Add Project (D8), and it still requires a folder. A project that several Squadrons reference can't start a thread until one is deleted.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two things here. Create Squadron is still offered, and create doesn't refuse a second Squadron for the same project, so a project can end up with two and then every new thread in it fails with the ambiguous-project error. And the repair isn't just "delete one": delete is refused while the Squadron has unarchived agents or Crews. If this can merge without #456, either guard create or fix this text.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm an AI agent (Claude) working for Jackson.

Agreed on both. No code change here: #455 and #456 merge back to back, and the description now opens with that line. #456 removes every Create Squadron door (the sidebar button, the filter's menu item and the Add Project redirect), and guards the one creating path left until #457, the welcome wizard's Squadron stage, so it uses a project's existing Squadron and never offers a second.

I fixed this text in 87c5f48 (now 5c97b18): D9 says Create Squadron does not check for an existing Squadron on the folder, and that delete is refused while the Squadron has unarchived agents or live Crews, so those have to be archived first.

Comment thread FORK.md Outdated
10. SQ1's lossless launch carrier and durable attach boundary: `packages/contracts/src/orchestrationV2.ts:2322-2342` adds additive-optional unbranded `squadronId` at `:2325`; `packages/client-runtime/src/operations/commands.ts:144-167,546-612` carries it only from an explicit first-message caller into the launch RPC and loudly rejects the otherwise-silent no-bootstrap retry with the typed `SquadronLaunchRequiresBootstrapError`, directing the user to start a new thread. Bootstrap re-carry for that rare partial-failure recovery remains a queued improvement, not an invented fallback. `apps/server/src/ws.ts` forwards it only when present before the fixed `creationSource`; and `apps/server/src/orchestration-v2/ThreadLaunchService.ts:63-79,545-611` sends the carrier to J5's shared creation engine only after the thread is durable and before preparation is scheduled. The shared engine is provided once in `apps/server/src/server.ts:337-342`; the boundary honors a sent `squadronId` and rejects an invalid reference, preserves the named durable orphan on failure, and retry uses the same deterministic registration command. Since 2026-10-03 (the Squadron fold, [#412](https://github.com/Jacksondr5/j5code/issues/412)) a launch that sends no `squadronId` is no longer refused: J5-owned `SquadronThreadCreationService` registers the thread into its project's Squadron. Exactly one Squadron referencing the project is used; none creates one named after the project, in the same transaction as the lookup, so concurrent launches create one; several are refused with `SquadronThreadCreationAmbiguousProjectError`; a missing or deleted project is refused without creating anything. A replay reuses the home its first attempt registered. The service reads the project's title from upstream's `ProjectionProjectRepository`, which `makeJ5SquadronCreationLayer` provides, because `ProjectService` depends on the runtime this layer feeds. No upstream source file changed for this; the one upstream-file edit is the J5 test in `ThreadLaunchService.test.ts`, which now fails registration with the several-Squadrons error. The web client still refuses to send without a Squadron (case 9) until its doors return to upstream. This also lets ACP session import (`ws.ts`, which sends no Squadron) register instead of failing. The native cohorts in `SquadronLaunchPolicy.ts` (mobile, system bootstrap, legacy plan children) and the scheduled refusal (case 12) are unchanged. On every rebase, verify this exact client → contract → WebSocket → launch → J5-engine chain, one runtime provider, and no parallel HTTP launch door.
11. SQ1's plan-provenance launch carrier is its own protected contract exception: `packages/contracts/src/orchestrationV2.ts:2322-2327` adds additive-optional `sourcePlanRef`; it is not an existing generic field and has no default. `packages/client-runtime/src/operations/commands.ts:152-167,590-596,624-629,669-683`, `apps/server/src/ws.ts`, and `apps/server/src/orchestration-v2/ThreadLaunchService.ts:63-79,548-592` pass it only from the plan→implementation launch. After durable child identity, ThreadLaunch reads the parent Registrar home through the shared engine: a known home is inherited; a legacy no-home parent remains the named native cohort, with neither refusal nor default. On every rebase, verify this additive contract field and the durable-before-preparation order.
11. SQ1's plan-provenance launch carrier is its own protected contract exception: `packages/contracts/src/orchestrationV2.ts:2322-2327` adds additive-optional `sourcePlanRef`; it is not an existing generic field and has no default. `packages/client-runtime/src/operations/commands.ts:152-167,590-596,624-629,669-683`, `apps/server/src/ws.ts`, and `apps/server/src/orchestration-v2/ThreadLaunchService.ts:63-79,548-592` pass it only from the plan→implementation launch. After durable child identity, ThreadLaunch reads the parent Registrar home through the shared engine: a known home is inherited; a legacy no-home parent remains the named native cohort, with neither refusal nor default. Since the Squadron fold ([#412](https://github.com/Jacksondr5/j5code/issues/412)) this launch sends no `squadronId`: the child takes its plan parent's home, or else its project's Squadron (case 10). The client half retires with the ledger migration, when every thread registers at creation and plan→implementation returns to upstream's create-then-start. On every rebase, verify this additive contract field and the durable-before-preparation order.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This fallback isn't real. For a parent with no home, ThreadLaunchService returns legacy-plan-child-native and skips registration, so the child stays homeless (missing from Fleet, can't message). Drop ", or else its project's Squadron (case 10)".

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm an AI agent (Claude) working for Jackson.

You're right, that fallback is not real. Fixed in 87c5f48 (now 5c97b18): case 11 now says the child takes its plan parent's home, and that a child whose parent has no home stays without one (legacy-plan-child-native). The door table in the PR description says the same.

@Jacksondr5

Copy link
Copy Markdown
Owner Author

I'm an AI agent (Claude) working for Jackson. Replies to the review points that have no inline thread:

  • Case 10 said the web client refuses to send without a Squadron. Fixed: it now says the web client's doors are upstream's again and send no squadronId, so every web launch takes the project-Squadron path.
  • "Replacement scope" said DraftHeroHeadline.tsx replaces upstream's implementation and the palette does Registrar-derived selection. Fixed: it now says the UI replacements are going back to upstream, that the headline is upstream's file and the palette selects projects.
  • Sidebar.logic.test.ts lost upstream's shouldCreateNewThreadInCurrentProject import. Restored; the import block matches the pin again.

All in 5c97b18. The description now opens with "Merges back to back with #456."

@coderabbitai

coderabbitai Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

  • Run on-demand review

This review includes 36 billable files and costs up to $9.00.

  • Ask an admin to make reviews automatic

Open in CodeRabbit

Reviews can continue after your included limit without a manual trigger. An admin must approve usage-based billing.

Or wait 30 minutes for your next included review.

Check out review usage here.

View limit details

Limit details: You’ve used all 3 included reviews currently available. Your 40 included PR review attempts over the past 7 days set your current allowance at 3 reviews per hour.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Repository: Jacksondr5/j5code/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Essentials
  • Run ID: a6ac11f1-fa61-458d-93ea-96acddfb2ff2
📥 Commits

Reviewing files that changed from the base of the PR and between 6515173 and 90e8d5d.

📒 Files selected for processing (36)
  • FORK.md
  • apps/web/src/components/ChatView.logic.test.ts
  • apps/web/src/components/ChatView.logic.ts
  • apps/web/src/components/ChatView.tsx
  • apps/web/src/components/CommandPalette.logic.test.ts
  • apps/web/src/components/CommandPalette.logic.ts
  • apps/web/src/components/CommandPalette.tsx
  • apps/web/src/components/Sidebar.logic.test.ts
  • apps/web/src/components/Sidebar.logic.ts
  • apps/web/src/components/Sidebar.tsx
  • apps/web/src/components/chat/ChatComposer.tsx
  • apps/web/src/components/chat/ChatHeader.tsx
  • apps/web/src/components/chat/DraftHeroHeadline.tsx
  • apps/web/src/hooks/useThreadActionMenu.ts
  • apps/web/src/j5/onboarding/onboardingSquadrons.logic.test.ts
  • apps/web/src/j5/onboarding/onboardingSquadrons.logic.ts
  • apps/web/src/j5/squadron/FirstRunGate.logic.test.ts
  • apps/web/src/j5/squadron/FirstRunGate.logic.ts
  • apps/web/src/j5/squadron/FirstRunGate.test.tsx
  • apps/web/src/j5/squadron/FirstRunGate.tsx
  • apps/web/src/j5/squadron/SquadronActions.logic.test.ts
  • apps/web/src/j5/squadron/SquadronActions.logic.ts
  • apps/web/src/j5/squadron/SquadronDraftChip.tsx
  • apps/web/src/j5/squadron/SquadronDraftState.ts
  • apps/web/src/j5/squadron/SquadronPicker.logic.test.ts
  • apps/web/src/j5/squadron/SquadronPicker.logic.ts
  • apps/web/src/j5/squadron/SquadronScope.logic.test.ts
  • apps/web/src/j5/squadron/SquadronScope.logic.ts
  • apps/web/src/j5/squadron/refreshAfterThreadLaunch.ts
  • apps/web/src/j5/squadron/retargetSquadronDraft.test.ts
  • apps/web/src/j5/squadron/retargetSquadronDraft.ts
  • apps/web/src/j5/squadron/useSquadronNewThreadOnBranch.ts
  • apps/web/src/routes/_chat.index.tsx
  • apps/web/src/routes/_chat.tsx
  • apps/web/src/routes/welcome.tsx
  • docs/j5/product/upstream.md
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@Jacksondr5
Jacksondr5 force-pushed the fold/doors-back-to-upstream branch from 2b56aa5 to 92e4296 Compare October 8, 2026 01:33
Base automatically changed from fold/views-read-projects to j5/main October 8, 2026 01:42
…ects

The Squadron picker, draft chip, headline, first-run gate and Squadron
search are removed. A new thread starts in a project, and the server puts
it in that project's Squadron. No launch sends a Squadron.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Jacksondr5 and others added 2 commits October 7, 2026 21:42
…ent-scope paragraph

Review follow-up. A plan child of a parent with no home stays without one.
Restores upstream's unused test import and names the delete route's limit
in D9.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@Jacksondr5
Jacksondr5 force-pushed the fold/doors-back-to-upstream branch from 92e4296 to 90e8d5d Compare October 8, 2026 01:42
@Jacksondr5
Jacksondr5 merged commit e5c1079 into j5/main Oct 8, 2026
28 checks passed
@Jacksondr5
Jacksondr5 deleted the fold/doors-back-to-upstream branch October 8, 2026 01:52
This was referenced Oct 8, 2026

This branch was successfully deployed

1 active deployment
Preview — 90e8d5da Deployed Oct 8, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL 1,000+ effective changed lines (test files excluded in mixed PRs). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants