resolve.rs, `reopened_at`: #227/#272 made the editable arm a
`match writes { true => awaiting_seed, false => opened_on(state, ..) }`.
Kept that new shape and re-applied this branch's declining
`NonItem => SetStatus(non_item_refusal(..))` arm ahead of it, so a
non-item cell still reopens no editor whether or not the frame writes.
`uneditable`'s NonItem arm merged cleanly and is unchanged. Both guard
tests pass; the rival (NonItem folded into the editable arm) fails
an_advance_in_the_browser_re_opens_no_editor_on_a_non_item_cell.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
Conflicts, all in resolve.rs:
- commit_value and rename_coordinate: joed's `Step::Local(commands)`
return, plus #227's success-path `cleared(&edit_mode)` and
`advanced(.., writes)`. The waiting, `Gone` and 3h9w declines all
return (as `Step::Declined`) before any clear. That is the joed
ordering constraint.
- `STILL_WAITING` and `cleared` kept side by side.
Fault injected: a waiting decline that also clears the buffer fails
a_commit_that_waits_for_the_host_keeps_the_typed_text,
a_value_commit_before_the_host_answers_the_last_one_waits_out_loud and
a_rename_that_waits_for_the_host_keeps_the_typed_text.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
context/test-evidence/command.md: both sides inserted entries at the
same point (this branch's remove_formula_of_a_missing_formula_is_a_refusal;
gh/main's fy9o entries from #227). Both kept.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
This branch carries #282 and #286 (5m9z/7mro). The other side now
carries #227 and #272 (fy9o/p6v6). This applies the #227 x #295 recipe
(resolve-b/fy9o-with-295, 3918b126) on top of 8xq0's captured-target
commit.
- client.rs: `settle_awaited_seed()` then `settle_declined_editor()`.
One `settle_awaited_seed`, which needs both no unanswered write and a
projected cell (`projected_seed`).
- resolve.rs:
- `opened_on(state, ..)` and `seeded` from p6v6. 8xq0's
`opened_at_cursor` is kept.
- 8xq0's `written` over the captured `OpenedCell` and `still_waiting`
are kept, and fy9o's `cleared` is added. The position-based
`written` and `record_at_cursor` from the other side are dropped,
because 8xq0 replaced them.
- `commit_value` and `rename_coordinate`: `cleared` after
`ChangeMode(Normal)`, after every decline's early return (joed).
`advanced(.., writes)`.
- `reopened_at(.., writes)`: `declined_at` first, then
`awaiting_seed` after a write or on an unprojected landing, else
`opened_on(state, ..)`. One `awaiting_seed`.
- The capture still reads through `projected_at` (`cell_at_cursor`),
and `refused_here`'s 3h9w arm is kept (`state.opened.is_some()`).
- lockstep: #286's `sent` renamed `sent_to_host` (E0428). The held-cell
test delivers its held replies before it reads an awaiting editor.
- Ids for the three p6v6 fixture cells that had none.
- context/test-evidence/clients.md: both sides kept, plus the held-cell
amendment.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
context/test-evidence/clients.md: both sides appended at the same point;
both kept.
resolve.rs merged cleanly. Since improvise-3uzg (#272), an editor
reopened after a write waits for the host's seed, and only the send door
records the frame as awaiting that answer. Two tests assumed the answer
without stating it:
- the end of enter_commits_the_cell_advances_and_re_enters_editing
folded through `ClientState::fold` (a tenth host-door site). It now
folds through `fold_outgoing` and then calls `accepted()`;
- the_editor_an_advance_reopens_starts_untouched already used
`press_folded`, so it failed after the merge. It now calls `accepted()`
after Enter.
Rival: `OpenedEditor::awaiting()` built with `touched: true` fails both.
The aopa evidence entry records it.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
Conflicts:
- resolve.rs: milr's `claimed` and fy9o's `cleared` sit side by side.
Both functions kept. `rename_coordinate` keeps milr's `Opened` arms. The
waiting and `Gone` declines return before #221's success-path
`cleared` (the joed constraint).
- context/test-evidence/clients.md: both sides kept.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
Conflicts:
- client.rs accepted(): both settles, in `fold`'s order:
settle_editor (fy9o/p6v6 awaited seed), settle_opened (fdk1 capture),
then the revision bump.
- resolve.rs edit_or_drill: a Coordinate opens like a Record, through
p6v6's `opened_on(state, ..)`, which waits while a write is unanswered.
- resolve.rs rename_coordinate: fy9o unwelded `clear-buffer` from the
commit keys, so the rename clears its own buffer on the success path,
after ChangeMode(Normal). It passes `advanced(.., writes)`, where
`writes` is whether the frame composed the rename. The waiting decline
still returns before any clear (the joed constraint).
- resolve.rs reopened_at: the decline arm first (Coordinate { .. }), then
`awaiting_seed` after a write, else `opened_on(state, ..)`.
- lockstep.rs: both sides' new tests kept.
- context/test-evidence/clients.md: both sides kept.
- browser_round_trip `a_second_rename_after_a_reorder_renames_the_row_the_host_shows`:
the reopened editor is now seeded from the answered cell. The test
asserts that seed, then clears it before typing. Evidence amended.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
context/test-evidence/clients.md: both sides inserted entries at the
same point (this branch's two tile-select lockstep entries; gh/main's
fy9o/5wai entries from #227). Both kept.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
#297's rulings kept: no bash floor, no find_modern_bash probe in
checkers.sh (it runs suites under the dev shell's $BASH), and no
toolchain-policing step in the build job. This branch's CI table kept:
ci_suites, --ci, --would-run, and the --ci steps in ci.yml (build, js, kb),
which replace gh/main's hand-listed kb, --self-test and remaining-checkers
steps. The kb row already runs every suite those steps named.
check-ci-graph passes on the merged ci.yml.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
Applies the #227 x #295 resolution recipe from resolve-b/fy9o-with-295
(3918b126). The tree equals `merge-tree 3918b126 220abc61`, which
merges cleanly, because main moved past #227 only in tooling files.
- client.rs: `settle_awaited_seed()` then `settle_declined_editor()`.
One `settle_awaited_seed`, which needs both no unanswered write and a
projected cell (`projected_seed`).
- resolve.rs `reopened_at(.., writes)`: the decline arm first, then
`awaiting_seed` after a write, or when the landing is unprojected,
else `opened_on(state, ..)`. One `awaiting_seed`.
- lockstep: #286's `sent` renamed `sent_to_host` (E0428).
- Ids for the three p6v6 fixture cells that had none.
- `a_held_cell_is_read_at_its_position_and_not_its_cache_index` delivers
its held replies before it reads an awaiting editor. Evidence amended.
- `cleared` stays on commit's success path only (the joed constraint).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
Copilot on #297: `pr-reviews` only calls `date +%s`, so the REAL_DATE
pass-through never ran. It is deleted rather than tested. The fake now refuses
any other arguments with exit 2, so a new `date` call shows up as a failure.
Rival: with pr-reviews calling `date -u +%s`, "a review arriving on the third
poll is seen" and "--wait keeps polling until its deadline" fail (23/25).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
Two ChatGPT Codex findings on the #250 stack.
- #250, P2 (improvise-e265): a FrameGroup.level from the wire sized the
open-run stack in AxisFrame::groups, so a huge level drove a huge
allocation. AxisFrame now deserializes through UncheckedAxisFrame and
refuses any group or GroupEnd level not below cats.len(), naming it.
context/code/protocol.md §3b.
- #273, P3 (improvise-0r01): the lazy open_runs still cloned a stack per
skipped row under .nth(idx). walk_open_runs lends one stack to a visitor
that can stop the walk, so a lookup copies nothing for earlier rows.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
This follows the user's rulings: CI should not care which bash or which
standard utilities it runs, and jobs take what the ci dev shell provides.
- checkers.sh: remove find_modern_bash, the 5.1 floor (improvise-fd0j) and
exit 3. Suites run under $BASH with PATH unchanged.
- checkers-test.sh: remove sections 2, 5 and 5b (the fake bashes and utilbin).
They existed only to pin the floor.
- scripts/kb: drop the BSD `stat -f` fallback. kb needs the dev shell for tpl,
and that shell's stat is GNU.
- ci.yml: remove every `shell: bash` override, so every step runs in the dev
shell. Remove the web-toolchain version probe and the Playwright
version/browser probe. The shell's PLAYWRIGHT_BROWSERS_PATH pins the
browsers. npm ci stays because @playwright/test is not nix-provided.
- flake.nix: update the comments that promised those CI checks.
Reasoning: context/code/tooling.md section 5. Evidence:
context/test-evidence/tooling.md.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
On the NixOS runners /bin holds only sh. With no /bin/sleep, the watchdog in
bounded_reviews exits at once and wins the `wait -n`, so every --wait case
reports 124. Both tools are now resolved with `type -P` before any case stubs
PATH.
Red: with both paths pointed at /nonexistent/, the suite fails 25 of 25.
Rival: REAL_SLEEP=/nonexistent/sleep fails 25 of 25 again. The date
pass-through has no discriminating rival, because pr-reviews only calls
`date +%s`. Evidence: context/test-evidence/tooling.md.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze