Repository navigation
Land: ci-only mode (LAND_CI=only), queued CI runs waited for, CI Android ABI rebaseline - #222
Merged
Merged
Conversation
…h pnpm ci:test-files to dispatch and read it over REST
…ems 1 and 4) scripts/cloud-setup.sh, run by the project SessionStart hook only when CLAUDE_CODE_REMOTE=true, installs the Node every workflow pins and the pnpm of packageManager, then pnpm install --frozen-lockfile and pnpm setup:git, which now also turns rerere off. DRAGON_REQUIRE_NATIVE=1 turns a native run with a missing toolchain from blocked (owner tooling) into a failure naming the tool, in runTarget and runHostLane, as CI's "No native run was blocked" step does.
…group; ci:test-files reads reports strictly and removes them
…then the merge drivers) floor-merge.test.ts pins pnpm setup:git to exactly what the landing driver sets; rerere.enabled false joins both, so the exact-equality check stays and covers the new line.
…_NATIVE=1, prove the Linux path in CI Review of 892a687: the hook now has no matcher, so it reruns after compact, clear and fork (compaction drops CLAUDE_ENV_FILE exports); in a cloud session the script writes export DRAGON_REQUIRE_NATIVE=1 to CLAUDE_ENV_FILE first (PM ruling) and fails without that file; only the summary line reaches stdout; npm --prefix; curl --retry-connrefused. ci.yml's checks job runs on ubuntu-24.04 and runs cloud-setup.sh twice before setup-node, checking Node, pnpm, the export, typecheck and no reinstall.
…oid ABI rebaseline - LAND_DEVICES, LAND_TEST and LAND_REGEN accept ci-only; LAND_CI=only sets all three. Under ci-only GitHub Actions not running a step is a CiOutage: the driver stops, fails no PR, and every PR not landed stays queued (status: STOPPED BY A CI OUTAGE). All three ci-only skips the priority and quiet files; the leases are only on local paths, which ci-only never reaches. - awaitOnCi tells a run queued for runners (jobs queued, or the run pending) from one that never started: queued runs are waited for up to LAND_CI_QUEUE_WAIT (default 3 h); the run's own wait counts from its first job's start. - LAND_CI_MAX_INFLIGHT (default 2) caps the prepared CI regens a batch dispatches at once. - R3: a CI device run whose only model changes are Android image ABI changes is an architecture rebaseline, logged loudly and recorded in the landing; each changed lane must keep the previous state and exactly its failures. Under LAND_DEVICES=ci a local fallback onto records of another ABI stops the driver instead of blaming the PR.
# Conflicts: # scripts/land.ts
…after the CI rebaseline lands
…re; a nonce finds the dispatched run; every test vitest collects must run; the setup test covers env, vitest command and blocked scan
…review) A macOS job waiting for a runner while the Ubuntu jobs ran is queued, under LAND_CI_QUEUE_WAIT from when it was first seen waiting; a running job has the step's wait from its own start; a run with jobs done but not completed is waited for up to the queue wait. Under LAND_CI=only, the PR's own CI never running or never finishing is a CiOutage. Unreadable previous device records in the ci-mode fallback refusal stop the driver (Fatal) instead of blaming the PR.
Commands: pnpm regen; pnpm run parity:devices; pnpm regen
This was referenced Oct 8, 2026
Cloud session bootstrap and DRAGON_REQUIRE_NATIVE (cloud migration items 1 and 4)
Commands: pnpm regen
Commands: pnpm regen
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.
Item 7 of the cloud migration plan, and R3 of its parity proof (docs/goals/milestone-2-proof/notes/cloud-migration.md). Stacked on #220 (LAND_REGEN=ci); #220's review fixes are merged in.
What changed
ci-only mode.
LAND_DEVICES,LAND_TESTandLAND_REGENeach acceptci-only.LAND_CI=onlysets all three, and it is the documented setting for a host other than this Mac. WithLAND_CI=onlyset, any of the three set tolocalorciis refused. All parsing is inparseLandModes(land-lib.ts), which replacesparseCiMode.CiOutage, a new subclass ofFatal, and never runs the step locally. That covers the device lanes, the full test, the regen (landRegenand a prepared position's CI regen), and a master that has no CI workflow yet.runBatcheshandles aCiOutagedifferently from other Fatal errors. It records no failed outcome, adds no label and posts no comment. It returnsoutage, andstoppedlists every PR that has no outcome, including the batch it hit, in queue order. The status readsSTOPPED BY A CI OUTAGE, names the outage, and lists those PRs as still queued.serializeFatal/parsePrepared).proveRestingMasterrethrows it, so the driver stops before any batch.LAND_DEVICES=ci, the local fallback stays, with one exception. When the previous position's Android records are from a different ABI than this host's, the driver stops instead of falling back. A local run there could only differ in architecture, so it would blame the PR.Queued vs never started (
awaitOnCi, land-devices-ci.ts). This applies to every CI wait: devices, full test and regen.LAND_CI_START, a run that exists and is waiting for runners counts as queued. That means its jobs are queued or waiting, its resolve job is still running, or the run itself is pending with no jobs yet.LAND_CI_QUEUE_WAIT(default 3 h), then counts as unavailable.LAND_CI_START, as before.waitS) now counts from its first job's start, so time spent queued before that is not taken from it.Concurrent CI regens (from #220's review).
LAND_CI_MAX_INFLIGHT(default 2) caps how many prepared positions dispatch a CI regen at once. Each regen takes several macOS jobs, and the free plan runs 5 at once. Positions above the cap are built one by one, and each dispatches its regen in turn.R3: Android ABI rebaseline. This keeps
LAND_ARCH_REBASELINEas it is: it applies to one named PR, needs a line in the PR's body, and allows any change of model. UnderLAND_DEVICES=ciorci-only, a CI device run whose model changes are all Android image ABI changes is now accepted as an architecture rebaseline. "ABI change" means the same model and device apart frombuilt for <abi>or the vectors ABI (ciArchRebaseline,archChanges).modelChanges. A change the split doesn't see is never let through.deviceRunProblemswithrebaseline. Each changed lane must keep the previous state and exactly the previous failures, so no verdict difference is accepted, not even fewer failures.!!! ARCHITECTURE REBASELINEline and recorded in the landing's device note.LAND_ARCH_REBASELINE.cithe ABI guard above stops the driver instead.Tests changed (reasons)
parseLandModes, andci-onlyis valid. The source checks follow the new code (parseLandModes(env),REGEN_ON !== 'local').outage: false.New tests:
LAND_CI, the three modes, conflicts,LAND_CI_MAX_INFLIGHT.CiUnavailablecatch and both CI-readiness checks throwCiOutagebefore any local run.LAND_CI=only.What passed
pnpm typecheckpnpm vitest runon land.test.ts, land-devices-ci.test.ts, land-parallel.test.ts, land-supervisor.test.ts, merge-train.test.ts, floor-merge.test.ts, chrome-ports.test.ts, and both registry-claims tests: 9 files, 252 tests passed.No network is used in the tests. No tolerance or check was loosened.
Not run:
pnpm regenand the fullpnpm test. Nothing here is a generator input.🤖 Generated with Claude Code