Skip to content

release(3.5.0): sdk-preparation — runtime lock cure, version truth, runner contracts, bundle manifest#19

Merged
div0-space merged 122 commits into
mainfrom
feat/sdk-preparation
Jul 12, 2026
Merged

release(3.5.0): sdk-preparation — runtime lock cure, version truth, runner contracts, bundle manifest#19
div0-space merged 122 commits into
mainfrom
feat/sdk-preparation

Conversation

@div0-space

@div0-space div0-space commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

Release branch for 3.5.0

feat/sdk-preparation is 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)

  • Runtime lock cure (root of the fleet's night of false stalls): the global .sync.lock was taken with unbounded flock(LOCK_EX) and every per-run lookup_run/await_run rebuilt 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 → loud ControlPlaneLockBusy), scoped event-stream merge. Regression proves a per-run lookup returns while the lock is held.
  • Version truth: installed --version == packaged VERSION == metadata; version_bump.py updates every projection; consistency test replaces the tautology.
  • Complete-runtime distribution manifest shared by both install paths + make bundle-check proves payload from a clean tree; honest teardown + restore kit; honest dispatch receipts.
  • Runner contracts refreshed to current CLIs: agy 1.1 (--print value, no stdin), junie JSON telemetry (tokens/cost/session), grok 0.2.97 alignment.

Status / known blockers (do NOT tag until 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.
  • Flock cure verified live in the installed runtime (3.5.0, doctor clean, no hang).

div0-space and others added 30 commits June 28, 2026 21:14
…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
…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

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 149 out of 151 changed files in this pull request and generated 3 comments.

Comment thread install.toml Outdated
Comment thread vibecrafted-core/vibecrafted_core/skills/vc-delegate/SKILL.md Outdated
Comment thread vibecrafted-core/vibecrafted_core/skills/pl/vc-workflow/SKILL.md Outdated
Copilot AI review requested due to automatic review settings July 12, 2026 17:16

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 149 out of 151 changed files in this pull request and generated 4 comments.

Comment thread vibecrafted-core/vibecrafted_core/skills/vc-research/SKILL.md Outdated
Comment thread vibecrafted-core/vibecrafted_core/skills/vc-research/SKILL.md Outdated
Comment thread vibecrafted-core/vibecrafted_core/skills/vc-research/SKILL.md Outdated
Comment thread vibecrafted-core/vibecrafted_core/runtime/vc-research/research.yaml.example Outdated
- 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
Copilot AI review requested due to automatic review settings July 12, 2026 17:37
Authored-By: codex <agents@vetcoders.io>

session_id: 019f56fd-94e4-7dd2-b7f4-05fc9106b531

time: 2026-07-12T19:40:45+02:00

runtime: terminal

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 150 out of 152 changed files in this pull request and generated 6 comments.

Comment thread vibecrafted-core/vibecrafted_core/skills/vc-research/SKILL.md Outdated
Comment thread vibecrafted-core/vibecrafted_core/skills/vc-research/SKILL.md Outdated
Comment thread vibecrafted-core/vibecrafted_core/skills/vc-research/SKILL.md Outdated
Comment thread vibecrafted-core/vibecrafted_core/runtime/vc-research/research.yaml.example Outdated
Comment thread tests/tui/test_research_launcher.py
Comment thread tests/tui/test_research_launcher.py
Copilot AI review requested due to automatic review settings July 12, 2026 17:46

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 150 out of 152 changed files in this pull request and generated 2 comments.

Comment thread vibecrafted-core/vibecrafted_core/runtime/vc-research/research.yaml.example Outdated
Comment thread vibecrafted-core/vibecrafted_core/runtime/scripts/lib/util.sh Outdated
Copilot AI review requested due to automatic review settings July 12, 2026 17:51

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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).

@div0-space
div0-space added this pull request to the merge queue Jul 12, 2026
@div0-space
div0-space removed this pull request from the merge queue due to a manual request Jul 12, 2026
Copilot AI review requested due to automatic review settings July 12, 2026 18:04

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 150 out of 152 changed files in this pull request and generated no new comments.

@div0-space
div0-space added this pull request to the merge queue Jul 12, 2026
Merged via the queue into main with commit 5cf4dc0 Jul 12, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants