Repository navigation
Retire the four-item lane ceiling from the lane tooling (owner ruling 2026-10-26) - #2543
Conversation
Owner ruling 2026-10-26: the Builder four-item lane ceiling and the start-throttle by burn are retired, and there is no WIP limit on briefing. Usage is governed only by the Steward's holds and the korus Workflow gate. lane.ps1 drops -Capacity (default 4) and the record's capacity field, and strips a capacity left on an older record on its next write. lane-level.ps1 no longer reads a lane as AT CAPACITY or SERIAL, and no item count buys the dispatcher arm silence: each lane is reported as STATED with its in-flight and free-by-work counts. New tests in tests/test_coord_lane_no_ceiling.py fail if a default cap of 4 returns. Proposed PR title: Retire the four-item lane ceiling from the lane tooling
Against the pre-change scripts the dispatcher-report test failed on its count-format check before it reached the capacity check. The control is now the lane's note, which both versions print, and the capacity assertions come next, so a returning ceiling is what turns it red. Measured: line 214, the capacity assertion, fails on origin/main's scripts; all five tests pass on this branch.
Round-one code-review fixes. Dropping the capacity key broke an older lane.ps1 run from another branch: it assigns $rec.capacity, which throws under StrictMode when the key is missing. Measured: the old writer exits 1 on a record without the key and 0 with it as null. So lane.ps1 now writes capacity as null on every write. Also: -Free and -InFlight take any non-negative count; the hook reads a lane with nothing in flight as IDLE; ROSTER DRIFT fires only on a shortfall of lanes; the builder nag says to count no empty slots; and the ruling is stated once, in lane.ps1's header.
Round-two code-review fixes. lane-level.ps1's Get-AgeMin passed the [datetime] ConvertFrom-Json returns back through [datetime]::Parse, which re-read it as local time and added the offset again, so a level stated 45 minutes ago read as hours in the future and the STALE check and the builder re-prompt never fired west of UTC. It now mirrors the fix lane.ps1 already carries at its statedUtc guard. New tests: a builder lane is asked again at 45 minutes and not at 0, and the dispatcher report never prints a negative age. Also: the hook's CANNOT SEE text again names Steward holds, and says a hold, not a count, is what stops briefing; ROSTER DRIFT goes back to firing on any count but the expected one; the UNREADABLE line names a missing count; and lane.ps1's comments say what actually throws and which lanes the hook re-prompts.
| @pytest.mark.parametrize(("minutes_ago", "nags"), [(0, False), (45, True)]) | ||
| def test_a_builder_lane_is_asked_again_once_its_level_ages( | ||
| tmp_path: Path, minutes_ago: int, nags: bool | ||
| ) -> None: | ||
| """The 0-minute case is the control: the nag below is the age's, not the record's shape's.""" | ||
| shared = tmp_path / "shared" / "mefor-coord" | ||
| (shared / "lanes").mkdir(parents=True) | ||
| builder = _git_repo(tmp_path / "builder-lane") | ||
| stamp = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(time.time() - minutes_ago * 60)) |
There was a problem hiding this comment.
If Windows uses UTC, these tests pass even with the original broken Get-AgeMin conversion. The extra local-to-UTC conversion changes nothing there, so both the 0-minute and 45-minute cases still pass. Add a controlled non-UTC case so a UTC test runner can catch this bug returning.
Prompt To Fix With AI
This is a comment left during a code review.
Path: tests/test_coord_lane_no_ceiling.py
Line: 242-250
Comment:
**UTC hides the age regression**
If Windows uses UTC, these tests pass even with the original broken `Get-AgeMin` conversion. The extra local-to-UTC conversion changes nothing there, so both the 0-minute and 45-minute cases still pass. Add a controlled non-UTC case so a UTC test runner can catch this bug returning.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
|
Merge order: the vault companion is MEFORORG/MessageFoundry-vault#2704. The installed gauge shim runs the vault hook in engine sessions, so merge the vault PR with or before this one, then update the vault primary checkout. |
|
Lander: review proof now covers engine 2543 at A Lander-dispatched
|
tests/test_coord_lane_no_ceiling.py runs scripts/coord/lane.ps1 and scripts/hooks/lane-level.ps1 as real pwsh children and imports nothing from messagefoundry, so its subject is the coordination harness. It joins tests/tooling_manifest.txt beside its sibling tests/test_coord_lane_statement.py, in that block's alphabetical order. Without it, test_every_non_engine_test_is_classified reported the file as UNCLASSIFIED and turned all three test legs red.
|
Fix for the red test legs: commit b6867fa (fast-forward on top of 0a53e43). What changed. One line in Why the manifest and not Tests run.
The review ran over the whole branch diff against
The rest: the Get-AgeMin tests cannot fail on a UTC runner; |
The current lane.ps1 writes capacity as null on every write; an older copy writes a number there on every statement, and its free count includes the empty slots under the retired ceiling. lane-level.ps1 now reads a non-null capacity as that marker, never as a cap: the dispatcher arm shows the lane as OLD-WRITER with its in-flight count and no free count, and asks for a restatement; the builder arm asks every turn, naming the lane.ps1 beside the hook. Null or absent capacity reads as before. No cap or full verdict, and the record version is unchanged. Self-test gains an old record (capacity 4, 2 free, 2 in flight) and its null-capacity control; tests/test_coord_lane_no_ceiling.py gains the same pair for the dispatcher and builder arms. Follow-up on PR 2543 (lane ceiling retired, owner ruling 2026-10-26).
… on a level Review round one on the OLD-WRITER change. The unstated-or-stale nag told the lane to run its worktree's own lane.ps1, which may be the older copy, so the two nags could alternate; both now name the lane.ps1 beside the hook. The OLD-WRITER nag fires only on a record with a stated level, since a record with none holds no free count; the unstated nag covers it. The hook header no longer dates the old meaning, and lane.ps1's comment points at the hook header instead of restating it. Follow-up on PR 2543 (lane ceiling retired, owner ruling 2026-10-26).
-Asked writes no counts, so nulling capacity there erased the marker of an older writer's statement and left its slot-inclusive free count reading as held items. A statement still writes capacity as null; -Asked keeps any value it finds and adds the key as null only when it is missing, because an older lane.ps1 assigns it and throws without it. The test that expected -Asked to null it now expects 4 kept, and a new case covers the missing key. Also from review round two: the dispatcher OLD-WRITER line no longer says the lane's own nag will ask it (that arm runs only in builder* worktrees), and the test docstring no longer calls age the migration path. Follow-up on PR 2543 (lane ceiling retired, owner ruling 2026-10-26).
|
Follow-up pushed to
Tests: self-test now 10 cases, including capacity 4 with 2 free and 2 in flight read as OLD-WRITER with no free count, and the same counts with capacity null read as STATED with 2 free. In Checks: QA: Level: xhigh, from the brief. Tag: xhigh effort -> 10 inline angles -> dedup (no verify) -> sweep -> <=15 findings (forks a0d84a56a3cb8180a round-8ff925ef58, ac538155f15e3fcb2 round-5cc1f8f1fd; ascii spelling). Round one's findings on this change are fixed in 8f47f87. Round two's are fixed in a22cf38, which is the -Asked change. a22cf38 itself had no third review round, because the cap is two. Open findings on earlier commits, listed and not fixed:
Noted from the vault Builder, not fixed here: the vault hook, which the install shim runs in engine sessions, looks up builder records by a path-only key, while the engine writes host-plus-path keys. |
|
Lander: review proof now covers head Scope: a Lander-dispatched
No finding ships a behaviour defect or weakens a control. The two copies agree on -Asked (vault 2704 Findings, all filed as rows before merge, with the rows from QA comment 6428262563:
Order stands: vault 2704 merges first, then this PR, then the vault primary is pulled. |
|
Lander: one re-run of the failed jobs on head Run 40408302361, job If the re-run goes red with the same signature, that is a finding: it would point at this PR's lane tooling rather than the runner. Rows are filed: #4411 to #4430 (vault PR 2713, merged). Order once green: vault PR 2704 merges first, then this PR. |
|
Lander: enqueuing at pinned head |
Owner rulings 2026-10-26, in session: the Builder four-item lane ceiling and the burn start-throttle are retired, and there is no WIP limit on briefing. Usage is governed by the Steward's holds and the korus Workflow gate.
scripts/coord/lane.ps1:-Capacity(default 4) is removed. Thecapacityfield is written as null rather than dropped, so an older lane.ps1 on another branch can still restate (measured: the old writer exits 1 on a record without the key, 0 with it null).-Freeand-InFlighthave no upper bound, and-Freecounts only held items.scripts/hooks/lane-level.ps1: the AT CAPACITY and SERIAL verdicts and the quiet-when-full exit are gone. A lane reports STATED or IDLE. Also fixesGet-AgeMin, which read UTC stamps as hours in the future west of UTC, so STALE and the 15-minute re-prompt never fired.tests/test_coord_lane_no_ceiling.py(new): 8 tests that fail if a default cap of 4, a count bound or the AT CAPACITY verdict returns. Their controls were measured against origin/main.Not in this PR:
agent-*subagent worktrees.$EXPECTED_LANES = 2is still hard-coded.Related: #2534 and MEFORORG/korus#246 carry the same rulings in the playbooks and cards.
Checks: ruff and ruff format on both test files; mypy tests leg on both; pytest, 355 passed across the 11 files that reference these scripts;
lane-level.ps1 -SelfTestpasses; pre-commit passed. Full suite not run.QA: code-review at level xhigh, two rounds, round-abf8f84da9 and round-fce919bd8b. Tag for both:
xhigh effort -> 10 inline angles -> dedup (no verify) -> sweep -> <=15 findings, read with korusscripts/quality/review_tag.pyfrom origin/main (exit 0). The round-two fixes are covered by tests but have not been reviewed again (repair cap).The PR appears safe to merge, with a non-blocking gap in the timezone regression test.
Fix with agent prompt
Summary
Removes the lane tooling's four-item ceiling.
Acknowledged exclusions from
wshallwshall: vault copies and the installed wrapper still use the old ceiling; a vault PR follows. The dispatcher seat match, missingagent-*reminders, and hard-coded$EXPECTED_LANES = 2are explicitly deferred.Reviews (1) · Last reviewed commit: "Read a lane level's age in UTC, and keep..." · Reviewed by Greptile