Repository navigation
Batch: pipeline, Git lock, Markdown, themes, Host dashboard, Review button and terminal fixes (#340 to #348, #290, #292, #293) - #349
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…iew menu (#293) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…unavailable reviewer by its name (#293) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add as project in Files hardcoded Codex for the new Main, which a never-started main chat now keeps. Resolve the instance with the Default Agent fallback Add Project uses, through a shared resolveDefaultAgentInstanceId. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…347) Render the real provider status banner and composer banners: a not-ready provider's banner explains it, while a disabled or removed provider, in a never-started or a started chat, shows nothing today and still lets Send submit the bound instance. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A chat bound to a disabled or removed provider instance showed no reason, an empty picker, and Send submitted the instance for the server to reject. The composer banners now name the provider and the recovery (Settings > Providers, or a chat with another agent from the + menu), and Send is refused with that reason through the composer's existing blocked-reason prop, for never-started and started chats. An instance configured in settings but not reported yet is not called unavailable; the exact-session-account test now configures its instance for that reason. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ider (#347) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…and mirror cases (#348) The fake grid now changes only when fit runs, so the test fails if the scale handler stops refitting. A mirror must not claim on a scale change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…#348) When the last resize or owner claim fails and no further layout or input event arrives, the PTY keeps its old size, for example 24 rows after the mount shrank to 19, cutting off the bottom rows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…348) A failed resize or owner claim now retries after 250 ms, 1 s and 4 s by re-measuring through the layout trigger, so a newer size replaces the failed one and a renderer that no longer owns the size does not claim. A success restores the budget; unmount and renderer replacement cancel the timer. The red test advances timers asynchronously so each retry's result can schedule the next. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… on return (#348) Pane and document hiding each recreate the renderer; on return, with no resize event, the smaller box is fitted and sent in the legacy path and claimed by the owner. The fake fit addon can now apply its proposal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…retries (#348) A zero-area mount still attaches with its sizeClaim; it supplies no fitted dimensions and sends no layout-driven resize. Qualify the scale-change entry and add the resize retry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…293) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…code reviews (#293) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Drives seeded layout actions around a Codex Terminal whose fixture TUI now draws a footer on its last three rows, and after each step checks that the PTY's rows, xterm's rows and the rows that fit the mount agree and that the last row is inside every clipping ancestor. Not in the default spec list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
The upstream AppRun hook builds its plugin, scanner and PTP helper paths from $APPDIR, which is unset when the extracted AppRun runs and names another AppDir when inherited from another AppImage. After the pinned plugin writes the hook, the wrapper checks its four expected lines, rewrites them to the AppDir the hook file lives in, and fails the build if the upstream hook drifts. A normal launch exports the same values as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… sync the follow repair calls (#348) Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
… loaded host (#348) Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
…, close the last tasks Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Codex Review Summary: ✅ CompletedThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
This was referenced Nov 12, 2026
Closed
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9c57548ffa
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
This was referenced Nov 12, 2026
…kspace (#345) The rendered view draws an image's relative src against the page's address, so it never loads. These tests expect the editor to keep the src in the document, draw no img with it, and hand each image to the surface, which reads it relative to the Markdown file through the workspace asset route and refuses a path that leaves the workspace. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ace (#345) The rendered view's image node drew an <img> with the file's src, which the page resolved against its own address, so a relative image never loaded in the desktop app, the browser or a remote environment. Images now get a node view the surface draws into, as Mermaid diagrams do. A relative src is resolved against the Markdown file's folder; a path that leaves the workspace, an absolute path or another scheme is refused before any request, and the asset route still checks the path on the server. The file is read through the workspace asset URL and shown from a blob URL with the Files preview's own loader, revoked on unmount or a new URL. While loading or on failure the image's text stands in, with the reason on hover. The document and the saved file keep the src as written. The packaged rich Markdown spec checks a relative placeholder image loads. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…urvive a reissued address (#345) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e address (#345) http: and https: pass through only with //, so http:/x.png is not read against the page. A failed image is tied to its URL, so a reissued signed URL tries again, and a refused asset address asks to check that the file exists. The reissue test re-renders with a copied workspace, since the React Compiler memo hides the mocked atom's change. The architecture overview and the packaged validation runbook describe the image view. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR review of #341: a write that takes index.lock can be force-stopped while it holds none, and another Git process can take the lock meanwhile and keep it unchanged past the 2 second wait. This test is red: the cleanup deletes that live lock. A second test keeps R16 green: a lock the forced write itself held open is removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…#341) After a forced stop the cleanup removed any lock that appeared during the command and stayed unchanged for 2 seconds, so it could delete a live lock another Git process took while BiBCode's command held none. The stop report now carries a check taken just before the forced kill, while the root still runs: on Linux (/proc/<pid>/fd) and macOS (proc_listpidspath limited to the root's process group) whether the root has index.lock open. On those platforms a lock is removed only when it did. Git removes its own lock on SIGTERM even while a hook runs with the lock's descriptor closed, so a forced stop leaves one only when Git could not act on the request, while it still holds it open. Windows has no such check and keeps the previous rule; the docs say so. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s review and the follow-up issues Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
mubeda
added a commit
that referenced
this pull request
Nov 14, 2026
Bump every version source to 0.16.0 and turn the Unreleased CHANGELOG section (PRs #349, #359, #365 and #369) into the v0.16.0 entry. Raise the Claude Code additive-hook ceiling to 2.1.323 after the live PreToolUse guard proof passed on that build, and move the above-ceiling test example to 2.1.324. Give the CI Test lookup contract test a 30-second limit: it runs bash and jq eleven times and timed out against the 5-second default under load. Verified locally: cargo check for the workspace, vp check, vp run typecheck, the full vp run -r --concurrency-limit 1 test graph in all nine packages, release:smoke, the updater regression sets, cargo test -p bibcode-desktop, and the macOS arm64 DMG signature and Finder icon check. CI: the Seeded Packaged Desktop Upgrade workflow from v0.8.0 passed on all seven lanes for this branch (macOS x64 on a rerun after its hosted runner lost its connection). Reviewed by Codex with no findings. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this changes
One batch of fixes and two features, planned in
docs/plans/2026-11-09-issue-batch-340-345-290/(spec, plan, phases, progress log).host_metricsMCP tool; volumes the filter hides are listed with the reason and never read.Also: the Linux AppImage bundles its GStreamer plugins (audio in Files no longer kills the web process), the PDF preview loads (
frame-srcnow allowsblob:), and several tests that raced their own timeouts are fixed.#348 in detail
Three separate causes were found on a real pair (the Linux desktop app as server, a second client):
SIGCONTto that terminal's own process group, and the CLI re-enters its screen and repaints.Limits, stated plainly:
After the first review
index.lockis removed after a forced stop only if the killed Git process still held the lock open just before the kill, so a lock another Git process took meanwhile is kept even when it stays unchanged. Windows cannot check this: there a foreign lock that appeared while BiBCode's command held none and stayed unchanged for 2 seconds can still be removed. The Linux check has not run yet outside CI.main.macOS app as client (run after CI went green)
The packaged macOS app (WKWebView) built from this branch was the client of the Linux desktop app running in the Docker lab (Ubuntu 22.04, WebKitGTK, Xvfb, no window manager), Profiler on in both. The server was a container, not a real desktop, and input on the Mac was synthetic.
SIGCONTper lossy attach 30 of 30, none on complete histories; 27 of 30 screens identical, 3 differ only by live output read a moment apartFound and not fixed here: when the PTY size changes while a window is away and that window returns to a complete history, the raw replay at the new size can leave rows that an attached window does not show (4 stale rows, 5 of 5 runs with the stand-in). A headless xterm.js probe shows the cause is the replay of bytes written for another size; a program that erases the whole screen when it is resized is not affected. Whether the real Claude CLI is affected is not known. The server-side emulated screen (follow-up) removes this class.
Not valid on this pair: whether an idle window takes the size back (every driver call counts as a user gesture, and the lab's window always reports focus). Not run: jumping between two terminals of two worktrees (the second worktree had no terminal).
Compatibility
sourceControl.review) saved on a server makes a v0.15.3 client unable to load that server's keybindings, aschat.findalready does for older clients. The keybindings guide says so.Validation
The suites below ran on the tree of the last product commit (
fix(terminal): ask a Claude terminal to repaint after a lossy attach). The commits after it change three test files and the plan log only; the changed tests were rerun on their own. Commit ids in the plan log predate a history rewrite that removed a local folder path from two early plan commits; the final tree is unchanged by it.cargo fmt --all --check,cargo clippy --workspace --all-targets -- -D warnings,vp check,vp run typecheck,vp run check:contracts,vp run check:markdown-linkscargo test -p bibcode-server;cargo test -p bibcode-desktopcargo test -p bibcode-server terminal::,host_metrics; Clippyvp check, typecheckcargo test -p bibcode-desktop;cargo test -p bibcode-serverremoval_refuses_when_an_admission_does_not_drain_before_the_deadline, which fails about 1 run in 3 onmaintoo)Real pair (Linux desktop app as server, headless Chromium clients, Profiler on):
Not run: the owner's own Linux desktop as server with the macOS client; the packaged macOS suite (the host's console was locked, which hides the webview); the real Claude CLI on the pair (not signed in inside the test fixture; the owner confirmed by hand on their own server that
kill -CONTrepairs a terminal with missing characters); x64 Windows and Linux (CI); a focused WebKit window for the idle take-back check.Profiler: on for every packaged and real-pair run. No finding caused by this change. Pre-existing: main-thread stalls up to 2.7 s and a few slow calls under software rendering, more
rpc.slowoccurrences for Git ref listing on the Windows VM.Profiler coverage of the change: the unary
server.getHostMetricsand the host metrics stream are registered through the session wrappers and are not long-running; the host collector stops in quiesce before the profiler's teardown and its disk threads are never joined; the resume signal adds no process, RPC or event and logs throughtracing; no terminal content or mount point is logged.React and
UI.mdreview: the changed terminal panel, composer banner and Host dashboard components were reviewed againstvercel-react-best-practicesandUI.md(five small findings; three fixed: the unavailable-agent banner's guidance, the size notice as a status region, a 100% label for a scaled terminal; two left: the Fit button gives no feedback when no size request can be sent, and the Host dashboard sheet re-renders once a second while open).Runbooks:
docs/testing/cross-platform-validation.md,linux-desktop.mdandwindows-desktop.mdwere updated; the others were reviewed and remain accurate.Known limits and follow-ups (ticketed separately)
chat-reasoning-rows, also onmain).removal_refuses_when_an_admission_does_not_drain_before_the_deadlineis timing-sensitive under load (also onmain).Refs #348.
Closes #340, closes #341, closes #342, closes #343, closes #344, closes #345, closes #290, closes #292, closes #293, closes #346, closes #347.
🤖 Generated with Claude Code