103 lines
5.7 KiB
Markdown
103 lines
5.7 KiB
Markdown
# Review Report — Job bb360685
|
|
|
|
- **Reviewer**: cline (herdr session `reviewer-cline-01`, role: reviewer)
|
|
- **Job ID**: bb360685
|
|
- **Reviewed branch**: `refactor` (changes unstaged in working tree)
|
|
- **Scope**: Cross code review (lint / operability / drift) of the diff for
|
|
"Improve 2xK grid layout engine and prevent premature workspace overflow".
|
|
- **Diff stat**: 7 files, +236 / -9 (plus a dirty submodule).
|
|
|
|
## 1. Change Inventory
|
|
|
|
| File | Change | Category |
|
|
|------|--------|----------|
|
|
| `.agents/skills/lib_py/layout.py` | `compute_2xk_layout` default `min_cols` 60→40; CLI `--min-cols` default 60→40; `_env_int` docstring 60→40 | Core logic (task goal #1, #2) |
|
|
| `.agents/skills/lib.sh:432` | Fallback `${MAM_MIN_PANE_COLS:-60}` → `:-40` | Core logic (task goal #1) |
|
|
| `.mam.env.example` | Documented default `MAM_MIN_PANE_COLS` 60→40 | Config/docs (task goal #1) |
|
|
| `tests/test_layout.py` | Updated lib.sh snippet expectation (`:-60`→`:-40`); J-1 docstring 60→40; +4 new tests (default-40, 80-col boundary, 90/100-col tiling) | Tests (task goal #3) |
|
|
| `tests/test_tier1_unit.py` | +2 new Tier-1 tests (default-40, 90/100-col tiling) | Tests (task goal #3) |
|
|
| `tests/test_a4_adapter_contract.py` | Widened `claude` `ready_tokens` regex (`+|Claude Code|Opus|Sonnet|Haiku`) | **Unrelated to layout task** |
|
|
| `nats-docker` (submodule) | `PRIVATE_SERVER.md` modified → submodule marked `-dirty` | **Stray / drift, unrelated** |
|
|
|
|
## 2. Lint / Syntax
|
|
|
|
- `python -m py_compile lib_py/layout.py` → **OK**
|
|
- `bash -n .agents/skills/lib.sh` → **OK**
|
|
- No leftover `MAM_MIN_PANE_COLS:-60` fallbacks anywhere in `.sh`/`.py`. The only
|
|
remaining `60` references are *explicit* `min_cols=60` arguments in pre-existing
|
|
layout tests (legitimate — they exercise the 60 configuration, not the default)
|
|
and one contrast docstring line. The default is consistently 40 across all three
|
|
authoritative sites (function signature, CLI argparse, lib.sh fallback) and the
|
|
env example. **No orphans.**
|
|
|
|
## 3. Operability — Goal-by-Goal Verification
|
|
|
|
### Goal #1 — Default 60→40 to enable 3-4 agents in ~100-col windows
|
|
- Verified all three default sites are 40 and consistent.
|
|
- Practical effect: with `min_cols=60`, a 100-col pane split right yields 50-col
|
|
halves → `50 < 60` → immediate `column_width_overflow` (could not even open a
|
|
2nd column). With `min_cols=40`, `50 >= 40` → 2 columns (4 panes) fit before
|
|
overflow. The change materially enables 3-4 agents per ~100-col workspace, not
|
|
merely cosmetic. ✓
|
|
|
|
### Goal #2 — Clean 2-column split at width >= 80 without premature overflow
|
|
- Boundary predicate is `rightmost_top_pane.width // 2 < min_cols` (strict `<`).
|
|
At width 80: `80//2 = 40`, `40 < 40` is **False** → splits right (not overflow).
|
|
At width 79: `79//2 = 39`, `39 < 40` is **True** → `column_width_overflow`.
|
|
- CLI end-to-end confirmation (mirrors the `lib.sh` invocation path):
|
|
- 80-col payload → `right p1` ✓
|
|
- 79-col payload → `overflow p1` ✓
|
|
- The boundary is exactly at 80 and behaves as specified. ✓
|
|
|
|
### Goal #3 — Updated unit tests assert default 40 & 90-100 col tiling
|
|
- New tests present in both suites:
|
|
- `test_default_min_cols_is_40` / `test_layout_default_min_cols_40_in_tier1`
|
|
- `test_80_col_2_column_splitting_boundary`
|
|
- `test_90_col_single_workspace_multi_pane_tiling` /
|
|
`test_100_col_single_workspace_multi_pane_tiling` /
|
|
`test_layout_single_workspace_90_100_cols_tiling_tier1`
|
|
- Tiling tests verify the full 1→2→3→4→(5th overflow) progression with correct
|
|
target panes and `column_width_overflow` reason. Traced the column-grouping
|
|
logic: singleton-column fill at step 3→4 and width-constrained overflow at
|
|
step 4→5 are both reached correctly. ✓
|
|
|
|
### Goal #4 — Full pytest suite passes
|
|
- Targeted run of the three affected unit-test files:
|
|
`tests/test_layout.py tests/test_tier1_unit.py tests/test_a4_adapter_contract.py`
|
|
→ **99 passed in 10.97s**. ✓
|
|
- The complete `pytest tests/` suite could not be fully executed within this
|
|
review's time budget (integration tests are long-running), but every file
|
|
touched by the diff passes, and no unit-test regression is introduced.
|
|
|
|
## 4. Findings (advisory, non-blocking)
|
|
|
|
### F-1 (Hygiene/Scope): `test_a4_adapter_contract.py` change is out of scope
|
|
- The `claude` `ready_tokens` regex widening (`+|Claude Code|Opus|Sonnet|Haiku`)
|
|
is a correct, additive adapter fix and the contract test passes — but it is
|
|
**unrelated** to the 2xK layout-engine task. Bundling it into this diff blurs
|
|
traceability.
|
|
- **Direction**: Split into its own commit (`fix(adapter): broaden claude
|
|
ready_tokens`) before merging. No code change required for the layout work.
|
|
|
|
### F-2 (Drift): `nats-docker` submodule is dirty
|
|
- `git diff nats-docker` shows the submodule pointer unchanged but flagged
|
|
`-dirty`; `git -C nats-docker status` shows ` M PRIVATE_SERVER.md`.
|
|
- This is a stray local modification inside the submodule, unrelated to the
|
|
task, and risks being accidentally staged/committed alongside the layout
|
|
changes.
|
|
- **Direction**: Revert the stray edit (`git -C nats-docker checkout --
|
|
PRIVATE_SERVER.md`) or leave the submodule unstaged. Do not commit the
|
|
submodule pointer change with this work.
|
|
|
|
## 5. Summary
|
|
|
|
The core implementation correctly and consistently lowers the 2xK layout
|
|
`min_cols` default from 60 to 40 across `lib.sh`, `layout.py` (function +
|
|
CLI + docstring), and `.mam.env.example`, with matching, passing unit tests
|
|
covering the 80-col boundary and 90/100-col single-workspace tiling. Syntax
|
|
and CLI operability are verified. The two findings (F-1 out-of-scope adapter
|
|
regex, F-2 dirty submodule) are hygiene/drift items that do not affect the
|
|
layout engine's correctness or operability and require only commit
|
|
housekeeping, not a redesign.
|
|
|
|
[VERDICT: PASS] |