Skip to content

test(root): place the canvas pointer at a known depth inside a zone - #806

Merged
mobeenabdullah merged 12 commits into
mainfrom
test/canvas-zone-inset
Aug 14, 2026
Merged

mobeenabdullah merged 12 commits into
mainfrom
test/canvas-zone-inset

Conversation

@mobeenabdullah

Copy link
Copy Markdown
Collaborator

Unblocks the B-7 hysteresis lane. Filed as §6 of tasks/left-tasks/2026-08-14-0030-canvas-harness-dwell-follow-ups.md, deferred from #763.

Why the existing control cannot answer a margin question

The requirement permits target-switch hysteresis as an 8-12px distance margin or a >100ms dwell. #763 addressed the dwell form thoroughly — waiting, settling, declared allowances. It addressed the margin form not at all, and one place makes that concrete.

dragUntilInsideZone stops at the first 4px step that puts the pointer inside a zone. A canvas whose hysteresis is a distance margin has correctly not switched there: that position is inside its margin, and holding the previous target is exactly what the requirement asks for. So the containment comparisons reject a compliant canvas.

settledTarget cannot rescue it. Waiting does not move a pointer, and a distance-based resolver does not change its mind with time. No amount of settling turns "somewhere inside" into "far enough inside".

The B-7 lane has chosen the margin form, so this is a live dependency rather than a hypothetical one.

What this adds

dragToInsetInZone(driver, wantInsetPx, maxSteps?): Promise<ZoneInset>
// { zone, insetPx, refused?: "never-entered" | "too-narrow" }

Three phases, and the middle one is what makes the answer exact:

  1. coarse steps until a zone contains the pointer;
  2. one-pixel steps back until the zone is left, then one forward — the boundary is now bracketed to within a pixel, and its position is read from driver.pointer() rather than inferred from a step count;
  3. forward to the requested depth, re-reading containment so a zone too shallow reports that.

Three properties the consumer asked for, and each is a test:

  • The depth is MEASURED, not echoed. insetPx is what was achieved. Pointer positions and DOM geometry are fractional and a 4px scan overshoots, so the achieved depth is not always the requested one and a caller asserting on a band width has to know which it got.
  • A zone too shallow REFUSES. Returning the closest depth managed would silently measure a number the caller did not ask for — and would pass.
  • No settling. For a margin implementation there is nothing to wait for, and mixing a dwell wait in would put wall-clock dependence into the one control a width assertion rests on.

ZoneInsetDriver is declared as the capability (moveBy, zoneContainingPointer, pointer) rather than the whole CanvasDriver, matching EdgeSearchDriver and JitterDriver, so it runs against a simulated canvas as well as a real one.

Why the unit is pixels of pointer movement

Collision.value is not in consistent units — pointer distance for one collision type, overlap area for another — so a band expressed as a raw collision score means different things per candidate kind. pointer() is what makes the result assertable in the only unit a band width can honestly be stated in.

Evidence

Six tests against a simulated canvas with bands at known pixel positions, so the expected answer is arithmetic rather than a second opinion. That matters more than usual here: this control is itself the measuring device for every band assertion built on it, so it cannot be checked against another instrument.

The separating assertion is trueDepth(band, pointer().y) === insetPx — the reported depth compared against the band's real edge. Removing only the boundary bracketing (phase 2), which is exactly what dragUntilInsideZone does today, fails 3 of 6: the control then reports a self-consistent depth measured from wherever its coarse approach happened to land. Comparing the report against the request would not catch that; comparing it against the real edge does.

Also covered: the same depth from four different start offsets within one coarse step; a band too shallow refusing rather than approximating; never entering a zone reported as a refusal rather than as depth 0; a depth measured from the band entered rather than from a band crossed earlier; and depth 0 as a legitimate request, since a band assertion needs both ends.

No browser, matching settle.test.ts and dwelling-canvas.test.ts.

Not in scope

The suite still does not assert hysteresis width — §1 of the follow-up, and the reason it matters: the existing ±2px jitter probe is satisfied by a 3px margin, so it would accept an implementation the requirement forbids. The B-7 lane is writing that assertion in a file of their own, in pixels of pointer movement, mutation-checked. This is the control it needs.

dragUntilInsideZone is left in place and unchanged — its callers ask a containment question it answers correctly, and changing where it stops would change what the whole suite measures.

Test-only, so no changeset.

@mobeenabdullah

Copy link
Copy Markdown
Collaborator Author

@codex please review this PR

@coderabbitai

coderabbitai Bot commented Aug 14, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

@mobeenabdullah, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 6 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 3c554ec8-2d35-42eb-9a4b-88b5db89c087

📥 Commits

Reviewing files that changed from the base of the PR and between 60f7255 and 71b809f.

📒 Files selected for processing (4)
  • e2e/tests/canvas/driver.ts
  • e2e/tests/canvas/geometry-settle-matches-the-canvas.test.ts
  • e2e/tests/canvas/poc-driver.ts
  • e2e/tests/canvas/zone-inset.test.ts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1cd42d3aad

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread e2e/tests/canvas/driver.ts Outdated
Comment thread e2e/tests/canvas/driver.ts
Comment thread e2e/tests/canvas/driver.ts Outdated
@mobeenabdullah

Copy link
Copy Markdown
Collaborator Author

@codex please review this PR

@mobeenabdullah

Copy link
Copy Markdown
Collaborator Author

@nextly-bot review

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f0e7a4e59f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread e2e/tests/canvas/driver.ts
Comment thread e2e/tests/canvas/driver.ts Outdated
Comment thread e2e/tests/canvas/driver.ts
@pkg-pr-new

pkg-pr-new Bot commented Aug 14, 2026 •

Copy link
Copy Markdown

Open in StackBlitz

@nextlyhq/adapter-drizzle

npm i https://pkg.pr.new/@nextlyhq/adapter-drizzle@71b809f

@nextlyhq/adapter-mysql

npm i https://pkg.pr.new/@nextlyhq/adapter-mysql@71b809f

@nextlyhq/adapter-postgres

npm i https://pkg.pr.new/@nextlyhq/adapter-postgres@71b809f

@nextlyhq/adapter-sqlite

npm i https://pkg.pr.new/@nextlyhq/adapter-sqlite@71b809f

@nextlyhq/admin

npm i https://pkg.pr.new/@nextlyhq/admin@71b809f

@nextlyhq/admin-css

npm i https://pkg.pr.new/@nextlyhq/admin-css@71b809f

@nextlyhq/blocks-engine

npm i https://pkg.pr.new/@nextlyhq/blocks-engine@71b809f

@nextlyhq/blocks-react

npm i https://pkg.pr.new/@nextlyhq/blocks-react@71b809f

@nextlyhq/builder

npm i https://pkg.pr.new/@nextlyhq/builder@71b809f

create-nextly-app

npm i https://pkg.pr.new/create-nextly-app@71b809f

nextly

npm i https://pkg.pr.new/nextly@71b809f

@nextlyhq/plugin-form-builder

npm i https://pkg.pr.new/@nextlyhq/plugin-form-builder@71b809f

@nextlyhq/plugin-page-builder

npm i https://pkg.pr.new/@nextlyhq/plugin-page-builder@71b809f

@nextlyhq/plugin-sdk

npm i https://pkg.pr.new/@nextlyhq/plugin-sdk@71b809f

@nextlyhq/plugin-seo

npm i https://pkg.pr.new/@nextlyhq/plugin-seo@71b809f

@nextlyhq/storage-s3

npm i https://pkg.pr.new/@nextlyhq/storage-s3@71b809f

@nextlyhq/storage-uploadthing

npm i https://pkg.pr.new/@nextlyhq/storage-uploadthing@71b809f

@nextlyhq/storage-vercel-blob

npm i https://pkg.pr.new/@nextlyhq/storage-vercel-blob@71b809f

@nextlyhq/ui

npm i https://pkg.pr.new/@nextlyhq/ui@71b809f

commit: 71b809f

@mobeenabdullah

Copy link
Copy Markdown
Collaborator Author

@codex please review this PR

@mobeenabdullah

Copy link
Copy Markdown
Collaborator Author

@codex please review this PR

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: cbaeb23451

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread e2e/tests/canvas/driver.ts Outdated
Comment thread e2e/tests/canvas/driver.ts Outdated
Comment thread e2e/tests/canvas/driver.ts
@github-actions

github-actions Bot commented Aug 14, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @mobeenabdullah's task in 19m 21s —— View job


Review round 1 — superseded before posting

  • Read reviewer tooling and repo instructions
  • Gather diff, threads, and prior rounds (round 1; 3 Codex threads, all verified fixed at head)
  • Phase-by-phase review of cbaeb234
  • Adversarial verification of both candidate findings
  • Post review payload — refused: the branch moved

Posting failed, and this run is superseded rather than clean. The gateway re-read the PR at post time and found the head at e9dab26b, not the cbaeb234 this run was invoked for, so it refused the review — correctly: it was composed against a commit nobody is looking at any more. The push triggers its own review round against e9dab26b.

What the round had concluded, for whoever reads the next one:

  • Finding 1 (P2) — refuse() reported insetPx: 0 it did not stand at, contradicting the ZoneInset.insetPx contract on the boundary-not-found and edge-moving paths, with no test asserting insetPx there. The new push fixes exactly this: insetPx is now optional and absent on refusals, with toBeUndefined() assertions added.
  • Finding 2 (P2) — still open at e9dab26b. Nothing pins the invariant that the retreat budget is derived rather than arbitrary: a zone entered at a depth beyond maxSteps * 4 reports boundary-not-found for a boundary the caller's own budget made unreachable, and no test would fail if retreatLimit were any smaller constant. The usable depth range — what the B-7 lane needs before asserting a band — is unstated and unenforced.
  • Not anchorable, doc-only: the old dragUntilInsideZone docblock was left in place above type ZoneInsetDriver when the function moved below the new code, so its "Returns the containing zone's ordinal" clause now reads as describing the type beneath it.

@mobeenabdullah

Copy link
Copy Markdown
Collaborator Author

@codex please review this PR

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e9dab26b83

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread e2e/tests/canvas/driver.ts
@mobeenabdullah

Copy link
Copy Markdown
Collaborator Author

@codex please review this PR

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7d367d5f3b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread e2e/tests/canvas/zone-inset.test.ts Outdated
Comment thread e2e/tests/canvas/driver.ts Outdated
The refusal rewound the pointer by the last bracket's net movement, which
for a boundary travelling DOWN is positive — carrying the pointer back
above an edge it had already passed, while the result still named that
zone. The pointer is now left where the bracket put it and the zone is
read from its actual containment.

The moving-edge control no longer keys its shift to the wall clock: it
shifts on the probe's own settle wait, which is injectable for that
purpose. A pause longer than the wait made the edge move before the first
measurement, so the walk landed in the settled band and the test passed
with the re-entry logic removed.
@mobeenabdullah

Copy link
Copy Markdown
Collaborator Author

@codex please review this PR

@mobeenabdullah

Copy link
Copy Markdown
Collaborator Author

@nextly-bot review

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 87bf4f3b03

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread e2e/tests/canvas/driver.ts Outdated
Comment thread e2e/tests/canvas/driver.ts Outdated
@github-actions

github-actions Bot commented Aug 14, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @mobeenabdullah's task in 27m 35s —— View job


Review round 2 — superseded before posting

  • Phase 0 — pre-flight: PR open, head 87bf4f3b matched the invoked SHA
  • Phase 1 — load the law: AGENTS.md, ARCHITECTURE.md invariants, derived-checks/verifying-merged-work rules, review skill
  • Phase 2 — round awareness: 14 threads pulled (11 resolved and spot-verified at head, 2 open Codex P2s still present at head, 1 answered in-thread)
  • Phase 3 — task understood: dragToInsetInZone exact-depth probe + 16 unit tests
  • Phase 4 — context expansion: full driver.ts, zone-inset.test.ts, sibling suites, both dragUntilInsideZone callers, the real canvas CSS
  • Phase 5 — the hunt: every fixture hand-traced against the probe; guarantee-attack on refusals, validation, restore semantics
  • Phase 6 — adversarial verification (nothing executed — sparse checkout, no dependencies installed; all claims are traced code paths)
  • Phase 7 — compose comments
  • Phase 8 — post review — refused: the branch moved

Posting failed, and this run is superseded rather than clean. The gateway re-read the PR at post time and found the head at b09eeaba, not the 87bf4f3b this run was invoked for, so it refused the review — correctly: it was composed against a commit that is no longer the head. The push triggers its own review round against b09eeaba.

What the round had concluded, for whoever reads the next one:

  • No findings above P3 at 87bf4f3b. The PR's stated guarantees each held under attack: the reported depth is measured from a bracketed edge (traced to the exact pixel in every fixture, including the too-narrow capacity of 7 at y=27 and the settled-edge depth at y=60); every unmeasurable outcome refuses rather than approximating; the pointer ends inside the zone the result names in every outcome but never-entered. Input validation rejects 12.5 / -4 / NaN / Infinity / -1 before any move. approachZone is behavior-identical to main's dragUntilInsideZone for its two existing callers.
  • One P3, doc-only: the old dragUntilInsideZone docblock was left stranded above type ZoneInsetDriver when the function moved, so its return-contract clause now reads as describing the type beneath it; the same leftover-shape duplication exists at zone-inset.test.ts:334-341, where the abandoned wall-clock fixture's docblock sits directly above its replacement.
  • Both open Codex P2s re-verified as still present at 87bf4f3b (the 4px approach step able to step over a sub-4px zone, at driver.ts:602; the final settle() before the edge-moving return able to invalidate the containment it just read back, at driver.ts:862). Not reposted per the no-duplicate rule — if the new push addressed either, the next round will verify the fix; if not, they remain the open findings.

The wait exists to separate one bracket from the next. After the last
bracket there is no next one, so waiting gave the edge another interval
to travel and invalidated the containment that bracket had just
confirmed — the refusal then read back -1 and named no zone at all.

The control could not see it: it compared the reported zone against the
read-back, and two absent zones compare equal. It now requires a real
zone first.
A 4px approach stride could place a whole zone between two commands. A
6 CSS-pixel drop zone is 3 host pixels at the 0.5 canvas scale this
suite supports, so the walk reported a later zone, or none, and the
helper could never say the first was too narrow.

The stride is now the probe resolution and the budget is expressed in
pixels, so a caller's maxSteps reaches exactly as far as before.
@mobeenabdullah

Copy link
Copy Markdown
Collaborator Author

@codex please review this PR

The loop was explained by the drop-zone rule that currently produces a
moving edge. This driver is a vocabulary several canvases implement, so
that rule is one canvas's business and free to change; a canvas whose
zones are geometrically constant settles on the first two measurements
and pays nothing.
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 🚀

Reviewed commit: b09eeababa

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c95d756bd9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread e2e/tests/canvas/driver.ts Outdated
The probe carried its own 120ms, a second copy of a duration the canvas
owns and animates in its own stylesheet. Lengthen that transition and the
probe re-brackets while the edge is still travelling, agrees with itself
on a whole pixel, and returns a stale depth with nothing reporting it.

Declared per driver like dwellAllowanceMs. The value cannot be shared
with the CSS -- the rule is a template string compiled into the iframe,
and a zone only exists mid-drag -- so a guard parses the stylesheet and
fails if the transition outgrows it.
@mobeenabdullah

Copy link
Copy Markdown
Collaborator Author

@codex please review this PR

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 71b809f0f0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread e2e/tests/canvas/geometry-settle-matches-the-canvas.test.ts
@mobeenabdullah
mobeenabdullah merged commit 12d1363 into main Aug 14, 2026
22 checks passed
@mobeenabdullah

Copy link
Copy Markdown
Collaborator Author

@codex please review this PR

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 12d136387c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread e2e/tests/canvas/geometry-settle-matches-the-canvas.test.ts
@mobeenabdullah

Copy link
Copy Markdown
Collaborator Author

@codex please review this PR

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 12d136387c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

let boundaryY: number | null = null;
for (let attempt = 0; attempt < EDGE_SETTLE_ATTEMPTS; attempt += 1) {
const found = await bracketZoneEdge(driver, zone, retreatLimit);
if (!found) return refuse(zone, "boundary-not-found");

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Report the actual zone when re-entry exhausts its budget

When a selected edge moves downward by more than retreatLimit between settle attempts, bracketZoneEdge exhausts its forward search and restores the pointer to the previous boundary, which is now outside the zone, but this branch still returns the original positive zone. Fresh evidence after the earlier forward re-entry fix is this exhaustion path: for example, entering after 2px with maxSteps = 1 gives a 6px limit, so an 8px shift produces { zone: 5, refused: "boundary-not-found" } while containment is -1. Read back containment here or preserve a contained position; the existing boundary-failure control only exercises retreat exhaustion while the pointer remains inside.

AGENTS.md reference: AGENTS.md:L199-L216

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant