Lane: let the project define its own batch size ([lane] in tf.toml) #181
Open
triform-admin
wants to merge 8 commits from
agent/lane-project-batch-size-v2 into main
pull from: agent/lane-project-batch-size-v2
merge into: triform:main
triform:main
triform:agent/fsn-held-drain
triform:agent/iggygg-owner-docfix
triform:agent/iggygg-owner-migration-20260908
triform:agent/lane-conflict-pump-redproof-39016
triform:agent/lane-conflict-pump-yield-39016
triform:agent/lane-project-batch-size
triform:agent/fix-fetch-head-race-20260825
triform:agent/witness-slo-per-lane
triform:agent/candidate-snapshot-manifest-final-20260824
triform:agent/candidate-snapshot-manifest-final-v2-20260824
triform:agent/lane-eject-trail
triform:agent/candidate-snapshot-manifest-20260824
triform:agent/appserve-enospc-finished-prune-20260824
triform:agent/appserve-enospc-finished-prune-v2
triform:agent/lane-generated-tree-resolver
triform:agent/attempt-stderr-scope-refresh-v2
triform:agent/attempt-stderr-scope-82122
triform:agent/lane-intergeneration-writer-yield
triform:agent/shared-with-file-collision-v2-20260821
triform:agent/ci-dedicated-runner-v2-20260821
triform:agent/shared-with-file-collision-20260820
triform:agent/lane-ejection-clarity-convergence
triform:agent/shared-with-unattributed-clarity
triform:agent/lane-why
triform:agent/ci-dedicated-runner-20260819
triform:agent/roster-stale-member-20260819
triform:agent/roster-stale-member-merge-refresh-20260819
triform:agent/witness-gate-closed-20260819
triform:agent/fail-closed-attempt-ra-stderr-20260816
triform:agent/fix-repeated-pending-withdrawal-20260816
triform:agent/fix-explicit-gate-off-20260816
triform:agent/fix-lane-withdraw-20260815
triform:agent/fix-conformance-false-green
triform:agent/shared-with-cause-20260811192059
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/lane-compose-legs
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!181
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "agent/lane-project-batch-size-v2"
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?
Supersedes #179, rebased onto current main. (#179 branched from
agent/lane-restart-continuity; the lane subsystem then landed on main by a different route, with a redesign that conflicts structurally — see "What the rebase dropped" below.)The build lane batches at most 10 members per cycle and nothing can change it.
LaneConfig::default()hardcodesmax_members: 10, andwith_lanebuilds itsLaneStateviaLaneState::new— which iswith_config(root, LaneConfig::default()). So the knob is documented as tunable in two docs and settable from nowhere.This was mis-diagnosed once: a shell script's
TRAIN_MAX_MEMBERSwas raised 10→20, found inert 8 minutes later, and reverted. That post-mortem concluded "the real limiter is inside the cargoless binary" without locating it. It islane.rs. The other visible knob,CARGOLESS_BATCH_MAX_MEMBERS(default 40), governs the check coalescer — a different subsystem sharing a field name, which is what made the earlier search stall.What lands
Five settings, layered
default < tf.toml < CARGOLESS_LANE_* env, mirroring the existingTelemetry*config family. Defaults are unchanged, so a project that sets nothing behaves exactly as before.Two things worth reviewer attention
Validation is deliberately non-uniform. Four settings refuse
0, each for a different reason —max_members = 0is not a deadlock but an unbounded loop of real release builds with an empty roster (the queue-empty early return makeslen >= 0unconditionally true, sotake = 0drains nobody while the phase still flips toBuilding). Butcapture_window_ticks = 0is the documented build-immediately mode every unit test and single-developer repo uses, and must stay legal. A tidy all-fields-positive validator would break exactly that.The CLI reader had to be fixed first (commit 1, independently valuable).
apply_tf_tomlhard-errors on any section outside[project]/[cache], so[lane]in a repo's tf.toml would makecargoless check/watch/buildfail. Already latent for[fleet]/[telemetry], escaping only becauseCmd::Serveearly-returns before that reader runs.What the rebase dropped
#179 carried a commit fixing
load_active_build, which calledSelf::new(root)internally and so silently reverted a recovered lane to built-in defaults. Main has since replaced journal-based recovery with trail reconstruction (close_abandoned_generations) and that function no longer exists, so the fix is moot — the bug it addressed cannot occur in the new model. Everything else carried over.Observability
A
build-lane-policyboot line carries every value with a_src=tag (so "the tf.toml was read" is distinguishable from "the default coincided"), plus apolicyblock onGET /lane. There's also an advisory whenmax_membersis raised against a defaultedcapture_window_ticks: the lane only builds early once the queue reaches the cap, so raising it alone does nothing on sparse arrivals — and concluding "the knob is broken" is precisely how the last investigation went.Verification
Not compiled locally —
cargois hook-blocked per CLAUDE.md, so CI is the first build. Every touched file passesrustfmt --check. The predecessor #179 went fully green (build/test/clippy/fmt/lane-mutation) on the same code against its own base, including one round where CI correctly caught a bad test of mine.crates/cargoless-core/tests/lane_settings.rsis the load-bearing test: it writesmax_members = 3to a real tf.toml and asserts three members ride the build and two wait. If any seam regresses toLaneConfig::default(), all five ride one build and it goes red.🤖 Generated with Claude Code
5a8a00e026253deb178dGreen and ready to merge — but the merge API is stuck; please merge from the web UI.
CI on
253deb1, all six jobs:buildtestclippyfmtlane policy mutation proofWhy it is not merged. The API reports
mergeable: falsewithmerge_basepinned ata9f970d— the tip this branch was originally cut from, now several commits stale — andPOST /mergereturns405 "Please try again later". Verified independently in a clean clone thatgit merge-tree origin/main <branch>exits 0 with zero conflicts, so the merge really is clean; Forgejo's cached mergeability just never recomputed.Attempted, in order, none of which moved
merge_base: polling, close/reopen, rebase onto current main + force-push (new head), and retrying after CI went green.Not pushing to
maindirectly — that would bypass this PR and the repo's never-push-to-main rule over what is a UI cache bug. If the web Merge button also refuses, the instance likely needs a restart orforgejo doctor; the branch itself is fine.On the rebase: pure replay. Byte-comparing the diffs before and after shows only blob hashes and line offsets differ — identical content, same 934 insertions / 21 deletions across the same 11 files. Main's three newer lane commits do not touch the seams this change depends on, and the one
LaneConfigliteral they add uses..Default::default(), so the added fields do not break it.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.