feat: reframe the conductor as an assistant whose fleet is one capability - #275
Merged
Conversation
…lity The design doc treated fleet supervision as the conductor's whole contract and claimed it was read-only over targets "by construction". Neither holds. The conductor is the owner's always-on assistant: it converses, answers questions about the owner's work and machine, fetches information, runs unattended routines, and commands a fleet of coding sessions as ONE of several capabilities. §5 now enumerates that surface (fleet, memory, notes, web, routines, mounted MCP servers) and draws the three architectural consequences: the system prompt must be composed per mounted capability, read-only classification must be registry-driven instead of a hand-maintained list in tool-safety.ts, and web reads must auto-approve. Read-only-by-construction is retired as R6. It was never implemented: ZeroID scopes do not gate the conductor session's local tool surface (#createConductor builds a plain session, allowedTools is a pre-approval list); write: false would not close it anyway because Bash sits outside WRITE_TOOLS by design; and fleet_spawn(shape: "ship") obtains write on owner approval as a root grant. The identity model's real guarantee — the conductor cannot MINT mutation authority by delegation, since ZeroID intersects scopes per RFC 8693 hop — is preserved and stated precisely. What replaces it is scope, not capability: write auto-approved in the conductor's own workdir, approval-gated outside a repo, never auto-approved inside one, hard-denied where a live session holds that repo's worktree, and Bash denied in repos. The surviving arguments are context economics (Read threatens O(active threads) more than Edit does) and multi-writer correctness, both of which a path scope satisfies and a capability ban over-serves. Delegation becomes a cost decision. Also: §9 gains an honest enforced-vs-prompted inventory, §11 defers all sequencing to the build plan instead of carrying a competing phase list, §12 retires five settled questions and adds the six the reframe opens, and the status notes now say plainly that the front doors are unbuilt, "always on" is not yet true, and routines need tools rather than only a scheduler. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
…al positioning Follow-ups from reviewing the reframe against the current market. Sandboxing is a wrapper (highflame-forge starts codeoid inside the sandbox), which is the right split — it keeps the daemon free of if (sandboxed) branches the way local-mode keeps the auth path free of if (localMode). But it closes one threat model, not two: the outer fence protects the host from the fleet, while R6's hazards all occur INSIDE it. sed -i on a repo file works as well sandboxed as not, and a kernel fence cannot tell the conductor's write from the write of the session that owns that worktree. §9 now carries both rows, and the point that the inner fence needs no kernel help: the worktree check is deterministic because the daemon knows which session owns which worktree, which makes it an invariant only a session-owning control plane can enforce rather than sandbox catch-up. Also records the open topology decision — codeoid inside a sandbox is one fence per daemon, so shape: "scout" is still a scope claim, not a fence. Open questions 8 and 9 are resolved by the same layering: tool-safety.ts stays a pure classifier answerable from a tool name, and the session's canUseTool gate makes the contextual path decision, so the module's dependency-free purity survives. §5 states the mount contract as an exchange rather than paperwork: declare read and side-effecting verbs, receive identity attribution, audit, approval classification, and episodic capture. Mandatory both ways — undeclared means no auto-approval. That exchange, not the registry, is what peers' plugin systems cannot offer. §6 stops positioning the ranker as a moat. Bi-temporal validity, hybrid dense/sparse/graph retrieval, RRF and cross-encoder rerank are shipped and benchmarked elsewhere; claiming them invites a comparison we lose. What is differentiated is downstream of the native-protocol layer instead: the corpus (tool-call-granular episodes with file paths, which a text-ingesting memory cannot produce) and the task (fuzzy reference to session across workspaces, which nobody benchmarks). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This was referenced Aug 5, 2026
Open
akashjavelin
approved these changes
Aug 5, 2026
This was referenced Aug 5, 2026
Open
Open
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.
Docs-only. Locks in a reframe of
conductor-design.md, plus the minimum consistency edits toconductor-build-plan.mdso the two docs stop contradicting each other.What changed, and why
1. The conductor is an assistant; the fleet is one capability.
The doc treated fleet supervision as the conductor's whole contract —
CONDUCTOR_SYSTEM_PROMPT_APPENDeven lives infleet.tswith a comment saying the fleet tools "define the conductor's whole contract". The conductor is the owner's always-on assistant: it converses, answers questions about the owner's work and machine, fetches information, runs unattended routines, and commands coding sessions as one capability among several.§5 is now a capability surface — fleet, memory, notes/scratch, web, routines, mounted MCP servers — with per-capability status. Three consequences are architectural, not cosmetic:
config.conductor.providerexists) does so far more readily than a frontier model.isSafeToolhardcodes per-server prefix lists; every new capability means editing the one file where an over-broad match is a prompt bypass.WebFetchis not an assistant.2. Read-only-by-construction is retired (R6). It was never implemented, for three reasons in the code:
#createConductorbuilds a plain session with no capability role and nodisallowedTools;allowedToolsis a pre-approval list. Full default toolset behindcanUseToolonly.write: falsewould close itWRITE_TOOLSexcludesBashby design —tool-safety.tssays so:>,tee,sed -i,git applyremain until a real sandbox exists.WORKER_SCOPE_PROFILES.shipcarriestools:write;shape: role.write ? "ship" : "scout".The identity model's actual guarantee is preserved and stated precisely: the conductor cannot mint mutation authority by delegation, because ZeroID intersects scopes on every RFC 8693 hop — which is exactly why a ship worker's token is a root grant sanctioned by owner approval rather than a conductor delegation. "Cannot mint" is true. "Read-only subtree" is not.
3. Scope replaces capability. The two arguments that survive scrutiny are context economics (and notably
Readthreatens O(active threads) more thanEditdoes — it is inSAFE_TOOLSand auto-approves) and multi-writer correctness against live worktrees. Both are satisfied by a path scope:~/.codeoid-conductorBashin a repoDelegation becomes a cost decision, not a trust one: delegate when the overhead exceeds the context cost of acting inline. Send-class egress (§8) stays delegated, and that one is about trust — the conductor ingests untrusted text from web fetches,
<fleet_events>, and mounted servers.Housekeeping in the same pass
fleet_spawnmakes a single worker.Ordering effects
Recorded in both docs: a tool-surface slice lands first, P5 front doors and mountable fleet MCP (#245) move up — #245 is the keystone of the reframe, since a mounted fleet is what makes it one capability rather than the contract — and P4.5 routines gain the spend ceiling as a hard prerequisite (amended R5: unattended autonomy needs its cost cap at the same time as its autonomy, not in the Shield era).
Verification
Docs-only; no code touched.
biomelint coverssrc/andpackages/only. Section numbers referenced byconductor-session-resolution.md,collaborative-session-design.md, andsdlc-pipeline.md(§2, §5, §6) are unchanged — §5 keeps its number and gains a §5.1. Anchor links verified against the actual headings.🤖 Generated with Claude Code
Second commit — two-fence sandbox split, mount contract, retrieval positioning
Folded in after reviewing the reframe against the current market (OpenClaw, GitHub Agent HQ, Zep/Graphiti, Agent-Kanban).
highflame-forgestarts codeoid inside the sandbox), which is the right split: it keeps the daemon free ofif (sandboxed)branches the way local mode keeps the auth path free ofif (localMode). But it closes the outer threat model only. Every R6 hazard happens inside that fence —sed -iworks as well sandboxed as not, and a kernel fence cannot tell the conductor's write from the write of the session that owns that worktree. The inner fence needs no kernel help: the worktree check is deterministic because the daemon knows who owns which worktree, which makes it an invariant only a session-owning control plane can enforce rather than sandbox catch-up. Records the open topology decision — codeoid inside a sandbox is one fence per daemon, soshape: "scout"is still a scope claim.tool-safety.tsstays a pure classifier answerable from a tool name; the session'scanUseToolgate makes the contextual path decision. The module's dependency-free purity survives, which was the objection.Follow-up work filed
Bashdenied in reposfleet_spawncannot start a collaborative sessionUpdated with reframe context: #245 (mountable fleet MCP is the keystone), #251 (external callers must join the delegation chain, not hold bearer tokens), #54 (routines need tools, plus two hard prerequisites), #52 (budgets promoted from Shield-era to a prerequisite of unattended autonomy).