Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
c794ffc
fix(dev): make alpha2 web validation portable
mattheliu Aug 30, 2026
409564d
fix(a11y): restore alpha2 modal focus ownership
mattheliu Aug 30, 2026
7615cb8
ci: keep alpha2 fork checks on standard runners
mattheliu Aug 30, 2026
7546b3b
test(ci): refresh alpha2 PowerShell evidence
mattheliu Aug 30, 2026
3cc585a
fix(a11y): stabilize PowerShell startup evidence
mattheliu Aug 30, 2026
2359d51
feat(a11y): add core keyboard browser contracts
mattheliu Aug 30, 2026
616d177
fix(ci): preserve accessibility browser invocation
mattheliu Aug 30, 2026
dc9cc8d
fix(ci): preserve accessibility evidence contracts
mattheliu Aug 30, 2026
dd2b73e
feat(a11y): complete keyboard menu contracts
mattheliu Aug 30, 2026
0fe9464
fix(shell): respect terminal-owned PowerShell prompts
mattheliu Aug 30, 2026
37e3d91
test(ci): stabilize snapshot readiness evidence
mattheliu Aug 30, 2026
e1dcf98
fix(acp): stabilize session option publication
mattheliu Aug 30, 2026
e40a4e2
feat(a11y): expose checked menu choices
mattheliu Aug 30, 2026
acb3fb0
feat(a11y): expose shell landmarks and splitters
mattheliu Aug 30, 2026
3546bc2
feat(a11y): make session views keyboard operable
mattheliu Aug 30, 2026
b1c7a98
feat(a11y): make trajectory navigation keyboard operable
mattheliu Aug 30, 2026
e1f08a8
feat(a11y): harden guided interaction flows
mattheliu Aug 31, 2026
854b150
feat(a11y): announce durable interaction states
mattheliu Aug 31, 2026
7840772
feat(a11y): add stable headless output
mattheliu Aug 31, 2026
da17dde
feat(a11y): own modal and selection focus
mattheliu Aug 31, 2026
e09cc86
fix(a11y): separate file tool actions
mattheliu Aug 31, 2026
d1c6409
fix(a11y): restore environmental accessibility contracts
mattheliu Aug 31, 2026
0ea4ab1
fix(a11y): make JSON inspection keyboard operable
mattheliu Aug 31, 2026
098b069
fix(a11y): unify safety dialog focus
mattheliu Aug 31, 2026
210e0fd
fix(a11y): complete subagent tree navigation
mattheliu Aug 31, 2026
73a4797
fix(a11y): preserve pending message landmarks
mattheliu Aug 31, 2026
dea4c01
fix(a11y): correct context meter disclosure semantics
mattheliu Aug 31, 2026
be791ab
test(a11y): version core browser evidence
mattheliu Aug 31, 2026
33eb2d9
fix(a11y): address central evidence schema
mattheliu Aug 31, 2026
5803bfc
ci(a11y): retain versioned browser evidence
mattheliu Aug 31, 2026
70a8eee
merge: port accessibility core to DSH 0.1.2-rc.1
mattheliu Sep 7, 2026
59f648b
docs(a11y): record rc1 migration evidence
mattheliu Sep 7, 2026
33546ce
test(a11y): close rc1 release gates
mattheliu Sep 7, 2026
f298fa7
test: refresh PowerShell web tool prompts
mattheliu Sep 7, 2026
21859d9
test: reopen sidebar before settings focus route
mattheliu Sep 7, 2026
1e7f105
test(web): align queue accessibility snapshots
mattheliu Sep 7, 2026
2fa51c2
Checkpoint accessibility migration onto DSH 0.1.5-rc.2
mattheliu Sep 22, 2026
b11b37b
Adapt accessibility core to DSH 0.1.7-alpha.1
mattheliu Sep 22, 2026
41074ff
fix(a11y): align alpha.1 validation with current CI contracts
mattheliu Sep 22, 2026
2f7eaf7
fix(a11y): handle catalog entry keys once and close merge check gaps
mattheliu Sep 22, 2026
0f8480e
test: respect concurrent account reads and coverage lane budget
mattheliu Sep 22, 2026
1e53eed
Merge DSH 0.1.7-rc.2 and preserve accessibility interactions
mattheliu Sep 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Bilingual-pair consistency record for 2026-08-31-assistive-technology-headless-output.md (docs/i18n/README.md): per heading
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
# After editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-31-assistive-technology-headless-output.md
/agent-note-stable-headless-output-for-assistive-technology:
en: 6e9bcae87ea6daee
zh: 9ccd6b7b2178bba4
/agent-note-stable-headless-output-for-assistive-technology/problem:
en: 10fb4193f3d09a51
zh: f11dfdc8b429ae35
/agent-note-stable-headless-output-for-assistive-technology/decision:
en: 3dccdfe707f0d1b3
zh: 511272ead669f001
/agent-note-stable-headless-output-for-assistive-technology/alternatives-considered:
en: a31183851911049d
zh: c162bbb4b8adacb2
/agent-note-stable-headless-output-for-assistive-technology/consequences:
en: bda10e92e1fbe9b8
zh: 1ea2f1c85a17f519
/agent-note-stable-headless-output-for-assistive-technology/testing:
en: e7889aaaf7a64ad4
zh: cee6444f5efa4142
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Agent Note: Stable headless output for assistive technology

Status: implemented

English | [中文](2026-08-31-assistive-technology-headless-output.zh.md)

## Problem

The product one-shot command streamed every provider reasoning delta to stderr. A screen reader could therefore announce token-sized fragments for the duration of a task, while carriage returns, terminal escape sequences, BEL, or other controls in model text could trigger redraw behavior or unwanted terminal feedback. The command also exposed only an unversioned final-text projection, so accessibility conformance automation had no stable process result to inspect after the durable turn boundary.

Assistive-technology use and versioned accessibility verification require a stable final result, not a second CLI application or a Session-event stream.

## Decision

`dsh --profile headless` owns two output flags through its existing app command-line provider. `--accessibility` selects a text presentation with no color, spinner, cursor movement, updating counter, or reasoning deltas. It writes `dsh: task started` and exactly one durable terminal-state line to stderr. The final assistant text remains on stdout after terminal escape sequences, C0/C1 controls, carriage-return redraws, and BEL are removed; newlines and tabs remain. Error diagnostics use the same sanitizer and collapse to one line. Default text mode retains its existing reasoning stream and final-text behavior.

`--output-format json` writes exactly one newline-terminated `dsh-headless-result` object to stdout after the owned Session interval is flushed and writes no outcome diagnostics to stderr. Version `1.0.0` carries `type`, `schemaVersion`, `status`, `text`, and `reason`. `status` is `completed` only for a durable completed turn and `failed` otherwise. `reason` projects completed, structured error, aborted cause kind, blocked, max-tokens, interrupted, and missing-turn outcomes; merge-extensible reasons become `{ "kind": "other", "name": <durable-kind> }`. A direct runner failure becomes an `INTERNAL` error result. JSON mode suppresses reasoning independently of `--accessibility`; when both flags are present, JSON remains the sole output presentation.

The mode establishes process-output properties, not assistive-technology compatibility evidence. Evidence for a named screen reader, terminal, operating system, speech configuration, and disabled-user workflow remains a separate recorded artifact.

## Alternatives considered

**Make low-noise output the default.** Rejected because existing terminal users and diagnostics deliberately consume streamed reasoning, and changing stdout or stderr without an explicit flag would break the product command's current behavior.

**Keep reasoning and add periodic accessible summaries.** Rejected because token fragments would still dominate a screen reader queue and could expose sensitive reasoning in logs. One start line and one durable terminal line are bounded and correspond to authoritative state.

**Restore the former CLI demo or stream every Session event as JSON.** Rejected because that would recreate a second application or enlarge the public protocol beyond the current consumer. Accessibility automation needs one final result, while SDK and ACP already own persistent machine control.

**Treat sanitized output as proof of screen-reader support.** Rejected because automated bytes cannot observe speech order, focus, terminal settings, user comprehension, or independent task completion.

## Consequences

Accessibility mode intentionally changes model text that contains terminal control bytes; users who need the exact original bytes use default text or JSON. JSON strings retain their content through JSON escaping and never become terminal controls on the output line. Scripts can parse one format without combining stdout and stderr, and incompatible future result changes require a new schema version.

The product now has a keyless, versioned CLI output target for accessibility conformance checks, but real NVDA, JAWS, Narrator, VoiceOver, and Orca evidence remains outstanding until named testers record it. The default command continues to carry the privacy and verbosity cost of reasoning output by explicit compatibility choice.

## Testing

Package tests pin default compatibility, reasoning suppression, control sanitization, bounded status lines, every built-in non-completed outcome, direct failures, single-line JSON, schema version, command parsing, help, and invalid formats. The built `dsh` acceptance starts the shipped headless profile against the mock provider and verifies default, accessibility, and JSON presentations through the published entry.
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Agent Note: 面向辅助技术的稳定 headless 输出

Status: implemented

[English](2026-08-31-assistive-technology-headless-output.md) | 中文

## Problem

产品的一次性命令会把提供方的每个推理增量流式写入 stderr。读屏软件可能因此在整个任务期间播报 token 粒度的片段,而模型文本中的回车、终端转义序列、BEL 或其他控制字符可能触发重绘或非预期终端反馈。该命令还只暴露没有版本号的最终文本投影,因此无障碍符合性自动化无法在持久化轮次边界之后检查稳定的进程结果。

辅助技术使用和版本化无障碍验证需要稳定的最终结果,不需要第二个 CLI 应用或 Session 事件流。

## Decision

`dsh --profile headless` 通过既有应用命令行提供方拥有两个输出 flag。`--accessibility` 选择一种没有颜色、spinner、光标移动、持续更新计数器或推理增量的文本展示。它向 stderr 写入 `dsh: task started`,再恰好写入一个持久化终态行。最终 assistant 文本仍在移除终端转义序列、C0/C1 控制字符、回车重绘与 BEL 后写入 stdout;换行与制表符保留。错误诊断使用同一清理器并折叠为一行。默认文本模式保留既有推理流与最终文本行为。

`--output-format json` 在所属 Session 区间 flush 后,向 stdout 恰好写入一个以换行结束的 `dsh-headless-result` 对象,且不向 stderr 写入结果诊断。`1.0.0` 版本包含 `type`、`schemaVersion`、`status`、`text` 与 `reason`。只有持久化完成的轮次将 `status` 设为 `completed`,其余均为 `failed`。`reason` 投影 completed、结构化 error、aborted 原因种类、blocked、max-tokens、interrupted 与缺少轮次的结果;merge-extensible 原因变成 `{ "kind": "other", "name": <durable-kind> }`。runner 直接失败时得到一个 `INTERNAL` error 结果。JSON 模式独立于 `--accessibility` 抑制推理;两个 flag 同时出现时,JSON 仍是唯一输出展示。

该模式建立进程输出属性,而不是辅助技术兼容性证据。针对具名读屏软件、终端、操作系统、语音配置与残障用户工作流的证据,仍须作为独立制品记录。

## Alternatives considered

**把低噪声输出设为默认值。**不采用,因为现有终端用户与诊断会刻意消费流式推理;在没有显式 flag 时改变 stdout 或 stderr 会破坏产品命令的当前行为。

**保留推理并添加定期无障碍摘要。**不采用,因为 token 片段仍会占满读屏队列,也可能在日志中暴露敏感推理。一个开始行与一个持久化终态行具有数量上界,并对应权威状态。

**恢复原 CLI demo 或把每个 Session 事件流式输出为 JSON。**不采用,因为这会重新创建第二个应用,或让公开协议超出当前消费方所需。无障碍自动化只需要一个最终结果,持久机器控制已由 SDK 与 ACP 负责。

**把经过清理的输出当作读屏支持证明。**不采用,因为自动化字节无法观察语音顺序、焦点、终端设置、用户理解或独立完成任务。

## Consequences

无障碍模式会刻意改变包含终端控制字节的模型文本;需要精确原始字节的用户使用默认文本或 JSON。JSON 字符串通过 JSON 转义保留内容,不会在输出行上变成终端控制。脚本可以解析一种格式而不必拼接 stdout 与 stderr;未来不兼容的结果变更需要新的 schema 版本。

产品获得了一个可供无障碍符合性检查使用的无密钥、版本化 CLI 输出目标,但具名测试者记录之前,真实 NVDA、JAWS、Narrator、VoiceOver 与 Orca 证据仍然缺失。出于显式兼容选择,默认命令继续承担推理输出的隐私与冗长成本。

## Testing

包级测试固定默认兼容性、推理抑制、控制字符清理、有界状态行、每种内建非完成结果、直接失败、单行 JSON、schema 版本、命令解析、帮助与无效格式。构建后的 `dsh` 验收通过发布入口,以 mock 提供方启动随附 headless profile,并验证默认、无障碍与 JSON 展示。
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Bilingual-pair consistency record for 2026-09-07-rc1-accessibility-core-migration.md (docs/i18n/README.md): per heading
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
# After editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-09-07-rc1-accessibility-core-migration.md
/agent-note-version-pinned-accessibility-core-migration:
en: 245b138de031c204
zh: 8cc0f81b56584edb
/agent-note-version-pinned-accessibility-core-migration/problem:
en: 3901a4a2216b852f
zh: 870eb122d2d16f97
/agent-note-version-pinned-accessibility-core-migration/decision:
en: 6e5efb0ce0793ac8
zh: b0bd1abe0ffb61fb
/agent-note-version-pinned-accessibility-core-migration/alternatives-considered:
en: d47a133a52f654b5
zh: a3c91dc01b443ef4
/agent-note-version-pinned-accessibility-core-migration/consequences:
en: 35ba1d5174f6b780
zh: b260f84540a103b2
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Agent Note: Version-pinned accessibility core migration

Status: implemented

English | [中文](2026-09-07-rc1-accessibility-core-migration.zh.md)

## Problem

The released accessibility candidate and its automated evidence describe DSH `0.1.2-rc.1`. The official `0.1.5-rc.2` line changes the right sidebar, menu placement, Assistant stream events, persisted fixture generations, and dependency packaging. Reusing old evidence would claim coverage for different code; copying the old layout would discard current product behavior.

## Decision

The migration starts at official tag `dsh-v0.1.5-rc.2`. Current upstream owns Session and layout state. Component owners retain native semantics, keyboard composites, focus containment and restoration, quiet live announcements, and bounded headless text or JSON output.

The new right sidebar owns expansion; the outer frame only reports its geometry. Its named splitter resizes with Arrow keys, selects its width limits with Home and End, and restores the default width with Enter. Explicit expand/collapse actions transfer focus between the same Session's controls without stealing a newer focus owner. A hidden right pane is inert. The left splitter remains keyboard-restorable while collapsed. Narrow frames remove width transitions so newly focused rail controls cannot scroll a clipped intermediate column.

The model menu waits for portal placement before moving focus. File actions retain separate disclosure and preview controls; previews now open the current right sidebar, not the former native file-open path. Accessibility fixtures use the current recorded `session.v3.jsonl` without modifying older generations.

## Alternatives considered

**Change package version strings only.** Rejected because compilation cannot prove portal focus, keyboard navigation, hidden controls, or the assembled preview route.

**Restore the old Details panel.** Rejected because it would replace upstream ownership and remove current sidebar behavior.

**Move required semantics into the companion plugin.** Rejected because post-render diagnostics cannot reliably reconstruct component-owned focus and durable Session boundaries.

**Reuse the earlier candidate's browser record.** Rejected because evidence identifies exact product revisions, not a reusable compatibility label.

## Consequences

The fork and companion must pass their own checks and a clean, exact-revision, three-engine assembled run before publication. The earlier candidate and its evidence remain historical artifacts. The versioned browser-evidence decision remains active; this migration changes its product baseline, not its protocol or the distinction between emulated and real assistive technology.

Unit, browser, geometry, contrast, motion, and headless checks do not establish VoiceOver, NVDA, braille, switch input, real zoom, or independent disabled-developer completion. Human evidence remains open. New sidebar viewers and the separate Desktop surface require their own task evidence; the legacy P0 suite is not a claim of exhaustive accessibility.
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Agent Note: 固定版本的无障碍核心迁移

Status: implemented

[English](2026-09-07-rc1-accessibility-core-migration.md) | 中文

## 问题

已发布的无障碍候选版本及其自动化证据描述的是 DSH `0.1.2-rc.1`。官方 `0.1.5-rc.2` 修改了右侧栏、菜单定位、Assistant 流事件、持久夹具代际和依赖打包。复用旧证据会把不同代码错误地声明为已覆盖;复制旧布局则会丢弃当前产品行为。

## 决策

迁移从官方标签 `dsh-v0.1.5-rc.2` 开始。Session 与布局状态以当前上游为准。组件所有者保留原生语义、键盘复合控件、焦点约束与恢复、低干扰实时播报,以及有界的 headless 文本或 JSON 输出。

新的右侧栏拥有展开状态;外层框架只报告其几何信息。具名分隔条通过方向键调整宽度,Home 与 End 选择宽度边界,Enter 恢复默认宽度。显式展开或收起会在同一 Session 的控件之间转移焦点,不抢占更新的焦点所有者。隐藏的右侧面板进入 inert 状态。左侧分隔条在收起时仍可通过键盘恢复。窄框架移除宽度过渡,避免新聚焦的轨道控件滚动尚被裁切的中间栏宽。

模型菜单等待 portal 定位完成后再移动焦点。文件操作继续区分展开详情与预览控件;预览改为打开当前右侧栏,而不是原来的系统文件打开路径。无障碍夹具使用当前已录制的 `session.v3.jsonl`,不修改较早代际。

## 考虑过的替代方案

**只修改包版本字符串。** 否决,因为编译不能证明 portal 焦点、键盘导航、隐藏控件或组装后的预览路径。

**恢复旧 Details 面板。** 否决,因为这会替换上游的所有权并删除当前侧栏行为。

**把必需语义移到配套插件。** 否决,因为渲染后的诊断无法可靠重建组件拥有的焦点和持久 Session 边界。

**复用此前候选版本的浏览器记录。** 否决,因为证据标识精确产品修订,不是可复用的兼容性标签。

## 后果

分叉与配套插件必须通过各自检查,以及干净、固定精确修订的三引擎组装测试,才可发布。此前候选版本及其证据继续作为历史产物保留。版本化浏览器证据决策继续有效;本次迁移改变其产品基线,不改变协议或模拟环境与真实辅助技术的区分。

单元、浏览器、几何、对比度、动效和 headless 检查不能证明 VoiceOver、NVDA、盲文、开关输入、真实缩放或残障开发者独立完成任务。真人证据继续开放。新增侧栏查看器与独立 Desktop 表层需要各自的任务证据;既有 P0 套件不是全面无障碍声明。
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Bilingual-pair consistency record for 2026-08-31-versioned-core-browser-accessibility-evidence.md (docs/i18n/README.md): per heading
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
# After editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write .agents/notes/implemented/testing/2026-08-31-versioned-core-browser-accessibility-evidence.md
/agent-note-versioned-core-browser-accessibility-evidence:
en: 9903cfb9b69bbd4c
zh: 6780d850094147e9
/agent-note-versioned-core-browser-accessibility-evidence/problem:
en: 0c7978e9e852bb26
zh: 451e63e237196954
/agent-note-versioned-core-browser-accessibility-evidence/decision:
en: 2da2894707a929a5
zh: dd00bbe5f52588cc
/agent-note-versioned-core-browser-accessibility-evidence/alternatives-considered:
en: 02bd9c8a4c487ff4
zh: 5fc71334f664cc3a
/agent-note-versioned-core-browser-accessibility-evidence/consequences:
en: 31e6d7176e050664
zh: 3c19207be2c39b79
Loading
Loading