Skip to content

Local builder handoff: make takeover quiescent, Git-write capable, and runner-consistent #962

Description

@jeffhuber

Part of stabilization epic #979 and roadmap #900.

Part of roadmap #900. Follow-up from the v1.4.0 release dogfood in PR #959.

Problem

Code Mower validates an explicit source lane, destination lane, and exact handoff head, but the v1.4.0 recovery exposed three gaps in the execution boundary:

  • The default Codex builder sandbox could not write Git metadata, so fetch, checkout, commit, and guarded push failed even though the dedicated worktree was writable.
  • A source Devin session continued working after reporting that it had stood down, producing another local commit after the Codex takeover.
  • This repository's checked-in dogfood runner recognizes only Codex and Claude even though the v1.4.0 generated runner supports Devin labels and source prefixes.

An accepted handoff therefore does not yet prove that the previous writer is quiescent, that the replacement can perform its normal Git duties, or that checked-in and generated runner contracts agree.

Outcome

A builder takeover starts exactly one capable destination writer only after Code Mower proves the source writer is stopped, cancelled, or suspended at the accepted head. The checked-in dogfood runner and generated runner use one canonical lane contract.

Acceptance criteria

  • Under the default Codex builder posture, the dedicated checkout permits fetch, checkout, commit, and guarded push while preserving the checkout boundary and pre-push protection.
  • An explicit handoff identifies the source transport/session or local process and stops, cancels, or suspends it through the existing provider-neutral lifecycle before the destination writer starts.
  • If source-writer quiescence cannot be verified, the handoff fails closed with one owner action and does not start the destination writer.
  • Existing expected-head validation remains effective before launch and at push; source-side head movement invalidates the handoff.
  • Repeating the same handoff is idempotent and neither emits duplicate acceptance records nor starts duplicate writers.
  • The checked-in dogfood runner and generated runner derive allowed lanes, builder labels, and source branch prefixes from one canonical configuration. CI detects semantic drift.
  • A Devin-to-Codex fixture using a devin/ branch succeeds without local prefix patching.
  • Tests cover local-process and hosted-session quiescence, cancellation failure, stale heads, Codex Git writes, generated/checked-in parity, and no writes outside the dedicated checkout.

Boundaries

Reuse the handoff validation from #751 and the provider-neutral session lifecycle from #906. Do not introduce another session state machine, automatic paid retry, force push, or broad host process scan. Keep public evidence metadata-only and exclude prompts, transcripts, source, diffs, credentials, raw provider output, and private paths.

Delivery

One independently reviewable PR with one Code Mower builder, one independent exact-head merge-authority audit, focused and relevant regression tests, and the normal Code Mower gate.

Completion dependency and PR map

One planned OSS PR; planned Code Mower Codex builder and independent eligible Code Mower Claude review. This unit precedes #963 when handoff/provenance files overlap. Its quiescence and Git-capability guarantees must be consumed before automatic takeover in #977/#920; #949 consumes the unified lineage through #963. Reuse existing #751/#906 contracts and the independent evidence vocabulary in #976. Invalid request-key/prose inputs must not be described as a provider rule against completed-session operations. No automatic create/recovery allowance is added.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingparallel-okCan be implemented in parallel once shared contracts are stabletier:RCode Mower generated label

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions