Skip to content

chore(release): merge v2/main into main for v2.11.0 - #2720

Merged
cliffhall merged 120 commits into
mainfrom
v2/chore/milestone-merge-v2.11.0
Oct 14, 2026
Merged

cliffhall merged 120 commits into
mainfrom
v2/chore/milestone-merge-v2.11.0

Conversation

@cliffhall

@cliffhall cliffhall commented Oct 14, 2026 •

Copy link
Copy Markdown
Member

Closes #2718

Milestone merge of v2/main into main for the v2.11.0 minor release, which is step 2 of the release skill. Step 1 was #2716 / PR #2717.

This is a pure merge

$ git rev-list HEAD --not origin/main origin/v2/main
079058e3 chore: merge v2/main into main for the v2.11.0 release

$ git rev-parse origin/v2/main^{tree}
ec5625bc7925884da14b13a55b8b388f05d86bb5
$ git rev-parse HEAD^{tree}
ec5625bc7925884da14b13a55b8b388f05d86bb5

The merged tree is byte-identical to origin/v2/main and reads 2.11.0. The milestone payload is complete: 46 issues closed, plus #2716. The seven unfinished automation chores (#2462, #2463, #2542, #2544, #2545, #2547, #2548) were moved to v2.12.0 before the bump.

Verification

Ledger: https://claude.ai/artifact/XYJcbYMQtrufXjUtcsy63y — one row per closed milestone issue, with what was run and what was observed, for maintainer review.

  • npm run local:gate on this tree: exit 0. Every stage passed, including all three Firefox smokes (run natively on this macOS 15 host) and Storybook (536 tests, 123 files). The Firefox smokes also passed through the smoke:web:firefox cannot launch Playwright's Firefox on macOS 27 #2625 container route (INSPECTOR_FIREFOX_SMOKE=container, playwright:v1.64.0-noble).
  • npm run pack:verify: OK — 27 files, 5.78 MB unpacked, with skills/mcpdo present. It drove web, CLI, TUI and mcpdo from the installed tarball.
  • npm audit --audit-level=high: 0 vulnerabilities in all five installs (Release 2.11.0 step 1: bump version to 2.11.0 on v2/main #2716).
  • 47 / 47 milestone issues driven from the production build. That covers the web client (headless Chromium against the --web prod server), the CLI and launcher, mcpdo, the TUI (in a real pty), and the repo tooling, where a probe made each guard fire. Most rows show the published 2.10.1 as the before.

Findings

None blocks the release, and there are no regressions.

🤖 Generated with Claude Code

cliffhall and others added 30 commits October 11, 2026 23:32
… 27 (#2625)

Playwright's Firefox cannot launch on Darwin 27, so smoke:web:firefox
timed out every local:gate run and cut off local:storybook behind it.

On those hosts the runner now executes the three engine smokes inside
mcr.microsoft.com/playwright:v<pinned>-noble, with the tag read from
clients/web/package-lock.json, over an export of the working tree. With
no Docker daemon it skips loudly (naming #2625) and exits 0 so the rest
of the gate runs. INSPECTOR_FIREFOX_SMOKE=native|container overrides.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
Step 2 now cuts the feature branch into a sibling worktree instead of
treating a worktree as optional, with the required real `npm install`
inline; step 9 removes the worktree and local branch after merge. The
AGENTS.md "When work begins" rule is updated to match.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
The --use-stored-auth refresh wrote back a server entry built from the
snapshot read before the token grant's network round trip, so a
same-server write landing meanwhile (a web OAuth flow adding an issuer
slot, switching activeIssuer) was overwritten.

Add updateOAuthServerEntry to oauth-persist-file: under the state-file
lock it re-reads the entry fresh (store-joined) on every write attempt,
applies the caller's updater, then splits and writes through the same
path as writeOAuthSections. The CLI uses it to change only the refreshed
slot's tokens, and never resurrects an entry or slot removed meanwhile.

The rollback bookkeeping now records only fields an attempt changes, so
an updater carrying forward a racing writer's secret cannot have it
clobbered by a failure-path restore.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…#2602)

findFreePort() closed its probe socket before startHonoServer bound the
port, so under load another process could take it and the server's
EADDRINUSE handler process.exit(1)'d the run. Bind :0 and read the real
port back from the URL handed to the opener, which the banner builds
from the bound port.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…2624)

The lease lived under os.tmpdir(), which follows $TMPDIR, so a gate run as
`TMPDIR=/tmp npm run local:gate` took a different lock and ran alongside a
gate already holding the lease — the overlap #2339 exists to prevent.

leaseDir() now returns /tmp/mcp-inspector-gate-lease-<uid> on POSIX and a
directory under the account's profile (from os.userInfo(), not %TEMP%) on
Windows. $XDG_RUNTIME_DIR is dropped for the same reason: a desktop session
sets it and an ssh/tmux one may not. INSPECTOR_GATE_LEASE_DIR still overrides.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…Container (#2625)

Addresses Copilot review on #2662: on a rootful Linux daemon the root-run
install left a bind-mount tree the host could not remove, and the
no-daemon skip had no automated coverage. runInContainer now takes
injectable side effects, tested for the skip, exit propagation and cleanup.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
Bump the four lockstep-pinned typescript-sdk packages (client, core,
server, server-legacy) from 2.2.0 to 2.3.1 in the root manifest and
refresh the lockfile. eventsource-parser moves 3.0.6 -> 3.1.1 to meet
the client's new >=3.0.8 floor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
The POSIX default is a predictable name in world-writable /tmp, and a
recursive mkdir adopts whatever is already there. Require a real directory
(not a symlink) owned by this uid and tighten it to 0700; otherwise take the
existing unleased-with-a-warning path. Mirrors mcpdo's assertTrustedPrivateRoot.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…ow-worktree

docs(pr-flow): always start work in a new git worktree
Addresses Copilot review round 3 on #2662: a typo'd override fell through
to host routing and could report green for a path that never ran. It now
fails closed like SMOKE_BROWSER, and a forced container run no longer
claims the host cannot launch Firefox.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
A 2.9.x save strips the secretsNamespace stamp and keeps a confidential
DCR client's client_id, but can only see the legacy ids, which adoption
already emptied. The next 2.10 save re-adopted under a fresh namespace
and purged the old one first, destroying the only copy of the client
secret, so the next token exchange failed until re-authorization.

Reads of an unstamped file and adoption now fall back, newest first, to
the namespaces its ledger records for any field the legacy ids lack, and
adoption purges the superseded namespaces only after the new stamp has
committed with those values copied under it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…2-3-1

chore(deps): upgrade the MCP TypeScript SDK to 2.3.1
…ease-tmpdir

fix(gate-lease): key the lock on a fixed per-user path, not TMPDIR
Copilot review on #2666:
- The CLI write-back now applies the rotation only while the slot still
  holds the refresh token the grant spent, so a sign-out or same-issuer
  re-authorization made during the grant is kept.
- A retry's candidate set now includes fields earlier attempts touched,
  and deletes count as ours only when the field existed, so a racer
  removing an issuer-keyed entry between attempts cannot have its
  secrets resurrected by a failing retry's rollback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…pen-port-race

test(web): bind the auto-open server to :0 instead of probing a free port
Addresses Copilot review round 4 on #2662: an unbounded docker info could
hang the gate on a wedged or remote daemon. The probe now times out after
a measured 10s (healthy: 0.07-0.12s; dead remote: 32s) and reaches the
loud skip with the reason.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…h-writeback-race

fix(cli): refresh write-back updates the fresh on-disk entry
…x-smoke-container

fix(smoke): run the Firefox pass in the Playwright container on macOS 27
…2667)

Bulk triage and board work tripped GitHub's secondary rate limit while
gh api rate_limit still showed quota. Add the pacing rule to the
Issue-driven Work Style section of AGENTS.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…ve-dcr-secret-on-namespace-remint

fix(auth): carry stripped-namespace secrets over before purging (#2630)
…github-writes

docs(agents): pace bulk GitHub writes under the secondary rate limit
…ntry (#2676)

#2666 added a joinSnapshot call with three arguments; #2671 added a fourth
fallbacks parameter. Each passed CI alone, so v2/main stopped typechecking
once both merged. The write path always holds a resolved namespace, so
there is no unstamped file to fall back from.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
Under SEP-2663 task creation is server-directed: the server decides per
request whether to return a task handle, so the client has no per-call
choice to offer. The switch is now legacy-only, gated by a new pure
offersRunAsTask(protocolEra, capabilities) helper, and the modernTasks
prop is gone from ToolDetailPanel / ToolsScreen / InspectorView.

No routing change is needed: on a modern connection InspectorClient.callTool
already dispatches through the ext-tasks pipeline (preference "allow"),
which declares the extension and follows a returned handle to completion
with the same Tasks-screen events and progress as callToolStream; on v2
"allow" and "prefer" are identical on the wire and retentionMs is v1-only.

mcpdo's --task flag cannot be hidden per era (its command tree is static),
so its help text now says it applies to legacy servers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…js (#2523)

The test-servers skill named scripts/ensure-test-servers.mjs, a path that
has never existed; the helper the scripts import lives under scripts/lib/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…OXY (#2642)

mcpdo's daemon connection and front-end authorization environments set only
`transport`, and InspectorClient always hands the transport a defined fetch,
so the transport's createProxyFetch() fallback was never reached and mcpdo
connected direct even with a proxy configured. Install `fetch:
createProxyFetch()` on both environments, as the one-shot CLI and TUI do, and
pass it to EMA leg 1 (IdP discovery and code exchange), which runs outside
InspectorClient. The --relogin clear is local-only and needs no change.

Adds a daemon test through a real forwarding proxy (proxied, and direct for a
NO_PROXY host), wiring tests for the authorize and EMA paths, and lists mcpdo
on the proxy rows in docs/environment-variables.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
… call (#2650)

pack:verify now also:
- asserts skills/mcpdo/SKILL.md is in the npm pack file list;
- ESM-resolves every bare import in the installed clients/mcpdo/build
  from inside the package (import.meta.resolve; a CJS require.resolve
  falsely fails @modelcontextprotocol/ext-tasks, which exports only an
  `import` condition);
- runs `mcpdo @test tools/call echo message:=pack-verify` through the
  packaged daemon and checks the echoed text.

The mcpdo daemon dir is shortened to a one-character name so the socket
path stays well under macOS's 104-byte sun_path limit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…00 probe (#2660)

The web backend's /api/mcp/send flattened every upstream transport
failure to `{ kind: "transport_error", error: <message> }`, and the
browser rethrew it as a plain Error. The SDK's era-negotiation probe
classifies a failed `server/discover` by HTTP status only when the error
is an `SdkHttpError`, so a 2025-only server's 400 read as a network
error and the connect failed instead of falling back to `initialize`.

The relay now carries an `SdkHttpError`'s code, status, statusText and
body as a typed `http` field, and RemoteClientTransport rebuilds the
`SdkHttpError` from it. An unknown relayed code falls back to the code a
non-OK POST throws with.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…napshot-fallbacks

fix(auth): pass empty fallbacks to joinSnapshot in updateOAuthServerEntry
A single long Protocol target (a minted resource URI) widened the whole
sidebar list, clipping every card's border and pushing its controls out of
view. The autosize ScrollArea's content slot sizes to its min-content, and
only the Network panel opted out of that; the Protocol target's non-wrapping
inner ScrollArea made the list's min-content as wide as the URI.

- EmbeddableScrollArea now constrains its content to the viewport whenever
  it is embedded, so every sidebar tab gets the rule rather than opting in.
- The compact headers of ProtocolEntry, NetworkEntry and TaskCard, and the
  Logs meta row, wrap their controls (or a long logger name) onto a line of
  their own instead of squeezing badges and buttons until their labels clip
  at the 320px minimum sidebar width. The Protocol target keeps a minimum
  scroll window, and a long subscription id scrolls in place.
- Storybook play tests at the narrowest sidebar width assert that no row,
  card, button or label overflows, for Protocol, Network, Logs, Tasks and
  Console.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
cliffhall and others added 22 commits October 12, 2026 22:45
keyring 2 rejects on a locked or inaccessible store instead of resolving
null/false, which is the contract secret-store.ts's getStrict, probe and
delete paths were already written against; v1 silently erased it.

commander also moves mcpdo's sucrase override, which pins sucrase's copy to
the root's major so mcpdo's own import resolves the same commander.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
The per-file coverage gate only judges files that reach
coverage-summary.json, and nothing checked that the report holds the files
it should. Under vitest 5 web's report collapsed from 418 files to 11 and
the gate stayed green (#2557).

verify:coverage-scope resolves each gated client's coverage include/exclude
through Vitest, expands them against the file system with Node's own glob
(never Vitest's matcher), and fails naming every declared file missing from
the report. It runs as the last step of `npm run coverage`, so local:gate and
CI's coverage job both enforce it. A coverage client it does not list fails
deny-by-default.

On v2/main every client's report matched its declaration except web's
pendingReauth.ts, a type-only module v8 has no row for; it joins web's
existing pure-type coverage excludes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…ndant ones (#2709)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…rage-file-set-guard

chore(scripts): guard the file set each coverage run measures (#2709)
…hly-dep-refresh

chore(deps): October dependency refresh (#2557)
…ones (#2712)

npm 11.19's `allowScripts` policy still runs a script that is neither
allowed nor denied, so every v2 install ran esbuild's and fsevents'
install scripts. Deny both by bare name in each install that holds them
(root: fsevents; web, cli, mcpdo, tui: esbuild + fsevents) — npm reads
the policy only from the installing project's own manifest.

Add `verify:install-scripts` to `validate:guards`: every lockfile entry
flagged `hasInstallScript` must be decided in its install's own
`allowScripts`. It reads the lockfile rather than `npm install-scripts
ls`, which CI's Node 22 npm 10.x does not have.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…alls (#2518)

npm exports every non-default config value to lifecycle scripts as
npm_config_*, whichever npmrc set it. With allow-scripts in a user's
~/.npmrc, the root install accepted it and then handed it to the
install-clients postinstall as npm_config_allow_scripts; the child
`npm install` read that as --allow-scripts on the command line, which
npm 11.19+ rejects in a project install (EALLOWSCRIPTS), so a from-source
install failed at clients/web.

The child installs now run with that one variable removed. Nothing is
lost: each child npm reads the same npmrc files itself, where the setting
is allowed.

The script's main guard compares real paths, since Node resolves symlinks
for import.meta.url but not for argv[1], so the cascade cannot skip
silently when the checkout is reached through a symlink.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…t a shell (#2518)

The symlink case now launches the fixture through a deliberate symlink
(a junction on Windows) and the plain case runs from a canonical path, so
reverting the realpath guard fails on every platform rather than only
where tmpdir happens to be an alias. Node is spawned without a shell, so
a Windows temp path containing a space is not re-split.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…2712)

npm 11.19 honours only a bare name or exact versions joined by `||` as
policy keys, and matches a registry package by the name+version in the
lockfile's `resolved` URL, not its node_modules folder. The guard
accepted any semver range and keyed on the folder, so it could pass a
policy npm ignores. Mirror npm's matcher, fail closed for a
non-registry entry without an exact `resolved` key, and skip bundled
dependencies, whose scripts never run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
… runner's npm (#2518)

CI's Node 22 bundles npm 10, which predates the allow-scripts gate, so the
real-npm cases skip or pass there whether or not the strip is wired in. A
stub npm on PATH fails whenever npm_config_allow_scripts reaches it, so
dropping the env wiring now fails on every runner.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
npm's allowScripts matcher returns "unreviewed" for a bundled
dependency unconditionally, and 11.x still runs an unreviewed script
during the bundle rebuild — so skipping them left a path no policy can
decide. Report every bundled scripted entry, with a remedy that does
not suggest an ineffective key. None exists in any install today.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…2712)

npm 11.19 also runs `prepare` for a git/file/remote dependency, and the
lockfile's `hasInstallScript` records only preinstall/install/postinstall,
so a prepare-only one passed unseen. A non-registry entry now needs an
exact `resolved` key whether or not it is flagged; link entries point at
in-repo source and stay out of scope. No install has one today.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
--preserve-symlinks-main keeps the symlink in import.meta.url, so
canonicalizing only argv[1] still skipped the cascade silently for a
checkout reached through a symlink under that flag. The symlink case now
runs with and without it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…y sources (#2712)

A bundled entry often carries no `resolved`, so a scriptless one read as
non-registry and was reported with no policy key able to clear it. Only a
`resolved` source that is not a registry tarball can run `prepare`; a
bundled entry never does, and one with no `resolved` is npm's own
registry fallback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…til npm 12' (#2712)

npm 12.0.0 (2026-07-08) runs a dependency script only when allowScripts
says `true`, so blocking is already the default there; the guard is
needed because this repo installs with npm 10 and 11.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…pts reports (#2712)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
…l-clients-allow-scripts

fix(install): strip npm_config_allow_scripts from the per-client installs
…-install-scripts

chore(deps): deny esbuild/fsevents install scripts; guard unreviewed ones
npm audit --audit-level=high reported 0 vulnerabilities in the root and
all four client installs, so no audit fixes precede the bump.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: cliffhall <cliff@futurescale.com>
Copilot AI balanced review requested due to automatic review settings October 14, 2026 03:54
@cliffhall cliffhall added the v2 Issues and PRs for v2 label Oct 14, 2026

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

This 176-file milestone release spans every client and still requires final maintainer validation of the ledger and completed CI checks.

0 open findings

What changed in this PR

Milestone merge promoting the complete v2.11.0 development tree to the release branch.

Changes:

  • Delivers coordinated fixes across core, Web, CLI, TUI, launcher, and mcpdo.
  • Expands protocol compatibility, OAuth safety, task handling, list counts, and UI resilience.
  • Adds extensive tests, dependency updates, release documentation, and validation safeguards.
File Description
scripts/​run-engine-smokes.mjs Adds containerized Firefox fallback.
docs/​environment-variables.md Documents mcpdo proxy support.
docs/​cli-smoke-testing.md Clarifies CLI argument separation.
core/​react/​useManagedTools.ts Exposes tool-list load state.
core/​react/​useManagedResources.ts Exposes resource-list load state.
core/​react/​useManagedPrompts.ts Exposes prompt-list load state.
core/​mcp/​types.ts Adds client-specific timeout remedies.
core/​mcp/​state/​managedListState.ts Tracks committed list loads.
core/​mcp/​remote/​types.ts Defines relayed HTTP errors.
core/​mcp/​remote/​remoteClientTransport.ts Reconstructs SDK HTTP errors.
core/​mcp/​remote/​node/​server.ts Relays structured HTTP failures.
core/​mcp/​node/​config.ts Rejects conflicting connection options.
core/​mcp/​node/​authChallengeFetch.ts Distinguishes denials from challenges.
core/​cli/​handlers/​skills-verify.ts Adds client-specific verification hints.
core/​cli/​handlers/​run-method.ts Supports hints and required tasks.
core/​cli/​handlers/​method-types.ts Documents required-task behavior.
core/​cli/​handlers/​connect-timeout.ts Defines CLI timeout guidance.
core/​auth/​oidcDiscoveryCompat.ts Preserves synthesized metadata identity.
core/​auth/​node/​oauth-namespace-ledger.ts Reads historical secret namespaces.
core/​auth/​challenge.ts Ignores bare HTTP 403 denials.
clients/​web/​vite.config.ts Strengthens coverage and test isolation.
clients/​web/​src/​utils/​toolUtils.ts Gates legacy task controls.
clients/​web/​src/​utils/​toolUtils.test.ts Tests task-control gating.
clients/​web/​src/​utils/​listCount.ts Formats complete and partial counts.
clients/​web/​src/​utils/​listCount.test.ts Tests list-count formatting.
clients/​web/​src/​test/​scrollAreaStoryAssertions.ts Adds overflow assertions.
clients/​web/​src/​test/​narrowSidebarDecorator.tsx Adds narrow-sidebar harness.
clients/​web/​src/​test/​integrationStorageSetup.ts Isolates integration OAuth storage.
clients/​web/​src/​test/​integration/​mcp/​remote/​remoteClientTransport-unit.test.ts Tests HTTP error reconstruction.
clients/​web/​src/​test/​integration/​mcp/​inspectorClient.test.ts Tests custom timeout remedies.
clients/​web/​src/​test/​integration/​auth/​node/​storage.test.ts Guards destructive storage tests.
clients/​web/​src/​test/​core/​react/​useManagedTools.test.tsx Tests tool load state.
clients/​web/​src/​test/​core/​react/​useManagedResources.test.tsx Tests resource load state.
clients/​web/​src/​test/​core/​react/​useManagedPrompts.test.tsx Tests prompt load state.
clients/​web/​src/​test/​core/​mcp/​state/​managedToolsState.test.ts Tests managed-list lifecycle.
clients/​web/​src/​test/​core/​mcp/​skillsVerification.test.ts Tests verification remedies.
clients/​web/​src/​test/​core/​mcp/​node/​config.test.ts Tests option conflicts.
clients/​web/​src/​test/​core/​mcp/​node/​authChallengeFetch.test.ts Tests bare-403 handling.
clients/​web/​src/​test/​core/​auth/​oauth-namespace-ledger.test.ts Tests namespace history.
clients/​web/​src/​test/​core/​auth/​challenge.test.ts Tests challenge classification.
clients/​web/​src/​hooks/​useServerCommands.tsx Updates modern task routing.
clients/​web/​src/​hooks/​useServerCommands.test.tsx Updates pagination fixtures.
clients/​web/​src/​hooks/​usePaginatedList.ts Exposes active-list load state.
clients/​web/​src/​hooks/​usePaginatedList.test.tsx Tests paginated load state.
clients/​web/​src/​hooks/​useInspectorStores.ts Wires managed load state.
clients/​web/​src/​components/​views/​InspectorView/​types.ts Clarifies task-control semantics.
clients/​web/​src/​components/​views/​InspectorView/​InspectorView.tsx Removes modern task-control prop.
clients/​web/​src/​components/​views/​InspectorView/​InspectorView.test.tsx Updates counted headings.
clients/​web/​src/​components/​screens/​ToolsScreen/​ToolsScreen.tsx Removes modern task toggle.
clients/​web/​src/​components/​screens/​SkillsScreen/​SkillsScreen.tsx Refreshes viewed skill files.
clients/​web/​src/​components/​screens/​SkillsScreen/​SkillsScreen.test.tsx Tests skill-file refreshes.
clients/​web/​src/​components/​screens/​ConsoleScreen/​ConsoleScreen.stories.tsx Covers sidebar overflow.
clients/​web/​src/​components/​groups/​ToolDetailPanel/​ToolDetailPanel.test.tsx Removes obsolete modern-task tests.
clients/​web/​src/​components/​groups/​ToolControls/​ToolControls.tsx Displays tool counts.
clients/​web/​src/​components/​groups/​ToolControls/​ToolControls.test.tsx Tests tool-count states.
clients/​web/​src/​components/​groups/​TaskListPanel/​TaskListPanel.stories.tsx Covers long task content.
clients/​web/​src/​components/​groups/​TaskCard/​TaskCard.tsx Wraps narrow task headers.
clients/​web/​src/​components/​groups/​SchemaForm/​SchemaForm.stories.tsx Covers object arrays.
clients/​web/​src/​components/​groups/​PromptControls/​PromptControls.tsx Displays prompt counts.
clients/​web/​src/​components/​groups/​PromptControls/​PromptControls.test.tsx Tests prompt-count states.
clients/​web/​src/​components/​groups/​NetworkStreamPanel/​NetworkStreamPanel.stories.tsx Strengthens overflow coverage.
clients/​web/​src/​components/​groups/​NetworkEntry/​NetworkEntry.tsx Wraps compact network headers.
clients/​web/​src/​components/​groups/​LogStreamPanel/​LogStreamPanel.stories.tsx Covers long log content.
clients/​web/​src/​components/​groups/​ConnectionInfoModal/​ConnectionInfoModal.tsx Forwards capability counts.
clients/​web/​src/​components/​groups/​ConnectionInfoModal/​ConnectionInfoModal.test.tsx Tests count forwarding.
clients/​web/​src/​components/​groups/​ConnectionInfoContent/​ConnectionInfoContent.tsx Displays capability counts.
clients/​web/​src/​components/​groups/​ConnectionInfoContent/​ConnectionInfoContent.test.tsx Tests capability counts.
clients/​web/​src/​components/​elements/​LogEntry/​LogEntry.tsx Wraps compact log metadata.
clients/​web/​src/​components/​elements/​ListPaginationControls/​ListPaginationControls.tsx Carries list load state.
clients/​web/​src/​components/​elements/​EmbeddableScrollArea/​EmbeddableScrollArea.tsx Constrains embedded content width.
clients/​web/​src/​components/​elements/​EmbeddableScrollArea/​EmbeddableScrollArea.test.tsx Tests width constraints.
clients/​web/​src/​components/​elements/​CapabilityItem/​CapabilityItem.tsx Formats partial capability counts.
clients/​web/​src/​components/​elements/​CapabilityItem/​CapabilityItem.test.tsx Tests partial counts.
clients/​web/​src/​components/​elements/​CapabilityItem/​CapabilityItem.stories.tsx Documents partial counts.
clients/​web/​src/​App.tsx Wires counts and task gating.
clients/​web/​src/​App.test.tsx Updates managed-list fixtures.
clients/​web/​server/​web-server-config.ts Avoids token-bearing error details.
clients/​web/​server/​run-web.ts Adds web version output.
clients/​web/​package.json Updates install-script policy.
clients/​tui/​tui.tsx Adds TUI version output.
clients/​tui/​src/​utils/​keybindings.ts Documents filter escape behavior.
clients/​tui/​src/​utils/​clipboard.ts Cleans temporary copy files.
clients/​tui/​src/​hooks/​useCopyKeys.ts Announces copy-file cleanup.
clients/​tui/​src/​components/​ToolsTab.tsx Reports escape ownership.
clients/​tui/​src/​components/​SkillsTab.tsx Adds TUI verification guidance.
clients/​tui/​src/​components/​ResourcesTab.tsx Reports escape ownership.
clients/​tui/​src/​components/​PromptsTab.tsx Reports escape ownership.
clients/​tui/​src/​components/​ListFilterBar.tsx Documents Escape-to-clear.
clients/​tui/​README.md Documents temporary-file lifetime.
clients/​tui/​package.json Updates ink-form and script policy.
clients/​tui/​__tests__/​useCopyKeys.test.tsx Updates copy status assertion.
clients/​tui/​__tests__/​ToolsTab.test.tsx Tests filter guidance.
clients/​tui/​__tests__/​SkillsTab.test.tsx Tests TUI verification hints.
clients/​tui/​__tests__/​ListFilterBar.test.tsx Tests Escape guidance.
clients/​mcpdo/​src/​daemon/​server.ts Supplies mcpdo verification hints.
clients/​mcpdo/​src/​daemon/​connections.ts Adds proxy and timeout wiring.
clients/​mcpdo/​src/​connection/​mcp.ts Clarifies modern task behavior.
clients/​mcpdo/​src/​connection/​ema.ts Proxies EMA OAuth traffic.
clients/​mcpdo/​src/​connection/​authorize.ts Proxies authorization traffic.
clients/​mcpdo/​src/​connection/​auth-helper.ts Preserves fresh auth locks.
clients/​mcpdo/​package.json Updates overrides and script policy.
clients/​mcpdo/​package-lock.json Locks updated transitive versions.
clients/​mcpdo/​__tests__/​ema.test.ts Tests EMA proxy wiring.
clients/​mcpdo/​__tests__/​daemon-coverage.test.ts Tests timeout guidance.
clients/​mcpdo/​__tests__/​authorize.test.ts Tests proxy and timeout options.
clients/​launcher/​src/​index.ts Advertises version option.
clients/​launcher/​README.md Documents version forwarding.
clients/​cli/​src/​handlers/​emit-result.ts Honors quiet output mode.
clients/​cli/​src/​handlers/​consume-outcome.ts Exports broken-pipe detection.
clients/​cli/​src/​completion.ts Handles completion-pipe closure.
clients/​cli/​package.json Adds install-script policy.
clients/​cli/​package-lock.json Aligns Node type dependencies.
clients/​cli/​__tests__/​tools.test.ts Tests required task tools.
clients/​cli/​__tests__/​skills-verify-cli.test.ts Tests CLI budget hints.
clients/​cli/​__tests__/​programmatic-ergonomics.test.ts Tests timeout remedy output.
clients/​cli/​__tests__/​error-handler.test.ts Updates timeout classification fixture.
clients/​cli/​__tests__/​emit-result.test.ts Tests quiet file output.
clients/​cli/​__tests__/​completion.test.ts Tests completion write errors.
.github/​workflows/​main.yml Documents coverage-scope verification.
.claude/​skills/​test-servers/​SKILL.md Corrects helper path.
.claude/​skills/​release/​SKILL.md Expands release smoke procedure.
Files not reviewed (4)
  • clients/cli/package-lock.json: Generated file
  • clients/mcpdo/package-lock.json: Generated file
  • clients/tui/package-lock.json: Generated file
  • clients/web/package-lock.json: Generated file

🧠 Review effort: Balanced


💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

@cliffhall

Copy link
Copy Markdown
Member Author

Copilot review loop closed: round 1 posted 0 findings, with no inline comments and no suppressed block. Its headline ("needs a closer look") asks only for maintainer validation of the ledger and for CI to finish, which is the approval this merge is waiting on anyway. No further rounds requested.

@cliffhall
cliffhall merged commit 074b810 into main Oct 14, 2026
9 checks passed
@cliffhall
cliffhall deleted the v2/chore/milestone-merge-v2.11.0 branch October 14, 2026 04:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

v2 Issues and PRs for v2

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Release 2.11.0 step 2: merge v2/main into main and cut the release

2 participants