Skip to content

feat(cli): add trusted Cloud rooms and Fleet workflow#1358

Open
khaliqgant wants to merge 18 commits into
mainfrom
feat/herdr-cloud-room-cli
Open

feat(cli): add trusted Cloud rooms and Fleet workflow#1358
khaliqgant wants to merge 18 commits into
mainfrom
feat/herdr-cloud-room-cli

Conversation

@khaliqgant

@khaliqgant khaliqgant commented Jul 23, 2026

Copy link
Copy Markdown
Member

Summary

  • add participant-only Cloud room invite, membership, acceptance, and per-device session commands
  • add a thin CLI over the existing Cloud integration catalog/connect/disconnect lifecycle; Relayfile remains the integration and writeback authority
  • let Agent Relay SDK and CLI clients use scoped agent tokens without inheriting an ambient owner workspace key
  • hide offline/non-Fleet history by default, use atomic node ports, make fleet spawn --session-ref perform a real Claude/Codex resume, allow immediate same-name respawn after release, and advertise broker spawn/release capacity before the first remote spawn

V1 trust model

Every invitee is a trusted full room participant with ordinary agent-level Relaycast collaboration actions. There is no viewer role, room integration grant/lease service, Cloud chat proxy, or Relaycast source/version change. The workspace owner key, owner-only Relaycast administration, and Agent Relay Cloud organization administration remain owner-only.

Validation

  • npm run typecheck
  • focused current-head CLI suite: 49 passed
  • full broker suite: 822 passed, 4 environment-dependent tests ignored
  • focused session-resume argv and action-dedup regression tests pass
  • broker cargo clippy --lib -- -D warnings
  • prior focused CLI suite: 121 passed; SDK suite: 163 passed
  • pinned Relaycast v6.0.1 local two-node Fleet E2E: 14 passed
  • all current-head GitHub checks are green, including the two-node Fleet matrix and both OS E2E jobs
  • exact current-head broker bytes (6fc373bbeb9e90589fdaceac3087c65cc075dd1ccbbdeb2d526e43a5cdd84425) transferred over Tailscale to finn-mini
  • live exact-head proof: phase one created Codex thread 019f93bd-019e-7663-b1b0-b320acb71ea9 at PID 26879; after CLI release, an immediate same-name fleet spawn --session-ref created PID 28000 on the same node, /api/spawned retained that exact thread UUID, the phase-two task did not contain the marker, and the resumed Codex context recalled PR1358_232A_MEMORY_5E8F14
  • Prettier, Cargo fmt, and git diff --check
  • final cross-PR Claude-then-Codex signoff is pending

Related

@khaliqgant
khaliqgant requested a review from willwashburn as a code owner July 23, 2026 21:45
@cursor

cursor Bot commented Jul 23, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds workspace-scoped Cloud room management, integration discovery and delegated credentials, agent identity commands, credential-safe SDK behavior, CLI documentation, and atomic broker port allocation for Fleet scenarios.

Changes

Cloud room lifecycle

Layer / File(s) Summary
Room transport and secure data handling
packages/cli/src/cli/commands/cloud-room.ts
Adds validation, authenticated Cloud requests, response normalization, forbidden-credential rejection, secure token I/O, and sanitized output.
Room lifecycle commands and tests
packages/cli/src/cli/commands/cloud-room.ts, packages/cli/src/cli/commands/cloud-room.test.ts
Adds invitation, membership, acceptance, and device-session commands with rollback, output-mode, routing, and security coverage.

Cloud integrations

Layer / File(s) Summary
Integration transport and credential storage
packages/cli/src/cli/commands/cloud-integration.ts
Adds strict validation, authenticated requests, response normalization, sanitization, capability rendering, and secure delegated credential-file creation.
Integration commands and tests
packages/cli/src/cli/commands/cloud-integration.ts, packages/cli/src/cli/commands/cloud-integration.test.ts
Adds catalog, connection, grant, delegated credential, and revocation commands with cleanup and output tests.

Agent identity and registration

Layer / File(s) Summary
Agent identity and CLI registration
packages/cli/src/cli/commands/agent.ts, packages/cli/src/cli/lib/sdk-client.ts, packages/sdk/src/*, packages/cli/src/cli/commands/cloud.ts, packages/cli/README.md, CHANGELOG.md
Adds agent identity commands, agent-token transport selection, credential-safe relay serialization, Cloud command registration, command-surface tests, and documentation.

Atomic broker ports

Layer / File(s) Summary
Atomic broker startup and Fleet coverage
packages/cli/src/cli/lib/broker-lifecycle.ts, packages/cli/src/cli/commands/core.ts, packages/cli/src/cli/commands/core.test.ts, tests/e2e/fleet/*, crates/broker/src/cli/mod.rs, packages/harness-driver/src/spawn-config.ts
Allows port zero to request an OS-assigned API port, reports the bound port, handles missing status, and updates Fleet configurations and documentation.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Operator
  participant CLI
  participant CloudSession
  participant CloudAPI
  participant SecureFile
  Operator->>CLI: run room or integration command
  CLI->>CloudSession: ensure authenticated session
  CloudSession-->>CLI: bound API host
  CLI->>CloudAPI: authorized scoped request
  CloudAPI-->>CLI: normalized response or credential lease
  CLI->>SecureFile: write owner-only secret when requested
  SecureFile-->>CLI: write result
  CLI->>CloudAPI: revoke lease if file writing fails
Loading

Possibly related issues

  • AgentWorkforce/cloud#2462: Both changes modify agent-scoped Relaycast authentication and agent-token handling.

Possibly related PRs

Suggested labels: size:XXL

Suggested reviewers: willwashburn

Poem

I’m a rabbit with tokens tucked safe in my den,
Rooms bloom with invites, then welcome new friends.
Integrations grant paths, credentials stay tight,
Agents show presence by day and by night.
Cloud commands hop, while ports bind just right!

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.06% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ⚠️ Warning It covers the summary and validation, but the required Test Plan section is missing and Screenshots is not filled out. Add the template's Test Plan checkbox items and a Screenshots section, or mark screenshots as not applicable, to match the repository format.
✅ Passed checks (3 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title is concise and accurately reflects the main changes to Cloud rooms and Fleet workflows.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/herdr-cloud-room-cli

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 11df645277

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/cli/src/cli/commands/cloud-integration.ts Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (1)
packages/cli/src/cli/commands/cloud-integration.ts (1)

442-443: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Dead --json branch in connections and grants. Both commands advertise --json but the if/else arms call json(deps, payload) identically, so the flag has no effect and no human-readable renderer exists. Either implement a distinct default rendering or drop the --json option and the redundant branch.

  • packages/cli/src/cli/commands/cloud-integration.ts#L442-L443: collapse to a single json(deps, payload) call (and remove --json on the connections command) or add a real non-JSON renderer.
  • packages/cli/src/cli/commands/cloud-integration.ts#L540-L541: apply the same fix for the grants command.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/cli/src/cli/commands/cloud-integration.ts` around lines 442 - 443,
The --json branches in the connections and grants command handlers are redundant
because both paths call json(deps, payload). In
packages/cli/src/cli/commands/cloud-integration.ts lines 442-443 and 540-541,
collapse each conditional to a single json(deps, payload) call and remove the
unused --json option from the connections command, unless implementing a
distinct human-readable renderer instead.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@CHANGELOG.md`:
- Around line 8-10: Change the changelog heading from “Unreleased - Minor” to
the standard “Unreleased” format, leaving the existing “### Added” section
unchanged.

In `@packages/cli/src/cli/commands/cloud-integration.ts`:
- Around line 394-402: Update the catalog command around workspaceId and the
request URL so the validated workspace is included in a workspace-scoped route,
using the established `/api/v1/workspaces/{id}/integrations/catalog` pattern and
encoding the ID before interpolation. Preserve the existing dynamic query
behavior and catalog normalization.

---

Nitpick comments:
In `@packages/cli/src/cli/commands/cloud-integration.ts`:
- Around line 442-443: The --json branches in the connections and grants command
handlers are redundant because both paths call json(deps, payload). In
packages/cli/src/cli/commands/cloud-integration.ts lines 442-443 and 540-541,
collapse each conditional to a single json(deps, payload) call and remove the
unused --json option from the connections command, unless implementing a
distinct human-readable renderer instead.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: fbd3b00a-2541-4b05-bd2e-61083c15e1cf

📥 Commits

Reviewing files that changed from the base of the PR and between d4d0d44 and 96cca10.

📒 Files selected for processing (13)
  • CHANGELOG.md
  • packages/cli/README.md
  • packages/cli/src/cli/bootstrap.test.ts
  • packages/cli/src/cli/commands/agent.test.ts
  • packages/cli/src/cli/commands/agent.ts
  • packages/cli/src/cli/commands/cloud-integration.test.ts
  • packages/cli/src/cli/commands/cloud-integration.ts
  • packages/cli/src/cli/commands/cloud-room.test.ts
  • packages/cli/src/cli/commands/cloud-room.ts
  • packages/cli/src/cli/commands/cloud.test.ts
  • packages/cli/src/cli/commands/cloud.ts
  • packages/cli/src/cli/lib/sdk-client.test.ts
  • packages/cli/src/cli/lib/sdk-client.ts

Comment thread CHANGELOG.md
Comment thread packages/cli/src/cli/commands/cloud-integration.ts Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
packages/cli/src/cli/commands/cloud-room.ts (2)

824-824: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Role terminology mismatch: "observer" vs "viewer".

This help text says "participant or observer credential", but the role vocabulary used everywhere else in this file (e.g., line 551's --role description, RoomRole) is "viewer or participant". This is likely a leftover naming inconsistency that could confuse users about actual role names.

✏️ Fix
-    .option('--json', 'Output the session, including its scoped participant or observer credential')
+    .option('--json', 'Output the session, including its scoped participant or viewer credential')
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/cli/src/cli/commands/cloud-room.ts` at line 824, Update the --json
option description in the cloud-room command to say “viewer or participant
credential” instead of “observer credential,” matching the role terminology used
by RoomRole and the --role description elsewhere in the file.

602-646: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Invitee email echoed to stdout in both delivery branches.

deps.log includes the invitee's email in the confirmation message for both the email-delivery branch (line 607-608) and the manual-token branch (line 642) — flagged by static analysis as CWE-532. Since CLI stdout is routinely captured by CI logs, shell history, or telemetry, this can persist a third party's email address (invitees are often not the operator) beyond the interactive session, which is a compliance/privacy concern (GDPR/CCPA-style PII retention).

Consider omitting the email from the human-readable confirmation, or truncating/masking it (the recipient already knows their own email; the operator already typed it), and reserve the full email for --json output only.

🔒 Example mitigation
-        deps.log(`Sent ${options.role} room invitation to ${email}.`);
+        deps.log(`Sent ${options.role} room invitation.`);
-          deps.log(`Created ${options.role} room invitation for ${email}.`);
+          deps.log(`Created ${options.role} room invitation.`);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/cli/src/cli/commands/cloud-room.ts` around lines 602 - 646, Remove
the invitee email from the human-readable confirmation messages in the
email-delivery branch and the manual-token branch of the room invitation flow.
Update the deps.log calls around normalizeEmailInviteCreate and the final
“Created” message to use role/status wording without echoing email; leave --json
behavior unchanged so the full email remains available there.

Source: Linters/SAST tools

🧹 Nitpick comments (1)
packages/cli/src/cli/commands/cloud-room.ts (1)

586-586: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consolidate the duplicated workspace-ID validators.

requireWorkspaceId() in cloud-room.ts and workspaceId() in cloud-integration.ts duplicate the same Cloud workspace UUID / rw_ validation. Move these patterns into a shared Cloud workspace validation helper and reuse them at both call sites so the accepted formats cannot drift.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/cli/src/cli/commands/cloud-room.ts` at line 586, Replace the
duplicated validation in requireWorkspaceId and workspaceId with a shared Cloud
workspace validation helper. Move the existing UUID and rw_ format rules into
that helper, then update both call sites to reuse it while preserving their
current behavior and error handling.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@packages/cli/src/cli/commands/cloud-room.ts`:
- Line 824: Update the --json option description in the cloud-room command to
say “viewer or participant credential” instead of “observer credential,”
matching the role terminology used by RoomRole and the --role description
elsewhere in the file.
- Around line 602-646: Remove the invitee email from the human-readable
confirmation messages in the email-delivery branch and the manual-token branch
of the room invitation flow. Update the deps.log calls around
normalizeEmailInviteCreate and the final “Created” message to use role/status
wording without echoing email; leave --json behavior unchanged so the full email
remains available there.

---

Nitpick comments:
In `@packages/cli/src/cli/commands/cloud-room.ts`:
- Line 586: Replace the duplicated validation in requireWorkspaceId and
workspaceId with a shared Cloud workspace validation helper. Move the existing
UUID and rw_ format rules into that helper, then update both call sites to reuse
it while preserving their current behavior and error handling.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0930c651-7cb4-4300-be02-5d941cea789b

📥 Commits

Reviewing files that changed from the base of the PR and between 96cca10 and 48572b3.

📒 Files selected for processing (4)
  • packages/cli/src/cli/commands/cloud-integration.test.ts
  • packages/cli/src/cli/commands/cloud-integration.ts
  • packages/cli/src/cli/commands/cloud-room.test.ts
  • packages/cli/src/cli/commands/cloud-room.ts
🚧 Files skipped from review as they are similar to previous changes (3)
  • packages/cli/src/cli/commands/cloud-integration.test.ts
  • packages/cli/src/cli/commands/cloud-integration.ts
  • packages/cli/src/cli/commands/cloud-room.test.ts

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tests/e2e/fleet/harness.ts`:
- Around line 125-130: Update getFreeBrokerBasePort so the broker’s returned
base + 1 port is actually reserved through broker startup rather than merely
probed and released. Keep the reservation alive until the broker claims the
port, or move port allocation into the broker startup path, while preserving the
existing valid-port behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 62720d14-bc7f-44f6-b436-74132961e9a0

📥 Commits

Reviewing files that changed from the base of the PR and between f9f7451 and 255554d.

📒 Files selected for processing (2)
  • tests/e2e/fleet/fleet-e2e.test.ts
  • tests/e2e/fleet/harness.ts

Comment thread tests/e2e/fleet/harness.ts Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/cli/src/cli/commands/core.ts`:
- Around line 153-156: Update the binaryArgs construction in createDefaultRelay
so persist is disabled when apiPort uses the default OS-assigned value of 0,
preserving ephemeral fallback broker behavior; enable persistence only when an
explicit nonzero port or other existing opt-in requires it.

In `@packages/cli/src/cli/lib/broker-lifecycle.ts`:
- Around line 336-345: Update the basePort === 0 startup flow around
candidate.getStatus and the apiPort validation so any rejected status check or
failed validation shuts down candidate before propagating the startup error.
Reuse the existing shutdown cleanup behavior, ensuring broker processes and
locks are removed while preserving successful return of the relay and assigned
API port.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: bfce806a-b527-4e60-b048-a17b844bf547

📥 Commits

Reviewing files that changed from the base of the PR and between 255554d and 13c8685.

📒 Files selected for processing (17)
  • CHANGELOG.md
  • crates/broker/src/cli/mod.rs
  • packages/cli/src/cli/commands/cloud-integration.test.ts
  • packages/cli/src/cli/commands/cloud-integration.ts
  • packages/cli/src/cli/commands/cloud-room.test.ts
  • packages/cli/src/cli/commands/cloud-room.ts
  • packages/cli/src/cli/commands/core.test.ts
  • packages/cli/src/cli/commands/core.ts
  • packages/cli/src/cli/lib/broker-lifecycle.ts
  • packages/cli/src/cli/lib/sdk-client.test.ts
  • packages/cli/src/cli/lib/sdk-client.ts
  • packages/harness-driver/src/spawn-config.ts
  • packages/sdk/src/__tests__/agent-relay.test.ts
  • packages/sdk/src/agent-relay.ts
  • packages/sdk/src/messaging/relaycast-client.ts
  • tests/e2e/fleet/fleet-e2e.test.ts
  • tests/e2e/fleet/harness.ts
🚧 Files skipped from review as they are similar to previous changes (4)
  • packages/cli/src/cli/lib/sdk-client.ts
  • CHANGELOG.md
  • packages/cli/src/cli/commands/cloud-room.ts
  • packages/cli/src/cli/commands/cloud-integration.ts

Comment thread packages/cli/src/cli/commands/core.ts
Comment thread packages/cli/src/cli/lib/broker-lifecycle.ts
@khaliqgant

Copy link
Copy Markdown
Member Author

Final validation and review-feedback closure — exact head ce8520c15

All CI is green (43 successful checks; platform-inapplicable jobs skipped/neutral), including:

  • live two-node Fleet matrix
  • macOS/Linux E2E, unit, stress, and integration-stress suites
  • Rust tests, clippy, format, and cross-compilation
  • Node 22/24 install and fresh-install checks
  • SDK TypeScript, package build/validation, standalone macOS smoke
  • CodeQL, dependency review, npm audit, secret scanning, and CodeRabbit

Local exact-head gates also passed:

  • full Vitest: 1,545 passed
  • SDK: 163 passed
  • focused CLI/core: 131 passed
  • real pinned Relaycast v6.0.1 + two real brokers: 14/14 passed
  • CLI build/typecheck, lint (zero errors), Prettier, Cargo fmt, and diff checks

Final CodeRabbit feedback was verified and addressed: failed startup validation now shuts down the broker in both OS-assigned and fixed-port paths, with explicit tests. The requested port-zero persistence change was correctly declined because this is an explicit persistent node up mode whose connection/state files are required by status, down, Fleet cleanup, and enrolled-node recovery.

Current unresolved review threads: 0.

@khaliqgant

Copy link
Copy Markdown
Member Author

Exact-head final signoff — 71b38f7b0af7641e2a241f1619a84bec16fbdb02

Final evidence is pinned to the current head:

  • GitHub matrix: 43 successful checks, 1 expected skip, 1 neutral reviewer check, no pending or failing checks; CodeRabbit passes and there are 0 unresolved review threads.
  • Local exact-head validation: full Vitest suite passed (1547 passed, 14 skipped); CLI typecheck/build, Prettier, Cargo fmt, and diff checks passed; focused node/core validation passed.
  • Real stack proof: pinned Relaycast v6.0.1 plus the real Rust broker completed the live Fleet E2E matrix 14/14, including two concurrent nodes using the production node up port default.
  • Review-feedback closure: failed getStatus() startup now cleans up both ephemeral- and fixed-port candidates; normal node up uses an atomic OS-assigned port by default, preserves an explicit AGENT_RELAY_BROKER_PORT, passes that environment through detached re-exec, and the E2E harness no longer injects port zero.
  • Required sequential fresh-context review completed over Fleet/Relay: Claude on sf-mini returned VERDICT: APPROVE at this exact head; afterward Codex on finn-mini returned VERDICT: APPROVE, with npm run typecheck and 117 focused tests passing on that machine.
  • Cloud counterpart AgentWorkforce/cloud#2833 remains pinned to d4f309d1a4ba99eaaa8334c9b0a8cb52674dee0d; both reviewers found no interaction regression.

No changes requested by either final signoff reviewer.

@khaliqgant khaliqgant changed the title feat(cli): add Cloud rooms and integration access feat(cli): add trusted Cloud rooms and Fleet workflow Jul 24, 2026
@khaliqgant
khaliqgant force-pushed the feat/herdr-cloud-room-cli branch from 240d962 to b95c855 Compare July 24, 2026 07:38
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