From deca1a280e64d6b59e20c7512ee7b30306e4648a Mon Sep 17 00:00:00 2001 From: Natalie Date: Tue, 2 Jun 2026 16:06:12 -0700 Subject: [PATCH] =?UTF-8?q?feat(@projects/@claire):=20=E2=9C=A8=20update?= =?UTF-8?q?=20remote=20control=20naming=20to=20use=20bracketed=20host=20pr?= =?UTF-8?q?efix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- src/claire/orchestrator/bootstrap.py | 11 ++++++----- src/claire/web/rounds.py | 13 ++++++++----- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/claire/orchestrator/bootstrap.py b/src/claire/orchestrator/bootstrap.py index 4c45ce8..1642431 100644 --- a/src/claire/orchestrator/bootstrap.py +++ b/src/claire/orchestrator/bootstrap.py @@ -384,10 +384,11 @@ def _send_kick(*, rcl: Rclaude, cwd: str) -> None: def _register_remote_control(*, rcl: Rclaude, cwd: str, host_label: str) -> None: """Register the orchestrator session with claude.ai/code as - `claire-` so per-host Claires are distinguishable in the browser. - Hyphen (not `@`) because claude.ai/code's remote-control name field - silently strips `@` — observed when `claire@apricot` registered as - bare `claire` and produced duplicate entries. + `[] claire` so per-host Claires are distinguishable in the browser's + remote dev list (e.g. `[plum] claire`, `[apricot] claire`, `[black] claire`). + The bracketed-host prefix is the operator's chosen convention; avoid `@` + in the name — claude.ai/code's name field silently strips it (observed: + `claire@apricot` collapsed to bare `claire` and produced duplicates). `/remote-control` is a Claude *slash command* — it only takes effect delivered as literal input, never from prose. The bootstrap kick is a @@ -402,7 +403,7 @@ def _register_remote_control(*, rcl: Rclaude, cwd: str, host_label: str) -> None remote spawns. """ rcl.send( - text=f"/remote-control claire-{host_label}", + text=f"/remote-control [{host_label}] claire", match=_cwd_slug(cwd), yes=True, dry_run=False, diff --git a/src/claire/web/rounds.py b/src/claire/web/rounds.py index 5456a5f..c216926 100644 --- a/src/claire/web/rounds.py +++ b/src/claire/web/rounds.py @@ -71,11 +71,14 @@ def build_rounds_prompt(cfg: ClaireConfig) -> str: " • `set_project_status name_or_id= status=archived` for " "anything that's clearly a sync/demo/test artifact — never " "delete, just archive.\n" - "5. CONSIDER DISPATCH — call `budget_status` and " - "`fleet_load`. If there is unassigned open work, pick the " - "top-priority task that fits the envelope (under the daily " - "token cap; P0/P1 only if past the low-priority floor; a " - "host with capacity). " + "5. CONSIDER DISPATCH — first call `suggest_assignments` to " + "enumerate the UNASSIGNED open-work backlog (its leftover " + "tasks), then `budget_status` and `fleet_load`. An empty live " + "fleet does NOT mean idle — todo/in_progress tasks with no " + "active assignment are exactly what to dispatch. Pick the " + "top-priority unassigned task that fits the envelope (under " + "the daily token cap; P0/P1 only if past the low-priority " + "floor; a host with capacity). " + dispatch + "6. ALWAYS `report_status` with your own one-line summary.\n" "7. ALWAYS Write the formatted output below to "