Releases
v1.39.0
Compare
Sorry, something went wrong.
No results found
yaleh
released this
07 Oct 14:43
1.39.0 (2026-10-07)
New Features
AC-234: record a run's source from caller.via, add mcp to ChatRunSource (6588622 )
AC-235: address runs by runId — runsById summaries, aborted status, injectable retention/clock (663ece7 )
activity-dock: AC-190 人工关卡 —— 记录小节 + 只读取证脚本 + 护栏判据 (ce37f20 )
activity-dock: stop a task and background a foreground tool from the dock (AC-199) (d544ce2 )
chat: chat.background-task control verb addressing the Turn Tracker (AC-197) (cbc6e10 )
chat: chat.stop-task control verb with event-driven confirmation (33771d5 )
chat: collapse control-verb ownership onto one entry, rework cancel-queued (6c5d766 )
chat: draw the turn's status in the message flow at every viewport (7fd3598 )
chat: execute ui.navigate by this device's policy (bd2170a )
chat: join a streamed block by blockKey on the client (9d0ac64 )
chat: make the activity dock tell the truth when the server is unreachable (75a06bf )
chat: move the resident process facts from the dock's arrow to a pill in the header (f27f9a8 )
chat: read-only mode for sessions held by a Claude Code background job (d81cbf4 )
chat: remove composer resident switch; intent applies only to new sessions (8b944e6 )
chat: replace the drawn scrollbar and turn rail with an input outline drawer (bd39344 )
chat: session store absolute-index window model (64bf293 )
chat: show this session's background tasks in the transcript (65bebd9 )
chat: title the collapsed work segment with action, count and elapsed (e18c57e )
claude: give live streaming frames a block-level identity (03a8e9e )
claude: hand each session its own Claude Code title at launch (94f74a7 )
claude: refuse an occupied session on the per-run path too (86aa952 )
debug-agent: resident control queue — driver hands over the queued uuid (51760ea )
device-identity: announce the browser's identity on every WS connection (22db8cb )
mcp-gateway: AC-252 self-referential write guard (980fe05 )
mcp-gateway: add approvals_list / approval_answer tools (AC-274) (44d3ede )
mcp-gateway: add ui_clients_list read tool (56cee44 )
mcp-gateway: audit every tool call to mcp_audit_log with 90-day retention (AC-244) (10c053c )
mcp-gateway: declare @modelcontextprotocol/sdk and zod as dependencies (AC-239) (4a2d0ab )
mcp-gateway: declare accurate MCP tool annotations for every tool (2eb4afa )
mcp-gateway: expose GET /api/settings/mcp-audit readback (AC-304) (0659f40 )
mcp-gateway: implement session_cancel_queued (AC-271) (25bf66c )
mcp-gateway: implement session_create and session_interrupt (AC-250) (061da3d )
mcp-gateway: implement session_reconfigure (AC-272) (6f3d6a1 )
mcp-gateway: implement session_start/session_close over resident host service (AC-251) (7f73cd5 )
mcp-gateway: make a reference that names nothing an error (AC-287) (15530fc )
mcp-gateway: name the missing scopes in an INSUFFICIENT_SCOPE denial (AC-286) (6eb734c )
mcp-gateway: OAuth-aware /mcp auth with discovery challenge (AC-263) (30f45ad )
mcp-gateway: session_send returns a runId at once (AC-249) (224e864 )
mcp-gateway: stage-3 read tools over the injected services (AC-245) (85db940 )
mcp-gateway: stateless /mcp endpoint gated by MCP_ENABLED, mounted before static (AC-240) (4df2d93 )
mcp-smoke: AC-256 嵌套冒烟取证通道 + --check-record 判据 (6dd9de0 )
mcp: AC-273 session_background lists and stops held background work (1e9fcff )
mcp: add ui_open_session — open a session in a chosen browser device (7f54cf7 )
oauth-consent: re-confirm the password and rate limit it per source (e9c60b3 )
oauth-consent: render the authorization screen as an SPA (8bdfc15 )
oauth: AC-259 authorization-server semantics (49ba2a6 )
oauth: add access_tokens table and personal access token service (ccb96e7 )
oauth: DCR registration policy and manual client creation (AC-264) (0157c13 )
oauth: mount the authorization-server HTTP surface end to end (AC-268) (714adb5 )
oauth: move the consent screen to the SPA behind a JSON contract (cf9d805 )
oauth: rate limit consent password submissions per source (AC-261) (74f3e83 )
oauth: settings routes for grants and clients (AC-265) (ad80150 )
oauth: validate access-token scopes against a single vocabulary (fb85d0b )
oauth: 每个 oauth/mcp 请求留下一条无密日志 (f294161 )
providers: add Claude Schedule Tracker (AC-192) (431b60d )
providers: add lease deriver and AC-195 frame-by-frame parity criterion (78f1b30 )
providers: add per-session Claude Turn Tracker (AC-186) (cea23b7 )
providers: emit a transcript row on a background task's terminal transition (bf7e44f )
providers: incremental session history cache parses only appended tail (8f7a264 )
providers: mirror a settled ai-title into the resident peer registry (ce36452 )
providers: read a message window around an id (b8e0187 )
providers: session turn outline endpoint (AC-209) (f94161c )
quay: add Stage goals, Task ledger, Tests and Fan-in panel cards (05f8afc )
quay: add task/ADR detail lists and wire the dashboard link (8a501dd )
quay: project quay status display (sidebar badge + read-only panel) (df88baf )
resident: start a resident session on demand instead of binding it (3123e56 )
server: retire /api/agent and the plaintext api_keys mechanism (AC-226) (c31eba8 )
session-hosts: extract resident host start/close into a reusable service (b2cdbf6 )
settings: /api/settings/access-tokens create/list/revoke routes (7eb8bfc )
settings: connected apps and OAuth clients sections (AC-266) (4b7601b )
settings: per-device MCP navigation policy and device name (a8f8b5e )
transcript: terminal row only for real background tasks, one line, no segment break (ce4da55 )
voice: capture pre-VAD raw audio for a passive corpus (d34758a )
voice: carry dashscope-omni usage counts into meta.usage and the transcribe log (2d85084 )
voice: label what the user changed between the dictation and the send (def6c58 )
voice: ship the browser recogniser same-origin from a directory path (d9a896d )
voice: stage-0 readout report and its criterion (c67b34b )
voice: 客户端本地识别适配器接入同一 ASR 缝(locality 'local-client') (ec485c1 )
websocket: activity snapshot protocol with rev, REST + whole-snapshot WS upsert (6695421 )
websocket: ChatControlService.send returns runId immediately (AC-230) (4187dc2 )
websocket: five chat control verbs share one injectable access entry (AC-232) (7d92177 )
Bug Fixes
AC-233: keep the chat.send refusal synchronous across the control-service seam (5cc59b4 )
activity-dock-human-gate: unpin the guard test from the pre-acceptance state (71645e0 )
activity-dock: drop the dead backTask that red the repo lint stage (4c0f4fe )
activity: attach the activity feed on activity.subscribe, not chat.subscribe (dcafe32 ), closes #1
activity: heartbeat carries run-in-flight bit so an idle phase no longer clears a live turn anchor (b9b177d )
chat: activity dock with no session ignores other sessions' frames (29298db )
chat: address every transcript row, and make the active view readable on both layouts (635d34d )
chat: collapse Reasoning trigger-to-body gap with the body (696ff8f )
chat: give landscape phones a height tier so the transcript survives (00a1f52 )
chat: guard ResizeObserver in the rail's new column and scrollbar (4dddb4a )
chat: ignore activity.heartbeat control frame; make merge immune to id-less rows (6a5ba32 )
chat: keep the outline handle clear of header and composer, show it on mobile (357a43d )
chat: make the replay cursor run-aware so a reconnect can replay a new run (c61e42b )
chat: name the debug agent in a message header instead of Claude (18b6924 )
chat: narrow the short tier to touch-only devices (faba31e )
chat: rebuild the resident host on edit-send instead of appending into it (2ea22ce )
chat: retire optimistic user echo when its persisted copy arrives over the socket (08ceae5 )
chat: retire the project draft a first resident send was typed in (cc658ae )
chat: wrap the AskUserQuestion "Other" answer and stop the hint covering it (96ace60 )
claude: hand over only a title the session actually has (db76a05 )
claude: project real cross-session messages past the isMeta gate (f51943d )
css: stop global rules from overriding the elements they style (5e0fbca )
debug-agent: make a per-run scenario turn a run, so the merged activity sources see it (915e92a )
drivers: cap the full-suite runner's own scope at 24G (4cf98d8 )
drivers: pin PATH so the launcher starts the plugin it selected (1f4353b )
e2e: stabilize AC-171 criterion under load and mid-run HMR (5fee2e1 )
i18n: give the Quay tab a real label in all 12 locales (e536fee )
mcp-gateway: keep the OAuth switch literal out of index.ts prose (AC-263) (34d1be2 )
mcp-gateway: name the ui_open_session requester instead of null (ff0568e )
mcp-gateway: run audit retention sweep after the database is initialized (ba9eb2c )
mcp-gateway: spell the debug-agent gate vars through constants (AC-249) (1c4a85e )
mcp-smoke: 补 JSDoc 注解让 scripts/tsconfig 的类型检查回绿 (8997645 )
mcp-smoke: 补齐 JSDoc 类型,scripts typecheck 回绿(AC-256 AC11) (f04f689 )
oauth: let the consent form's redirect through CSP, refuse unregistered redirect_uri (3ad2edf )
oauth: let the consent redirect chain through, and offer the whole scope vocabulary (1bf3cd8 )
providers: key the resident turn phase by the app session id (2d1c7f6 )
providers: refuse resident launch when a Claude Code bg job holds the session (1943cf9 )
quay: give the panel's two responsive grids a base column count (807b848 )
quay: resolve quay CLI per project root instead of the server PATH (f4d7422 )
quay: stop reading a healthy task store and a failed read as the same thing (14d0a6b )
resident: re-read projected peer name after the title mirror moves the registry (bf7c2f0 )
scripts: require ~/.local/bin on the server unit's PATH (3c76d1c )
scripts: run the :3001 server as a fixed systemd user unit, stop copying PATH (76fdb28 )
server-test-lane: hold undici's 18 bad ports for the whole per-file process (15e021a )
sessions: prune superseded prompt branches anchored on the turn's branch point (8e0acb6 )
sidebar: apply session-name filter to sessions named after their first upsert (e3a0855 )
sidebar: apply the project session filter to live Conversations upserts (298f1af )
sidebar: keep Conversations list live on session upserts (2d43736 )
sw: leave the OAuth and MCP paths alone; never resolve respondWith with undefined (b44b778 )
test: AC-163 withdrawal client must send the required requestId (bf19009 )
voice-trim: resolve the @/ alias in run-savings.mjs for plain node (518b92b )
voice: attribute AC-148's real-db reading by /proc handle ownership, not timing (686ce3f )
voice: load the AudioWorklet from the bundler's build, not the raw .ts source (a474797 )
voice: mint attempt ids per process instance and never overwrite a recording (55b63cf )
voice: scope the AC9 residue reading by pid in the capture-audio criterion (e37f951 )
voice: the saved recogniser, not the shared backend, decides the route (eefd3d4 )
voice: 客户端 ASR 缝的三处回归(registry-first id、脚本夹具、pause-cues 断言) (6431d17 )
websocket: unref the activity beat and re-project the hello announcement (9ffe827 )
workspace-menu: mount the dropdown's rows only while it is open (3fcdbce )
Refactoring
chat: move the held-work lease helper to shared utils (4b1c33a )
claude: migrate claude-runtime.provider.js to TypeScript (no behavior change) (76a2a06 )
Documentation
AC-172: record the 2026-10-03 retirement of the status bar lease-count keys (2c5abe6 )
activity-dock: record the GOAL-014 human acceptance (AC-190) (36cb2ec )
activity-dock: record the GOAL-015 human acceptance (AC-201) (351066f )
activity-dock: step 4 of the AC-201 gate reads the capability disposition (6b98be4 )
chat: analyse and design observability of Claude background work (7903a5d )
chat: analyse the doubled streamed segment and design block-keyed streaming (9ed7134 )
chat: design one truthful activity dock for Claude sessions (8188e5c )
chat: mark the sequence/snapshot protocol design as deferred (fac1213 )
chat: record rulings and follow-up measurements for the activity dock (ec73d2a )
chat: record the e2e fixture design for the truthful activity dock (0c4ee14 )
claude: record the title-guard DoD legs and the host's title behaviour (fb73601 )
experiments: voice-draft E-A 引用重建的结果(机械与人读) (0f6626d )
experiments: voice-draft E-A 引用重建的预注册、抽取规则与运行脚本 (849505c )
experiments: voice-draft E-A2 抽取清洗更正与 TTS 失败处理 (31ead77 )
experiments: voice-draft E-A2 用上一轮输出校正识别错误的预注册与脚本 (013f9f8 )
experiments: voice-draft E-A2 结果,用上一轮输出校正识别错误 (f6be060 )
experiments: voice-draft E-C 事后敏感性分析的标准答案(仅口述可推出的核心诉求) (227c816 )
experiments: voice-draft E-C 标准答案第二版(含独立标注比对)与口述脚本 (800b0c9 )
experiments: voice-draft E-C 结果(预注册判定与事后敏感性分析) (9b40c3c )
experiments: voice-draft E-C 追问链的核心诉求标注(作者版,先于独立标注提交) (230d7f1 )
experiments: voice-draft E-C 预注册与运行脚本 (40695ce )
experiments: voice-draft E-C2 带认知类型的草稿——预注册、标准答案与运行脚本 (01120a8 )
experiments: voice-draft E-C2 结果(带认知类型的草稿:机械指标与盲评) (35fe407 )
experiments: voice-draft E-C3 一次调用抽取加代码渲染——预注册、流水线与运行脚本 (c57132d )
experiments: voice-draft E-C3 结果(一次调用抽取加代码渲染:机械指标与盲评) (7dea3b8 )
experiments: voice-draft E-C4 修省略的回答——预注册、新案例脚本与流水线 v2 (1868aa2 )
experiments: voice-draft E-C4 新案例运行脚本 (643fe36 )
experiments: voice-draft E-C4 第一批 hold-out 结果(v2:保留问加答) (80ecf93 )
experiments: voice-draft E-C4b v3 修法的预注册、第二批新案例与流水线 v3 (9b6f8d7 )
experiments: voice-draft E-C4b 分析脚本(v1/v2/v3 三版本渲染) (c3afa92 )
experiments: voice-draft E-C4b 第二批新案例的结果(v3 修好省略的回答) (a9c2c06 )
experiments: voice-draft S1 与 S2 结果、人读审计与偏差记录 (09c06f6 )
experiments: voice-draft S1 与 S2 预注册及脚本标准答案 (1b71096 )
experiments: voice-draft S1 分析脚本与 S2 识别、草稿运行脚本(提示词在取数前冻结) (a85348f )
experiments: voice-draft S1 运行脚本(提示词在取数前冻结) (23d0051 )
experiments: voice-draft S2 补充 1 与 2 结果,整份草稿重写(纯文本与 JSON)的机械指标与人读审计 (0c72261 )
experiments: voice-draft S2 补充 1,整份草稿重写的预注册与运行脚本 (595a807 )
experiments: voice-draft S2 补充 2,整份重写加 JSON 输出的预注册与运行脚本 (40cd8cf )
experiments: voice-draft S2 音频生成脚本 (fd530c9 )
experiments: voice-draft 结果文档补全一处未写完的句子 (2795336 )
mcp: 人 yale 写入两条人工验收行 —— AC-257 与 AC-277 (79003c9 )
mcp: 人 yale 写入第三条人工验收行 —— AC-270 (cea9151 )
ops: correct the restart-kills-sessions claim to match SIGTERM shutdown (0560bc1 )
proposal 的活动状态与 Stop 规则改为桌面与移动一致 (0cafe92 )
proposals: mcp-gateway SPEC v3.1 — CloudCLI MCP over the session control plane (92fdd25 )
proposals: mcp-gateway SPEC v3.2 — map phases to GOAL-018..022, backfill two deviations (49bb81b )
readme: describe the fork's changes since v1.37.3, drop upstream promotion (fc4aec8 )
resident: §12 随出路 (a) 改写——地址是读来的,不是自赋的 (f3a9661 )
ui: ui_visible_context 扩展范围规划 —— 四个维度的现状与落地范围 (f557c4b )
voice: correction feedback-loop proposal + post-ASR disambiguation pilot (d9ed637 )
voice: drop the post-deploy verification scaffold (cf0a6ba )
voice: freeze the replay-stream extraction and the TTS+ASR runner before data (7337f74 )
voice: itn and language settings cannot improve segmentation (v8) (2c7b336 )
voice: pre-register round 4 - harmful errors, close-set selection, long-message sources (0df09b4 )
voice: pre-register round 5 - local SenseVoice, confidence, CTC candidate scoring, versus Omni (1bf5cf1 )
voice: pre-register round 6 with the patched sherpa engine and its patch (dcbe43f )
voice: pre-register the replay of real session input before any data (336fed4 )
voice: preregister the punctuation post-processing experiment (v7) (fb38273 )
voice: preregister the SenseVoice itn/language punctuation experiment (v8) (ba0aa8a )
voice: proposal for VAD segmentation of long and continuous voice input (72dfc52 )
voice: punctuation model does not beat SenseVoice's own punctuation (v7) (7fe3a6a )
voice: record the audio, local browser and phone engine, and rewrite-button decisions (0d080a8 )
voice: replay of real session input - flag, find, maintain, converge (6b8ebff )
voice: round 4 results - harmful errors, closed-set selection, long-message sources (b1347bf )
voice: round 5 results - local SenseVoice versus Omni (7ece83a )
voice: round 6 results - patched sherpa engine, provenance, scale rule, aliases (945ed5a )
voice: shrink VAD sweep sample sizes and cap recognition spend at 2 CNY (8525516 )
voice: state the real-db handle match as the whole -* sidecar family (b922a26 )
voice: write round-4 conclusions into the proposal (section 5.8) (34c8aae )
voice: write rounds 5-6 into the proposal - local engine, confidence, aliases, rewrite split (55749e3 )
voice: write the replay results and the tolerable-error principle back into the proposal (c826174 )
voice: 客户端 ASR 探针补真机读数;探针页加下载进度与批量上传 (a71430b )
voice: 纠错反馈回路提案修订 —— 三档标记、点词弹层与借用边界 (5e14496 )
最终报告 + 三个滚存台账(L1 81/81、L2 11/11 收尾) (ccb871b )
Styling
oauth: order the shared consent-path import after the @/ group (a9c3b91 )
Maintenance
claude: make the criterion's types and import grouping clean (2dc67d1 )
quay: declare loop.suite_runner=quay-buckets so fan-in runs the lane-aware runner (ee1b18d )
quay: drop pinned 0.14.0 native provider path/mcp_entry after init reconcile (e42cb7e )
quay: rebind native provider path/mcp_entry from plugin 0.10.0 to 0.14.0 (7425fba )
tasks: gap-ac175-criterion-red-is-uncommitted-composer-wip record AC state and completion record (6007c05 )
tasks: gap-ac242-mcp-loopback-guard-before-auth record AC ticks (99493fb )
tasks: gap-ac277-mcp-resident-human-gate 记录 AC1-5/7 与 ## Evidence(transport ABI tick) (c3968b1 )
tasks: gap-chat-control-ownership-cancel-queued ABI tick (7/7) + evidence (f6b497c )
tasks: record peer-row exemption falsification readings (94835d8 )
tasks: transcript-long-session-e2e-seed AC ticks (transported ABI bytes) (80e9ad8 )
voice-vad: fill qwen3.8-omni-flash prices so the recognition budget guard can run (aaca7a8 )
voice: drop the committed python bytecode from the SenseVoice scripts (61510b6 )
CI/CD
release: publish to npm via trusted publishing (OIDC) instead of NPM_TOKEN (c2fa2a6 )
release: upgrade npm after npm ci so the lockfile's mirror URLs still install (ed5c067 )
Tests
AC-166: give the resident (re)spawn wait measured lane-load headroom (ddecc9d )
ac286: assert the stop payload's stopped/taskId fields in leg (d) (d09a0fe )
ac287: migrate AC-284's criterion's two exempt class probes (a3a501e )
ac287: migrate AC-289's criterion and sync the count pin (4be5076 )
chat: assert DOM-node identity as booleans so a mutation fails instead of hanging (ddfaca6 )
chat: assert the survivor identity in the straddled-tool-row shape (460cb04 )
chat: cover the outline handle's pixel clamp (c78526e )
chat: model unmeasured rows with their real 100px placeholder height (e2042ac )
chat: pin the block-keyed join, its gaps, and the row key (a06a1f4 )
chat: place the turn-rail i18n completeness test in its owning module (826ee6e )
chat: split the reasoning-spacing cases so they redden independently (d15a7cf )
claude-cli-path: isolate CLAUDE_CLI_PATH for the default-path cases (44d8a3c )
claude: assert the freeze where it is, not where the design assumed it (853ff24 )
claude: measure where the name freeze actually lives (6cd3a23 )
claude: read the control's registry while the launch is still held (3121b5b )
debug-agent: derive the delivery-leg window from the observer's own measured latency (25138f4 )
debug-agent: read the withdrawn-no-round claim before the queue-emptiness claim (b12202b )
debug-agent: teach the vocabulary guard the dialect's peer origin kind (c470fde )
e2e: assert the collapsed work-segment title in a real browser (c0d6894 )
e2e: bound the mcp-settings startup path with warm-up + replay guard (1e995cd ), closes #username
e2e: bound the resident-status-bar startup path (b57428a )
e2e: composer draws no resident switch; AC2 silent-conversion regression leg (876147f )
e2e: drive ui.navigate end to end in a real browser (309e257 )
e2e: make the turn-jump criterion discriminate id from timestamp, and detach (37ae049 )
e2e: pin MCP_ENABLED/PUBLIC_BASE_URL explicitly in mcp-settings criterion (d560d72 )
e2e: print the strip's row contents and the scenario row delta (bc21e13 )
e2e: real-browser DoD reading for the task-terminal-row criterion (803ea8f )
e2e: share one budget across the first landing's two probes (84ef903 ), closes #username
mcp-gateway: make the mount-order leg measurable via GET/DELETE /mcp (615cbf3 )
mcp-gateway: sharpen AC-272 criterion readings (59d6e47 )
mcp-gateway: type the AC-287 fakes so typecheck passes (39880d9 )
mcp: cover ui_open_session in the AC-303 write-notification plan (8253025 )
names: 修 claude-session-name-authority 的 typecheck 红(挡住落地的那条) (7362011 )
oauth-consent: add the DoD visual-review legs to the consent criterion (d791d09 )
oauth: AC-226 criterion — read /api/agent + plaintext key retirement from the syntax tree (3db8b21 )
oauth: red-first criterion for /api/settings/access-tokens routes (5924ea0 )
providers: record AC-210 mutation-probe evidence in the criterion header (368d3be )
providers: record the measured limit of the not-early criterion (bb52e12 )
providers: strip the registry's runId in the unattended-turn frame projection (bed8c58 )
quay: pin the unpaged task-list read that the ledger counts aggregate (af0f1ea )
resident-status-bar: align test 3 key table with shipped badge keys (276a9c8 )
resident-status-bar: route both deliberate reloads through the bounded replay (e4703a6 )
resident: criteria for the on-demand start route and the refusal UI (41b12fb )
resident: 占位名是过渡态、且永不当地址的判据 (c2838b5 )
resident: 地址永不是 App 侧给会话的名字 (d49a682 )
session-hosts: budget covers the three boots it shelters (AC-166) (fa07717 )
session-hosts: pin the measured stopTask capability in the residentFeatures guard (3a28c2b )
session-hosts: re-project the hello's turn-phase fields in per-run parity (fec466d )
session-hosts: widen claude residentFeatures guard to the ninth field (stopTask) (12df4f4 )
settings: AC-255 MCP block + token-scope i18n completeness criterion (b470200 )
settings: guard connectedApps/oauthClients i18n completeness across locales (AC-267) (cef5aee )
suite: 服务器测试文件数 232→233,修精确计数钉 (2df26ad )
suite: 服务端测试文件精确计数钉 230/232→233/235(本任务新增 3 个服务端测试文件) (e9f0122 )
voice: AC-152 residue guard excludes concurrent harness writers, keyed on size (92664f8 )
voice: align raw falsify temp-copy prefix with the shared __criterion-falsify- convention (20d925d )
voice: complete the wholesale voiceDebug mocks for isVoiceVadEnabled (678cb92 )
voice: judge the shipped worklet by the artifact, with the defect as a false form (6ee2845 )
voice: the error vocabulary is 14 members once ENGINE_UNAVAILABLE exists (a89e19a )
You can’t perform that action at this time.