Triage log
Defects found after the build — reproduced, root-caused, and closed.
One defect, closed. The board's cells turned rectangular as tiles were placed — a CSS grid that pinned its columns but let rows size to content. It was reproduced with measurements, root-caused, fixed by making every cell square regardless of content, and guarded with a geometry assertion so it can't come back.
Board cells turn rectangular as tiles are placed
In the context of rendering the 3×3 board, facing cells that stretch to fit their mark, we observed rows losing their square shape after the first move, because the grid fixed its columns but let rows auto-size to content — accepting a board that looks broken mid-game.
- Expected
- Every cell stays square — width equals height — from the empty board to the last move.
- Actual
- Empty, each cell measures 108×108. After the first mark the three rows measure 135 / 127 / 70 px — a marked cell balloons to 108×135 while the empty row collapses to 70.
- Diagnosis
- The board set grid-template-columns:repeat(3,1fr) with aspect-ratio:1, but never sized its rows. Auto rows grow to the tallest glyph and shrink where empty; cells also lacked min-width:0, letting a glyph's intrinsic width widen its column.
Would another session reproduce this from the spec + plan? Yes. The plan named a board render but never required the board to stay square independent of content. The miss is latent in the design, not only the code — so the defect is classified at the implementation layer where it manifested, and a one-line note was added to the plan's board-render intent so the next author pins equal, content-independent tracks.
Squareness now lives on the cell, not the board: each cell derives its height from its own width, so no glyph — however tall — can distort a row.
Regression guard. The self-play harness now asserts that after every move each cell's width equals its height. Re-verified across a full game — worst delta 0 px.
Change log
One file. Renders anywhere. Degrades to readable static HTML.