Lane: run the project check legs AND the preview roll, not one or the other #120
Open
iggy
wants to merge 1 commit from
agent/lane-compose-legs into agent/lane-stages
pull from: agent/lane-compose-legs
merge into: triform:agent/lane-stages
triform:main
triform:agent/zstd-project-check-runtime-20260804
triform:agent/lane-restart-continuity
triform:agent/diagnostic-retrigger-refresh-20260804
triform:agent/candidate-notfound-idempotent
triform:agent/lanetree-stale-remove-race
triform:agent/lane-stale-candidate-cleanup-20260804
triform:agent/lane-stale-candidate-cleanup-ci-retry-20260804
triform:agent/lane-cutover-integration-r3-20260804
triform:agent/lane-abandoned-verdict
triform:agent/lane-cutover-integration-r2-20260804
triform:agent/lane-point-retry
triform:agent/witness-scratch-recovery-20260804
triform:agent/lane-cutover-integration-20260804
triform:agent/project-timeout-finalization-linear3-20260804
triform:agent/diagnostic-cancel-backoff-20260803
triform:agent/project-timeout-finalization-linear2-20260804
triform:agent/project-timeout-finalization-linear-20260804
triform:agent/project-timeout-finalization-20260804
triform:agent/lane-red-files-evidence
triform:agent/lane-member-identities
triform:agent/lane-dispatch-artifact
triform:agent/lane-honesty
triform:agent/lane-stages
triform:agent/lsp-pipe-liveness-20260803
triform:agent/lane-point-reassert-20260803
triform:agent/lane-infra-backoff
triform:agent/analyzer-pathology-rollout-20260803
triform:agent/unattributed-witness-20260803
triform:agent/respawn-nonlatching-main
triform:agent/rejection-reason-refresh-20260803
triform:agent/rejection-reason-20260803
triform:agent/overlay-response-timeout-20260803
triform:agent/diagnostic-event-origin-20260803
triform:agent/http-partial-write-20260803
triform:agent/readyz-liveness
triform:agent/diagnostic-absolute-uri-20260803
triform:agent/diagnostic-final-fence-20260803
triform:agent/diagnostic-freshness-rebased-20260803
triform:agent/diagnostic-freshness-20260803
triform:agent/diagnostic-timeout-20260803
triform:agent/reuse-result-protocol-20260803
triform:agent/project-check-lifecycle-fix
triform:agent/outcome-pending-race
triform:agent/red-files-attribution
triform:agent/name-the-unattributed-diagnostic
triform:agent/ra-proper-20260731
triform:agent/build-lane
triform:agent/serve-image-tag-epoch
triform:agent/ci-no-cancel-in-progress
triform:agent/witness-serial-class
triform:agent/batch-obs
triform:agent/cgls11-reopen-cap
triform:agent/coalesce-gated-witness-by-base-rebased
triform:agent/get-status-attributed
triform:agent/ra-memory-cap
triform:agent/witness-stranded-unknown
triform:agent/witness-ra-reap-handover
triform:agent/coalesce-gated-witness-by-base
triform:agent/witness-warm-target
triform:agent/witness-serial-warm
triform:agent/coalesced-emit-gated-checks-ran
triform:agent/test-flake-hardening
triform:agent/appdrv-test-isolation
triform:agent/cgls-26-attribution-guard
triform:agent/verdict-failure-class
triform:agent/appserve-clear-stale-last-red
triform:agent/witness-watchdog-25m
triform:agent/docs-ci-log-pointer
triform:agent/appserve-enospc-selfheal
triform:agent/eager-boot-warm
triform:agent/deploy-ref-parity-fsgroup
triform:feat/serial-batch-witness
triform:agent/witness-base-sha-keying
triform:agent/instances-sighup-reload
triform:agent/eager-boot-warm-basefetch
triform:agent/serveapi-base-local-no-fetch
triform:agent/preview-restart-persistence
triform:agent/hot-trunk-no-cancel
triform:agent/preview-selfserve-integrated
triform:agent/gated-checks-ran-on-deployed
triform:agent/gated-checks-ran
triform:agent/preview-rename-public-status
triform:fix/interaction-red-unknown
triform:agent/overlay-cap-128
triform:agent/per-lane-build-slot
triform:agent/runplan-per-build-reread
triform:agent/cgls11-pool-overlay-flycheck
triform:agent/cgls12-content-macro-detection
triform:agent/manifest-run-plan-on-main
triform:agent/ci-concurrency
triform:agent/macro-witness-fix
triform:agent/appserve-build-job
triform:agent/build-to-completion
triform:agent/fix-overlay-reaches-ra
triform:agent/fix-appbuild-test-manifest-hash
triform:agent/fix-serve-ra-procmacro-skew
triform:agent/fix-otlp-v1-traces-path
triform:agent/ra-stderr-visible
triform:agent/manifest-run-plan
triform:agent/self-serve-previews
triform:agent/appserve-worktree-setup
triform:agent/appserve-dockerfile-fix
triform:agent/timer-settle-unknown-cgls9
triform:agent/verdict-freshness-cgls9
triform:agent/app-serve
triform:agent/verdict-cli
triform:agent/witness-offloop
triform:agent/bounded-git
triform:agent/readyz
triform:agent/verdict-attribution
triform:agent/otlp-queue
triform:agent/infra-258-260
triform:agent/project-checks-nonblocking
triform:agent/attribution-helper
triform:release/v0.3.0
triform:agent/batch-concurrency-validation
triform:agent/project-checks-hard
triform:agent/amem-49-exporter-timeout
triform:agent/infra-54-init-success-log
triform:agent/infra-49-blocking-client
triform:agent/infra-49-simple-exporter
triform:agent/honest-verdict-and-otel
triform:agent/overlay-project-checks
triform:agent/fsn-serve-shards
triform:agent/existing-red-report
triform:agent/checks-base-pruning
triform:agent/docs-project-check-resource-discipline
triform:agent/session-handover-2026-05-25
triform:agent/builder-template-cache-repair
triform:agent/tf-multiverse-serve-service
triform:agent/serve-auth-read-image
triform:agent/cargoless-http-read-auth
triform:agent/serve-image-bump
triform:agent/push-only-ready
triform:agent/architect
triform:agent/bench-lead-m3
triform:agent/builder-infra-msrv-doc
triform:agent/builder-infra-doc-housekeeping
triform:agent/builder-infra-roadmap-integration
triform:agent/builder-infra-docs-combined
triform:agent/docs-launch-lead-roadmap-refresh
triform:agent/docs-launch-lead-prestage
triform:agent/builder-infra-update-lock
triform:agent/docs-launch-lead-w2-docs
triform:agent/builder-infra-263-disk-full
triform:agent/dev-fixer-2c
triform:agent/dev-fixer-2b
triform:agent/bench-lead-m2-on-9429462
triform:agent/docs-launch-lead-brand-coherence
triform:agent/bench-lead-m2-approx
triform:agent/docs-launch-lead-dewasm-scope
triform:agent/dev-fixer-otel-wave1
triform:agent/dev-fixer-dewasm
triform:agent/dogfood-lead-stage1-rework
triform:agent/dev-fixer-respawn-driver-reset
triform:agent/dev-fixer-pushoverlay
triform:agent/dev-fixer-healthz
triform:agent/dogfood-lead-stage1-suite
triform:agent/bench-lead-diffharness
triform:agent/dev-fixer-serve-wire
triform:agent/builder-infra-serve-image
triform:agent/docs-launch-lead-inc2spec
triform:agent/builder-infra-serve-k8s
triform:agent/builder-infra-v020
triform:agent/docs-launch-lead-e5
triform:agent/builder-infra-198
triform:agent/dev-fixer-modelr-cio
triform:agent/builder-infra-podinfra
triform:agent/bench-lead-15bench-r
triform:agent/bench-lead-15bench
triform:agent/builder-infra-14-integ
triform:agent/builder-infra-14auth-fix
triform:agent/builder-infra-tripleguard
triform:agent/builder-infra-i2fixed
triform:agent/builder-infra-i1
triform:agent/builder-infra-reset0
triform:agent/builder-infra-capcore
triform:agent/builder-infra-12
triform:agent/builder-infra-4
triform:agent/builder-infra-incr4
triform:agent/builder-infra-incr3
triform:agent/builder-infra-182
triform:agent/builder-infra-14auth
triform:agent/docs-launch-lead-e4
triform:agent/bench-lead-modelr-13c
triform:agent/docs-launch-lead-e3
triform:agent/bench-lead-modelr-13
triform:agent/dev-fixer-modelr-c
triform:agent/docs-launch-lead-e2
triform:agent/builder-infra-comp2v2
triform:agent/builder-infra-cigatefix2
triform:agent/dev-fixer-modelr-b
triform:agent/bench-lead-modelr
triform:agent/builder-infra-cigatefix
triform:agent/builder-infra-comp2
triform:agent/docs-launch-lead-modelr
triform:agent/builder-infra-modelr
triform:agent/docs-launch-lead-final
triform:agent/bench-lead
triform:agent/dev-fixer-132
triform:agent/dev-fixer-97
triform:agent/docs-launch-lead-prep
triform:agent/dev-fixer-128
triform:agent/dev-fixer-procmacro-downrank
triform:agent/dev-fixer-idle-evict
triform:agent/dev-fixer-structural-trigger
triform:agent/dev-fixer-openclosed-design
triform:agent/dev-fixer-94
triform:agent/dev-fixer-97-plan
triform:agent/docs-launch-sf
triform:agent/docs-launch-lead-d1b
triform:chore/f13a-integrate-v2
triform:agent/dev-fixer-f13a
triform:chore/cwdl-71-phase-d
triform:chore/buildid-integrate-v2
triform:agent/dev-fixer-f13b
triform:agent/buildid
triform:agent/ra-config
triform:agent/d-a2-design
triform:agent/docs-launch-lead-d1
triform:agent/docs-launch-lead
triform:agent/dev-fixer-5
triform:agent/dev-fixer-4
triform:agent/dev-fixer-3
triform:chore/launch-readiness-docs
triform:agent/dev-fixer-2
triform:agent/f8-integrate
triform:agent/integration-default
triform:agent/dev-fixer-f8
triform:agent/dev-fixer
triform:agent/builder-infra
triform:agent/v0-feature-complete
triform:agent/daemon-core-21
triform:agent/v0-final-converge2
triform:agent/ra-bench-wt
triform:agent/cli-ux-v0
triform:agent/v0-final-converge
triform:agent/build-cas-publisher
triform:agent/docs-v0
triform:agent/v0-core-converge
triform:agent/gate-locked
triform:agent/main-stabilize
triform:agent/cli-ux-wire
triform:agent/devserver-bundle
triform:agent/daemon-core-sup
triform:agent/integration-converge
triform:agent/build-cas-bundle
triform:agent/daemon-core-wt
triform:agent/build-cas
triform:agent/devserver
triform:agent/cli-ux
triform:integ/dc-ac6
triform:integ/ra-bench
triform:integ/daemon-core
triform:agent/ra-bench
triform:agent/proto-contracts
triform:agent/daemon-core
No reviewers
Labels
Clear labels
No items
No labels
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
triform/cargoless!120
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "agent/lane-compose-legs"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
LegPlanwas a single exclusive value, andprofilewas consumed only in theInProcessarm. The live lane setsCARGOLESS_LANE_PREVIEW_SLOT=lane, so it took thePreviewarm andProfileLegRunnernever ran.Six
tier: lanelegs were therefore dead code in production —lane-csr,lane-lib-test,lane-vsockand siblings — each added after a real outage (a csr-cone E0382 pinned the site ~6h; the cfg(test) cone hid 5.5 weeks of unit-test rot; the vsock cone froze isolation bakes for 8 days).Confirmed against production, not only source:
/workspace/cargoless-state/lane-runs.logoncargoless-lane-shadowcontains onlyid=preview:laneleg lines — no profile leg has ever run. All 6 reds it has ever produced carrieddiagnostics=1, the syntheticpreview.redstub anchored atcargoless.checks.yaml:1:1, which nobody touches — so every red so far wasUnattributedand ejected the entire roster.The change
ComposedLegRunnerruns the profile legs, and only on green rolls the preview.LegPlan::Previewgains aprofilefield; empty keeps today's behaviour exactly.LegPlan::Composedvariant.LegPlananswers "WHERE do the legs run", and composing does not change the destination. AComposedvariant would make the enum answer two questions and need every pair spelled out. EveryLegPlanmatch is exhaustive with no_arm, so all three sites failed to compile until updated.LegOutcomeverbatim, so the cargo-JSON diagnostics cannot be dropped in transit. AnErrpropagates as infra.LegReports appear, the first's prepended, soLaneDriver::record_legswrites both halves to the durable trail. Note:LaneSnapshot/GET /lanecarries phase, queue depth, in-flight ids and ejections — no legs — so the trail is today the only place per-leg evidence outlives the candidate worktree.Observability (the half that let this survive)
The boot line printed the raw
CARGOLESS_LANE_PROFILEbeside the destination, announcingprofile=lane where=preview:lanewhile running no profile leg.profile=andwhere=are now derived from the constructed plan, so advertising a profile the plan cannot use is unrepresentable;Dispatchreports none and warns loudly if one was configured.Rollout note
This changes the meaning of the deployed shape: the lane sets both env vars today, so the first candidate after the roll runs six legs that have never executed in production, cold (the lane sets no warm
CARGO_TARGET_DIR). See the commit message for the budget analysis.Tests
Six tests in
crates/cargoless-core/tests/lane_real_io.rs, each pinning one property: both-run, red-short-circuits-with-diagnostics, empty-profile-unchanged, dispatch-advertises-no-profile, infra-never-reaches-preview, artifact-from-last-runner.Logic validated against a Rust-faithful Python port before commit (no local cargo by design).
🤖 Generated with Claude Code
`LegPlan` was a single exclusive value, and `profile` was consumed only in the `InProcess` arm. The live lane sets `CARGOLESS_LANE_PREVIEW_SLOT=lane`, so it took the `Preview` arm and `ProfileLegRunner` never ran. Six `tier: lane` legs were therefore dead code in production. Each was added after a real outage, and each covers a cfg-cone nothing else compiles: lane-csr an E0382 in a #[cfg(any(csr,hydrate))] fn pinned the site ~6h while the SSR witness returned SUCCESS on every sha lane-lib-test neither `cargo check` nor `cargo build` builds the cfg(test) target — 5.5 weeks of silent portal unit-test rot lane-vsock a cfg-gated borrow error froze every isolation bake for 8 days A preview roll is genuinely stronger than a compile — it proves the tree BOOTS AND ANSWERS — but it compiles nothing itself, so a cone its own build does not exercise is simply unchecked. The two claims are complementary, so compose them instead of choosing. Design decisions, and why: * ORDERING — cheap compile legs first. Three reasons, the first load-bearing: the profile legs emit cargo JSON, so their diagnostics carry real file paths and the attribution ladder can name the member who broke it; a preview red is free text with no spans, is correctly unattributable, and therefore holds the WHOLE queue. Running the attributable check first means the lane learns whose fault it is whenever it can. Then: a preview roll is 20-45 minutes, so re-discovering a type error there is pure latency for everyone queued behind; and a red preview after a red compile cannot exonerate the compile red while still costing the slot the next candidate needs. The converse order was considered and rejected — it inverts the first reason for no gain. * PLAN SHAPE — `LegPlan::Preview` gains a `profile` field rather than adding a `LegPlan::Composed` variant. `LegPlan` answers "WHERE do the legs run", and composition does not change the destination: this is still a preview lane, still one slot, still the same landing semantics. A `Composed` variant would make the enum answer two questions at once and would need every combination spelled out (Composed{InProcess,Preview}, Composed{InProcess,Dispatch}, …) to stay honest. Empty `profile` is exactly today's behaviour, so the field reads as "and also run these legs first", which is what it means. Every `LegPlan` match is exhaustive with no `_` arm (the same discipline `transport/unix.rs` documents for verbs), so all three sites — `describe`, `profile`, `into_runner` — failed to compile until updated; there are no other matches in the tree. * DIAGNOSTICS — a first-runner red returns its `LegOutcome` VERBATIM rather than being rebuilt, so the cargo-JSON diagnostics that make it attributable cannot be dropped in transit. That is most of the value of running these legs at all. An `Err` propagates as infrastructure: rolling a preview after the legs could not even be launched would let a green preview become the only verdict on a candidate whose compile legs never ran. * LEGS — both runners' `LegReport`s appear, the first's PREPENDED, so `/lane` and the trail show what actually ran in the order it ran. Observability, the half that let this survive: the boot line printed the raw `CARGOLESS_LANE_PROFILE` beside the destination, so a preview lane announced `profile=lane where=preview:lane` while running no profile leg at all. The config was not wrong and the daemon agreed with it. `profile=` and `where=` are now both derived from the CONSTRUCTED plan, so a line that advertises a profile the plan cannot use is unrepresentable; `Dispatch` reports none and gets a loud WARNING if one was configured anyway. ROLLOUT NOTE — this changes the meaning of the DEPLOYED shape. The lane sets both `CARGOLESS_LANE_PROFILE=lane` and `CARGOLESS_LANE_PREVIEW_SLOT=lane` today, so the first candidate after the roll runs six legs that have never executed in production, on a cold per-candidate target dir (the lane sets no warm `CARGO_TARGET_DIR`). The tf-mv `lane` profile is `max_parallel: 1` under a single 90-minute profile-wide budget, and cold serial ssr+hydrate+bindgen+ csr+lib-test+vsock plausibly exceeds it — a profile-timeout reds every leg that had not started, on a healthy tree. Watch the first run and raise `timeout_ms` or warm the target dir if it bites. Tests (crates/cargoless-core/tests/lane_real_io.rs), each pinning one property: a_profile_and_a_preview_slot_both_run_… — THE GAP: with both configured, both execute, reports prepended in execution order a_profile_leg_red_short_circuits_the_preview_and_keeps_its_diagnostics — preview never rolled, and the cargo-JSON file path + span survive an_empty_profile_still_yields_a_preview_only_lane — today's config is byte-identical, including the boot line a_dispatch_plan_reports_no_profile_… — the boot line cannot advertise legs that will never run an_infra_failure_in_the_profile_legs_never_reaches_the_preview the_composed_artifact_comes_from_the_last_runner — a preview publishes nothing locally, so no stale profile-leg file can be promoted Logic validated against a Rust-faithful Python port before commit (no local cargo by design). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.