- Return the early answer from scanCommand without awaiting a successful
outcome: the SSH provider rejects done when termination cancels a
launch it has not yet acknowledged, which turned a retained dirty
checkout into a failed cleanup.
- Test that a never-initialized submodule is removed and that Git
refuses a committed embedded repository, which inspection leaves to
Git by design.
- Record the git-status-only trade-off and its sparse-checkout rationale
in the worktree Agent Note, and align the README, upgrade guide,
maxOutputBytes description, and comments with what is streamed.
Refs #8151
Archive cleanup read whole Git listings into the 64 KiB maxOutputBytes
buffer, so every clean checkout in a repository with more than about a
thousand tracked files settled as failed.
- Drop the skip-worktree/assume-unchanged and gitlink listings; removal
follows what `git status` reports, as peer agent products do.
- Stream `git status` and stop at its first entry, and stream the
worktree listing, so neither is bounded by maxOutputBytes; restoring a
worktree shares the streamed lookup.
- Retain a checkout whose administrative directory holds submodule
repositories instead of letting Git refuse the removal.
Refs #8151
An expanded file now draws its lines once the reader approaches it, and a
jump to the last file settles at the end of the list after it draws.
Regenerates the config catalog line reference.
Status snapshots carry the base commit the host recorded with the head
(baseSha). ForgeService.diff passes it to the provider when the latest
status names the requested head, and forge-github starts the compare read
from it while its GraphQL read confirms the head; a stale head or another
base cancels and joins the early read.
- Shift-chosen commits must follow each other as first parents; the picker
says why it keeps a run that leaves the line, and the Host refuses one with
forgePanel/commits-not-linear for the Branch scope and change requests.
- The Branch scope lists its newest maxCommits commits with
--no-show-signature, so log.showSignature cannot corrupt the listing.
- Viewed marks merge with the stored entry on each write and follow the
storage event, so tabs of one Session keep each other's marks.
- .gitattributes patterns follow Git's wildmatch rules, checked against
git check-attr; change digests include file mode lines.
- GitHub commit pagination refuses a repeated cursor or a changed count;
commits validates the repository before its host like the other reads.
- The commit list is read once per head, base, or refresh; the lens menu
hides the count of the disabled Tests lens.
A repository's root .gitattributes now decides a file's review layer first:
dsh-review-layer names test, interface, or implementation, and
linguist-generated still places a file in the test layer. The testPaths and
interfacePaths settings add globs before the built-in rules and are empty by
default. The built-in rules follow the default conventions of common
languages and tools instead of treating every JSON or YAML file and every
name containing config as interface. This repository declares its own locale
dictionaries, snapshot tree, pairing records, and types modules.
- forge-github: repeat a compare read without --allow-escape-sequences when
a gh older than 2.97 rejects the option; such a gh prints escape sequences
unchanged, so every version reads every diff (checked with gh 2.96.0 and
2.100.0 on a pull request whose patch holds an ESC byte).
- client-ui-forge: a stale refusal now re-runs the read effect, so a status
that arrived during the read, including a failed poll that keeps the
earlier head, starts the next read at once instead of leaving the changes
view loading.
- forge: ctx.forge.diff polls at once only for the first stale read at a head
commit; later stale reads at it wait for the regular poll, which bounds the
read-poll loop while GitHub's answers briefly disagree.
- forge-github: review thread pages share the byte budget of a complete
check read.
- client-ui-forge: a truncated count shows its "+" even when it is zero.
- READMEs: document the batch deadline and rewritten-base limitations.
The changes view gains a lens of All, Interface, Implementation, and Tests
that spans the file tree above it, a switch that hides test files from the
tree and the diff, and a viewed checkbox on each file header that collapses
the file. The toolbar counts viewed files and V toggles the file being read.
Marks are kept per Session, source, path, and change digest in browser
storage, so a file that changes again reads as changed since viewed. All
commits beside Submit review, and beside the base branch of the Branch scope,
shows one commit or a Shift run of commits.
The GitHub provider now reads headRefOid and baseRefOid in one GraphQL query,
returns `stale` when the head moved, and reads the patch from
`compare/<baseRefOid>...<headSha>` instead of bracketing `gh pr diff` with two
head reads. Both ends are fixed commits. The compare read lives in the internal
`readComparison` helper so commit-range diffs can reuse it.
For every open and merged pull request measured, the compare patch is
byte-identical to `gh pr diff`. Unlike the pull request diff, it returns diffs
over 300 files, so such a pull request now shows its complete diff; only output
over `maxOutputBytes` or GitHub's HTTP 406 / `too_large` refusal is
`too-large`. The read passes `--allow-escape-sequences`, which gh 2.97 and
newer require to print patches whose files contain terminal escape sequences.