Skip to content

Travel sites: pop-ups, calendars, place boxes, click into view - #78

Merged
senamakel merged 15 commits into
tinyhumansai:mainfrom
YellowSnnowmann:fix/7000-travel-sites
Oct 9, 2026
Merged

senamakel merged 15 commits into
tinyhumansai:mainfrom
YellowSnnowmann:fix/7000-travel-sites

Conversation

@YellowSnnowmann

@YellowSnnowmann YellowSnnowmann commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Fixes for the travel-site rounds after #77 (Goibibo, OYO, MakeMyTrip, Agoda, ixigo). Each one handles a pattern any page can draw; none names a site.

This PR does not depend on tinyhumansai/agent-browser#2. The vendor/agent-browser gitlink is unchanged (ebf10fb, as on main). The click-into-view fix was first tried in agent-browser's element.rs. It is done here in tinycomputer instead.

Three commits:

  1. Bring a control sight found into the window before pressing it. A sight mark is pressed through a selector, and a selector's element that shows at all is not scrolled first. The press lands on its middle even when that point is below the window, and still reports success. Live, Amazon's "Add to cart" sat at the window's foot and every press went nowhere. INTO_VIEW_JS (surface/uncover.rs) now scrolls such an element to the window's middle before the press and leaves one in view alone.
  2. Sight reads more of what pages draw:
    • Preact click listeners (l / _listeners), e.g. OYO's place suggestions.
    • Options with their own handler inside a trigger (a sort menu).
    • Tailwind variant classes (placeholder:text-disabled) are no longer read as disabled or selected.
    • Camel-case sprite closers (icClose).
    • Calendars drawn as grids of buttons, and two-month pickers.
    • Rows scrolled out of their own list's view read as offscreen, not covered.
  3. Pop-ups, calendars and place boxes in the engine:
    • Jev's 120-element state lists what's in view first, so a pop-up at the end of a long page is seen. Knockouts trim unseen regions first.
    • Front keeps whose dialog is in front (Dialog: the page's, or the task's asking, answered, or served). A dialog at a rescue's first look is the task's only when the run before left it open, and contract 2.9 carries that across.
    • A calendar the task has picked in no longer blocks the press behind it.
    • Dates are picked from a calendar already showing.
    • Place boxes drawn as buttons ("From DEL", "To BLR") are opened one slot at a time.
    • A value with no box is picked only from what the screen shows.
    • "The cheapest" never opens a strip of bare fares.

Related issue

Part of tinyhumansai/openhuman#7000. Follows #77.

API or behavior changes

  • Contract 2.9 (minor, additive): RunFlowRequest.dialog_left_open and FlowRunResult.dialog_left_open, both optional and defaulting to false. The task controller sets the field for a rescue run itself, so a host needs no change. A host built against 2.8 still binds this module; a host built against 2.9 needs a 2.9 module.
  • Behavior: the reading and flow changes above. Pages without these patterns read as before.

Validation

  • cargo fmt --all -- --check: clean.

  • cargo clippy --all-targets --all-features -- -D warnings: clean on every crate except tinycomputer-accessibility, which this PR doesn't touch. That crate's macOS-only code (focus.rs, paste.rs, permissions.rs) fails 4 lints under local clippy 0.1.98, and fails the same way on main. CI runs on Ubuntu, where that code isn't compiled.

  • cargo build --all-targets --all-features: not run on its own. The clippy run and the test build above compile every target.

  • cargo test --all-features, run as cargo test --release --workspace --exclude tinycomputer-accessibility --all-features: every suite passes. Re-run after the new tests moved into topic files: engine 452 passed, browser 135 passed.

  • RUSTDOCFLAGS="-D warnings" cargo doc --no-deps --all-features --workspace --exclude tinycomputer-accessibility: clean.

  • Live sight tests in Chrome (TINYCOMPUTER_LIVE_BROWSER=1): 19 passed.

  • Live site runs through the loaded module (task_live), all made before the last fixes:

    Site Round Result
    OYO 9e Stopped before "Continue to Book". 1 rescue, for the check-out date (fixed after the run as O5)
    MakeMyTrip 9e Reached the sign-in wall after choosing the lowest fare. 1 rescue
    Goibibo 9d Stopped before traveller details. 3 rescues, one for picking "cheapest" from bare fares (fixed after the run as G3)
    Agoda 9d Stopped before Book. 5 rescues: the calendar crowded Jev's list and stayed in front (fixed after the run as A1/A2); result cards are still open
    ixigo 3rd run Failed by the runner's measure after 5 rescues. The enter step left To and the date to rescues. Search, 4 flights read, the cheapest picked and Book pressed all went through. It ended when the destructive guard refused a "… Pay ₹4,300 fee …" radio
    • Fixes made after a site's last run were not re-run live on that site. The simulator tests cover them.
    • After all the live runs, Front's flags were folded into one state to satisfy clippy. This doesn't change behavior.
    • The click fix moved from agent-browser into this repo after the runs. Amazon was not re-run with it in its new place. It passed with the same fix in agent-browser, and here a live sight test covers it: live_a_control_whose_middle_is_below_the_window_is_brought_into_it_and_pressed.

Tests

  • Engine simulator:
    • New flow_tests/picker_tests.rs: a closer that goes with its pop-up; a calendar picked in, closed for a press behind it; a date picked without pressing its button.
    • Additions to brief, grounding, choose, enter, suggestion, pick and do-loop tests.
    • A rescue test that the dialog is carried across only when the run before left it open.
    • New simulator quirk CalendarStaysOpen, and place boxes drawn as buttons.
  • Browser:
    • Unit test that a sight mark is brought into view before it is pressed, and a tree ref is not.
    • Live tests in new sight_tests/live_controls_tests.rs and sight_tests/live_calendar_tests.rs, plus the scrolled-list case in live_tests.rs. These need Chrome and TINYCOMPUTER_LIVE_BROWSER=1, and return early without them.
  • Bus: version pins (2.9; a 2.9 host doesn't bind a 2.8 module) and the public API pin.
  • Not measured: line coverage (llvm-cov) was not run locally because the disk is near full, so the 90% per-file rule is unverified here. INTO_VIEW_JS's scroll itself runs only in the live test.

Documentation

  • docs/crates/tinycomputer-browser/interacting.md: bringing a sight mark into view.
  • docs/crates/tinycomputer-browser/sight.md: Preact listeners and variant classes.
  • docs/technical/decision-thresholds.md: CALENDAR_DAYS.
  • docs/technical/jev-harness.md: in-view-first order of the 120 elements.
  • docs/technical/specs/desktop-module-contract.md: the 2.9 bump.
  • crates/tinycomputer-bus/src/flow/guide.md: a pop-up that may not show is closed in an if step.

Checklist

  • The change is focused on one logical change: three focused commits under one theme, the travel-site round fixes. I can split them into separate PRs if preferred.
  • No new #[allow(...)], #[ignore], or relaxed lints: there is one #[allow(clippy::struct_excessive_bools)], on RunFlowRequest. The comment beside it gives the reason: folding its four flags into an enum would rename allow_destructive, include_values and trace on the wire, which is a major bump. The same allow already sits on describe.rs and observation/types.rs.
  • No secrets, tokens, or .env contents in the diff or the description.

Known gaps, not fixed here

  • Result cards on long pages: Agoda's cards are split by grid columns, and Goibibo's results read as loose fragments.
  • Agoda's price is read as 3 characters, and its room pick lands on "Rooms".
  • ixigo: the enter step left To and the date to rescues. A radio worded as a fee ("… Pay ₹4,300 fee …") is refused as irreversible, which is an acceptable end.

A press on a sight mark goes through a selector, and a selector's element
that shows at all is not scrolled first: the press lands on its middle
whether the window shows that point or not, and reports success. Live, a
store's "Add to cart" sat at the window's foot with its middle below it,
and every press went nowhere.

Before pressing a sight mark, the surface now runs INTO_VIEW_JS: an
element whose middle lies outside the window is scrolled to the window's
middle, and one in view is left where it is. A ref of the tree is still
brought into view by agent-browser itself. The fake's check for stray
page scripts (evaluated_besides_every_press) leaves this script out, as
it does the one that keeps a press in the tab.
A click listener Preact keeps on an element (`l` once minified, or
`_listeners`, as "click" or "clickfalse") makes it a control, as a React
press handler does. Live, a hotel site's place suggestions were rows with
only such a listener, read as page text, and the place typed was never
chosen. Inside another control, an element with a press handler of its
own is a control too: a sort menu's options sat inside their
pointer-cursor trigger and read as one button naming them all.

A class behind a variant prefix (`placeholder:text-disabled`,
`disabled:opacity-50`) no longer reads as disabled or selected: a flight
site's place box carried the first and was never seen. Words run together
in camel case in an icon's class ("icClose") are read as words, so a
sign-up pop-up whose only way out was such a sprite can be closed.

A calendar drawn without a table, a grid of 28 to 49 cells numbered from
1 below the month and year it shows, is read as one, its days as dates; a
title naming two months names two grids in order. A picker showing two
months side by side is paged by the block that holds both, and a table's
header is read as shown, so a hidden month list no longer hides the month
it shows. A row scrolled out of its own list's view (a popover's airport
rows below its fold) reads offscreen rather than covered, so it is ranked
and offered rather than dropped.

Each has a live sight test against a page in Chrome, in the new
live_controls_tests.rs and live_calendar_tests.rs topics, along with one
that a control below the window's foot is brought into it and pressed.
Live runs on travel sites stalled on a few patterns any site can draw;
each is now handled by what the page shows, not by where it is.

What Jev is shown. Of the 120 elements a state holds, those in view come
first and the rest keep a quarter of the room in page order (seen_first):
a sign-up pop-up drawn at the end of a long page was cut off, and a
calendar in front crowded out the guests button it covers. A knockout
that must drop chunks drops them first from regions with nothing in view,
so the list in front and a dialog's rows are offered whole. A place box's
suggestion is a row in view and in front, never a footer link of the
same name.

Dialogs. Front keeps whose the dialog in front is (Dialog: the page's,
the task's still asking, answered, or served by a step before), in place
of separate flags. A dialog at a run's first look is the task's only when
the task's run before left its own dialog in front, which contract 2.9
carries: RunFlowRequest and FlowRunResult gain `dialog_left_open`, kept
by the task store for a rescue. A sign-up or a menu the page opened at a
rescue's first look no longer refuses every move past it. A calendar the
task opened and has pressed in since no longer blocks a press behind it,
and on a page that draws its pop-up without a dialog's role, a closer
that went with what it was pressed on is the pop-up dismissed.

Calendars and place boxes. An enter step picks each date from a
calendar already showing before it looks for a box, rather than pressing
the calendar's own button closed. A form that draws its place boxes as
buttons ("From DEL", "To BLR") has each slot's opener pressed once, one
slot at a time (enter/open.rs). A date the field's button shows
("Departure Thu, 22 Oct") counts as made. An enter value with no box is
picked only from what the screen shows, a list's option is one option
however long its label, and "to" or "from" alone names only a container
that begins with it. A pick opens only lists whose items hold something
to press, never a strip of bare fares.

RunFlowRequest's new flag sits beside three others that callers set by
name; its struct_excessive_bools allow says why folding them into one
enum is not worth a major bump.
@tinysweeper

tinysweeper Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Tiny Sweeper review

⚠️ Review failed for b301aaa23324. the review of #78 did not finish within 900s

Last completed report

Tiny Sweeper review

Tiny Sweeper reviewed this change across 6 lane(s) and found 20 active actionable finding(s). Detailed lane evidence and any incomplete work are listed below.

State: Changes requested
Priority: high
Reviewed head: eb42bbf11dde
Updated: 1791486592 (Unix time)

Review snapshot

Change surface Files Review signal Count
Production 37 Active findings 11
Tests 23 Noted findings 0
Documentation 10 Resolved findings 222
Configuration 0 Pending checks/questions 0

Completeness: Complete
Test assessment: No supported feature-to-test mapping was available; this does not mean tests are absent or passed.

What changed

The review could not produce a supported behavioral summary; inspect the cited changed surface and lane details below.

Features

None identified with supported citations.

Tests

No supported feature-to-test mapping was produced. Test execution is not inferred.

Findings

  • high · critique · Select the number for the requested field — `rank_closest` ranks by the first number in each `Record`, while `records_of` preserves every field in reading order. For a list whose cards show a price before a size, a criterion (crates/tinycomputer\-engine/src/agentic/flow/steps/list\.rs:58)
  • high · critique · Close the calendar on Escape outside the obstacle path — This state update is inside the existing obstacle-handling branch, so pressing Escape while only `CalendarStaysOpen` is active never reaches it: `sim.obstacle` is false, the calend (crates/tinycomputer\-engine/src/agentic/flow/flow\_tests/simulator\.rs:502)
  • high · critique · Require the search box to remain active before overriding modal Return — This exception is based only on the run's last action. For example, after typing in a search box and then opening a sheet or alert, the last action still matches even though the mo (docs/technical/decision\-loops\.md:275)
  • medium · critique · Select the number from the intended record field — `Record.fields` is a `BTreeMap`, so `.values()` visits fields in lexicographic key order, not in the order the record displays them or according to the field named by the criterion (crates/tinycomputer\-core/src/records/rank\.rs:198)
  • medium · critique · Parse day numbers anywhere in calendar labels — The non-table calendar path only recognizes a day when it begins the cell's text. Cells such as `Choose date 22`, `Tue 22`, or labels with an accessible prefix are skipped, so an o (crates/tinycomputer\-browser/src/surface/sight/sight\.js:217)
  • medium · critique · Require the typed search field to still be active — `typed_last` is used as the sole evidence that Return should bypass the non-window dialog guard. If a search field was typed into and a sheet or dialog then appeared before the sho (crates/tinycomputer\-engine/src/agentic/flow/act/moves\.rs:77)
  • high · security · Block clicks behind the cookie bar — This handles the bar's dismissal button, but the click-refusal path does not include `Quirk::CookieBar`. While the bar is present, clicks on underlying controls can therefore succe (crates/tinycomputer\-engine/src/agentic/flow/flow\_tests/simulator\.rs:394)
  • medium · security · Ignore fixed-position ancestors when finding a scroller — Only the element itself is checked for `position: fixed`. A fixed-position descendant nested inside a scrolling ancestor will still be assigned that ancestor as its scroller and ca (crates/tinycomputer\-browser/src/surface/sight/sight\.js:916)
  • medium · security · Recognize day numbers anywhere in calendar labels — The non-table calendar path only accepts a day number at the beginning of a cell's text. Cells labelled like `Mon 22` or `Tue, 23` are visible calendar dates but are discarded, so (crates/tinycomputer\-browser/src/surface/sight/sight\.js:217)
  • medium · security · Limit generated dates to the titled month's length — The new non-table calendar path accepts any sequential run after day 1, including days 32–42 in a six-week grid. It then stores those values as dates for the titled month, so a cal (crates/tinycomputer\-browser/src/surface/sight/sight\.js:223)
  • medium · description · Test intersection with the scroller, not only the center point — `scrolledAway` still decides from the element's center point alone. A tall row whose middle lies below the scroller's view is reported offscreen even though most of it shows (and v (\(pull request description\))

Resolved this pass

  • Apply the visibility guard to newly discovered rows
  • Match option roles case-insensitively
  • Filter out blank calendar cells before counting days
  • Ignore hidden siblings when identifying calendar headings
  • Require month evidence for the same calendar grid
  • Count dates within one displayed calendar
  • Add the declared test module files
  • Process every sibling month grid before marking their shared holder
  • Apply the visibility guard to newly discovered rows
  • Recognize accepting controls as valid closers
  • Verify the pop-up disappeared, not just its close control
  • Use intersection rather than the element center for scroll clipping
  • Match slot words throughout the opener label
  • Close the previous autocomplete when switching buttons
  • Clarify the optional member list and dialog behavior
  • Match option roles case-insensitively
  • Preserve the in-view priority in output order
  • Keep candidates that themselves name a placing-word region
  • Distinguish calendar navigation from serving its field
  • Require calendar-specific evidence before marking a screen as a calendar
  • Preserve an inherited dialog before the first look
  • Clear calendar state when the calendar leaves the front
  • Exclude fixed-position descendants from scroll clipping
  • Process only one date from each displayed calendar
  • Add the picker_tests module before declaring it
  • Preserve the look-call contract
  • Add tests for named opener selection
  • Block clicks behind the cookie bar
  • Verify the pressed control disappeared with its overlay
  • Parse the day from descriptions and non-leading date words
  • Ignore fixed-position ancestors when finding a scroller
  • Match opener roles case-insensitively
  • Keep placing-word candidates that name their own region
  • Recognize month navigation in the full target label
  • Clear the active door whenever the list closes
  • Filter out blank calendar cells before counting days
  • Use only fields present on Screen
  • Recognize day numbers anywhere in calendar labels
  • Ignore hidden siblings when identifying calendar headings
  • Clear the active door when the list closes
  • Require month evidence for the same calendar grid
  • Count dates within one displayed calendar
  • Use intersection rather than the element center
  • Test intersection with the scroller, not only the center point
  • critical — Add the declared test module files
  • high — Process every sibling month grid before marking their shared holder
  • high — Apply the visibility guard to newly discovered rows
  • high — Recognize accepting controls as valid closers
  • high — Verify the pop-up disappeared, not just its close control
  • medium — Use intersection rather than the element center for scroll clipping
  • medium — Match slot words throughout the opener label
  • medium — Close the previous autocomplete when switching buttons
  • medium — Clarify the optional member list and dialog behavior
  • medium — Match option roles case-insensitively
  • medium — Preserve the in-view priority in output order
  • medium — Keep candidates that themselves name a placing-word region
  • medium — Distinguish calendar navigation from serving its field
  • medium — Require calendar-specific evidence before marking a screen as a calendar
  • medium — Preserve an inherited dialog before the first look
  • medium — Clear calendar state when the calendar leaves the front
  • medium — Exclude fixed-position descendants from scroll clipping
  • medium — Process only one date from each displayed calendar
  • critical — Add the picker_tests module before declaring it
  • critical — Preserve the look-call contract
  • critical — Add tests for named opener selection
  • high — Block clicks behind the cookie bar
  • high — Verify the pressed control disappeared with its overlay
  • medium — Process only one date from each displayed calendar
  • medium — Parse the day from descriptions and non-leading date words
  • medium — Ignore fixed-position ancestors when finding a scroller
  • medium — Match opener roles case-insensitively
  • medium — Keep placing-word candidates that name their own region
  • medium — Recognize month navigation in the full target label
  • medium — Clear the active door whenever the list closes
  • medium — Filter out blank calendar cells before counting days
  • critical — Use only fields present on Screen
  • medium — Use intersection rather than the element center for scroll clipping
  • medium — Match slot words throughout the opener label
  • medium — Exclude fixed-position descendants from scroll clipping
  • medium — Recognize day numbers anywhere in calendar labels
  • medium — Ignore hidden siblings when identifying calendar headings
  • medium — Clear the active door when the list closes
  • medium — Require month evidence for the same calendar grid
  • medium — Count dates within one displayed calendar
  • medium — Use intersection rather than the element center
  • medium — Test intersection with the scroller, not only the center point
  • Add the declared test module files
  • Process every sibling month grid before marking their shared holder
  • Apply the visibility guard to newly discovered rows
  • Recognize accepting controls as valid closers
  • Verify the pop-up disappeared, not just its close control
  • Use intersection rather than the element center for scroll clipping
  • Match slot words throughout the opener label
  • Close the previous autocomplete when switching buttons
  • Clarify the optional member list and dialog behavior
  • Match option roles case-insensitively
  • Preserve the in-view priority in output order
  • Keep candidates that themselves name a placing-word region
  • Distinguish calendar navigation from serving its field
  • Require calendar-specific evidence before marking a screen as a calendar
  • Preserve an inherited dialog before the first look
  • Clear calendar state when the calendar leaves the front
  • Exclude fixed-position descendants from scroll clipping
  • Process only one date from each displayed calendar
  • Add the picker_tests module before declaring it
  • Preserve the look-call contract
  • Add tests for named opener selection
  • Block clicks behind the cookie bar
  • Verify the pressed control disappeared with its overlay
  • Parse the day from descriptions and non-leading date words
  • Ignore fixed-position ancestors when finding a scroller
  • Match opener roles case-insensitively
  • Keep placing-word candidates that name their own region
  • Recognize month navigation in the full target label
  • Clear the active door whenever the list closes
  • Filter out blank calendar cells before counting days
  • Require month evidence for the same calendar grid
  • Count dates within one displayed calendar
  • Use intersection rather than the element center
  • Test intersection with the scroller, not only the center point
  • Clear calendar state when the calendar leaves the front
  • Add the declared test module files
  • Process every sibling month grid before marking their shared holder
  • Apply the visibility guard to newly discovered rows
  • Recognize accepting controls as valid closers
  • Verify the pop-up disappeared, not just its close control
  • Use intersection rather than the element center for scroll clipping
  • Match slot words throughout the opener label
  • Close the previous autocomplete when switching buttons
  • Clarify the optional member list and dialog behavior
  • Match option roles case-insensitively
  • Preserve the in-view priority in output order
  • Keep candidates that themselves name a placing-word region
  • Distinguish calendar navigation from serving its field
  • Require calendar-specific evidence before marking a screen as a calendar
  • Preserve an inherited dialog before the first look
  • Clear calendar state when the calendar leaves the front
  • Exclude fixed-position descendants from scroll clipping
  • Process only one date from each displayed calendar
  • Add the picker_tests module before declaring it
  • Preserve the look-call contract
  • Add tests for named opener selection
  • Block clicks behind the cookie bar
  • Verify the pressed control disappeared with its overlay
  • Parse the day from descriptions and non-leading date words
  • Ignore fixed-position ancestors when finding a scroller
  • Match opener roles case-insensitively
  • Keep placing-word candidates that name their own region
  • Recognize month navigation in the full target label
  • Clear the active door whenever the list closes
  • Filter out blank calendar cells before counting days
  • Recognize day numbers anywhere in calendar labels
  • Clear the active door when the list closes
  • Require month evidence for the same calendar grid
  • Count dates within one displayed calendar
  • Use intersection rather than the element center
  • Test intersection with the scroller, not only the center point
  • Process every sibling month grid before marking their shared holder
  • Apply the visibility guard to newly discovered rows
  • Ignore hidden siblings when identifying calendar headings
  • Require month evidence for the same calendar grid
  • Count dates within one displayed calendar
  • critical — Preserve the look-call contract
  • critical — Use only fields present on Screen
  • medium — Preserve an inherited dialog before the first look
  • critical — Add the declared test module files
  • Block clicks behind the cookie bar
  • Verify the pressed control disappeared with its overlay
  • Clear the active door whenever the list closes
  • Clear the active door when the list closes
  • Clear calendar state when the calendar leaves the front
  • Add the declared test module files
  • Add the picker_tests module before declaring it
  • Process every sibling month grid before marking their shared holder
  • Apply the visibility guard to newly discovered rows
  • Recognize accepting controls as valid closers
  • Verify the pop-up disappeared, not just its close control
  • Verify the pressed control disappeared with its overlay
  • Close the previous autocomplete when switching buttons
  • Clear the active door when the list closes
  • Match option roles case-insensitively
  • Preserve the in-view priority in output order
  • Distinguish calendar navigation from serving its field
  • Require calendar-specific evidence before marking a screen as a calendar
  • Preserve an inherited dialog before the first look
  • Clear calendar state when the calendar leaves the front
  • Exclude fixed-position descendants from scroll clipping
  • Ignore fixed-position ancestors when finding a scroller
  • Recognize month navigation in the full target label
  • Filter out blank calendar cells before counting days
  • Require month evidence for the same calendar grid
  • Ignore hidden siblings when identifying calendar headings
  • Critical: Use only fields present on Screen
  • Preserve the look-call contract
  • Add tests for named opener selection
  • Add the declared test module files
  • Add the picker\_tests module before declaring it
  • Process every sibling month grid before marking their shared holder
  • Apply the visibility guard to newly discovered rows
  • Recognize accepting controls as valid closers
  • Verify the pop-up disappeared, not just its close control
  • Verify the pressed control disappeared with its overlay
  • Preserve the in-view priority in output order
  • Match slot words throughout the opener label
  • Close the previous autocomplete when switching buttons
  • Clarify the optional member list and dialog behavior
  • Match option roles case-insensitively
  • Preserve an inherited dialog before the first look
  • Clear calendar state when the calendar leaves the front
  • Exclude fixed-position descendants from scroll clipping
  • Preserve the look-call contract
  • Block clicks behind the cookie bar
  • Parse the day from descriptions and non-leading date words
  • Filter out blank calendar cells before counting days
  • Use only fields present on Screen
  • Recognize day numbers in descriptions (partially — descriptions are checked)
  • Ignore hidden siblings when identifying calendar headings
  • Require month evidence for the same calendar grid
  • Recognize month navigation in the full target label
  • Clear the active door whenever the list closes
  • Clear the active door when the list closes
  • Add tests for named opener selection

Before merge

  • Address Select the number for the requested field (crates/tinycomputer\-engine/src/agentic/flow/steps/list\.rs).
  • Address Close the calendar on Escape outside the obstacle path (crates/tinycomputer\-engine/src/agentic/flow/flow\_tests/simulator\.rs).
  • Address Require the search box to remain active before overriding modal Return (docs/technical/decision\-loops\.md).
  • Address Block clicks behind the cookie bar (crates/tinycomputer\-engine/src/agentic/flow/flow\_tests/simulator\.rs).
Agent review details

critique

  • Conclusion: Failure
  • Scope reviewed: all assigned evidence
  • Lane summary: Reviewed 20 files; 9 findings. (3 already reported on an earlier push) (1 earlier finding(s) still open) (1 observation(s) grouped into shared inline comments) _Code retrieval was unavailable (model: ladder embeddings returned 400 Bad Request: {"error":{"message":"unknown ladder vectors; known ladders are flash (also chat-v1, flash-v1), instant (also no-think, instant-v1), reasoning (also deepseek), max-reasoning (also max-reasoning-v1), deepseek-flash (also reasoning-v1, agentic-v1), deep (also luna), scribe, uncensored, vectors-oai3 (also embeddings-oai3-v1), vision (also vision-v1, multimodal-v1), image (also images-v1, image-v1), vi), so this review saw the diff alone._ _Memory was unavailable (model: cortex: v1/recall: error sending request for url (http://cortexdb:3141/v1/recall\)\), so this review ran without it._
  • Evidence: crates/tinycomputer\-engine/src/agentic/flow/steps/list\.rs — Select the number for the requested field
  • Evidence: crates/tinycomputer\-engine/src/agentic/flow/flow\_tests/simulator\.rs — Close the calendar on Escape outside the obstacle path
  • Evidence: docs/technical/decision\-loops\.md — Require the search box to remain active before overriding modal Return
  • Evidence: crates/tinycomputer\-core/src/records/rank\.rs — Select the number from the intended record field
  • Evidence: crates/tinycomputer\-browser/src/surface/sight/sight\.js — Parse day numbers anywhere in calendar labels
  • Evidence: crates/tinycomputer\-engine/src/agentic/flow/act/moves\.rs — Require the typed search field to still be active

security

  • Conclusion: Failure
  • Scope reviewed: all assigned evidence
  • Lane summary: Reviewed 14 files; 5 findings. 6 files were not security-reviewed: crates/tinycomputer-bus/src/flow/guide.md (prose or tabular data), docs/crates/tinycomputer-browser/sight.md (prose or tabular data), docs/crates/tinycomputer-engine/flow/step-kinds.md (prose or tabular data), docs/crates/tinycomputer-engine/flow/the-do-loop.md (prose or tabular data), docs/technical/decision-loops.md (prose or tabular data), and 1 more. (1 already reported on an earlier push) (2 earlier finding(s) still open) _Code retrieval was unavailable (model: ladder embeddings returned 400 Bad Request: {"error":{"message":"unknown ladder vectors; known ladders are flash (also chat-v1, flash-v1), instant (also no-think, instant-v1), reasoning (also deepseek), max-reasoning (also max-reasoning-v1), deepseek-flash (also reasoning-v1, agentic-v1), deep (also luna), scribe, uncensored, vectors-oai3 (also embeddings-oai3-v1), vision (also vision-v1, multimodal-v1), image (also images-v1, image-v1), vi), so this review saw the diff alone._ _Memory was unavailable (model: cortex: v1/recall: error sending request for url (http://cortexdb:3141/v1/recall\)\), so this review ran without it._
  • Evidence: crates/tinycomputer\-engine/src/agentic/flow/flow\_tests/simulator\.rs — Block clicks behind the cookie bar
  • Evidence: crates/tinycomputer\-browser/src/surface/sight/sight\.js — Ignore fixed-position ancestors when finding a scroller
  • Evidence: crates/tinycomputer\-browser/src/surface/sight/sight\.js — Recognize day numbers anywhere in calendar labels
  • Evidence: crates/tinycomputer\-browser/src/surface/sight/sight\.js — Limit generated dates to the titled month's length

tests

  • Conclusion: Success
  • Scope reviewed: all assigned evidence
  • Lane summary: This revision adds live-sight improvements (Preact listeners, variant classes, camel-case icons, off-table calendars, scrolled-away rows, repeated card controls), nearness ranking for pick, the dialog_left_open wire field, calendar/cookie handling in the flow, and the previously missing test modules — nearly all earlier findings are now addressed, including the picker_tests and live test modules, sibling month-grid processing, accepting closers with a gone-check, calendar navigation, and the Screen-field fix. The remaining findings below are the earlier ones the code still does not cover; none is newly introduced by these commits. (1 already reported on an earlier push) (17 earlier finding(s) still open) _Code retrieval was unavailable (model: ladder embeddings returned 400 Bad Request: {"error":{"message":"unknown ladder vectors; known ladders are flash (also chat-v1, flash-v1), instant (also no-think, instant-v1), reasoning (also deepseek), max-reasoning (also max-reasoning-v1), deepseek-flash (also reasoning-v1, agentic-v1), deep (also luna), scribe, uncensored, vectors-oai3 (also embeddings-oai3-v1), vision (also vision-v1, multimodal-v1), image (also images-v1, image-v1), vi), so this review saw the diff alone._ _Memory was unavailable (model: cortex: v1/recall: error sending request for url (http://cortexdb:3141/v1/recall\)\), so this review ran without it._

commits

  • Conclusion: Neutral
  • Scope reviewed: all assigned evidence
  • Lane summary: Nothing sensitive found in what this pull request commits.

description

  • Conclusion: Success
  • Scope reviewed: all assigned evidence
  • Lane summary: This revision resolves nearly all of the earlier findings: the test module files are declared, sibling month grids are processed before their shared holder is marked, newly discovered rows get the visibility guard, accepting controls are closers, the overlay's disappearance is verified, in-view priority is preserved in output order, `Front`'s dialog state carries across runs, and fixed-position elements are exempt from scroll clipping. A few earlier concerns still stand — the scroll-clip check still tests only the element's center point, a fixed ancestor can still be walked as a scroller, opener roles and calendar day labels still match narrowly, and date picking against a two-month calendar is not per-calendar. With those noted, the change looks otherwise sound. (13 earlier finding(s) still open) _Code retrieval was unavailable (model: ladder embeddings returned 400 Bad Request: {"error":{"message":"unknown ladder vectors; known ladders are flash (also chat-v1, flash-v1), instant (also no-think, instant-v1), reasoning (also deepseek), max-reasoning (also max-reasoning-v1), deepseek-flash (also reasoning-v1, agentic-v1), deep (also luna), scribe, uncensored, vectors-oai3 (also embeddings-oai3-v1), vision (also vision-v1, multimodal-v1), image (also images-v1, image-v1), vi), so this review saw the diff alone._ _Memory was unavailable (model: cortex: v1/recall: error sending request for url (http://cortexdb:3141/v1/recall\)\), so this review ran without it._
  • Evidence: \(pull request description\) — Test intersection with the scroller, not only the center point

e2e

  • Conclusion: Neutral
  • Scope reviewed: all assigned evidence
  • Lane summary: No end-to-end harness in this repository: no e2e test files and no e2e workflow.
Evidence and run details
  • Models: gpt-5.6-luna, glm-5.3-flash, gpt-6-luna
  • Spend: $0.070018
  • Tokens: 904877 input · 75127 output · 69977 cached · 0 embedding
  • Continuity: summary cache chain restarted at the storage ceiling.
Head State Pass summary
4d0464b30348 changes requested 20 active finding(s), 0 resolved finding(s) (at 1791480106)
27c4886697cf changes requested 23 active finding(s), 301 resolved finding(s) (at 1791482842)
eb42bbf11dde changes requested 11 active finding(s), 222 resolved finding(s) (at 1791486592)

tinysweeper 0.1.0

@coderabbitai

coderabbitai Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: ce102a2e-ced0-4f7e-b90e-66e79c7b014d
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@tinysweeper tinysweeper Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes: 2 lane(s) blocking, worst finding is critical.

Fix or reply to the findings below and push. The next review clears this automatically once they are gone — you should not need to dismiss anything by hand.

             $0.1267 · 2,592,786 in / 136,056 out · 251,153 cached (10%) · gpt-5.6-luna, glm-5.3-flash
critique:    $0.0736 · 1,417,865 in / 84,626 out  · 136,534 cached (10%) · gpt-5.6-luna, glm-5.3-flash
security:    $0.0514 · 957,898 in   / 42,421 out  · 110,907 cached (12%) · gpt-5.6-luna
tests:       $0.0008 · 105,325 in   / 3,155 out   · 3,648 cached (3%)    · glm-5.3-flash
description: $0.0003 · 52,850 in    / 1,980 out   · 0 cached (0%)        · glm-5.3-flash

Comment thread crates/tinycomputer-browser/src/surface/sight/sight_tests.rs
Comment thread crates/tinycomputer-browser/src/surface/sight/sight.js
Comment thread crates/tinycomputer-engine/src/agentic/flow/steps/suggestion.rs
Comment thread crates/tinycomputer-engine/src/agentic/flow/act/mod.rs Outdated
Comment thread crates/tinycomputer-engine/src/agentic/flow/act/mod.rs
Comment thread crates/tinycomputer-engine/src/agentic/flow/front.rs
Comment thread crates/tinycomputer-browser/src/surface/sight/sight.js
Comment thread crates/tinycomputer-engine/src/agentic/flow/enter/fill.rs
Comment thread crates/tinycomputer-engine/src/agentic/flow/flow_tests.rs
Comment thread crates/tinycomputer-engine/src/agentic/flow/front.rs
Front took any press in a dialog the task opened for its answer, so a
calendar whose month was turned counted as served, and a covered press
could close it before its day was picked. Pressing a control that only
turns the month ("next month", "Previous month") now leaves the calendar
asking; a day pressed in it still serves its field.

A grid of bare numbers counted as a calendar's days even with no month on
screen, so a seat map pressed in could be closed for a press behind it.
Grid cells named by a number now count only when the screen names a month
somewhere; cells that name or are described with a month count as before.

A run that ended before its first look reported no dialog left open,
dropping the one its run before had left. Front::left_open now hands that
dialog on until the run has looked.
A dismissal step on a pop-up drawn without a dialog's role ends when the
control pressed names a closer and went with what it sat on. "Accept all"
and "I agree" close a consent bar as surely as "Reject all" does, but were
not closer words, so a step accepting cookies on such a bar fell back to a
judge that cannot see which button closed it. A simulated cookie bar now
checks that accepting it ends the step.
closest kept a long option row by an exact role match, while
is_one_option, beside it, compares roles in any case. It now uses that
helper, so an "Option" row is kept like an "option" one. The in_region
rustdoc now says a placing word's region never holds a control that only
names it, which is what the code does on purpose.
The simulated ride form drops a box's unpicked text when a press lands
anywhere else, as a page does, except when the press was the other box's
"From"/"To" button: that switched boxes and kept the old list on show. It
now closes the open list first, so a flow cannot pass by picking from a
list a real page would have closed.
Sight took each grid calendar's parent as its month while still looking
for grids, so when two months' grids sat side by side in one block, the
first claimed the block and the second was skipped: none of its days read
as dates. Grids are now all found first, and a block holding two of them
is no one month; the picker pass still adds it so its arrows page both.

A row's middle outside its scrolling container reads offscreen, but a
control fixed to the window moves with no container and none clips it. A
fixed button drawn from inside a scrolling list read offscreen wherever
it showed. scrollerOf now stops at a fixed element.

Live tests in Chrome cover both, and each fails without its fix.
named_opener's rustdoc said a label holding a slot's word anywhere, while
it looks only at the first three words; it now says so and why. seen_first
said "those in view first" where it keeps them first but lists every kept
element in screen order, as jev-harness.md says. The contract spec's 2.9
note broke the sentence it sat in; it now closes the version list and
explains dialog_left_open apart.

@tinysweeper tinysweeper Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes: 2 lane(s) blocking, worst finding is critical.

Fix or reply to the findings below and push. The next review clears this automatically once they are gone — you should not need to dismiss anything by hand.

             $0.0884 · 1,577,666 in / 126,097 out · 143,701 cached (9%) · gpt-5.6-luna, glm-5.3-flash, gpt-6-luna
critique:    $0.0463 · 821,241 in   / 66,289 out  · 84,583 cached (10%) · gpt-5.6-luna, glm-5.3-flash
security:    $0.0375 · 576,708 in   / 50,132 out  · 59,118 cached (10%) · gpt-5.6-luna
tests:       $0.0005 · 57,709 in    / 2,204 out   · 0 cached (0%)       · glm-5.3-flash
description: $0.0006 · 58,271 in    / 5,089 out   · 0 cached (0%)       · glm-5.3-flash

Comment thread crates/tinycomputer-engine/src/agentic/flow/enter/open.rs
Comment thread crates/tinycomputer-engine/src/agentic/flow/flow_tests/simulator.rs
Comment thread crates/tinycomputer-engine/src/agentic/flow/act/mod.rs
Comment thread crates/tinycomputer-browser/src/surface/sight/sight.js
Comment thread crates/tinycomputer-engine/src/agentic/flow/front.rs
Comment thread crates/tinycomputer-engine/src/agentic/flow/front.rs Outdated
Comment thread crates/tinycomputer-browser/src/surface/sight/sight.js
Comment thread crates/tinycomputer-engine/src/agentic/flow/flow_tests/places.rs
Comment thread crates/tinycomputer-engine/src/agentic/flow/front.rs
Comment thread crates/tinycomputer-engine/src/agentic/flow/front.rs
A pick "closest to 9" was judged item by item, and live, with a store's
sizes 9 and 10 sold out, Jev found none of 6, 7, and 8 clearly closest,
so the step failed and every rescue went back to the sold-out 9.

tinycomputer-core gains closest_to, which reads the number a criterion
such as "closest to 9" or "nearest to size 42" names, and rank_closest,
which ranks records by the distance of the first number each shows. pick
ranks such a criterion within the list from names (asking which when
several show, as for "first", through the new named_list), and takes the
first ranked item that belongs, as for prices. Both are additive.
Return is refused while a sheet or alert shows, since there it presses
the dialog's default button. Live, a store's search opened as a
full-window sheet, and the step to press Enter in the box just typed into
was refused 154 times; a rescue had to pick a suggestion instead.

FlowRun now keeps the field its last action typed into (typed_last, kept
through waits), and Return goes through in front of a sheet when that
field is a search box: a searchbox, or a box that takes text and names
itself for searching. A simulated search that opens as a sheet checks
both that Return runs it and that Return stays refused with no search
box typed into.
A product grid repeats one "ADD" on every card, and by its name alone
every copy is the same. Live, "add the first Maggi product" pressed the
first card's ADD, on a ramen above the Maggi, and two packets of the wrong
product went into the cart.

Sight now describes a control whose role and name repeat, with no
description of its own, by the name of the card holding it when that
card is a control itself ("in Maggi Double Masala 95 g ₹20"). A live
test in Chrome checks it, and that a control no other card repeats is
left alone.

@tinysweeper tinysweeper Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes: 2 lane(s) blocking, worst finding is high.

Fix or reply to the findings below and push. The next review clears this automatically once they are gone — you should not need to dismiss anything by hand.

             $0.0700 · 904,877 in / 75,127 out · 69,977 cached (8%)  · gpt-5.6-luna, glm-5.3-flash, gpt-6-luna
critique:    $0.0266 · 420,422 in / 35,847 out · 42,663 cached (10%) · gpt-5.6-luna, glm-5.3-flash
security:    $0.0380 · 279,388 in / 26,801 out · 27,186 cached (10%) · gpt-5.6-luna
tests:       $0.0006 · 66,076 in  / 4,821 out  · 64 cached (0%)      · glm-5.3-flash
description: $0.0006 · 66,551 in  / 4,151 out  · 64 cached (0%)      · glm-5.3-flash

Comment thread crates/tinycomputer-engine/src/agentic/flow/steps/list.rs
Comment thread crates/tinycomputer-engine/src/agentic/flow/flow_tests/simulator.rs
Comment thread docs/technical/decision-loops.md
Comment thread crates/tinycomputer-core/src/records/rank.rs
Comment thread crates/tinycomputer-engine/src/agentic/flow/act/moves.rs Outdated
Comment thread crates/tinycomputer-engine/src/agentic/flow/flow_tests/simulator.rs
Comment thread crates/tinycomputer-browser/src/surface/sight/sight.js
Comment thread crates/tinycomputer-browser/src/surface/sight/sight.js
Comment thread crates/tinycomputer-browser/src/surface/sight/sight.js
From the second review of this branch:

holds_calendar read a day only as a label's first word, so cells named
whole dates ("Thu Oct 01 2026", "Choose Thursday, October 22nd, 2026")
were no calendar's days. A short label that names a month now holds its
day anywhere, with a leading zero or an ordinal ending (day_of).
turns_the_month reads the description too: a "Next" described "next
month" turns the month.

Return in front of a sheet went through on the field typed into last
even after a dialog came up over it. The field must still show,
uncovered (still_shows): a dialog over it takes the keys.

named_opener took a link or button only in lower case; any case now.
records_of numbers its fields with three digits, so their keys sort in
reading order past ten fields, as rank_closest and the price parsers
read them.
The simulated ride form hid a box behind its button again only once a
suggestion was picked: pressed elsewhere or escaped, its list closed but
its box stayed on show. drop_unpicked now closes the box with its list.
The cookie bar's doc says it covers no control, as the promo toast
does, since nothing behind it is refused.
A grid of days took its month from a sibling before it, read through
shownWords, which falls back to innerText, and a hidden element's
innerText still holds its text: a template or a month menu the page
never shows could title a grid of numbered buttons. A sibling must now
show. A live test checks that a grid titled only by hidden text is no
calendar.
@senamakel
senamakel merged commit 4e60056 into tinyhumansai:main Oct 9, 2026
5 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants