Skip to content

Fix what a review of the seven reading features found - #14

Merged
RutaTang merged 8 commits into
mainfrom
claude/relaxed-cori-bw7sku
Oct 7, 2026
Merged

RutaTang merged 8 commits into
mainfrom
claude/relaxed-cori-bw7sku

Conversation

@RutaTang

@RutaTang RutaTang commented Oct 7, 2026 •

Copy link
Copy Markdown
Owner

A review of the seven reading features (shipped in 0.1.15) found 19 problems, and the Ask changes tool only knew main or master as a base branch. All of it is fixed here, each fix with a test, and a third Xvfb pass checked the fixes that can be clicked through.

This PR also brings in master, which had two commits not on main (protocol v16, and fixes to state sync, search races, code analysis and value tracing). See Merged from master below.

Merged from master

master's two commits (da40436, abdb6e0) come in through a merge commit. Three files conflicted:

  • src/editor/flow.rs: both sides fixed how a call's arguments and a signature's parameters are split. master's version is kept because it covers more: raw strings, block comments, Rust turbofish, and C/C++ declarators read by parse. This branch's string mask and angle-bracket helpers were dropped. This branch's regression tests stay and pass against master's code, after one fix on top: a < before a space, = or < is a comparison or shift, not an angle bracket (a Python default limit=n < 3 had left the list unclosed).
  • src/session/cache.rs: both sides moved the index cache to version 12 for different changes. 12 keeps master's meaning, and the stricter entry points move to 13, so an index built by either side is rebuilt.
  • src/app/tests.rs: both sides appended tests at the end of the file. Both sets are kept.

Ask changes tool

  • New files: it only ran git diff HEAD, which never lists a file git does not track. With a new file not added yet, it said there was nothing to review. Untracked files that are not ignored now count as uncommitted work. They are listed with the status ? and shown whole as added.
  • Lists crowding out the diff: the commit and file lists had no cap, so on a large branch they filled the result and the diff after them was cut away. Both lists are now capped in bytes with the rest counted, and the diff gets whatever room is left.
  • Base branch: it was only ever main or master. It is now whichever of the remote's default branch (origin/HEAD), main, master and develop the current branch is closest to, so a branch of develop is reviewed against develop.

Entry points

  • Go: any function whose first three lines named *http.Request or http.ResponseWriter counted as a route, so did helpers that take a request, and so did a one-line function placed before a handler. A route must now have a real handler signature, read up to the function's own {: net/http's writer and request, or a lone gin, echo or fiber context with the return type such a handler has.
  • Java: Room's and Spring Data's @Query, @Update and @Delete counted as routes. A bare HTTP verb is now a route only as JAX-RS writes it (@GET) or in a Micronaut file, and @Query/@Update never are, in Java or in Python.
  • Rust: an attribute wrapped over several lines (as rustfmt wraps long route attributes) ended the scan at its )] line. It is now read whole.
  • Same-named functions: two functions with the same name in one file could be an entry point to one lookup and not to the other. Both lookups now check every symbol of that name.
  • Index cache version 13 (12 after master's change), because the cache stores each function's entry kind. Files are classified again on the next open.

Value trace

  • Lost parameters: a parameter list containing an arrow type (() => void, impl Fn(u8) -> u8) or a generic bound with parentheses lost every parameter after it.
  • Wrong parameter: a comma inside a string literal counted as an argument separator, so following a value led into the wrong parameter. (Both of these are now handled by master's implementation, which this branch's tests cover.)
  • Wrong call names: (await f()) and (new F()) named their call t() or w().
  • Truncation note: "first 400 shown" counted only references. It now counts definitions too.
  • Remote projects: a row from a file the project never read now moves with its file's edits, instead of being marked changed.
  • Shortcut: "Trace value at cursor" is now a keyboard action, ⌘⇧V by default.

Type map, tutorial, glossary, debug-run walkthrough

  • Type map: the structure index records a Rust type's trait impls by bare name only, so every type of that name received all of them. A Rust type whose name is shared now takes no trait impls from that index. Telling them apart exactly would need each impl's file in the protocol (another protocol bump), which this PR does not do.
  • Tutorial: the Type Map icon now has its own step, and Settings points at its own icon again. The SEARCH step no longer leaves the search box holding the → and Enter keys that move the tour.
  • Glossary: clicking a folder term shows the folder's explanation instead of trying to open the folder as a file, and its location reads path/. A module term's hover now appears only on lines that import the module, not on a local variable with the same name.
  • Debug-run walkthrough: a stop outside the project now ends the current visit, so returning to a function adds another step.

Doc comments

New items had been inserted between existing doc comments and the items they describe, so rustdoc showed one item's docs on another (12 places). Each comment is back above its own item.

Checks run locally (on the merged head)

  • cargo fmt --check, strict clippy on the backend crates, and rustdoc with warnings denied are all clean.
  • Workspace clippy on Linux shows only the three known Linux-only dead-code warnings.
  • Backend tests (server, core, protocol): 849 pass, none fail.
  • GUI tests: 1,061 pass. The 12 that fail are the same ones already known to fail only on Linux.
  • Before the merge, an Xvfb pass on a small Python project (with added Go, Java and Rust files): the tutorial steps through by keyboard, the entry points and type map show the corrected results, the value trace follows the right parameter, changes lists the new files, and the module hover appears on import config but not on a local config.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WRJ4sDknvQJ86tFvGydgpf

RutaTang and others added 8 commits October 4, 2026 02:30
Preserve custom embedding settings without a key and resolve Rust raw
identifiers consistently. Keep member calls named after builtins, resolve
Rust child-module directories correctly, and scope inline imports by their
syntax-tree declaration while retaining one parse per indexed file.

Correct FLOW source/LSP column conversions, ignore quoted punctuation when
following arguments, and skip generic function bounds before parameters.
Build Docs from exact declaration ranges and AST access labels, and retain
the selected item when multiple declarations share a line. Invalidate older
index snapshots so cached analysis receives the fixes.

Validation: 1897 workspace tests passed, 19 ignored; workspace/all-target
Clippy with -D warnings, formatting, and toolchain checks passed.
Preserve remote reading preferences with journaled TOML key edits and protocol v16. Adopt absent remote state, refresh large notebooks, and recover stopped debugger state after rejected controls.

Retire stale searches and validate semantic and Ask embedding spaces. Correct Rust and C flow parsing, cfg literals, trait inheritance, and Cargo bundle artifact selection.

Add 43 regression tests. Workspace validation: 1940 passed, 19 ignored; build, Clippy, rustdoc, and formatting checks passed.
The changes tool only asked `git diff HEAD`, which never lists a file git
does not track: with a new file not added yet, it said there was nothing
to review. Untracked files that are not ignored now count as uncommitted
work, are listed with the status `?`, and are shown whole as added.

The commit and file lists had no cap, so on a large branch they filled
the result and the diff after them was cut away. Both are now capped in
bytes with the rest counted, and the diff gets what the result cap
leaves.

The base branch was only ever main or master. It is now the nearest of
the remote's default branch (origin/HEAD), main, master and develop, so a
branch of develop is reviewed against develop. HEAD on the remote's
default branch is on the base.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WRJ4sDknvQJ86tFvGydgpf
- Go: a function was a route whenever its first three lines named
  `*http.Request` or `http.ResponseWriter`, so helpers taking a request
  counted, and a one-line function before a handler did too. A route is
  now a real handler signature, read up to the function's own `{`:
  net/http's writer and request, or a gin, echo or fiber context alone
  with the return such a handler has.
- Java: Room and Spring Data's `@Query`, `@Update` and `@Delete` were
  routes. A bare HTTP verb is a route only as JAX-RS writes it (`@GET`)
  or in a Micronaut file, and `@Query`/`@Update` never are in Java or
  Python.
- Rust: an attribute wrapped over several lines (as rustfmt wraps long
  route attributes) ended the scan at its `)]` line; it is read whole.
- Two same-named functions in one file could be an entry point to one
  lookup and not to the other; both now ask every symbol of that name.

The index cache keeps each function's entry kind, so its version moves
to 12 and files are classified again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WRJ4sDknvQJ86tFvGydgpf
New items were inserted between an existing doc comment and its item in
several places, so rustdoc showed one item's docs on another (and none
on the first). Each comment is back above its own item.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WRJ4sDknvQJ86tFvGydgpf
- Value trace: a parameter list holding an arrow type (`() => void`,
  `impl Fn(u8) -> u8`) or a generic bound with parentheses lost every
  parameter after it; a comma inside a string literal counted as an
  argument separator, so following a value went into the wrong
  parameter; and `(await f())` or `(new F())` named their call as
  "t()"/"w()". Strings are skipped (a Rust lifetime is no string),
  arrows and comparisons are no brackets, and the list is the first
  parenthesis outside angle brackets.
- Value trace: the "first 400 shown" note counted references only; it
  counts definitions too. A row a remote project never read moves with
  its file's edits instead of being marked changed. "Trace value at
  cursor" is a keyboard action now (⌘⇧V by default).
- Type map: the structure index knows a Rust type's trait impls by bare
  name, so every same-named type got all of them; such a type now draws
  none from it.
- Tutorial: the Type Map icon has its step and Settings points at its
  own icon again; and the SEARCH step no longer leaves the search box
  holding the → and Enter that step the tour.
- Glossary: a folder term shows the folder's explanation instead of
  opening the folder as a file, and is located as `path/`; a module term
  shows on hover only where a line imports it, not on any local of the
  same name.
- Debug-run walkthrough: a stop outside the project ends the visit
  before it, so coming back to a function is another step.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WRJ4sDknvQJ86tFvGydgpf
master carries two commits not on main (protocol v16, and fixes to state
sync, search, code analysis and value tracing). Three files conflicted:

- src/editor/flow.rs: both sides fixed how a call's arguments and a
  signature's parameters are split. master's version covers more (raw
  strings, block comments, Rust turbofish, C/C++ declarators by parse),
  so it is kept and this branch's string mask and angle helpers go. This
  branch's regression tests stay and pass against it.
- src/session/cache.rs: both sides moved the index cache to version 12
  for different changes. master's change keeps 12 and the stricter entry
  points move to 13, so an index built by either side is rebuilt.
- src/app/tests.rs: both sides appended tests at the end; both are kept.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WRJ4sDknvQJ86tFvGydgpf
After the merge, the parameter splitter took every `<` outside braces as
an open angle bracket. A default such as `limit=n < 3` then left one
open that no `>` closed, so the list's `)` was never found and the
parameter after it could not be followed. A `<` before a space, `=` or
`<` compares or shifts, and opens nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WRJ4sDknvQJ86tFvGydgpf
@RutaTang
RutaTang merged commit f323da9 into main Oct 7, 2026
6 checks passed
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.

2 participants