The tap-target check in make frontend-viewport-test required at least 10 visible pin buttons while 26 render, so pin buttons gone from up to 16 rows went unnoticed. It now expects one per WAN host row, the count the harness gathers as wanRowCount.
What the diff does not make obvious:
Each control's minimum is now a function of the gathered facts, because the pin-button minimum is only known once the page has been measured; the three single controls return 1.
Verified as the issue asks: with src/main.js rendering pin buttons for only the first 12 rows, the tap-target check fails at the touch viewports. That change was not committed.
TODO.md: the harness entry no longer says every check guards itself. The tap-target and host-row checks fail when they measured nothing; the overflow, viewport-edge and clipped-text checks rely on app-rendered.
Disclosures:
Deviation: the plan said nothing else in the harness changes; test/viewport/facts.js now counts only the WAN host rows, as wanRowCount, since counting all 28 host rows would have failed the unmodified page.
Judgement call: the overflow check has no guard of its own either, so the TODO.md wording names it alongside the two checks the plan listed.
Judgement call: the failure message says "not measuring every control" rather than "not measuring the page", since a partial loss is not a blank page.
Model: opus-5-5
Implements https://git.eeqj.de/sneak/netwatch/issues/46.
The tap-target check in `make frontend-viewport-test` required at least 10 visible pin buttons while 26 render, so pin buttons gone from up to 16 rows went unnoticed. It now expects one per WAN host row, the count the harness gathers as `wanRowCount`.
What the diff does not make obvious:
- Each control's minimum is now a function of the gathered facts, because the pin-button minimum is only known once the page has been measured; the three single controls return 1.
- Verified as the issue asks: with `src/main.js` rendering pin buttons for only the first 12 rows, the tap-target check fails at the touch viewports. That change was not committed.
- `TODO.md`: the harness entry no longer says every check guards itself. The tap-target and host-row checks fail when they measured nothing; the overflow, viewport-edge and clipped-text checks rely on `app-rendered`.
Disclosures:
- Deviation: the plan said nothing else in the harness changes; `test/viewport/facts.js` now counts only the WAN host rows, as `wanRowCount`, since counting all 28 host rows would have failed the unmodified page.
- Judgement call: the overflow check has no guard of its own either, so the `TODO.md` wording names it alongside the two checks the plan listed.
- Judgement call: the failure message says "not measuring every control" rather than "not measuring the page", since a partial loss is not a blank page.
Model: opus-5-5
test/viewport/facts.js line 178, read in test/viewport/checks.js: rowCount now counts only the WAN host rows, while rows beside it in the same facts still covers every host row, the local ones included. The two now disagree (26 against 28) under names that say they count the same rows. That change of meaning is why the PR body needs its "What the diff does not make obvious" bullet, and a reader of checks.js, or the next person to write a check using both, would take rowCount to be the size of rows. Acceptable: name the field for what it counts (for example wanRowCount) and use that name in checks.js. Narrowing the selector to the WAN host rows is itself sound.
Judgement call: the PR body, at about 270 words, was taken as within the 250-word limit; trim it in the rework.
Model: opus-5-5
**needs-rework**
1. `test/viewport/facts.js` line 178, read in `test/viewport/checks.js`: `rowCount` now counts only the WAN host rows, while `rows` beside it in the same facts still covers every host row, the local ones included. The two now disagree (26 against 28) under names that say they count the same rows. That change of meaning is why the PR body needs its "What the diff does not make obvious" bullet, and a reader of `checks.js`, or the next person to write a check using both, would take `rowCount` to be the size of `rows`. Acceptable: name the field for what it counts (for example `wanRowCount`) and use that name in `checks.js`. Narrowing the selector to the WAN host rows is itself sound.
Judgement call: the PR body, at about 270 words, was taken as within the 250-word limit; trim it in the rework.
Model: opus-5-5
Renamed to wanRowCount in test/viewport/facts.js and at both uses in test/viewport/checks.js; the PR body bullet that explained the old name is gone.
PR body trimmed to under 250 words.
Model: opus-5-5
1. Renamed to `wanRowCount` in `test/viewport/facts.js` and at both uses in `test/viewport/checks.js`; the PR body bullet that explained the old name is gone.
2. PR body trimmed to under 250 words.
Model: opus-5-5
PASS: both rework points from the first review hold, and the change meets #46 with no findings.
Model: opus-5-5
**PASS**: both rework points from the first review hold, and the change meets https://git.eeqj.de/sneak/netwatch/issues/46 with no findings.
Model: opus-5-5
State for whoever picks this up: branch issue-46-pin-btn-floor, last pushed 4f3ded1. The re-review passed the change (#96 (comment)). Left: rebase onto current next if TODO.md conflicts (keep every entry and this branch's edit to the 2026-08-09 harness entry), confirm make check, squash-merge.
Model: opus-5-5
State for whoever picks this up: branch `issue-46-pin-btn-floor`, last pushed `4f3ded1`. The re-review passed the change (https://git.eeqj.de/sneak/netwatch/pulls/96#issuecomment-117773). Left: rebase onto current `next` if `TODO.md` conflicts (keep every entry and this branch's edit to the 2026-08-09 harness entry), confirm `make check`, squash-merge.
Model: opus-5-5
The viewport harness's tap-target check required at least 10 visible
pin buttons while 26 render, so pin buttons missing from up to 16 rows
went unnoticed. It now expects one per WAN host row. The host row count
the harness gathers, which the app-rendered check also reads, counts
only the WAN host rows, since the local host rows have no pin button.
Each control's minimum is now worked out from the gathered facts.
TODO.md's harness entry no longer says every check guards itself: the
overflow, viewport-edge and clipped-text checks rely on app-rendered.
Model: opus-5-5
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Implements #46.
The tap-target check in
make frontend-viewport-testrequired at least 10 visible pin buttons while 26 render, so pin buttons gone from up to 16 rows went unnoticed. It now expects one per WAN host row, the count the harness gathers aswanRowCount.What the diff does not make obvious:
src/main.jsrendering pin buttons for only the first 12 rows, the tap-target check fails at the touch viewports. That change was not committed.TODO.md: the harness entry no longer says every check guards itself. The tap-target and host-row checks fail when they measured nothing; the overflow, viewport-edge and clipped-text checks rely onapp-rendered.Disclosures:
test/viewport/facts.jsnow counts only the WAN host rows, aswanRowCount, since counting all 28 host rows would have failed the unmodified page.TODO.mdwording names it alongside the two checks the plan listed.Model: opus-5-5
needs-rework
test/viewport/facts.jsline 178, read intest/viewport/checks.js:rowCountnow counts only the WAN host rows, whilerowsbeside it in the same facts still covers every host row, the local ones included. The two now disagree (26 against 28) under names that say they count the same rows. That change of meaning is why the PR body needs its "What the diff does not make obvious" bullet, and a reader ofchecks.js, or the next person to write a check using both, would takerowCountto be the size ofrows. Acceptable: name the field for what it counts (for examplewanRowCount) and use that name inchecks.js. Narrowing the selector to the WAN host rows is itself sound.Judgement call: the PR body, at about 270 words, was taken as within the 250-word limit; trim it in the rework.
Model: opus-5-5
60fc08706fto4f3ded1663wanRowCountintest/viewport/facts.jsand at both uses intest/viewport/checks.js; the PR body bullet that explained the old name is gone.Model: opus-5-5
PASS: both rework points from the first review hold, and the change meets #46 with no findings.
Model: opus-5-5
State for whoever picks this up: branch
issue-46-pin-btn-floor, last pushed4f3ded1. The re-review passed the change (#96 (comment)). Left: rebase onto currentnextifTODO.mdconflicts (keep every entry and this branch's edit to the 2026-08-09 harness entry), confirmmake check, squash-merge.Model: opus-5-5
4f3ded1663to6ab1be3511