docs: record PR #227's second review round on the git Stage 1 lane
Two more P2s, both the same shape as round 1's P1 --- module-level mutable state read at continuation time instead of captured at invocation time --- plus the third instance of that shape, which is still open and which no review finding covers: the diff path has no generation counter at all, so two `d` presses in flight together are last-writer-wins on the single `*git-diff*` buffer. Also corrects a citation round 1 got wrong. The P1a block names two lines that must not be touched, and its second one (`:854`) pointed at `local unstaged = …` inside `diff_plan`, not at a display call. The site was always `show_diff_buffer`'s `pmacs.window.display`. A stale pointer in a block whose entire purpose is "leave these alone" is worse than none, so it is corrected rather than silently re-numbered. Section-local: nothing outside this lane's entry is touched or reflowed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016bqGA6s9tTUFzYpbeW3tai
This commit is contained in:
parent
842ec61f6f
commit
afe79bd7dc
|
|
@ -269,7 +269,7 @@ census.
|
||||||
|
|
||||||
**PR #227** — https://github.com/levineuwirth/pmacs/pull/227. Opened
|
**PR #227** — https://github.com/levineuwirth/pmacs/pull/227. Opened
|
||||||
2026-08-09 at `4002734`, after the framing was approved at revision 5
|
2026-08-09 at `4002734`, after the framing was approved at revision 5
|
||||||
and the full gate suite went green. **Now at `6c1631e`, MERGE-BLOCKED.**
|
and the full gate suite went green. **Now at `842ec61`, MERGE-BLOCKED.**
|
||||||
|
|
||||||
**Review round 1 found three blockers. Two are fixed; the third is why
|
**Review round 1 found three blockers. Two are fixed; the third is why
|
||||||
this lane is blocked.**
|
this lane is blocked.**
|
||||||
|
|
@ -301,17 +301,64 @@ this lane is blocked.**
|
||||||
already. Verified; no binding was added for this.
|
already. Verified; no binding was added for this.
|
||||||
- **P1a NOT fixed, and deliberately — it blocks this PR.** The async
|
- **P1a NOT fixed, and deliberately — it blocks this PR.** The async
|
||||||
completions display UI without capturing the initiating frontend
|
completions display UI without capturing the initiating frontend
|
||||||
(`builtin/runtime/git.lua:609`, `:854`), so a result surfaces in
|
(`builtin/runtime/git.lua:635` and `:928` at `842ec61`), so a result
|
||||||
whichever frontend is active when git exits. `commit_to` is the right
|
surfaces in whichever frontend is active when git exits. `commit_to`
|
||||||
mechanism and is **not Lua-reachable** outside a directory open, so
|
is the right mechanism and is **not Lua-reachable** outside a
|
||||||
the fix lives in the **`destination-capture`** lane. This lane adopts
|
directory open, so the fix lives in the **`destination-capture`**
|
||||||
it after that lands. Verified untouched: no diff line in `ffe5ae2` or
|
lane. This lane adopts it after that lands. Verified untouched: no
|
||||||
`6c1631e` reaches `open_status_panel`, `show_diff_buffer`,
|
diff line in `ffe5ae2`, `6c1631e`, `3eca5e8` or `842ec61` reaches
|
||||||
`pmacs.window.display` or `commit_to`.
|
`open_status_panel`, `show_diff_buffer`, `pmacs.window.display` or
|
||||||
|
`commit_to`.
|
||||||
|
|
||||||
|
**The second citation written here in round 1 was wrong** — `:854`
|
||||||
|
pointed at `local unstaged = …` inside `diff_plan`, not at a display
|
||||||
|
call. The site was always `show_diff_buffer`'s `pmacs.window.display`.
|
||||||
|
Corrected rather than silently re-numbered, because a stale pointer in
|
||||||
|
a block whose whole purpose is "do not touch these two lines" is worse
|
||||||
|
than none.
|
||||||
|
|
||||||
**Re-gated at `6c1631e`:** all 11 steps green, acceptance now 27 tests.
|
**Re-gated at `6c1631e`:** all 11 steps green, acceptance now 27 tests.
|
||||||
Both fixes mutation-verified.
|
Both fixes mutation-verified.
|
||||||
|
|
||||||
|
**Review round 2 found two more P2s, both the SAME SHAPE as the round-1
|
||||||
|
P1: module-level mutable state read at CONTINUATION time instead of
|
||||||
|
captured at INVOCATION time.** Both fixed here; the P1a block above is
|
||||||
|
unchanged and still the reason this lane cannot merge.
|
||||||
|
|
||||||
|
- **P2 fixed (`3eca5e8`) — an unborn-repository diff could switch
|
||||||
|
repositories mid-plan.** `run_diff_plan`'s `next_step` read
|
||||||
|
`state.root` each time it started a step, and an unborn `AM`/`AD` row
|
||||||
|
produces a **two-step** plan. A concurrent `git.status` for another
|
||||||
|
repository reassigns `state.root` from its own root-resolution
|
||||||
|
callback, so a diff started in A ran its second step with B as cwd and
|
||||||
|
A's path — git there matches nothing, so the unstaged half silently
|
||||||
|
rendered `(no changes)` instead of the worktree delta it exists to
|
||||||
|
show. The root is now captured at the keypress and threaded through as
|
||||||
|
a parameter; `state.root` is not read inside the plan at all.
|
||||||
|
- **P2 fixed (`842ec61`) — a repository root containing a newline was
|
||||||
|
truncated.** `rev-parse --show-toplevel` was parsed with `first_line`,
|
||||||
|
so a root at `/tmp/a\nb` became `/tmp/a` and every command after it ran
|
||||||
|
with a nonexistent cwd. Fixed with a **separate** helper,
|
||||||
|
`strip_output_terminator`, at that one call site. `first_line` is
|
||||||
|
deliberately untouched: its other three callers all feed the
|
||||||
|
**single-line status band**, where truncating is right, so folding the
|
||||||
|
two together would fix one caller and break three.
|
||||||
|
|
||||||
|
**A THIRD instance of the shape is still open and was NOT fixed** (not
|
||||||
|
in this round's scope, and no review finding covers it): **the diff path
|
||||||
|
has no generation counter at all.** `run_diff_plan` has no in-flight
|
||||||
|
guard, and `show_diff_buffer` writes the single `state.diff_buffer` at
|
||||||
|
completion — so two `d` presses in flight together are last-writer-wins,
|
||||||
|
and a slow first diff overwrites a fast second one. Reachable: `d`
|
||||||
|
displays into the document window, the user refocuses the panel, `d`
|
||||||
|
again. The status path solved exactly this with `reserve_generation`;
|
||||||
|
the diff path never got one.
|
||||||
|
|
||||||
|
**Re-gated at `842ec61`:** all steps green, acceptance now 29 tests.
|
||||||
|
Both round-2 fixes mutation-verified — `g6_22` fails on the second
|
||||||
|
spawned diff argv when the `state.root` read is restored, and `g6_14c`
|
||||||
|
resolves `<tmp>/nl` instead of `<tmp>/nl\nroot` when `first_line` is.
|
||||||
|
|
||||||
**Written with the lane's first commit, before the PR exists** — the
|
**Written with the lane's first commit, before the PR exists** — the
|
||||||
standing correction from #171 and #215. This session it was missed on
|
standing correction from #171 and #215. This session it was missed on
|
||||||
#224 and again on #225, both caught by review; writing it now is the
|
#224 and again on #225, both caught by review; writing it now is the
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue