Lane: let the project define its own batch size ([lane] in tf.toml) #179
Closed
triform-admin
wants to merge 11 commits from
agent/lane-project-batch-size into main
pull from: agent/lane-project-batch-size
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-project-batch-size-v2
triform:agent/lane-conflict-pump-redproof-39016
triform:agent/lane-conflict-pump-yield-39016
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!179
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "agent/lane-project-batch-size"
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?
The build lane batched at most 10 members per cycle and nothing could change it.
LaneConfig::default()hardcodesmax_members: 10, andwith_lanealways built itsLaneStateviaLaneState::new— so the knob was documented as tunable in two docs and settable from nowhere.This was mis-diagnosed once before: 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 that happens to share a field name, which is what made the earlier search stall.What lands
A project declares its lane policy in its own
tf.toml, versioned alongside the code whose build cost it describes: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.Three things worth reviewer attention
The restart path was silently reverting.
load_active_buildcalledSelf::new(root)internally, so a lane that recovered an active generation dropped back to the built-in policy — invisible until someone counted members. It now takes the policy as a required parameter, making the revert unrepresentable. The existing recovery test already used a non-default config, so it now asserts the config survived.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. That was already latent for[fleet]/[telemetry]and escaped only becauseCmd::Serveearly-returns before that reader runs.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— the only way to confirm a recovered lane kept its policy. There's also an advisory whenmax_membersis raised against a defaultedcapture_window_ticks, because the lane only builds early once the queue reaches the cap: 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 this PR is the first build. Every touched file wasrustfmt-ed.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
Superseded by #181, which is the same change rebased onto current main.
This branch was cut from
agent/lane-restart-continuity. The lane subsystem has since landed on main by a different route, with a redesign that conflicts structurally —load_active_buildis gone (recovery now reconstructs from the trail viaclose_abandoned_generations),spawn_persistedbecamespawn_with_intergeneration_yield, andwith_lanetook its own 7th parameter. Rebasing was cleaner than resolving those in place.Closing in favour of #181.
Pull request closed