Repository navigation
Conversation
Move every ClosedLoop and symphony-alpha specific line out of vibe and vibe-core into the new optional vibe-closedloop-provider plugin, which ships text and data only. With the provider bound, sessions keep today's behavior; without it, vibe and fleet work from the repository itself: the person's description, plans in the private git directory, the AGENTS.md test command, the lockfile install, and a requested PR or named recipient at the end. - provider binding, provider text assembly and data access in vibe-core - guards read their rules from the bound provider and stay silent outside an activated chat - main sync gates its provider-only machinery on the provider's recipe - the recipes opt-in file is validated and withholds recipes with one reason - the provider is offered for install once, never re-enabled or reinstalled - generic scan gate, generic walk fixture, eval arms, and generic twins for the provider-bound tests - vibe 1.1.81, vibe-core 1.0.5, vibe-closedloop-provider 1.0.0
- writer ledgers parse capabilities by shape; grants are checked against the session binding at register and launch - the Claude launcher resolves provider text for its roles - writers inherit the lead's binding through a Provider line, enforced by the Codex launcher, the Claude launcher and the Agent guard - the recipes opt-in file is validated and judged in the session repository - adopting a session keeps its binding; moved provider releases re-resolve - every installed provider's plan folder stays private - generic fleet recovery ids and duties, the worktree exclude rule, the guardrails formatter from the verify recipe - dangling reference paths fixed, provider text free of ticket ids and home paths, the inventory snapshot and mapping checked in pytest - the eval provider arm installs provider-resolved text - bundles build byte-identically from any working directory
Bind the tracker in the tracker-duty tests, run spawned scripts outside the real checkout so the cwd repository leg cannot pick it, derive the provider line in fleet tests from the fixture binding, fix the shadowed prototype deploymentHost check and rebuild dist, list provider.mjs as a vibe-core wrapper, and record the changelog word count.
Pass the lead's binding to remote fleet writers, read the recipes opt-in from the main checkout for older sessions and for a named checkout, know UI files by extension without an areas recipe, never write a legacy provider record generic, keep old hook scope records active, restore the exact ticket pattern for Prior removal, keep clerkOrgId for older vibe, report a main sync with no check as needing review, require the sole workflow for an undeclared lane source, keep generic plans in the common git dir, move the repository E2E text into provider blocks, and stop offering an install over an unreadable provider.
…c-vibe-v2 # Conflicts: # CHANGELOG.md # plugins/vibe/.claude-plugin/plugin.json # plugins/vibe/.codex-plugin/plugin.json
…ider - provider.mjs assemble writes a vibe file merged for the session's binding, and assemble --blocks gives every bound block of a loaded SKILL.md in one call; the reading rules use them - each generic region and its provider block share their identical lines once, so assembled text is unchanged and the provider is smaller - only an unbound capability falls back to the generic text: a bound provider that is gone, a missing block or an unreadable record stops with its reason and fix (exit 4) in the CLI, the launcher, every script and the hooks, and a guard refuses the action it guards - session records are written whole and renamed into place - the 1.1.82 word count is measured at this tree
ISS-14039 (#427) took vibe 1.1.82 and vibe-core 1.0.5. Keep both sides of the claude-worker launcher (the broken-provider mapping and the review model), rebuild the bundles, drop the ticket slugs the merge brought into runtime files, and remeasure the word count against the new main.
ISS-14028 and ISS-14024 (#428) took vibe 1.1.84 and vibe-core 1.0.7. The unit-status guard keeps the bound provider's rule and gains the chat's own program board; its tests keep both cases. The fleet-resume header covers both changes, the bundles are rebuilt, the ticket slugs the merge brought into runtime comments are dropped, the launcher mark written into installed launchers stays as an allowlisted compatibility line, and the word count is remeasured against the new main.
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.
Summary
vibe-closedloop-provider, that ships text and data only (provider.jsonplus reference blocks). Plan: the approved v2 plan, with Daniel's answers to its open questions (OQ1 to OQ12) recorded on the ticket..closedloop-ai/vibe-recipes.json, the opt-in this PR reads) and the fleet orchestrator's migration of its orchestration directory into the fleet home. origin/main (7c34119: ISS-14039: Accept a Fable review for a Claude cloud import #427 at vibe 1.1.82 / vibe-core 1.0.5, then ISS-14028, ISS-14024: Bind fleet chats to their programs, safe migrate #428 at 1.1.84 / 1.0.7) is merged in, so this change takes the next versions.provider: {name, state, capabilities, ...}on the startup record and the session; scripts, workers and hooks read it and never probe. States arenone,boundandbound-disconnected(a failed precondition is surfaced, never a silent downgrade). Records from before bindings existed wait for a chat that binds instead of being written generic..closedloop-ai/vibe-recipes.jsonnaming the provider; it is judged in the session's repository, falling back to its main checkout for sessions branched before the file landed. No repository names are hard-coded anywhere.gh, local#nwork ids for fleet units, plans and decision tables under<git common dir>/vibe/<slug>/, bootstrap from AGENTS.md or the lockfile, an unknown layout takes the full review path, UI files known by extension, repo-owned gates run only when the repo ships them, main sync with nothing to run reports NEEDS_REVIEW, an undeclared lane source must be the AGENTS.md test command or the repo's only workflow.Provider:line; remote writers get it with the launch (--lead-provider). Status sweeps, ticket units and placement by ticket are provider duties.vibe_generic_scan.py checkfails on provider-specific text in runtime files (exact-line allowlist with reasons); the inventory diff test proves no gating line of the base was dropped;generic-walk.test.mjsruns the walk's deterministic steps in a personal repository and requires an empty blocker ledger; the Codex eval runner has provider and generic arms.clerkOrgIdwas no longer written for an older vibe; main sync with no check reported DONE; an undeclared workflow lane source could be any workflow; generic plans lived in the per-worktree git dir; symphony E2E text sat in generic handoff text; an unreadable provider was offered for reinstall.mainunlessvibe.baseRefis set (session creation, handoff gate, several merge-base diffs, main sync).provider.mjs assemble <file>writes a vibe file merged for the session's binding, andassemble --blocks <file>every bound block of a loaded SKILL.md in one call (35 per-stub calls in vibe SKILL.md become 1). Each generic region and its provider block now share their identical lines once (5207 leading/trailing and 1818 interior words), proved byte-identical for 41 files across 12 bindings. Measured bound read path (skills and references, SKILL.md raw plus one blocks file, references assembled, the provider references a bound reader opens): 61045 words on main for the changed files, 67321 bound, +6276 (about 8.5% of the 73778-word base, down from +10.4k); almost all of the rest is the generic regions and stubs inline in the six stubbed SKILL.md files (vibe +2563, handoff +1776). Moving the heaviest stubbed sections into references is later work, measured first.provider-broken: <reason>. Fix: ...(exit 4) in provider.mjs, the Claude launcher (PROVIDER_BROKEN), and every vibe script that reads the provider. Hooks never throw: they show the reason and fix and keep their generic default, and a guard whose default would relax the bound rule refuses the action it guards (unit-status-guard on an MCP status write, shell-safety-guard on an executed e2e script, pr-create-guard when the override decides). Session records are written atomically.prototype-session.mjsshadoweddeploymentHostwith aconstof the same name (a throw on every call) and its bundle was stale; test helpers ran scripts from the real checkout, which the new cwd repository leg could pick up.VIBE_CORE_MIN1.0.8), vibe-closedloop-provider 1.0.0; dist bundles rebuilt. Word count against 1.1.84 at this head (instruction-words.mjs --changelogpasses): vibe about 20747 words shorter, the provider adds about 42146, all plugin Markdown about 21780 longer. The merges brought ticket slugs into runtime files (four(ISS-14039)from ISS-14039: Accept a Fable review for a Claude cloud import #427, fiveISS-14028/ISS-14024comments from ISS-14028, ISS-14024: Bind fleet chats to their programs, safe migrate #428); they are removed here (OQ10). The sixth from ISS-14028, ISS-14024: Bind fleet chats to their programs, safe migrate #428, fleet-home.mjsLAUNCHER_MARK, is text written into installed launchers and matched before an overwrite, so it stays as an allowlisted compatibility line.provider.json(1310 words) is data only scripts read; per-file provider headers and block markers are never printed to an agent.Breaking changes
board.mjsrefuses writes to an orchestration directory that is not a program in a fleet home (fleet-home.mjs migratemoves one). Session records gain an optionalproviderfield;environmentOrgIdis written beside the earlierclerkOrgId, which is still read and written.Test plan
provider.mjs(new, so not in the test-selection index) is imported by nearly every vibe and vibe-core test. code_tests_for_changes on the last round's 61 files selected 102 unit test files (hooks, fleet, handoff and vibe scripts, claude-worker); the full lanes cover them all.test_run.py) and vibe-workers typecheck, vitest and dist freshness all pass.e2e-lock.test.mjshung once under a loaded full run (load average about 40 from other sessions). Its signal cases then passed 3 of 3 in isolation, and its one change (the top-level catch calls failScript) is not on the signal paths. It passed in the final full run.main-sync.test.tsandmain-sync-input-boundary.test.tstimed out (16 to 44 s against 15 s) at load average 37 to 45. They passed 122/122 on one sequential rerun.--blocksorder and labels; exit 2, 3 and 4; an unreadable record is broken; a script exits 4 (local-plans); a guard refuses while generic checks still run, and grep/cat of e2e paths pass (pre-tool-use); a hook warns and still runs (program-change); PROVIDER_BROKEN mapping and CLI exit 4 (claude-worker).Test timed outat 5 s, 2spawnSync node ETIMEDOUT), with no assertion failure: claude-worker.test.ts 8, main-sync.test.ts 7, main-sync-ci, main-sync-input-references and main-sync-report-admission 1 each, at load average 50 to 65 on 10 cores from other sessions. After the ISS-14039: Accept a Fable review for a Claude cloud import #427 merge the same claude-worker file passed 67/67 and main-sync 122/122 in a sequential run; they are left to CI on clean runners rather than rerun here.