From 0c81b51956c50663440ea44e30abd3f74ecfe062 Mon Sep 17 00:00:00 2001 From: Dai Ha Date: Thu, 16 Jul 2026 16:12:36 +0200 Subject: [PATCH] =?UTF-8?q?roadmap:=20Stage=202=20complete=20=E2=80=94=20C?= =?UTF-8?q?B-205=20bridge=5Fask,=20CB-202=20reviewer=20skill,=20CB-201=20d?= =?UTF-8?q?escoped?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Record the rich-message-semantics stage as done: CB-205 reverse rendezvous (bridge_ask, live e2e), CB-202 reviewer-role skill, and CB-201 intentionally descoped from a {from,to,corr} envelope to a lightweight QUESTION kind + turn_id (connection identity already routes replies). CB-203/CB-204 shipped earlier. Bump suite to 147 green (+13). Resolve the reviewer-skill open decision (skill, not CLAUDE.md snippet) and move bridge_ask out of Stage 3's delivers line. --- 8-Roadmap.md | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/8-Roadmap.md b/8-Roadmap.md index cbde6ff..2cf2dc7 100644 --- a/8-Roadmap.md +++ b/8-Roadmap.md @@ -30,7 +30,7 @@ gantt |---|---|---| | **1 — Walking skeleton** | One review, happy path | Opus mounts `bridged` (MCP), calls `bridge_send` with a diff, gets a review back from a real `ccs gx00-vllm claude` worker. Single hardcoded profile, same host, no guard/lifecycle. | | **2 — Contract + guard** | Trust the reply, trust the boundary | Structured [envelope](7-Use-Cases#mechanism-4--the-id-contract-envelope) + worker `bridge_reply`; reply rendezvous; subscription guard via `ccs env`; reviewer skill. | -| **3 — Lifecycle + discovery** | Reuse, recycle, choose | Session manager (spawn/reuse/recycle Ralph loop, `idle_ttl`); `bridge_list` roster+live; multiple profiles; `bridge_ask`. | +| **3 — Lifecycle + discovery** | Reuse, recycle, choose | Session manager (spawn/reuse/recycle Ralph loop, `idle_ttl`); `bridge_list` roster+live; multiple profiles. (`bridge_ask` landed early in Stage 2.) | | **4 — Async + split-host** | Detached + cross-host | `block:false` (detached dispatch) + idle-pane injection; internal queue (durability); split-host `Stop`-hook adapter that polls `bridged`. | | **5 — Harden** | Production shape | Auth/TLS, `/metrics` + `/healthz`, mock-socket CI, systemd unit, per-session authz + audit. | @@ -128,8 +128,9 @@ comes in Stage 2). This is the thinnest end-to-end vertical slice. **Definition of done for the stage:** `CB-107` demo passes. -> **Build status — Stage 1 COMPLETE** (in `bridged/`, Maven · Java 25 · **134 tests green — 128 -> unit/acceptance + 6 live-herdr contract**). The `CB-107` end-to-end demo gate passes and the +> **Build status — Stage 1 COMPLETE** (in `bridged/`, Maven · Java 25 · **147 tests green — 141 +> unit/acceptance + 6 live-herdr contract**; the suite has grown with the Stage 2 work noted +> below). The `CB-107` end-to-end demo gate passes and the > bridge is **dogfooded**: an Opus primary delegates real tasks to off-subscription workers that > reply through it (delegated code reviews have produced committed bug fixes). > ✅ **CB-101** herdr client — connection-per-call, contract-tested vs live 0.7.0. @@ -166,6 +167,25 @@ comes in Stage 2). This is the thinnest end-to-end vertical slice. > the scrape cap (CB-118). Verified by a single-worker conversation harness, a **1-primary / > N-worker fan-out issue-hunt**, and a **sustained 5-minute stateful back-and-forth** (30 turns, > every one a clean `bridge_reply`, running total held) — all under `e2e/`. +> +> **Stage 2 — rich message semantics COMPLETE.** The contract-and-guard stage has landed (the +> +13 tests above are its coverage): +> ✅ **CB-205** `bridge_ask` reverse rendezvous — a worker pauses its delegated turn to ask the +> primary and resumes the **same** turn with the answer. The question surfaces on the primary's own +> blocked `bridge_send` carrying a `turn_id`, and the primary answers by sending on that `turn_id`. +> Live e2e (`e2e/bridge_ask_test.py`): the worker asked in ~9s and, after the primary answered, +> resumed and replied via a clean `bridge_reply`. +> ✅ **CB-202** reviewer-role skill (`.claude/skills/reviewer/SKILL.md`) — the playbook a worker +> loads to review a scoped assignment, ask the lead via `bridge_ask` when the call is genuinely +> theirs, and report exactly one structured finding via `bridge_reply`. Pairs the already-shipped +> `bridge_reply`/`bridge_ask` tools with the role guidance for using them. +> ⚠️ **CB-201 descoped** — the planned `{from,to,corr}` envelope schema + codec was **not** built. +> Connection identity (loopback peer PID → herdr pane) already routes every reply and question to +> the right session robustly, so CB-201 shipped as a *lightweight* addition only where the reverse +> path needs it: a `QUESTION` message kind + `turn_id` correlation. No heavyweight envelope. +> ✅ **CB-203 / CB-204** (reply rendezvous · subscription guard) shipped earlier in the CB-1xx +> sequence — completion-fallback resolution on the `working→idle` edge, and the per-profile +> `base_url` allowlist checked before any herdr call. **All five Stage 2 tickets are done.** --- @@ -263,8 +283,10 @@ end-to-end gate.* - **ccs worker profiles** — which existing ccs profiles (or new `ccs api` profiles) back the `gx00-vllm` / local workers, and their exact `base_url` hosts for the allowlist. -- **Reviewer system prompt** — ship the reviewer skill as a `CLAUDE.md` snippet vs a - slash-command/skill the worker loads at spawn. +- **Reviewer system prompt** — ✅ **Decided (CB-202):** shipped as a loadable **skill** + (`.claude/skills/reviewer/SKILL.md`), not a `CLAUDE.md` snippet. Workers inherit the repo cwd, so + the skill is available to every reviewer worker without polluting the developer-facing project + `CLAUDE.md`. - **Envelope-as-text (Stage 1) → structured (Stage 2)** — confirm the Stage-1 shortcut (request body inlined as prompt text, reply scraped) is acceptable before the envelope lands.