Answers 26-28: casefold is full Unicode case folding; the suffix is a
plain number; any colliding id, on import, in a session or across kinds,
gets a suffix from a gensym-style increment-only document counter.
Status stays proposed until the user's Approved.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
AGENTS.md and the wave skill: Copilot reviews again and is answered like
Codex; check baseRefName before merging a stacked PR; land a batch as one
integration PR; never resolve with --ours/--theirs, diff against both
parents; a clean merge of one test file can still fail together; CI takes
its tools from the .#ci dev shell; watch open ADR PRs; fmt-workspaces must
not be piped; Playwright serves the assembled harness/serve/.
repo-map: gotchas 1, 3, 18, 19, 38, 42, 44 and 47 brought up to gh/main
(view-named record resolution and Grids, nested group runs and remark,
the fold's spanned narrowing, uneditable/NonItem, the browser editor's
opened cell, NEEDS_THE_HOST, notify/settle_status); recounted the wire
vocabulary (28 model effects, 26 ModelCommand variants); File Inventory
line counts refreshed at c1772ca9; the median-binary ratio is degenerate.
kb.pl, through scripts/kb: 19 new facts; five stale ones replaced (the
checker's bash pin, the nix-shebang premise, the Copilot lapse, the
dev-shell environment, the fmt pipe).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
Every write the merged PRs added now names a view, chosen deliberately:
- The keyboard commit names OpenedCell::view, captured when the editor
opened, as EditTarget does for the mouse (context/code/clients.md).
- RenameRecordCoordinate names no view. Its record must hold cells, so it
resolves in the store alone: NamedRecord::Stored, as does the rename
destination records_at_stake adds. named_records replaces cells_named as
the exhaustive list records_named is read off.
- #252/#265's non_item_refusal moves into Grids::unwritable. The strict view
lookup (a missing view is RecordGone) and the Grids memo are kept.
- Test fixtures name a view their document has: Default for host() and
host_on_a_fold(), the records view for the rename pair, and the viewing
client's own view in browser_round_trip.
Evidence files: both sides kept, every heading of both parents verified
present. Test names: the merge holds every test of both parents.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
Answers 21-25: spaces collapse to one _, a duplicate slug gets a numeric
suffix, a file has ids on everything or nothing; ids are globally unique;
virtual ids are _index/_dim/_measure and no other id starts with _; an
old file's undeclared item is declared at load; the version stays an
explicit first-line literal and a second literal marks the new format.
Q18(b) and a new Q22 remain open. Status stays proposed.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
Resolutions:
- resolve.rs: dropped #295's record_at_cursor in favour of 8xq0's
captured-cell path (commit_value / opened_at_cursor); nothing references
it any more. declined_at keeps #292's NonItem arm. #274's two new
exhaustive matches (opened_at_cursor, uncaptured) gain a NonItem arm that
answers None; refused_here already declines a commit over a NonItem cell
when nothing is captured, so uncaptured never reaches it.
- client.rs: kept main's status_seen/status_owner beside #274's
Opened/OpenedCell/OpenedTarget.
- lockstep.rs: #274 made the same sent -> sent_to_host rename #295 did;
kept this branch's sent_or_upstream (main already owns sent_to_host).
- context/test-evidence/clients.md: kept both sides. Because #274 and #295
both carry the 7mro commits, the three 7mro entries
(keys_sent_before_a_scroll_is_answered_agree_with_the_tui,
a_held_cell_is_read_at_its_position_and_not_its_cache_index,
resolve::tests::a_cursor_on_an_empty_grid_waits_for_nothing) arrived
twice. The first two copies were byte-identical; #274's copy of the third
also carries its "Amending the entry ... for #274's capture" paragraph,
so #274's copies are kept and #295's are removed. Heading union against
both parents: nothing missing.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
Resolutions:
- client.rs imports: EditorSession (main) and ModelCommand (#251).
- client.rs refused(): #251 keeps the popped frame to learn which record it
renamed; main (#279/3kfc) calls settle_sent() after the pop. Both kept, in
the order pop, settle_sent, replay, then #251's Opened::Retry.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
Resolutions:
- CellId: #221 gives Coordinate fields { record, category }; main (#292)
adds NonItem { category, item }. Every exhaustive match now names both
(render.rs, core.rs x2, project.rs, resolve.rs x3, wasm-client lib.rs and
render.rs); project.rs's basis arm keeps #221's Coordinate-carries-a-record.
- resolve.rs edit_or_drill: #221 drops the "renaming a coordinate" decline
(Coordinate opens an editor); main's NonItem decline arm is kept.
coordinate_at_cursor's None arm gains NonItem. reopened_at keeps #295's
declined_at shape; declined_at's editable arm names Coordinate { .. }.
- client.rs: kept main's status_seen/status_owner and #221's opened +
OpenedCoordinate; every settle site calls both settle_opened and
settle_status. Main's new rebase() also gets settle_opened, since it
rebuilds the view exactly as apply() does.
- view/mod.rs: re-export both GridEval (main) and record_row (#221).
- context/code/command.md and context/test-evidence/clients.md: both sides
appended independent sections; kept both.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
Resolutions against gh/main 8d870c15:
- client.rs: kept main's settle_status (1x9h) and #295's
settle_declined_editor (5m9z) side by side.
- resolve.rs reopened_at: took #295's declined_at shape and moved #292's
CellId::NonItem arm into declined_at, which reopened_at consults before
any seed choice, so a NonItem landing still re-opens nothing.
- lockstep.rs: both sides appended at EOF; kept main's tail then #295's.
Both defined sent_to_host with different semantics (main's panics on a
non-local key, #295's lets an upstream key reach a silent host), so
#295's copy is renamed sent_or_upstream with its three callers.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
Conflicts with #294 in render.rs and project.rs resolved as tested:
#250's side of every hunk (levelled GroupEnd { level }, groups()/group_of,
axis_frame's carried headers, the try_from level check), then #294's shape
(Item { tuple, .. }, FrameEntry::item(..), the DataItem { tuple, collapsed }
arm, and GroupEnd { .. } in folds). Evidence EOF appends keep both sides.
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