release(3.5.0): sdk-preparation — runtime lock cure, version truth, runner contracts, bundle manifest#19
Merged
Merged
Conversation
…ross operator/dispatch/ownership/partner
Fleet dispatch must be VISIBLE when an operator session is live. The postures
already carried this only as a buried anti-pattern ("Running headless or
unwatchable dispatches" / "Do not run unwatchable dispatch") with no positive law
and no mechanism — so a dispatcher using the MCP launcher (which defaults
runtime=headless and ignores VC_FRAME_SESSION_NAME) silently strands workers as
invisible orphans even with a live vc-frame session, forcing hand-relayed status.
Make it a first-class law and name the trap, verified against vibecrafted-core
source (SUPPORTED_RUNTIMES = headless|terminal|visible; terminal opens a vc-frame
tab when VC_FRAME_SESSION_NAME is set; degrade-not-die to headless when absent;
CLI auto-selects terminal on a live session, MCP does not):
- vc-operator/SKILL.md: Dispatch Law gains a "Visible Dispatch" subsection
(CLI auto-selects, MCP needs explicit runtime="visible", headless = unattended only).
- vc-operator/RUNTIME.md: "Visible runtime (vc-frame) is the attended default"
section under Runtime Lanes — the full selector mechanism.
- vc-dispatch/SKILL.md: the Dispatch loop step now mandates visible launch + names the MCP default trap.
- vc-ownership/SKILL.md: Agent Policy gains a visible-dispatch rule.
- vc-partner/SKILL.md: Execution Shape note — shared steering means the operator sees the work happen.
Triggered live: a headless MCP dispatch on loctree-suite blinded the operator and
turned the conductor into a status relay. Visible-by-default dissolves that.
Follow-up: mirror into the pl/ translated skill variants.
Authored-By: claude <agents@vetcoders.io>
session_id: 43bc805c-1b8d-46f8-9d33-fd178be5cf5f
date: 2026-06-28T20:55:00 PDT
runtime: terminal
time: 2026-06-28T21:14:29-07:00
…trol-plane drift Adds a deterministic RED parity test for async dispatcher versus legacy shell state projection drift, plus assertions for the observed terminal projection regressions. Authored-By: codex <agents@vetcoders.io> session_id: 019f154a-2e3f-7f51-95e0-7adaf4a0c315 time: 2026-06-29T14:42:59-07:00 runtime: terminal
…s both launch paths - emit live lifecycle input from legacy shell metadata writes without adding a second runs snapshot writer - defer missing-report blocking for active runs with live session identity while preserving stale dead-launcher failures - normalize validated terminal projections with exit_code/completed_at and repair footer token extraction gate Authored-By: junie <agents@vetcoders.io> session_id: 019f1134-8399-74d0-b38e-3176ab7d9d1b time: 2026-06-29T17:07:28-07:00 runtime: terminal
Replace real and non-neutral placeholder home-path usernames (maciejgad, polyversai, silver, op, YOUR_USER) with the neutral `you` across docs, tests, plans, and sample configs. Test fixtures (schema_fidelity.rs, test_capabilities.py) updated on both the input and assertion sides so behavior is unchanged. Authored-By: claude <agents@vetcoders.io> session_id: 7292992a-7594-48ed-b3b4-f736cccc9668 time: 2026-06-30T07:51:59-07:00 runtime: interactive
…etcoders Collapse founder/agent names (Maciej, Monika, Szymanska, Klaudiusz, m-szymanska, M&K) to the collective `vetcoders`/`Vetcoders` per brand naming rules, across LICENSE/Cargo/pyproject authorship, credit headers, zellij/theme comments, docs prose, and CSS comments. Drop personal contact emails (void@div0.space, m.gad@amlt.ai, the1st@whoai.am) in favor of the brand contact hello@vetcoders.io. Left for operator decision (functional, not auto-fixed): shell-agent/Makefile SIGNING_IDENTITY carries the real Apple cert CN and must match the keychain identity; Apple Team ID MW223P3NPX kept (embedded in every signed binary). Machine names (sztudio/silver/div0) left in place — separate needs_decision class. Authored-By: claude <agents@vetcoders.io> session_id: 7292992a-7594-48ed-b3b4-f736cccc9668 time: 2026-06-30T07:53:03-07:00 runtime: interactive
…loyment details Memex: scrub the private mesh-topology prose (kronika-dated topology, named hosts dragon/silver/sztudio/div0/mgbook16, "operator's tailnet") from docs/MEMEX.md, config/memex.toml.example, and memex_client.py; rename the private default host dragon.local -> memex.local (and the dragon-ns test namespace -> team-ns) self-consistently across client code and tests (test-memex tier still green). AI_notes: genericize the private notes path in vc-canvas product-wave-contract. memex/rust-memex kept as the named optional integration (functional, like rmcp/lancedb). tailscale/tailnet left intact — functional container networking, not private-setup prose. rmcp/lancedb untouched (allowlisted). Authored-By: claude <agents@vetcoders.io> session_id: 7292992a-7594-48ed-b3b4-f736cccc9668 time: 2026-06-30T07:54:00-07:00 runtime: interactive
Apply brand naming rule: VetCoders->Vetcoders, ScreenScribe->Screenscribe, CodeScribe->Codescribe across docs, skills, code, configs, tests. Org/repo/namespace/path/URL contexts lowercased. Globally consistent so test-coupled pairs stay in sync. Verified: vibecrafted-core pytest 135, iterm2/aicx shell smoke 17/16, control-core schema_fidelity 7 all green. Authored-By: claude <agents@vetcoders.io> session_id: 7292992a-7594-48ed-b3b4-f736cccc9668 time: 2026-06-30T07:54:58-07:00 runtime: interactive
…th usernames Full main-side sweep of absolute home paths that leaked real OS usernames (maciejgad, polyversai, silver, operator) and machine layout. Replaced with the neutral /Users/tester placeholder across docs, plans, audits, tests, fixtures, and one Rust source comment. Clears the verify-gate CRITICAL findings. Authored-By: claude <agents@vetcoders.io> session_id: 7292992a-7594-48ed-b3b4-f736cccc9668 time: 2026-06-30T09:13:50-07:00 runtime: interactive
…gs (full main sweep) Normalize camelCase brand spellings to Capital-first across the whole main tree, not just the baseline slice: VetCoders->Vetcoders, ScreenScribe-> Screenscribe, CodeScribe->Codescribe, VibeCrafted->Vibecrafted. Covers docs, skills, configs, tests, plans, and two shell help strings the scanner missed. Author/copyright attribution lines left untouched (needs_decision). Authored-By: claude <agents@vetcoders.io> session_id: 7292992a-7594-48ed-b3b4-f736cccc9668 time: 2026-06-30T09:16:14-07:00 runtime: interactive
…er deprivatize The home-path sweep mechanically rewrote a negative regression guard (`assert "/Users/silver/Git/VibeCrafted" not in shim`) into a placeholder literal, which no longer guards anything. Re-anchor it to the dynamic `REPO_ROOT` so the guard keeps proving the shim contains no absolute repo path, regardless of where the repo lives. Authored-By: claude <agents@vetcoders.io> session_id: 7292992a-7594-48ed-b3b4-f736cccc9668 time: 2026-06-30T09:19:51-07:00 runtime: interactive
…d paths The brand sweep applied Capital-first 'Vetcoders' globally, but per naming-rules the org segment in URLs (github.com/vetcoders), Pages, and runtime/artifact paths is lowercase. Capital-first 'VetCoders->Vetcoders' broke test_bundle, whose source MARKETPLACE_LISTING.md correctly carries lowercase vetcoders. Re-lowercase the slash-delimited URL/path segments (prose stays Capital-first). Authored-By: claude <agents@vetcoders.io> session_id: 7292992a-7594-48ed-b3b4-f736cccc9668 time: 2026-06-30T09:56:15-07:00 runtime: interactive
…artifact-path Capital Second casing correction. The org/repo segment resolved from the git remote (`vetcoders/vibecrafted`) is lowercase — `test_runtime_helpers` asserts the resolver output, which broke under Capital-first. Re-lowercase bare org/repo pairs (`Vetcoders/<repo>` -> `vetcoders/<repo>`) in URLs, the prview repo ref, and that assertion. Restored `skill_launcher.rs` artifact path to Capital-first `Vetcoders` (artifact-path org is a functional runtime value, Capital by convention, not a brand-text leak) — verified locally: runtime_helpers 24, install_bootstrap 11, aicx_sync 36, bundle 7 green. Authored-By: claude <agents@vetcoders.io> session_id: 7292992a-7594-48ed-b3b4-f736cccc9668 time: 2026-06-30T10:12:38-07:00 runtime: interactive
… one launch entry - Route normal supervised wrapper launches through python -m vibecrafted_core.dispatcher run instead of the sync Supervisor. - Keep spawn.Supervisor as an explicit microsandbox/test/helper compatibility surface. - Add regression coverage proving normal runtime launches do not instantiate Supervisor. Authored-By: junie <agents@vetcoders.io> Co-authored-by: Junie <junie@jetbrains.com> session_id: 019f1134-8399-74d0-b38e-3176ab7d9d1b time: 2026-06-30T13:34:33-07:00 runtime: terminal
…stalls; bump VERSION Own and fix the Semgrep gate findings (no "pre-existing" — every line is ours): - Pin all 17 GitHub Actions refs to 40-char commit SHAs (checkout, setup-python, setup-uv, action-gh-release, configure-pages, upload-pages-artifact, deploy-pages), each tagged with its # vN for readability. Kills github-actions-mutable-action-tag. - Split the two container-bootstrap "curl ... | sh" installs (uv, rustup) into download-then-execute (the rule's recommended pattern); behavior-identical, no node-in-slim-container risk that a setup action would add. Kills gha-curl-pipe-shell. - Whole-repo gate now clean: `semgrep scan --config auto --error` exits 0; the pre-push hook will pass without --no-verify. - Bundle the operator's release VERSION bump 3.2.0 -> 3.3.0-dev (per request to commit it alongside another change, not standalone). Authored-By: claude <agents@vetcoders.io> session_id: 43bc805c-1b8d-46f8-9d33-fd178be5cf5f date: 2026-06-30T13:49:17 PDT runtime: interactive time: 2026-06-30T13:49:31-07:00
…egacy launcher fate Extend test_run_state_parity.py with test_execution_path_state_parity: both launch paths (python -m vibecrafted_core.dispatcher run, and the legacy shell spawn_write_meta frontend) must reach live state=active with a real session identity, project the same operator/liveness contract schema, and agree on state/operator_state/artifact_gate. The only tolerated schema divergence is the documented writer-local allowlist (worker_pid/worker_pgid vs meta/runtime). This is the positive gate the split-brain lacked. Refactor the two existing path tests to share _launch_python_dispatcher_path / _launch_shell_meta_path helpers (behavior unchanged, still green). Record the unified one-launch-entry / one-writer Execution-Path Doctrine and the legacy *_spawn.sh fate (KEEP as compatibility frontends; retirement is a human-user sign-off gate, no deletion) in launcher-migration.md, and cross-reference the new gate from spawn_parity_test.sh. Authored-By: claude <agents@vetcoders.io> session_id: 4a15fb7a-f1fa-495a-9f4c-fdd2ae8410f4 time: 2026-06-30T13:50:56-07:00 runtime: terminal
…th + one visible-by-default launcher - Route visible launches through a live-transcript wrapper and harden vc-frame session selection against stale ambient sessions. - Add failed-report fallback for abnormal supervisor exits, including SIGKILL-style termination. - Bound MCP observe payloads to recent transcript tails and clean optional UI field rendering. - Cover report fallback, observe tailing, and visible wrapper behavior with regression tests. Authored-By: junie <agents@vetcoders.io> session_id: cfb399fc-13e5-418e-8c1f-1198e47fc184 time: 2026-06-30T21:26:16Z runtime: vc-frame
…literal "None" (kills NoneNoneNone)
W1-06 follow-up — walk-around caught a NoneNoneNone surface the cut missed.
_format_junie_event built its display text from message/text/content only; junie's
json-stream events use name/details (e.g. {"type":"step","name":"Thinking",
"details":"..."}), so message was None and `str(None)` emitted the literal "None"
to the teed dispatcher stdout — repeated across events as the "NoneNoneNone" wall
the operator saw in the vc-frame tab. It also dropped junie's real content entirely.
Fix (mirrors the existing _format_grok_event guard): include details/data in the
message chain, run it through _stringish, drop empty/"None" via the
`if not text or text == "None": return ""` guard, and surface step labels as
"<name>: <text>" so junie transcripts are readable instead of lost.
Regression test: test_agent_stream_parser_renders_junie_steps_without_none_noise
asserts step events render their details, no "None" leaks, session id is captured.
Verify: pytest tests/test_agent_stream.py tests/test_run_state_parity.py -> 12 passed;
full core suite -> 384 passed; committed without --no-verify (Semgrep gate clean).
Authored-By: claude <agents@vetcoders.io>
session_id: 43bc805c-1b8d-46f8-9d33-fd178be5cf5f
date: 2026-06-30T14:53:10 PDT
runtime: interactive
time: 2026-06-30T14:53:24-07:00
…ersonal names, private-status Naming&Identity v1 pass on the remaining actionable text leaks: - author credit `M&K` -> `Vetcoders` (6 skill/doc files); footer collapsed to single `Created by Vetcoders (c)2026` (dropped the doubled brand). - vc-frame comments: drop person->machine attribution (`Monika's`/`Maciej's` desktop/laptop) -> neutral role labels; hostnames left as-is (theme-keys, REVIEW). - tools/README: `Private collection` -> `Project tooling` (public repo status). Left as REVIEW in need-decisions.md: polyversai@dragon test, hostnames, Vista/clinical, $HOME/Libraxis default paths, Monika author-credit. Authored-By: claude <agents@vetcoders.io> session_id: 7292992a-7594-48ed-b3b4-f736cccc9668 time: 2026-06-30T17:12:19-07:00 runtime: interactive
…/deprivatize-main
…s to new-tab + repo-derived session Runtime-cleanup intentionally changed external spawn to open a fresh tab (anti-stale-marbles-tab) and derives the operator session from repo root (harden against stale ambient sessions). Update the 3 stale assertions that still expected new-pane / operator-session; verified against real captured vc-frame payloads (new-tab, session vibecrafted-<runid>). NOT touched: test_resume_headless + test_await_pane are a genuine regression from the same hardening (headless path latches repo-root session -> interactive instead of exec). Those need a runtime-routing fix, not an assertion update. Authored-By: claude <agents@vetcoders.io> session_id: 7292992a-7594-48ed-b3b4-f736cccc9668 time: 2026-07-01T15:51:22-07:00 runtime: interactive
…c-frame targeting (fix W1-06 tui regressions)
W1-06's vc-frame session hardening over-reached: it dropped/ignored an explicitly
provided VIBECRAFTED_OPERATOR_SESSION whenever VC_FRAME_SESSION_NAME was unset,
resolving every external/CLI dispatch to the repo-basename ("vibecrafted"). That
broke real, tested behaviour (marbles pane grid, await-pane, spawn_in_operator_
session, vc-resume) — caught by tests/tui (which the W1-06 run never exercised; it
only ran vibecrafted-core/tests).
Fix, per-failure (not blind test edits):
- runtime/scripts/lib/vc_frame.sh: spawn_effective_operator_session now honours an
explicitly-supplied LIVE session (VIBECRAFTED_OPERATOR_SESSION / VC_FRAME_SESSION_
NAME / ZELLIJ_SESSION_NAME) FIRST, before the repo-basename shortcut.
- runtime/shell/lib/vc_frame.sh: _vetcoders_prepare_operator_runtime no longer
unsets an explicit VIBECRAFTED_OPERATOR_SESSION when VC_FRAME_SESSION_NAME is
absent; it honours it as the visible target.
The anti-stale-leak intent W1-06 wanted is preserved by its OTHER change (the
tightened _vetcoders_in_vc_frame signal requiring VC_FRAME_PANE_ID + VC_FRAME_
SESSION_NAME). Keeps all other W1-06 wins (report-on-death, observe-cap, visible
transcript wrapper, NoneNoneNone).
Verify: the 5 previously-failing tui tests now pass:
test_resume_terminal_runtime_routes_codex_resume_into_vc_frame,
test_marbles_from_operator_mode_spawns_launcher_in_fresh_tab_and_loops_right,
test_marbles_inside_vc_frame_uses_bundled_vc_frame_priority,
test_await_pane_targets_operator_tab_with_bundled_vc_frame_without_path_leak,
test_spawn_in_operator_session_targets_named_session -> 5 passed. shellcheck clean.
Authored-By: claude <agents@vetcoders.io>
session_id: 43bc805c-1b8d-46f8-9d33-fd178be5cf5f
date: 2026-06-30T19:56:20 PDT
runtime: interactive
time: 2026-06-30T19:57:17-07:00
…erseded by dispatch/ package dispatch_contract.py was the pre-package iteration of the dispatch TOML contract; the live dispatch/ package (schema.py + model.py + supervisor.py + verify.py + cli.py) carries every feature it had (workflow_map, brief validation, recovery-goto targets, concurrency gate, forbidden command needles) plus Baton, prompt rendering and the supervisor runtime. Verified dead two ways before the cut: loct impact (1 direct consumer = its own test, 0 transitive) and loct find --literal across 840 files (1 hit = the test import). Gates after removal: pytest 370/370, ruff check+format clean, mypy clean on 45 source files. Behavior divergence resolved toward the live package: READ cuts without mutation stay accepted per doctor policy (tests/dispatch/test_schema.py:120). Authored-By: claude <agents@vetcoders.io> session_id: 2123d83c-9beb-4ce1-be0c-34b7cc2466e5 time: 2026-07-01T22:19:21-07:00 runtime: workflow
…ndatory in template commit-msg The template commit-msg advertised the agent prefix as "optional" while Vibecrafted's own scripts/hooks/commit-msg hard-requires it. Align the template with the canonical standard: the prefix is now mandatory in the subject regex (when ALLOW_AGENT_PREFIX=1), add the 'release' type, and fix the stale comment + failure hint. Non-agent repos can still opt out via ALLOW_AGENT_PREFIX=0. Authored-By: claude <agents@vetcoders.io> session_id: 423065c1-dd92-4b7e-a078-d544c5e86a46 time: 2026-07-01T22:34:28-07:00 runtime: claude
…live lifecycle steering Worker reports can now steer the lifecycle runner (umbrella forward/backward) by writing next_stage: <stage-id> in report frontmatter: await_launch_truth parses it via cron.parse_frontmatter (reuse, no twin) and the runner's existing _next_stage hook consumes it. Added VIBECRAFTED_LIFECYCLE_MAX_STAGES cap (default 3x manifest stages, min 6) so cyclic steering/fallback edges fail explicitly instead of dispatching forever. Closes intents_2026_0506 gap umbrella (#10) and the steering half of baton (#9); gates: pytest 373/373 green, mypy clean on both touched modules. Authored-By: claude <agents@vetcoders.io> session_id: 2123d83c-9beb-4ce1-be0c-34b7cc2466e5 time: 2026-07-01T22:35:21-07:00 runtime: workflow
… the lifecycle runtime The operator lifecycle intent (intents_2026_0506) wants every workflow phase runnable as its own lifecycle runtime with Context Atlas, baton, and READ/WRITE guards — not only the six that had manifests. Add standalone single-stage manifests for vc-scaffold, vc-implement, vc-review, vc-workflow, vc-followup, and vc-release; convert their vc-* wrappers from supervised_skill_main to the lifecycle runner (the same migration marbles/dou/audit took earlier); point the four bin/ shims that still called supervised_skill_main directly at the named mains. Registry single-source, wrapper routing, and console-script packaging tests extended; core suite 379/379 green. Authored-By: claude <agents@vetcoders.io> session_id: a03fcc26-beb4-49cd-9892-30a68ca9bca8 time: 2026-07-01T22:54:44-07:00 runtime: workflow
Implements the dictation's agent relay ("wystrzeliwuje pałeczkę do
następnego agenta") as mechanism, without pinning registry defaults:
- WorkflowStage grows an optional per-stage agent pin (empty everywhere in
the registry — pinning stays the operator's call); the manifest payload
exposes it.
- Workers steer the relay via report frontmatter next_agent: <agent-id>,
surfaced by await_launch_truth symmetrically to next_stage (shared
_report_frontmatter_value helper, no parallel parser).
- LifecycleRunner resolves each launch as stage-pin > baton holder; a valid
requested next_agent becomes the sticky holder for later stages, unknown
agents are ignored (SUPPORTED_AGENTS-validated, mirrors unknown-stage
handling). Baton, transitions, run report and supervisor status all carry
next_agent.
- Stage prompts now state the steering contract (next_stage + next_agent)
workers previously had no way to know.
Gates: 382 passed (379 + 3 new), mypy clean on the four touched modules,
ruff clean. Runtime truth: real subprocess e2e reads next_agent from real
report frontmatter; steering block render verified via live _stage_prompt.
Authored-By: claude <agents@vetcoders.io>
session_id: 117694a0-d5ba-4d58-bf0d-adc4980c507b
time: 2026-07-01T23:17:01-07:00
runtime: workflow
…ator verbs The lifecycle canon (docs/runtime/LIFECYCLE.md, intents_2026_0506) promised that approval, interruption, forced audit, DoU acceptance, and fallback selection are "explicit runtime capabilities rather than side-channel custom" — but human_controls were only declared in the manifest, injected into prompts and reports, with zero implementing code, and LifecycleSupervisor.read_state/status had no consumer outside tests. New vibecrafted_core.lifecycle_control gives every lifecycle CLI (vc-ship and each single-stage wrapper via lifecycle_main interception) traced operator verbs over lifecycle_runs/<run_id>/state.json: - runs / status: first real consumer of LifecycleSupervisor observability - approve: launches the baton's pending next_stage as a parent-linked continuation run (parent_run_id on LifecycleRunSpec + state) - interrupt: workflow.stop_run on the live stage, status=interrupted - force-audit: steers the baton to the manifest audit stage, or dispatches a parent-linked standalone vc-audit run for single-stage manifests - accept-dou --finding: records a consciously accepted DoU gap - fallback --stage: manifest-validated backwards steering Every verb validates against the run's human_controls and appends a timestamped operator_actions entry to state.json, report.md, and the transcript. LifecycleRunner now persists the launch spec (continuations rebuild it), state/report writers moved to module level for reuse. Verified: vibecrafted-core suite 392/392 green; targeted launcher subset 11/12 (the 1 red, test_vc_dashboard_wrapper_dispatches_to_dashboard, is a pre-existing bash-launcher/vc-frame path untouched by this diff); mypy and ruff clean on changed files; live read-only verbs driven against the real control plane (empty-state and error paths). Full live agent dispatch through approve was not re-driven in this session. Authored-By: claude <agents@vetcoders.io> session_id: 3b749f60-d7c5-490a-a2ef-bd88882d7c92 time: 2026-07-01T23:44:47-07:00 runtime: workflow
…ator continuations The lifecycle baton relayed direction (next_stage, next_agent) but dropped its cargo at every operator button: LifecycleRunSpec had no field for inherited stage reports, so approve/force-audit continuations always prompted the next stage with "Previous stage reports: - none", and the default no-await path never recorded the launched stage's report in the baton at all. This breaks the Read-Write cadence the lifecycle exists for - a Read stage's report is exactly what the following Write stage must consume. Now LifecycleRunSpec.previous_reports seeds the runner's report trail (and the first stage prompt), the no-await branch appends the launched stage's report path to the baton before handing control to the operator, and _continuation_spec passes baton.previous_reports into every continuation run. state.spec records the inherited reports for traceability. Verified: vibecrafted-core suite 393/393 green; ruff clean on touched files. Authored-By: claude <agents@vetcoders.io> session_id: 2603026d-0c40-4ca9-af91-e2ab74256926 time: 2026-07-02T10:41:01-07:00 runtime: workflow
…e metric
The dictation's end-goal ("big win i ZERO DoU index") had no counter — the
last NOT FOUND row of the intent table. DoU stage workers now report
'dou_index: <int>' in their report frontmatter (0 = launch-ready target);
await_launch_truth surfaces it via the shared frontmatter reader (public
report_dou_index — parse_frontmatter returns strings, so 0 survives; bool
rejected explicitly since bool subclasses int). The lifecycle runner records
{value, stage, report} in state.json, on the baton and in the run report;
LifecycleSupervisor.status shows dou_index next to accepted_dou and lazy-reads
the live report frontmatter in no-await mode where the runner exits before the
worker finishes writing. The stage prompt carries the contract for DoU stages
only; LIFECYCLE.md gains the previously undocumented worker-steering section
(next_stage / next_agent / dou_index). Tests: 396 passed (+3 new, 4 extended);
ruff + mypy clean on touched files.
Authored-By: claude <agents@vetcoders.io>
session_id: ccedd12b-c974-4744-8f09-c1041fdfbf17
time: 2026-07-02T11:16:49-07:00
runtime: claude
Closes segment-6's flagged relay gap: approve carried the baton's report paths without verifying the worker had finished writing them, so an early operator button in no-await mode launched the continuation with an evidence trail pointing at files that were not there. approve_transition now checks every baton previous_report exists and is non-empty and refuses with the missing paths and an actionable hint; 'approve --force' is the conscious override and records forced_missing_reports in the traced operator action. force-audit's dispatch path stays permissive by design (emergency verb). Tests: 397 passed (+1 covering missing file, empty file, and forced trace); ruff + mypy clean; real 'vc-ship approve --help' renders the flag. Authored-By: claude <agents@vetcoders.io> session_id: ccedd12b-c974-4744-8f09-c1041fdfbf17 time: 2026-07-02T11:18:58-07:00 runtime: claude
Authored-By: codex <agents@vetcoders.io> session_id: 019f56fd-94e4-7dd2-b7f4-05fc9106b531 time: 2026-07-12T19:13:55+02:00 runtime: terminal
Authored-By: codex <agents@vetcoders.io> session_id: 019f56fd-94e4-7dd2-b7f4-05fc9106b531 time: 2026-07-12T19:15:03+02:00 runtime: terminal
- export the installed core path and disable bytecode in generated dispatchers - replace staged tools atomically from a validated mirror payload - catch manifest failures as concise installer verdicts instead of tracebacks Authored-By: codex <agents@vetcoders.io> session_id: 019f570a-7c7a-71b2-ad40-5d6b194c778f time: 2026-07-12T19:24:00+02:00 runtime: terminal
Launch acceptance is already durable before the worker is spawned. Defer global board reconciliation so unrelated lock contention cannot turn a successful run into a 15-second traceback and nonzero CLI result. Authored-By: codex <agents@vetcoders.io> session_id: 019f570a-7c7a-71b2-ad40-5d6b194c778f time: 2026-07-12T19:30:00+02:00 runtime: terminal
Authored-By: codex <agents@vetcoders.io> session_id: 019f56fd-94e4-7dd2-b7f4-05fc9106b531 time: 2026-07-12T19:37:36+02:00 runtime: terminal
Authored-By: codex <agents@vetcoders.io> session_id: 019f56fd-94e4-7dd2-b7f4-05fc9106b531 time: 2026-07-12T19:40:45+02:00 runtime: terminal
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 150 out of 152 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
vibecrafted-core/vibecrafted_core/skills/pl/vc-decorate-PL-przykład.md:215
- This byline still contains the private org token "LibraxisAI" (called out previously as a deprivatization leak). Since this line is being edited in this PR, it’s a good opportunity to fully neutralize it (e.g., collapse to the same placeholder used elsewhere).
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.
Release branch for 3.5.0
feat/sdk-preparationis the release branch for 3.5.0 (VERSION=3.5.0). This is NOT the draft #18 (that is a narrow 4-file dispatch fail-closed fix from the Vista fleet run, likely already superseded by this branch's supervision hardening).What lands here (highlights of 82 commits ahead of main)
.sync.lockwas taken with unboundedflock(LOCK_EX)and every per-runlookup_run/await_runrebuilt the whole board under it — a thundering herd that hung new dispatchers on an empty pane and (heartbeat behind the same lock) mislabeled live workers as stalled/pid_gone after 120s. Now: scoped per-run projection (no global lock, atomic per-run snapshot), bounded_sync_lock(LOCK_NB + timeout → loudControlPlaneLockBusy), scoped event-stream merge. Regression proves a per-run lookup returns while the lock is held.--version== packaged VERSION == metadata;version_bump.pyupdates every projection; consistency test replaces the tautology.make bundle-checkproves payload from a clean tree; honest teardown + restore kit; honest dispatch receipts.--printvalue, no stdin), junie JSON telemetry (tokens/cost/session), grok 0.2.97 alignment.Status / known blockers (do NOT tag until resolved)
make test) is currently red on 3 PRE-EXISTING failures (red since ≥2026-07-09, independent of this branch's new work):test_vc_skills_preserve_init_and_loctree_orientation_contract(vc-ship/SKILL.md missing canonical sections),test_generated_launcher_adds_uniform_artifact_closure(18 vs 15),test_codex_spawn_marks_meta_failed...auth_error. One further failure introduced by the agy 1.1 contract change was fixed in this branch (fake-agent now reads--print).v3.5.0tag → release.yml) is held until CI is green and conflicts are resolved.Verification on this branch (uv runners; host system python is 3.9)
uv run --project vibecrafted-core pytest→ 448 passed ·vibecrafted-mcp→ 30 passed · ruff clean.