Desktop Material

Desktop Material roadmap

Updated: August 13, 2026

Current repository snapshot — August 13, 2026

August 11 — the Material Design 3 shell is the application chrome

August 9 — evidence-bound self-hosted runner risk confirmation

August 9 — School mode and command shortcut completion

August 8 — Windows-only CI release gate and uncapped workflow jobs

August 8 — repair GitHub auth and Actions runner surfaces

August 7 — hardened self-hosted runner manager

August 7 — opt-in post-clone runner provisioning

August 6 — Windows renderer startup bundle safety

August 5 — self-hosted Windows dependency bootstrap

August 5 — multi-remote fetch sync

August 5 — account-aware repository transfer

August 5 — account cards share one active identity across providers

August 5 — Windows updates survive partial Releases

August 5 — rail account switching keeps the chosen identity active

August 5 — transient Actions job-log 404 recovery

August 3 — the site lays out on a phone

August 3 — the published site becomes one Material Design 3 component

August 3 — stash manager export slice

August 3 audit checkpoint — Scoped fixes verified; browser page search now usable

Historical August 2 roadmap register — archived issue references

Every item below had its own issue (#118–#135). This table preserves the planning and acceptance state recorded at that time; its issue links are archival references, not a live issue queue. The August 13 snapshot above reports zero open issues. A later issue closure is not, by itself, proof that a row's historic acceptance work completed, and a historic pending state is not a present issue or release claim. The original rule was that an item could be called finished only when it was genuinely verified, not merely when code compiled. Two rules govern that historical plan, set by the project owner:

Those two together make the self-hosted server and its wizard the critical path, ahead of any single feature that depends on it.

# Item State
R1 Self-hosted Docker server and its guided install wizard trust, provisioning, and build-context foundations implemented; guided UI and live transport pending — critical path
R2 Custom Docker OAuth server (SSO, multi-domain SSO, SAML) authority foundation implemented; server flows and capture pending, depends on R1
R3 History graph view: Branch/Tag ∣ Graph ∣ Commit Message graph, context actions, lane visibility, explicit keyboard-accessible List/Graph tabs, and a dedicated full-width Graph repository page implemented; prior 1443×992 built-app List/Graph captures remain verified, while a fresh dedicated-page capture and broader graph-scale acceptance remain
R4 Agents panel: fleet view, session creator, worktree status operational foundation implemented; final acceptance and capture pending
R5 Command palette expansion (45 audited additions, plus the git half) catalog audited and partial routes added; remaining live commands and capture pending
R6 Proactive conflict detection and predictive merge alerts native-accurate forecast foundation implemented; observation adapter, live warning UI, and capture pending
R7 AI merge conflict resolution, with an editable output pane guarded three-pane editor implemented; conflict-flow integration and capture pending
R8 Commit context menu in the graph shared graph/list context actions implemented and tested; built-app capture pending
R9 Compose commits with AI immutable composition-plan foundation implemented; policy-backed generation UI and capture pending
R10 Summarize past changes with AI safe reviewed-result foundation implemented; policy-backed adapter/UI and capture pending
R11 Launchpad, with pinning and snoozing model, bounded preferences, and accessible view implemented; live adapters/navigation/capture pending
R12 In-app pull request review and internal code suggestions review workspace implemented; provider suggestion integration and capture pending
R13 Team collaboration: shared workspaces, insights, presence, deep links not started, depends on R1
R14 Admin and security controls, including AI security controls fail-closed AI policy foundation implemented; trusted main-process wiring and admin UI pending, gates R7/R9/R10/R12
R15 Integrated terminal with a live synchronized graph renderer/session and refresh-coordinator foundations implemented; ConPTY/IPC/live-graph wiring and capture pending
R16 Issue tracker integrations: Jira, GitLab, Trello strict provider identity/config foundation implemented; authenticated clients, UI, and capture pending
R17 Parity gaps: lane hiding/soloing, SSH keygen, interactive rebase, Gitflow, in-app editor lane controls and interactive-rebase model/editor implemented; SSH keygen, Gitflow, in-app editor, wiring, and capture pending
R18 Cloud Patches, self-hosted on your own server canonical artifact and encrypted store foundations implemented; authenticated HTTP/apply/UI/capture pending, depends on R1

August 2 fleet bug hunt — 23 defects fixed; a handful named and left open

August 2 internal browser — Defects fixed; page search renderer completed; three features remain

August 1 line counts move into releases — Implemented and dewed

August 1 dim sum surprise in the app — Implemented and locally verified

July 31 full-app command palette with rich controls and teleport — Implemented and locally verified

July 31 recurring background errors — Implemented and locally verified

Production logs separated two failures that had appeared together: a bundled Git launcher denial during the hook-free settings history probe and an uncontained provider failure in repository-indicator refresh. The startup probe now has two bounded, cancellation-aware retries; indicator refresh contains each repository and reschedules in finally. Mutating Git commands remain single-shot.

Focused verification passes 6/6 launcher/updater tests, 62/62 exact pointer/submodule checks, 101/101 broader focused checks, changed-file ESLint and Prettier, and TypeScript no-emit. The reproducible Lowlevel-MCP production build returned 0 after 539.6 seconds; the exact rebased tree returned 0 again after 559.1 seconds. Off-screen Win32 acceptance showed the modified .gitmodules and deleted gitlink together for twelve stable seconds, with empty notification history and none of the reported errors in isolated logs. Push and hosted installer/Release evidence remain the close-out gates.

July 31 automatic submodule recovery — Implemented and locally verified

Add Submodule now resolves one immutable stage-0 blob OID, validates that same object, and restores its exact bytes only after the requested destination passes validation. The exclusive create cannot overwrite a concurrent file; failure cleanup removes only a matching device/inode and preserves a pathname when ownership cannot be proven. Commit-time Cheap LFS inventory omits Git metadata and gitlinks, but oversized protected dot paths stay in fail-closed commit accounting and are rejected before provider, credential, release, commit, or push mutation. This removes the follow-on unsafe-path toast without weakening real path, pointer, or large-file enforcement.

Exact non-UTF-8 blob restoration, real submodule add/rollback, protected-path zero-read behavior, early remote-mutation gates, and mixed/manual failure merging are covered by the final focused suites.

The first hosted run exposed two rebase-adjacent integration checks: a duplicate Help-menu H mnemonic from the incoming changelog viewer, and a duplicate desktop feature-summary row against the frozen TUI parity count. The Windows mnemonic now uses R; the duplicate summary row is removed without touching the out-of-scope TUI, while the full reliability article and Pages feature card remain published.

The second hosted run cleared both first-run failures. Its only remaining Windows failure was the incoming context-menu search surface using a constant expression instead of the registry auditor's literal one-to-one ID. Both the input and its regex control now expose the literal material-context-menu surface ID; the focused collection-registry contract passes.

July 30 Publish organization sizing — Implementation pushed; final hosted proof pending

Publish repository's Organization field is now an explicit-None searchable listbox instead of a native select. It persists fuzzy, substring, and bounded regex modes, opens the full Regex Builder, supports Home/End/Enter/Space/Escape, ignores stale responses from a previously selected account, and keeps the shared Regex Builder portal responsible for Escape so the host dialog stays open. Global select wrappers can shrink within their parent, while this list uses a bounded 128–176 CSS px viewport, contained vertical scrolling, and ellipsis for long organization names.

The frozen local tree passes 26/26 focused UI tests, TypeScript no-emit, 83/83 pre-promotion verifier contracts, 19/19 provider checks, and 61/61 documentation checks. Its exact hidden production build returned 0 after 1042.19 seconds, without a timeout; stderr contained only npm's upgrade notice. The accepted 1440×960 capture is 133,919 bytes with SHA-256 7db03d5db789d19e1ad49de66bd79abb62e46c7909eda9de08878aac367033d8. The 390×844 physical receipt used a 780×1688 logical viewport at combined DPR/zoom 0.5: the 176 CSS px list rendered at 88 physical px, had clientHeight=172, scrollHeight=184, reached maxScrollTop=12, kept the final option visible, showed no horizontal overflow, ellipsized the long row, and restored None. Gallery promotion makes this 85 current Windows scenes (67 canonical plus 18 specialist). Cleanup is complete, and implementation commit 63c1ec08c4f24f85d87f21d98851dcd5784c7800 is proven on origin/main. The first hosted matrix identified the omitted retained receipt and stale generated parity contract; this follow-up publishes both. Final exact-SHA hosted CI and installer-release proof remain open gates.

July 30 local conflict/CI repair and background progress — Implemented locally; push and hosted verification pending

Conflict dialogs and failed Actions runs now open bounded Codex/OpenCode tasks, Build & Run carries elapsed/ETA progress and stays hidden while work continues, and Cheap LFS restore details collapse without hiding the live header. All five actions are direct command-palette results alongside its rich search controls. TypeScript no-emit, targeted lint, Prettier, and 42/42 focused tests are green. The real production renderer passed off-screen command-palette and background progress acceptance; hosted CI and installer evidence remain pending until push.

Desktop Material's numbered roadmap now extends through M27. M0–M21 and the M23 Ollama manager have published receipts; M22's 73-scene visual refresh is published byte-identically. The current guided-gallery contract declares exactly 86 Windows targets. Its current-source updater-ready frame is now accepted and published; each remaining replacement stays fail-closed until it passes the current-build gates. Five Linux/Xvfb captures remain preserved as historical evidence outside that target set. The exact acceptance/publication state for M24–M27 is listed below. The July 22 tab-group, command-palette, Alt-key, release-gate, and Cheap LFS UI continuation is implemented, locally accepted, pushed to main, and verified through the exact-source CI, CodeQL, Pages, wiki, and installer-release pipelines. This file is the compact public source of truth; implementation details and historical test receipts stay in PLAN.md and HANDOFF.md.

July 29 repository-sheet and command-palette refinement — Implemented and locally verified

Repository account, service, status, text, and regex filtering now live behind one collapsed-by-default disclosure while preserving active state and an always-reachable compact action row. The action strip remains one row at the 390 px sheet width, including bilingual mode.

History hover/focus cards show the exact authored timestamp plus a localized, auto-updating relative age. Command-palette appearance controls are compact and aligned, and the optional Random per repository mode deterministically maps each stable local repository ID to one of six row layouts.

Focused implementation verification passes 133/133 and gallery capture contracts pass 73/73. This includes the .gitmodules/ordinary-metadata Cheap LFS false-positive regression, while explicit unsafe Cheap LFS pathspecs remain rejected. The gallery target has grown to 86 for the new History hover and Publish organization listbox scenes. The exact post-review Windows production build and four current-build screenshots remain in progress; publication and remote workflow evidence remain the close-out gates.

July 29 Cheap LFS hook containment and diagnostic server — Implemented, deployed, and locally verified

The one-file background commit that installs the Cheap LFS cloud-compression caller now points Git at an operation-owned empty hooks directory. This closes the gap left by --no-verify: a failing Git LFS-style post-commit hook is never invoked, while ordinary user commits and pushes keep the repository's hooks. A real-Git regression proves the generated workflow alone commits and reaches the remote despite a deliberately failing post-commit hook.

Desktop clients can select local, remote, or dual diagnostic storage through launch configuration, including an optional absolute local directory and a token-file-backed central endpoint. The remote transport is five-second bounded, best-effort, and redacts credentials before sending.

The ARM64 central service is live at the private Docker host on port 4318. It requires bearer authentication for ingestion, search, storage status, and the dashboard; redacts again server-side; stores per-client daily JSONL in an operator-selected bind mount; and enforces 14-day/5-GiB retention plus CPU, PID, request, query, and message bounds. The host Docker daemon reported that memory cgroup limits are unsupported, so the configured 192-MiB Compose limit is documented but not enforced there. Live health and an authenticated ingest/search/storage smoke test passed with the injected token value removed.

July 28 current close-out wave — Merged locally; final verification in progress

Cheap LFS bounded Windows sidecars — Implemented locally; final-tip build pending

Pin, Release restore, OCI restore, and generated clone hydration no longer derive scratch components from the complete tracked basename. Fixed process/UUID names remain well below NTFS's 255-unit component limit while preserving same-directory atomicity; current and legacy crash leftovers are kept out of status, staging, and automatic pin scans. Focused coverage is green at 82/82, including 255-unit tracked names and 200-unit helper/GHCR/OCI destinations. The earlier 67d475fd5e build predates this correction and is not final-tip evidence.

The screenshot's Pull refusal is tracked as a separate ordinary-Git boundary: raw materialized caches are intentionally hidden only from Desktop's Changes projection, not from Git's merge safety. The documented current workaround backs up only verified Materialized files, restores their committed pointers, pulls, then re-materializes; multi-gigabyte caches should not be stashed. Automatic cache parking remains future work because it must retain the payload, roll back on pull failure, and never rewrite a modified path.

Standalone Cheap LFS versus Git LFS atlas — Pages published; integrated app verification pending

The new stable /cheap-lfs-vs-git-lfs.html route is separate from the end-to-end Cheap LFS guide. Its source defines 72 row-level sourced distinctions in 12 six-row categories, six persistent browser-style tabs, two code-native SVG diagrams, an interactive fit finder, and category/fit/text filters. Explicit regex mode reuses the documentation site's fresh-worker runner and 750 ms hard deadline rather than compiling reader patterns on the UI thread. A dedicated publication tab contrasts Cheap LFS's provider-first handoff with Git LFS's pre-push path and includes the committed-pointer, ordinary git push, fetch, matching HEAD/@{upstream}, first-anchor, and raw-byte safety proofs.

The source keeps the result honest: Cheap LFS leads on the guided Windows workflow, explicit provider verification, Release/OCI choice, multipart logical files, optional encryption, recovery, and observability; Git LFS leads on standards, cross-platform clients, tracking policy, locking, caching, pruning, migration, CI, and automation. Host cost and policy remain dated “depends” claims, the pointer formats are not described as interoperable, and open 50+ GiB hardening issue #96 remains visible. Automated and Lowlevel MCP headless acceptance is green: both route contracts, 59 documentation/search tests, 35 installed-Chrome checks, all 33 HTTP requests, original-resolution wide/narrow capture inspection, and runtime cleanup passed. The base predates renderer multi-compiler fix 6903c9ae1e, so its known pre-fix production-build path was stopped with bounded evidence rather than misreported as a Pages success. The route is published from remote main commit 80e0209a12f41df8a6a80ef52925b52ab9ecb1b0; Pages run 30391300142 succeeded. Exact integrated application verification remains pending.

Cheap LFS Pages product guide — Pages published; integrated app verification pending

The stable /cheap-lfs.html route now carries a marketing-style but source-grounded 30-point comparison with five persisted filters, explicit “choose Git LFS when…” guidance, and a six-stage provider-first push handoff. The guide documents the create-only first-branch Release anchor separately from ordinary manual branch publication, inspects the committed pointer with git show, and proves the pushed branch through matching local/upstream SHAs. The Pages-only Lowlevel MCP headless run passed 46/46 checks in eight phases at 1440×960 and 390×844 with both accepted captures retained. The full Electron production build was interrupted after an extended silent run so the user-requested site push could proceed; no app-build result is claimed by this documentation milestone.

Integrated close-out gate

The locally merged issue-closing lineage covers the remaining actionable source, accessibility, documentation, and acceptance gaps. It is not complete until the exact Windows production build, all 86 fresh Windows scene checks, the declared focused and full suites, default-branch integration/push, and issue-closing receipts are proved. The archived Linux TUI prototype, its five captures, and its package/compatibility lanes are historical and non-blocking under the Windows-only product boundary.

Issue #96's reported working-tree inventory OOM path is now locally closure-ready: Git supplies only changed/untracked names, Desktop Material reads at most a securely identity-proven 512-byte prefix, and an exact 55,581,030,080-byte NTFS sparse regression proves git grep --untracked is never invoked. Focused coverage passes 82/82 and the complete Cheap LFS directory passes 673/673. Publication, final-tree gates, and the issue-closing receipt remain part of this wave rather than being inferred from that local checkpoint.

Historical July 28 measured repository-view responsiveness — Source fix locally verified; exact post-fix timing pending

Lowlevel MCP exercised the immutable baseline Windows release at 9bdfdb8b25 on an off-screen desktop. Idle animation stayed below 17 ms across 122 sampled frames, but warmed Changes/History switches measured 56–104 ms with six long tasks. Every section click sent an already-satisfied showBranchList: false update after the real section mutation, causing a second global app-state emission and root render. The rail now skips that dispatch while the list is already closed, and the store rejects identical partial updates from every caller. Focused tests passed 42/42 in that source checkpoint. Its changed-file ESLint was blocked by five missing repository-specific rule definitions in the reused dependency tree; that historical environment does not override the active close-out branch's later green lint gate. Exact post-fix packaged timing is still an acceptance requirement.

Historical July 28 root renderer resource audit — Superseded checkout snapshot

Root renderer subscriptions, IPC listeners, global document/window handlers, and deferred telemetry/update polling now have deterministic unmount cleanup. Queued idle and animation-frame work cannot resurrect those resources after the root has unmounted. Focused lifecycle coverage passed 4/4 and changed-file ESLint was clean. The Lowlevel MCP production build in that predecessor checkout stopped because that checkout lacked its dependency tree. That environment-specific stop is retained as chronology; it is not a current blocker or a substitute for the active branch's final build.

Historical July 27 encryption, observed network actions, and tone controls — Superseded status snapshot

Local verification is 194/194 focused tests and 6768/6768 full tests across 831 files; TypeScript and yarn lint are clean. Packaged visual evidence and remote CI are not yet claimed. #78, #80, and #83 remain open until real built-app screenshots are captured. Those deferral and open-issue statements describe that July 27 checkpoint only; the current close-out state is the section above.

Historical July 27–28 encryption, group management, lazy loading, tone controls — Integration chronology

Five issues landed on main in one sweep. At that checkpoint each was locally green; none of the surfaces with a visible component had a real capture yet, so the issues remained open rather than being closed on test evidence alone.

Two of them were then superseded. The repository owner independently implemented #78 and #83 and pushed a550dc1ea8, which deleted this branch's encryption module, encryption gate, funny-level controls and their test suites in favour of its own. The owner's implementation is the one that ships; the descriptions of #78 and #83 below record what this branch built and why, not what is now in the tree. #80, #81, #82 and #85 were not covered by those commits and survive as described.

Two build facts are worth recording because they cost real time. yarn compile:dev exhausts a 10 GB V8 heap: the config exports six webpack configurations built concurrently by one MultiCompiler, each holding a full module graph. Building one configuration per process succeeds comfortably. Separately, a build piped into tail returns tail's exit status, so two out-of-memory failures were reported as success and a screenshot was taken of a stale bundle — which is how a shipped feature briefly appeared to be missing from the settings tab.

Historical July 27 Linux TUI path browser and Git wrapper — Archived, non-blocking prototype receipt

This section preserves what the prototype accepted on July 27. The TUI is not a current supported product/package target, and none of its remaining compatibility, CI, installer, or visual gaps blocks the Windows application.

The Linux-first terminal edition then added a folder-only repository browser to its Open and Create dialogs without replacing the real editable path field. Browse/Hide, Home, and Up work by mouse and keyboard. A matching outer pair of single or double quotes is removed from pasted repository paths immediately when bracketed paste is available and again at submission as a terminal-independent fallback; path text is never evaluated by a shell.

The literal github launcher also provides github push, github pull, and their github git push / github git pull forms. Push forces a parseable native dry-run, checks the publication delta for Cheap LFS safety, and invokes native Git only after the preflight passes. Pull invokes native Git first and then materializes canonical pointers with exact size/SHA-256 verification. Other github git <argv> operations remain argv-only native passthrough. The wrapper never stages, commits, rewrites history, uploads a payload, or shadows the system git executable.

The full Windows-hosted TUI suite passes 250 tests with one Linux-only skip in 182.76 seconds. The focused path/browser suite passes 29/29, the focused wrapper suite passes 47/47, Ruff lint/format and strict mypy for both the normal and explicit Linux platform targets are clean, and the wheel and source distribution build successfully. Linux and Windows one-line uv install commands install all three aliases and update future shell PATH values. A disposable Linux fixture accepted safe dry-run/push/pull behavior and restored a 23-byte object with an exact pointer/cache hash match. The packaged TUI launched in real xterm/Xvfb and its Open dialog was inspected. Windows installs resolve all three aliases from the uv tool directory already on PATH; the Linux wheel smoke did likewise. Cleanup is complete. Immediate quoted-paste normalization, expanded-tree clicking, narrow live resizing, and Ctrl+Q exit remain automated rather than accepted visual evidence in the dated run manifest. Feature commit 62420efaf6 is integrated and pushed through f5f6f04c7e; current remote main contains that merge. Pages run 30323259671 and Cheap LFS cloud run 30323259650 passed for the pushed merge, while CI 30323259648 and code scanning 30323259706 were still running at handoff.

The preceding compatibility commit f555d374a6 is already contained in origin/main. CI run 30317262582 passed the Linux TUI matrix and Windows TUI core job, although the overall workflow failed in the unrelated Windows x64 unit job. Installer run 30318769692 failed and published no Release.

July 27 Cheap LFS restore look-ahead, app-hosted browser, and private badge — Pushed; TUI lanes green, overall CI/Release failed

The Cheap LFS Release restore path now uses one FIFO coordinator shared by every file and multipart asset in a batch. It permits at most two active downloads and opens the look-ahead lane only when the current provider transfer reaches the exact 90% boundary; a missing or unusable progress total falls back to starting the next item when the current transfer settles. Per-part and whole-file size/SHA-256 verification, unchanged-pointer comparison, temporary artifact cleanup, cancellation draining, and input-ordered outcomes remain mandatory. The shared Large files and clone/batch restore surface now shows overall/current/look-ahead progress, repository/provider/phase, file and part ordinals, logical and actual network bytes, queued/remaining/succeeded/failed counts, rate, ETA, elapsed time, bounded failure details, and cancellation.

Browser-bound HTTP(S) links can now follow a persisted global setting into a dedicated Desktop Material browser or the system browser. The app-hosted window provides tabs, New tab, address bar, Back/Forward, Refresh/Stop, Go, bookmarks, popup/redirect capture, and an explicit external escape. Remote pages live in permission-denied sandboxed WebContentsView tabs with no Node, preload, or trusted app IPC. Authentication is explicit rather than URL-guessed, uses a clearable in-memory partition, cannot be bookmarked, and always offers Continue in system browser.

Repository-list privacy is now a separate filled-lock badge driven only by exact isPrivate === true provider metadata. It remains visible beside a fork glyph or custom repository logo; public and unknown metadata show no lock. The badge is keyboard-focusable, localized, and included in the row's accessible name.

Local acceptance is complete and the source is merged and pushed through 2abccae8fd. The final focused browser, restore, localization, IPC, badge, and integration suite passed 760/760 across 58 files; the two CDP verifier contract suites passed 14/14; full TypeScript checking is clean; and the exact Windows production build returned 0 without timeout or stderr and produced the normal out bundle including the internal-browser assets. A real built app on an isolated hidden Win32 desktop passed wide English and narrow bilingual restore receipts at the exact current-90% / look-ahead-10% state, browser redirect/popup/new-tab/bookmark/authentication escape receipts, and the private-badge capture, with no clipping, overlap, or private data. Pages and wiki publication are verified live. The first remote CI run exposed Linux TUI-only Python 3.10/mypy compatibility defects. Correction commit f555d374a6 is contained in origin/main, and remote run 30317262582 passed the Linux TUI matrix plus Windows TUI core. The overall workflow still failed in the unrelated Windows x64 unit job; installer run 30318769692 failed and produced no Release. Packaged Windows E2E is verified by job 90140843987. Detailed contracts and the evidence split are in HANDOFF.md, Release-backed Cheap LFS, the app-hosted browser, and the private-repository lock badge.

Historical Linux-first interactive TUI — Archived, non-blocking prototype receipt

A separate Python/Textual prototype adapted Desktop Material for Linux terminals without weakening the graphical edition's Windows-only boundary. The preview has a clickable repository rail, tabs, buttons, lists, tables, selects, and checkboxes; real single-line and multiline text controls; keyboard focus and shortcuts; local Git panes; GitHub workflows through gh; bounded RE2 search and a full builder; English, Hong Kong Cantonese, and bilingual modes; non-blocking notifications; XDG state; editor/terminal integration; and app-owned Git-backed settings history.

Cheap LFS interoperates with the Windows Release-v1 pointer format on both Linux and Windows, exposes clickable inventory/preview/track/verify/restore flows, and provides the same operations through the CLI. New TUI writes are bounded at 500 MiB while legacy reads remain compatible through 2 GiB; size and hash are verified before restoration. OCI/GHCR/cloud writes, encryption, and automatic batching remain explicit parity gaps.

Packaging produces a wheel and source distribution, and the additive Ubuntu CI matrix covers Python 3.10, 3.12, and 3.13 plus lint, typing, tests, a fresh-wheel smoke install, and parity-contract drift. A separate Windows Server 2022/Python 3.12 lane checks the non-PTY cross-platform core without claiming Windows PTY acceptance. The generated contract maps all 201 desktop rows conservatively: 14 adapted, 53 partial, 132 not yet available, and 2 terminal-owned. It is deliberately not a full-parity claim.

The publish run manifest records the completed local matrix: 193 cross-platform tests plus a real Debian PTY pass, five original Lowlevel/Xvfb captures with mouse/text-field evidence, wheel/sdist and fresh-install inspection, a non-root Docker build, and complete disposable-resource cleanup. The merged delivery is pushed through 2abccae8fd, and Pages/wiki publication is verified.

The first merged-source CI run then found a Python 3.10 compatibility boundary: Git 2.54 emits UTC timestamps ending in Z, which Python 3.10 does not accept through datetime.fromisoformat. It also found a Linux-typeshed mypy boundary around the guarded Windows msvcrt lock path. The correction normalizes only the terminal UTC designator, preserves numeric offsets and malformed-date behavior, dynamically types the platform-only lock module, and skips TUI packaging when an older upstream CI target is already non-publishable. An isolated CPython 3.10.20 rerun passed 193 tests with one Linux-only PTY skip; Ruff, strict mypy, the 35 affected tests, and 8 workflow safety tests are green. Correction commit f555d374a6 is contained in origin/main. CI run 30317262582 passed the Linux TUI Python matrix and Windows TUI core job, but the workflow overall failed in the unrelated Windows x64 unit job. Installer run 30318769692 failed and created no Release.

July 26 reliability bug hunt — Implemented and locally accepted

The latest main was fast-forwarded before inspection. The pass repaired the fresh-session publication state behind issue #39, made quick push honor only an unambiguous configured tracking remote, corrected the Explorer shell package's root layout and x64/ARM64 build identity, and removed stale native output before a missing-toolchain return. User-authored app regex now uses bounded RE2 throughout; capture-heavy patterns receive a compositional work budget, diff search reports its global result limit instead of lying about no matches, saved legacy notification patterns require explicit migration, and the static Pages hub runs native ECMAScript regex only in a hard-deadline worker with bounded response data. Exact test, build, headless-capture, GitHub, and publication receipts are recorded at the top of HANDOFF.md and in the dated verification record.

July 26 repository distribution follow-through — Implemented and locally accepted

Transferred GitHub repositories now repair the exact default remote before network work while preserving protocol, origin, unrelated remotes, and any deliberately divergent push URL. Scheduled Git and post-push SSH work uses an explicit non-interactive path so hooks, signing, credential helpers, AskPass, and modal error UI cannot stall unattended automation; manual operations remain interactive.

The Distribution surface adds a per-repository GitHub Packages/version explorer, safe plain/fuzzy/regex search, and a narrow GHCR file upload/download path with immutable-digest and byte-integrity verification. App-owned Cheap LFS storage releases are hidden from the normal Releases list by default and can be revealed without mutation. Actions artifacts gain the same searchable catalog behavior. Cache archive download remains unavailable because GitHub exposes no supported cache-download API; the UI points users to downloadable workflow artifacts instead. Details and current receipts are in HANDOFF.md.

Ignored files to a local Cheap LFS submodule — Local phase implemented and pushed

Only the local phase is built; the publish phase below is still deferred. The reviewed local workflow is reachable from Repository settings → Submodules → Ignored files to a local submodule…. Candidates come from git status --porcelain=1 -z --untracked-files=all --ignored=traditional and every one is proven individually by git check-ignore -v -z --stdin, which is deliberately run without --no-index so a tracked path — including a force-added file that matches an ignore pattern — can never be proven ignored and therefore can never be selected. The exact source file, line, and pattern that proves each row is shown beside it. No .gitignore is ever parsed by the app.

Every check is fail-closed, with its own named reason: not-proven-ignored, symbolic-link, reparse-point, not-regular-file, git-control-path, nested-repository, path-escape, duplicate-selection, destination-case-collision, inside-destination, and stale-inventory. The destination folder adds empty, absolute, segments, git-control-path, existing-submodule, repository-root, unsafe-link, occupied, and ignored. One refusal refuses the whole operation.

Copy and hash proofs finish before any topology change. The phases run validate → hash-originals → recovery-copy → stage-copy → initialize-repository → topology → final-verification → cleanup: each staged copy is verified by size and SHA-256 while the parent repository is still strictly read-only, and the first index mutation anywhere — the new repository's own commit — happens only after every proof passes. The single git submodule add follows it and leaves the submodule and .gitmodules staged, not committed, with ./<path> recorded as the URL so no machine path is committed.

The ignored working files remain byte-for-byte at their exact original parent-repository paths; final verification re-hashes each one and the workflow has no code path that writes to an original. Independent recovery copies are written under <git-dir>/desktop-material/ignored-submodule-recovery/<run>/, outside the working tree, with a manifest, and are removed only after every original passes final verification — any failure retains them and names the directory in the error and in the UI.

Creating the local repository and submodule uploads no Cheap LFS object, creates no provider repository, adds no remote, converts nothing into a pointer, and pushes nothing; the dialog states each of those to the user before the confirmation button and a source test asserts the module imports and references none of that code. Release/OCI storage selection, upload, pointer conversion, remote creation, and push remain a separate explicit opt-in phase which is not built. Also still outstanding: merge to main, publication, and headless screenshot acceptance. Focused coverage is 36/36 (9 pure planning, 22 real-Git, 5 dialog), tsc and configured ESLint are clean, and the behaviour is documented in docs/features/repository-management/ignored-files-to-local-submodule.md.

July 25 Repository list bulk actions — Implemented on a branch, not merged

The repository side sheet gained a multi-select mode: a checkbox per row, a select-all that covers exactly the filter-visible rows, a selection-count bar, and Escape or Clear to leave. The selection can fetch, pull, favorite or unfavorite, assign or clear a custom group, and be removed from the list. Fetch and pull are submitted one reviewed single-repository batch at a time through the existing batch-sync path, so the store still revalidates every id and applies its per-repository pull review; a determinate N-of-M progress row shows each repository's status and can be cancelled between repositories, with the in-flight repository always allowed to finish and the rest reported as not started. Removing repositories is confirmation gated, names every repository, and never deletes on-disk content. The picker is registered as its own audited bulk surface with its safety exclusions. Details in HANDOFF.md and docs/features/repository-management/repository-list-bulk-actions.md.

July 25 Cheap LFS cloud compression installs its own workflow — Implemented on a branch, not merged

A repository could have cloud compression switched on and still compress nothing. Every entry point wrote the managed caller into the working tree and then asked the user to commit and push it; GitHub Actions only sees committed files, so the one step that made compression real was the step that silently never happened. Enabling compression, opening the Large files manager, and the automatic materialize pass now each detect a committed caller — never a working-tree file — and, when one is missing, write the canonical workflow, commit it with Add Cheap LFS cloud compression workflow / 加入雲端壓縮工作流, and push it in the background without blocking whatever the user is doing.

Nothing that already exists is ever overwritten. A caller that differs from the canonical one is reported through a non-blocking notice offering a confirm-class one-click update; a file the app does not own is left completely alone. The push reuses the existing batching machinery and its proofs — the remote tip is asserted before the push and re-read from the remote afterwards — and reuses the first-publish anchor when the branch has never been published. A branch that has diverged from its remote is committed but deliberately not pushed, so a background push can never publish local commits the user has not reviewed. The one failure this provokes that nothing else does, GitHub refusing a .github/workflows push without the workflow scope, is named explicitly with its fix instead of being relayed as a raw refusal. Thirty tests cover every detection and publish decision, the full-SHA action-pin contract, and an end-to-end install against a real repository with a real local bare remote.

July 25 Bundled-Git hooks, silent abort, and the 100k path cap — Implemented, locally accepted

Re-running the headless end-to-end against a build carrying the first-publish fix (issue #38) proved the bootstrap push and the EBUSY race were gone and exposed the next three defects. A repository with the stock Git LFS hooks could not push at all under the app's bundled Git: hook interception asked Git to read the hook's standard input from /dev/stdin, which the native Windows Git build cannot open, so every intercepted hook died with exit 128 before the hook ran. The payload is now written to a real file and that path is handed to Git, which fixes every hook that reads standard input and also lets a hook script re-open its own standard input under the bundled shell; separately, the app-generated first-publish anchor push — a create-only publication the user never authored — runs with --no-verify, while every reviewed push still runs hooks. A failed anchor used to abort the commit with the reason recorded only in a log file, so the commit button simply sprang back; the reason now reaches the per-file rows, the commit terminal summary, and a persistent non-blocking notice in English and Cantonese, with any credential-bearing Git text scrubbed first. Finally, the batching adapter refused any repository over 100,000 paths, blocking a real 212,569-file publish; that ceiling is a memory bound only and is now 600,000, derived from measured parse cost, with the raw-diff and path-inventory stdout budgets raised in lockstep so they cannot silently become the real cap. The per-batch 10,000-path and 1.4 GB ceilings are unchanged. Details in HANDOFF.md.

July 25 Cheap LFS anchor before the release review — Implemented on a branch, not merged, not live-verified

The third headless end-to-end pass (issue #38) left one defect. GitHub answers the releases API with [] for a repository that has no commits at all, even when releases exist on it, so the review a Cheap LFS commit acted on was not stale but wrong: the anchor push un-hid the pre-existing buckets mid-flight and the per-mutation review guard correctly aborted every in-flight upload. The release route now guarantees a commit exists remotely before anything is reviewed — bootstrapping one empty commit (Initialize repository for Cheap LFS / 開荒留名, no invented file content) when the local branch is unborn — then re-fetches the complete inventory, fingerprints it, and only then pins. The guard stays fail-closed for every change after that re-review, a capped or unreadable inventory yields no review rather than a false one, and an already-published repository takes no extra review at all. The same pass records the tracking ref and upstream the create-only anchor push does not set, so the toolbar stops offering "Publish branch" for a branch it just published. Committed on fix/bootstrap-before-review; a merge, a push, and a fourth live end-to-end pass are still outstanding. Details in HANDOFF.md.

July 25 Cheap LFS first publish and push race — Implemented, locally accepted

A headless 200k-file end-to-end (issue #38) proved three defects on the release storage route. Pinning during a commit created the bucket release against the local branch name, so on a never-published repository GitHub answered 422 Validation Failed for every file; the release is now anchored by publishing the branch tip first and re-reading the remote ref to prove it, and every genuinely blocking condition refuses with an actionable reason instead of retrying into another 422. The commit-batching snapshot's scratch index was cleaned with an unconditional recursive delete that raced its own 14-second git add -A, so a Windows EBUSY thrown from a finally masked the real error and aborted the push before any network I/O; cleanup now waits for a live lock to be released, never unlinks one, and never fails the operation. Per-file pin failures now carry their provider status and sanitized reason into the commit terminal rows, the summary, and the notification in English and Cantonese, so pinned 0 · failed 10 can no longer settle without a cause. An oversized GitHub Actions response during the launch update check is also a handled, once-per- session notice rather than a generic "background action stopped unexpectedly" toast. Details in HANDOFF.md.

July 24 trampoline token lifecycle — Implemented, locally accepted

A production log showed repeated Tried to use invalid trampoline token rejections after a timed-out remote-HEAD refresh overlapped a submodule fetch, surfacing as "a background action stopped unexpectedly" toasts and random Cheap LFS failures on very large commits. Credential-trampoline tokens now live until the Git process they were issued for actually exits rather than until the promise that started it settles, and a command bearing a no-longer-valid token is declined with a reply and a context-bearing warning instead of an unhandled rejection that left Git wedged on an unclosed socket. Details in HANDOFF.md.

July 25 updater downgrade guard — Implemented, locally accepted

The reported 3.6.2 downgrade was traced to a stale local Squirrel bootstrapper re-run (--install . --checkInstall), not the update feed and not a version comparer; the live feed only ever advertised 3.6.3-beta3-zadtorqoxa. As defence-in-depth the app now refuses a feed whose highest entry is older than the running build, and both release lanes filter the published RELEASES down to this package at exactly this version.

July 24 feature discoverability — Implemented, pushed

Buried features surfaced additively: six new command-palette commands (Sound settings, GitHub API explorer with un-hide, tag lifecycle, Cheap LFS settings, per-repo automation, Ollama chat), the Repository Settings tab relabelled "Build, run & large files" with an explicit Cheap LFS section heading, and settings-search entries for the Ollama manager/chat, global ignore, and Git hooks. Deliberate skips (standalone Ollama tab, auto-fix toggle) are recorded with reasons in HANDOFF.md. The standalone Ollama tab was subsequently built and is no longer a skip — see the July 25 entry below.

July 25 standalone Ollama settings tab — Implemented, locally accepted

Settings gains a real Ollama rail tab whose pane renders the Ollama model manager and its chat workspace directly, with no dependency on Copilot access, an account, or a Copilot licence. When no Ollama provider is configured the tab shows a setup state — a loopback-validated endpoint field, a health-check Connect action, and short guidance — instead of any Copilot sign-in content; connecting persists the same managed provider record the Copilot provider dialog creates, so both routes manage one endpoint. The palette's Ollama model manager and Ollama chat commands and the Ollama settings-search results now open this tab. The existing Preferences → Copilot → Providers route is unchanged. Details in [docs/features/integrations/ollama-model-manager.md](docs/features/integrations/ ollama-model-manager.md).

July 26 dedicated Cheap LFS settings tab — Implemented, locally accepted

The Cheap LFS preferences (storage provider, auto-pin, auto-download, parallel uploads, cloud-compression consent) moved from the combined "Build, run & large files" tab into their own Cheap LFS tab in Repository Settings, right after Build & run (which regained its plain name). The shared IBuildRunPreferences model and Save flow are unchanged; the palette command and the Large files manager's settings action now open the new tab directly. Targeted suites 43/43 and 80/80, tsc clean; docs and User Guide updated. Details in HANDOFF.md.

July 24 mega wave — Implemented, locally accepted

Five backlog features built in parallel by isolated Opus agents, each adversarially reviewed, then integrated: recorded narration wiring (the 243 bundled voice/melody assets now play at runtime with a serialized non-overlapping queue and live-TTS fallback), distinct SFX event mapping (push/fetch/pull and Build & Run phases each get their own motif), deterministic repository-themed music (Git-backed persistence with localStorage migration), safe Git auto-fix (classified auto/confirm/manual remediations, never destructive automatically), and native large-repository handling (gc/maintenance suppression across operations, stale-lock removal, explicit status-computing state, missing-repo polling suspension, wired idle repack). Plus: stash-inventory search with the full regex builder, and a responsive contract that stops small dialogs clipping the regex builder. Details in HANDOFF.md.

July 24 settings search — Implemented, locally accepted

A search box in the Settings dialog rail filters a bilingual catalog of settings by title, description, and keyword across every tab, highlights matches, badges and dims tabs by match, and jumps to the owning tab on select. Reuses the shared fuzzy/substring/regex filter control and regex builder (registered preferences surface). Fully localized (English / Cantonese / bilingual), keyboard- and screen-reader-accessible, tone-neutral. tsc clean; new filter/matching tests 15/15 with registry and i18n suites still green. Detail in HANDOFF.md; feature doc under docs/features/identity-and-workspace/settings-search.md.

July 24 tab-strip overflow dropdown — Implemented, locally accepted

When the repository tab strip overflows, the tabs that no longer fit move into a keyboard-accessible "more tabs" dropdown instead of clipping or scrolling sideways. A contiguous run of tabs stays visible, the active tab is guaranteed on screen, collapsed-group chips stay pinned, and every per-tab appearance customization is preserved in both the strip and the dropdown rows. Split geometry lives in a DOM-free, unit-tested module (tab-overflow.ts, 11 cases); npx tsc --noEmit is clean. English/Cantonese/bilingual copy and docs shipped.

July 24 optional audio system — Implemented, locally accepted

An opt-in, off-by-default audio layer: a bilingual (English + Cantonese) TTS narrator, Web Audio synthesized sound effects, and per-repository looped music, all gated in a new Settings → Sound pane. Event routing runs through the in-app notification centre; a pure decideAudioActions enforces rate-limiting, per-category cooldown, quiet hours, reduced-sound, and screen-reader coexistence, with errors always clear and never suppressed. Narrator tone scales with a per-language funny-level (1–5). tsc clean; 31 new unit tests pass. Details in HANDOFF.md and docs/features/design-system/audio-system.md.

July 24 Local GitHub Actions runner — Implemented, locally accepted

A new Repository ▸ Run actions locally… dialog (and "Run Actions locally" command-palette entry) discovers and parses a repository's .github/workflows, feature-detects act+Docker with localized install guidance when either is absent, and streams a chosen workflow/event/job run locally — supporting workflow_dispatch inputs, per-run secrets (ephemeral 0600 --secret-file, never logged or placed on the argv), a dry-run (-n) preview, and cancellation with full container-tree teardown. Pure workflow-parsing and act-argv engines are unit-tested (31 cases); tsc is clean. When a workflow contains a release-upload step the dialog surfaces a guarded notice; a local run never touches real releases.

July 24 batching dual caps, commit progress, and gc isolation — Implemented and locally verified

July 23 cross-lane updater recovery — Verified

Commits 241cc90ce9 and 04246fdf12 moved both release lanes into one Squirrel-monotonic alphabetic z namespace and removed the legacy comparer's decimal Int32 overflow. Exact-source CI 29977738533 and installer run 29978844761 succeeded; the latter published six-asset exact-target Release v3.6.3-beta3-zadtberjmv. A live installed 3.6.3-beta3-s000000000201 build automatically downloaded and applied it. Super Express run 29980281736 then published the greater same-SHA v3.6.3-beta3-zadtbhvdfc, and the isolated legacy UI visibly progressed from Downloading update… to Quit and Install Update. The detailed receipt is in HANDOFF.md.

July 23 Cheap LFS + push batching — Live acceptance and serialization correction complete

Focused local evidence passes 80/80 Release/OCI operations, 77/77 registry transport/runtime cases, 117/117 disposable-Git batching cases, 157/157 UI/settings/localization cases, 8/8 ORAS scripts, 19/19 headless-verifier contracts, and 7/7 compact-shell style checks. The final first-publication production build returned 0 after 400.46 seconds (404.3 seconds wall) and produced out/renderer.css with SHA-256 6381556b36c295ba47ad90e8080f4079cbc61951bd7811ab9cb9fc3520638cb1. That is the historical initial c3db37ea55 receipt. The corrected exact-source build returned 0 after 390 seconds wall (Yarn 387.64 seconds) and produced a 1,179,200-byte out/renderer.css with SHA-256 6fba1434112ea5c02256a12e6ce8af42f5c870f0db5835155acb8075708d9d28.

The promoted 1440×960 English Cheap LFS frame is 113,869 bytes with SHA-256 3d6358567126e3ce0504b04c4489abbfd473b77546bd82dac834553d50fe9333. All 36/36 named assertions, including noBlockingDialog, passed; one real pointer selection settled the over-limit diff and the frame proves all three worker rows. The final 640×960 bilingual frame is 85,175 bytes with SHA-256 1b99c827d1b5b2cf05298fb1255873acdf0502f72a40437c378c0be7bb989e50. It also passed all 36/36 named assertions after one real pointer attempt, kept the progress surface at y=942 inside the y=944 panel, and used only the compiled source bundle with no diagnostic style injection.

The corrected compact Repository Releases proof ran at 100%, 125%, 150%, and 200% in one 960×660 physical viewport. The promoted 200% frame is 89,856 bytes with SHA-256 8e29ac666a0832d353126d8dd759200ba7e853016a940501e5c7cbdbb1cf992a; its 480×330 CSS viewport shows one complete 53.5 px release row, 24-hour HH:mm timestamps, a wrapping bilingual disclosure, and no horizontal overflow. The 125% case now activates the 800×560 compact gate at 768×528 CSS; every compact scale measures a 176 px panel, at least a 52 px row, 30 px target floors, a 9 px text floor, three metric columns, and the latest card spanning two. Native Enter expanded and collapsed the compact tools; available actions retained focus semantics and the no-next-page pagination control remained correctly disabled. The gallery source now contains 77 inspected images.

The historical initial combined changed suite passed 151/151. The corrected Releases style/localization/UI plus Pages contracts pass 55/55. A final 152-test integrated rerun ran for 693 seconds without an observed failure, then was stopped cleanly during the disposable-Git batching suite at the user's explicit immediate-push request; no aggregate pass is claimed and the complete rerun remains a handoff item.

The full Cheap LFS folder aggregate remains deliberately reported as 261/262 only because one wall-clock policy case exceeded its harness budget under concurrent heavy Git work; its isolated rerun passed 8/8. The older 1,466.27-second build and its failed narrow attempt remain labeled as historical interim evidence in the dated local receipt. Historical initial integration commit c3db37ea55 is an ancestor of current corrective source c22e29a03a, which preserves every updater receipt commit. The responsive correction raises the compact pane's text/control floors, lets bilingual disclosure copy wrap, localizes its new controls, and widens the combined compact gate for 125%. Its exact-source build, four-scale headless geometry/keyboard proof, original-pixel review, capture promotion, and owned-resource cleanup passed locally. Cloud run 30055965804, CI 30055965807, CodeQL 30055965809, and Pages 30055965817 passed for exact c22e29a03a; installer run 30057456712 published immutable six-asset exact-target Release v3.6.3-beta3-zadthusbjk. The Bambu cloud, manifest verifier, immutable manifest Release, and initial 10/10 fresh-clone hash proof are complete; only the serialized-materialization rerun and final image remain open.

July 22 tab groups, command palette, and input/release reliability — Implementation and publication verified

M27 — Reviewed pull previews — Implementation, acceptance, and publication verified

Toolbar and application-menu pulls now fetch first and open a blocking review of the exact current/upstream refs and OIDs, ahead/behind topology, effective Git integration strategy, and bounded incoming commit/file summaries. Confirmation revalidates the frozen identity, strategy configuration, and clean worktree, then integrates the reviewed upstream commit without a second superproject fetch. Detached, dirty, conflicted, stale, failed-fetch, busy, and unsafe fast-forward-only states remain non-destructive. Focused tests, TypeScript, lint/format checks, the production build, and an isolated off-screen Win32 pull exercise passed. Exact-source CI, CodeQL, Pages, synchronized wiki, and the six-asset Windows x64 Release are verified for the main push recorded in HANDOFF.md.

M26 — Cheap LFS / Express Release — Live cloud Actions/UI and source publication verified

July 21 CI lint newline repair — Local verification complete; remote verification pending

July 21 pull-preview and Cheap LFS hardening — Locally verified

July 21 Settings queue and mobile connection — Implementation complete; publication verification pending

July 21 responsiveness hardening — Local implementation complete

Publication verification is pending.

M25 — Repository-bound API functions — Implementation complete; verification pending

Agent HTTP API — Implemented (part of M25–M26)

Platform support

Desktop Material is Windows-only. The supported product gates are Windows x64/arm64 builds, the Windows x64 full-unit and packaged-E2E lanes, and the Windows x64 installer/portable-ZIP release workflow. macOS and Linux application runtimes and packages are outside the roadmap; non-Windows runners may still host platform-neutral repository automation.

2026-07-21 maintenance — Codex CLI build repair — Implementation complete; integration verification pending

Failed Build & Run stages and free-form repository requests can use Codex or OpenCode, with a provider choice persisted per repository. Codex detection is shell-free. Noninteractive work uses bounded stdin context, a workspace-write sandbox, explicit per-run approval policy, ephemeral state, ignored user config and rules, disabled lifecycle hooks, bounded streaming, and renderer-owned process-tree cancellation. Trusted project Codex config remains part of the repository trust boundary because Codex CLI 0.144 has no verified blanket MCP- disable override. Installation and authentication stay explicit: the UI shows the official npm package command and terminal login guidance, never asks for a credential. Agent completion never implies success — Desktop Material reruns the selected Build & Run profile unless the user cancels; Stop suppresses that rerun. See the feature guide at [docs/features/integrations/local-ai-build-fix.md](docs/features/integrations/ local-ai-build-fix.md).

M24 — Guided sparse checkout — Local acceptance complete; publication verification pending

The existing bounded cone-mode sparse-checkout operation is now a persistent Choose/Adjust/Restore → Review selection flow with search, fuzzy filtering, preview counts, zero-match protection, and confirmed execution. Sparse files are tracked alongside the normal commit history and survive repo moves. See the feature guide at [docs/features/repository-management/sparse-checkout.md](docs/features/ repository-management/sparse-checkout.md).

M23 — Full Ollama manager — Complete; published

A purpose-built local Ollama lifecycle workspace separates health/version, installed inventory, running state, and selected-model details. Supports search/filter, streamed pull with cancellation, copy and guarded rename, load/unload, and confirmed delete. Synchronizes the authoritative installed inventory back to the provider's selectable Copilot model list. Endpoint validation requires one terminal /v1, permits only an exact loopback base, and rejects remote hosts, arbitrary prefixes, credential-bearing URLs, queries, and fragments. See the feature guide at [docs/features/integrations/ollama-model-manager.md](docs/features/integrations/ ollama-model-manager.md).

M22 — Owner-scoped management and complete visual refresh (July 19–20, 2026) — Implementation complete; visual acceptance in progress

Owner-scoped appearance customization via anchored right-click editors. Each owner stores one bounded versioned setting.json in its own local Git repository below the app's ppearance-elements user-data root. The General Appearance page holds ordinary preferences only; Repository Settings has no Appearance tab. Toolbar and typography owners are separate with full font/color controls. Tab strip follows a guarded organization contract with pinned tabs, inverse-close matching, drag/keyboard movement, and stable sorts.

M21 — Advanced workflow completeness (July 19, 2026) — Complete

M21 closes the 30 demand-backed workflow gaps identified in the July 19 research brief. The canonical item-by-item map is at [docs/features/github-desktop-demand-backlog.md](docs/features/github-desktop- demand-backlog.md). Implementation extends existing account, repository, Git, provider, store/dispatcher, and Material UI contracts without introducing a new application HTTP endpoint.

M20 — Platform wave (July 17–18, 2026) — Complete

Platform support hardened: Windows x64/arm64 builds, full-unit and packaged-E2E lanes, installer/portable-ZIP release workflow.

Ongoing maintenance

Current maintenance acceptance

The following items track the current cycle's progress against all six acceptance gates:

Feature / Gate Status Key Evidence
Cross-lane automatic updater migration Complete; both release lanes and installed UI verified 241cc90 introduced the shared lane and 04246fdf corrected the legacy integer-overflow boundary. CI 29977738533, installer run 29978844761, Super Express run 29980281736, two six-asset exact-target z… Releases, automatic s000000000201 migration, and the real download/ready UI are verified.
July 22 tab groups, palette, Alt, and release gates Complete; source publication verified Source contracts cover persistence, pin-boundary safety, portable-export stripping, three language modes, rich palette rows/appearance, deterministic bare-Alt sequencing, the then-current Super Express test-before-build contract, and release-PR main targeting. The production build and off-screen acceptance passed; source f7b4760a13 passed CI, CodeQL, Pages, synchronized wiki publication, and exact-tag six-asset Release verification. The owner superseded only the emergency-lane test contract on August 2 with an explicit zero-test direct release path.
M26 Cheap LFS / Express Release Complete; live public/private UI and source publication verified Retained public/private repositories contain pushed UI-created raw pointers and exact 1 MiB draft-release assets. Public automatic setup and private explicit opt-in produced successful Actions runs 29969707165 and 29969957449; each bot commit adopted a verified 1,033-byte part-deflate asset while retaining raw history. Both compressed pointers restored through the production UI to SHA-256 30e14955…; failed public run 29967844734 left its raw pointer cloneable and UI-materializable. Source f7b4760a13 passed CI, CodeQL, Pages/wiki publication, cleanup audit, and exact-tag six-asset Release verification.
July 21 Settings queue and mobile connection Implementation complete Verified empty-account copy, persisted-policy hydration, required-directory validation, parallel/sequential changes, enable/disable dispatch, English/Cantonese/bilingual rendering, responsive-surface registration
July 21 responsiveness hardening Local implementation complete Deterministic regressions verified for remote scan terminator, late termination rejection, same-URL proxy coalescing, strict clone barrier, every prompt family, 500-update burst, failed request-ID reuse, and 25 Markdown reloads
M25 Repository-bound API functions Implementation complete Built-in function seeding verified; function-button execution tested; per-repository rail visibility persistence checked; responsive Explorer styles verified
Agent HTTP API Implemented All eight shipped route patterns audited; all 24 static command names verified; unit coverage spans REST forms, MCP discovery and calls, dynamic named functions, token rejection/rotation, Host/Origin policy, body limits, pairing expiry, device revocation, LAN mode boundaries, gateway policy, browser-link generation, unavailable-mode handling, queue bounds, shutdown, and redaction
M24 Guided sparse checkout Local acceptance complete Verified case-insensitive literal inverse-close matching, counts/preview/zero-match protection, pinned-tab safety, drag and keyboard movement, pin-group boundaries, stable one-shot label/opened/status sorts, persisted order, focus, announcements, and multi-window isolation. The current tab milestone also adds a reduced-motion-safe before/after drag preview and a bounded, persistent recently-closed tab history with restore/forget/clear actions; focused UI/store coverage is green, while the hosted Windows build remains the release gate.
Actions workflow-run cancellation Complete Verified exact repository/account/run revalidation, cancellable-status gating, one normal cancel request with duplicate suppression, accepted-response polling, stale and terminal transitions, bounded provider errors, focus return, and compact confirmation layout
Reviewed current-branch rebase Complete Verified target search, current→target and ahead/behind context, bounded commit preview, fresh dirty/conflict/operation guards, exact ref/SHA revalidation, cancel-before-start, conflict continue/abort routing, protected-branch guidance, and no automatic force push
Provider account binding and OAuth scope alignment Complete; Git transport routing verified locally Verified repository-settings binding propagation without reopening, unique-match auto-binding, explicit multiple-account choice, no-match/stale/permission/SSO recovery, generation safety, no silent replacement of a valid binding, and the bounded repo user workflow notifications read:org sign-in scope set. HTTPS fetch, pull, push, post-push refresh, scheduled sync, refspec fetch, and remote-HEAD routing now preserve the exact stable repository account key; unbound organization remotes prefer a verified write-capable identity and missing explicit bindings fail closed
Compact Repository Tools, Remote Manager, and Regex Builder Complete Verified vertical reachability at short heights; readable remote name/URL/control columns before a stacked fallback; reflowed Regex Builder categories/tokens with a scrollable body and reachable footer; named controls, focus, zoom, and no page-level horizontal overflow
Detailed Pull All progress Complete Verified live per-repository state, bounded concurrency, completion summary, keyboard/accessibility semantics, compact-window containment, focused and full-suite coverage, the exact production build, and inspected off-screen evidence on main
Clone-style Add Submodule Complete Verified hosted-provider and URL selection, exact-account affinity, reviewed relative path/branch, duplicate and occupied-path rejection, bounded progress, cancellation, list refresh, keyboard labels, and minimum-window containment
Repository-wide feature revalidation Complete The historical revalidation verified the registered-surface and M0–M19 implementation inventory, focused and repository-wide tests, production builds/packages, isolated headless interaction, exact-SHA CI and installer runs, Pages, the seven-page wiki, and its then-current 52-image documentation gallery
Live Bambu build Cheap LFS acceptance Remote storage, clone integrity, and serialization correction complete A public 14,809,588,162-byte, 8,305-file payload completed four proven UI batches after an HTTP 408 retry, cloud run 30048474438 reported 13/0/0 with raw fallback retained across 26 assets, UI commit 712ad85 passed verifier 30054805137, and a fresh UI clone restored 10/10 hashes from 370–514-byte committed pointers. The first automatic/manual overlap prompted a normalized-checkout queue now covered by deterministic concurrency regressions; the live ten-pointer UI frame is promoted separately from the clone hash receipt.
Documentation gallery expansion 86-scene Windows target assembled; picker implementation pushed; final hosted publication pending; historical evidence retained separately The published 77-scene history remains intact. Four upstream repository-list/tab scenes plus the accepted restore, app-hosted authentication, private-repository lock, updater-ready, History-hover, and Publish-organization captures established the current gallery. The machine-checked plan now declares 86 Windows targets: 66 canonical and 20 specialist outputs, including the accepted Publish organization picker frame and the dedicated dark bilingual repository-sheet owner. Every additional current-source replacement remains fail-closed until captured, inspected, and promoted. Five Linux/Xvfb captures remain byte-for-byte historical evidence outside its rows, Pages figures, and capture plan without making Linux a supported target. The legacy updater-migration frame stays pinned to its immutable July 22 blob. The distinct current-source updater-ready frame is accepted from runtime source b069384ad7d8a65d1192ee06859a705fe484c9c8 and published by e3967f1b81ec039624500797dca40a1ab6d98598; its inspected 960×660 PNG is 47,086 bytes with SHA-256 0fc9caf5b13eb5b914121090f403c394545e02ea4303b11dd4598afcb3a2dfca. Publish organization implementation commit 63c1ec08c4f24f85d87f21d98851dcd5784c7800 is proven on origin/main; the retained receipt and regenerated parity input follow in the provenance correction push. Existing images remain in place unless a new deterministic capture passes original-resolution privacy inspection. Historical TUI correction commit f555d374a6 is in origin/main; its lane results do not block the Windows product.
Complete notifications and Releases dashboard Complete Verified every GitHub notification page, confirmed local/remote Clear all with partial-failure retention, release status metrics and loaded-result search/filtering, rich asset metadata, scoped retries, responsive layout, and inspected headless evidence

Acceptance gates

A roadmap or maintenance item is complete only when all applicable evidence is present:

  1. The implementation is reachable from a named UI, CLI, or agent workflow.
  2. Focused tests cover success, failure, cancellation/stale state, and safety boundaries appropriate to the feature.
  3. TypeScript, lint, formatting, repository-wide tests, and production build pass.
  4. UI work passes desktop and compact-window keyboard, focus, screen-reader, scaling, overflow, and clipping checks.
  5. Privacy-safe screenshots are inspected at original resolution and published in the relevant README, wiki, Pages, and tutorial surfaces.
  6. The exact commit is pushed to main, remote CI/Pages are green, and any temporary branch/worktree is removed only after merge verification.

Evidence index