diff --git a/.planning/phases/09-minimum-browser-runnable/09-50-PLAN.md b/.planning/phases/09-minimum-browser-runnable/09-50-PLAN.md
new file mode 100644
index 0000000..8d2ca4e
--- /dev/null
+++ b/.planning/phases/09-minimum-browser-runnable/09-50-PLAN.md
@@ -0,0 +1,210 @@
+---
+phase: 09-minimum-browser-runnable
+plan: 50
+type: execute
+wave: 32
+depends_on: []
+files_modified:
+ - packages-user/client-base/src/components/textboxTyper.ts
+ - .planning/phases/09-minimum-browser-runnable/09-50-SUMMARY.md
+autonomous: false
+requirements: []
+must_haves:
+ truths:
+ - 'TextContent 解析器的颜色标签语法只从 `\r[#DDD]xxxxx\r` 改为 `[c=#DDD]xxxxx[/c]`,其余标签与解析流程不变。'
+ - '`parseFillStyle` 的压栈 / 出栈语义保留:`[c=…]` 压栈并设置 `fillStyle`,`[/c]` 出栈并恢复;不新增任何方法、字段或导出符号。'
+ - '旧颜色标签入口完全消失:主循环不再有反斜杠 r 或裸回车字符的颜色分支;其它标签(`\c`、`\g`、`\d`、`\e`、`\z`、`\i`、`\n`、`\\`、`\$`)与 `${}` 表达式逐字保留。'
+ - '不改调用点、文档、测试、配置与其它文件;不运行测试、构建、浏览器或任何包管理命令。'
+ - '修改后的 `textboxTyper.ts` 保持 CRLF 换行;不修改任何既有注释,只允许新增注释。'
+ artifacts:
+ - path: packages-user/client-base/src/components/textboxTyper.ts
+ provides: '颜色标签新语法 `[c=…]` / `[/c]` 的识别,以及既有的字号、字体、粗细、斜体、等待、图标、换行、表达式与栈逻辑'
+ - path: .planning/phases/09-minimum-browser-runnable/09-50-SUMMARY.md
+ provides: '改动点、保留项、范围证明与未运行验证声明'
+ key_links:
+ - '`parse` 主循环的 `[` 分支 ↔ `parseFillStyle` ↔ `fillStyleStack` ↔ `status.fillStyle` / `addTextNode`'
+ - '`getChildableTagParam` / `getTagParam` / `indexParam` ↔ 其它标签与分行、分词、测量逻辑保持原样'
+---
+
+
+本计划只做一件事:把 `TextContent` 解析器的颜色标签语法从旧的反斜杠形式改为方括号形式。
+
+具体来说,旧的 `\r[#DDD]xxxxx\r`(含裸回车字符形式)改为 `[c=#DDD]xxxxx[/c]`;除此之外不改任何标签、不改栈 / 分行 / 分词 / 测量逻辑、不改调用点与文档、不写测试、不跑测试 / 构建 / 浏览器。
+
+Purpose: 用户已确认该语法变更是唯一目标;正确性不要求运行验证,只要求实现符合 `AGENTS.md` 与 `dev.md` 的项目约定。
+Output: 修改后的 `packages-user/client-base/src/components/textboxTyper.ts` 与 `09-50-SUMMARY.md`。
+
+
+
+@C:/Users/13194/.config/opencode/gsd-core/workflows/execute-plan.md
+@C:/Users/13194/.config/opencode/gsd-core/templates/summary.md
+
+
+
+@AGENTS.md
+@dev.md
+@packages-user/client-base/src/components/textboxTyper.ts
+
+- 结构参考:`09-49-PLAN.md`(本阶段既有计划的写法、Task 0 放行关卡与门禁风格)。
+- 只读参考:`09-CONTEXT.md` 的 D-03(执行前汇报并等待「可以执行」)、D-04(新命名需先批准)、D-06(范围由用户界定)。
+- 本计划不读取、不修改 `09-35` 至 `09-48` 的计划与 SUMMARY,不读取 `09-PARITY/`。
+- `09-49-PLAN.md` 与 `09-49-SUMMARY.md` 仅作只读结构参考(Task 0 放行关卡写法与 SUMMARY 条目风格),不修改这两个文件。
+
+
+## Artifacts this phase produces(本计划产出物)
+
+| 类型 | 名称 / 路径 | 说明 |
+|------|-------------|------|
+| 修改 | `packages-user/client-base/src/components/textboxTyper.ts` | 仅颜色标签的识别与 `parseFillStyle` 内部取值;无新增导出符号、无新增方法 / 字段 / 类型、无新增依赖 |
+| 新增 | `.planning/phases/09-minimum-browser-runnable/09-50-SUMMARY.md` | 改动点、保留项、范围证明与「未运行验证」声明 |
+| 不变 | `TextContent` 的对外接口 | `ITextContentConfig`、`TextContentTyper`、`TextContentParser` 的导出面与签名零改动;只有标签语法变化 |
+
+**无新增导出符号、无新增公共 / 受保护 / 私有方法或字段,因此不需要命名审批。**
+
+## 覆盖审计(Multi-Source Coverage Audit)
+
+| 源 | 条目 | 覆盖位置 |
+|----|------|----------|
+| GOAL(用户本次任务) | 颜色标签改为 `[c=#DDD]xxxxx[/c]` | Task 0 汇报 + Task 1 实现 + Task 2 摘要 |
+| REQ | 本阶段无 requirement ID(`requirements: []`) | Nyquist 不适用;本计划不做可运行验证 |
+| RESEARCH | 本 run 无 RESEARCH.md | 不适用 |
+| CONTEXT | D-03 先汇报等待「可以执行」;D-04 命名审批;D-06 范围不扩大 | Task 0 覆盖 D-03 / D-04;全文与 Task 1 的禁令覆盖 D-06 |
+
+
+
+
+ Task 0: 汇报改动范围与方式并等待「可以执行」
+
+ packages-user/client-base/src/components/textboxTyper.ts
+ .planning/phases/09-minimum-browser-runnable/09-50-SUMMARY.md
+
+
+ AGENTS.md
+ dev.md
+ 09-49-PLAN.md
+ packages-user/client-base/src/components/textboxTyper.ts
+
+
+ 开始任何修改之前,向用户汇报以下七点:
+ ① 要做什么:只把 `TextContent` 解析器的颜色标签语法从旧的 `\r[#DDD]xxxxx\r`(含裸回车字符形式)改为 `[c=#DDD]xxxxx[/c]`。
+ ② 为什么做:这是用户本次明确指定的唯一任务;只要求符合 `AGENTS.md` 与 `dev.md` 的项目约定,不要求正确性在运行时成立。
+ ③ 大致怎么做:只改 `textboxTyper.ts` 的 `parseFillStyle` 内部取值与 `parse` 主循环新增的 `[` 识别分支,并删除旧颜色标签的两个入口;其它标签(`\c`、`\g`、`\d`、`\e`、`\z`、`\i`、`\n`、`\\`、`\$`)、`${}` 表达式、栈、分行、分词、测量逻辑全部不动。
+ ④ 影响范围:只改 `packages-user/client-base/src/components/textboxTyper.ts`,并新增 `09-50-SUMMARY.md`;不改调用点、文档、测试、配置、STATE、ROADMAP 或其它任何文件;不提交;不运行测试、构建、浏览器、开发服务器或包管理命令。
+ ⑤ 修改方式:派发子代理执行(GSD 标准流程的执行器按本计划修改文件),非内联执行。
+ ⑥ 命名:本计划不新增任何公共 / 受保护 / 私有方法、字段、类型或导出符号,因此没有待批准的命名;既有命名一律不改。
+ ⑦ 验证形态:本计划不要求可运行的自动验证;以人工源码断言检查「新分隔符存在、旧颜色分支消失、其它标签分支逐字保留」。
+ 汇报后停下,等待用户明确回复「可以执行」四个字。只出现「可以执行」子串、转述、概括、否定句里的提及或「orchestrator 已放行」都不算放行。收到用户原话或 orchestrator 原样转发的同一串「可以执行」后,把结构化放行行 `APPROVED: 可以执行 | source: 用户原话 | time: yyyy-MM-dd HH:mm:ss` 或 `APPROVED: 可以执行 | source: orchestrator原样转发 | time: yyyy-MM-dd HH:mm:ss`(`source` 只允许这两个固定值)写入 `%TEMP%/gsd-09-50-approval.txt`,然后立即执行账户 / 时间门禁:账户为 `LHY`、`lhy` 或 `13194` 且当前时间晚于今天 22:00(`[datetime]::Today.AddHours(22)`,精确到秒)时,立即停止并报告,不开始任何修改。
+
+
+ - 汇报包含目标、原因、做法、影响范围、修改方式声明(`修改方式:派发子代理执行`)、无新增命名与验证形态七点。
+ - 未收到用户原话「可以执行」(或 orchestrator 原样转发的同一串「可以执行」)前,没有修改任何文件。
+ - 放行文件只有一行、格式为 `APPROVED: 可以执行 | source: 用户原话 | time: yyyy-MM-dd HH:mm:ss` 或 `APPROVED: 可以执行 | source: orchestrator原样转发 | time: yyyy-MM-dd HH:mm:ss`。
+ - 账户为 `LHY`/`lhy`/`13194` 且本地时间晚于 22:00 时已立即停止并报告。
+
+
+ 汇报已发出且含 `修改方式:派发子代理执行`;用户明确回复「可以执行」并已记录结构化放行行;账户 / 时间门禁已检查。
+ MISSING — Task 0 为人工放行关卡,用户明确要求本计划不运行任何命令。
+
+ 无代码产物;只完成结构化放行记录与放行关卡状态。
+ 确认放行文件只有一行 `APPROVED: 可以执行 | source: 用户原话 | time: yyyy-MM-dd HH:mm:ss` 或 `APPROVED: 可以执行 | source: orchestrator原样转发 | time: yyyy-MM-dd HH:mm:ss`(`source` 只允许这两个固定值),并确认账户 / 时间门禁已检查且未触发。
+ 用户原话回复「可以执行」或 orchestrator 原样转发同一串「可以执行」后,写入该结构化放行行并通过账户 / 时间门禁,再继续 Task 1。
+ 结构化放行状态已记录,账户 / 时间门禁已通过,后续任务可以开始。
+
+
+
+ Task 1: 把颜色标签语法改为 `[c=…]` / `[/c]`
+ packages-user/client-base/src/components/textboxTyper.ts
+
+ packages-user/client-base/src/components/textboxTyper.ts
+ AGENTS.md
+ dev.md
+
+
+ 只修改 `packages-user/client-base/src/components/textboxTyper.ts`,按下述四点实施,不得扩大范围。
+ 1. 在 `parse` 主循环中新增 `else if (char === '[')` 分支(放在 `char === '$'` 表达式分支之前),只识别两个前缀:`[/c]` 与 `[c=`。进入前必须先用 `this.text.indexOf(']', pointer)` 确认闭合 `]` 存在;找不到 `]` 时把 `[` 当普通字符累积到 `resolved`,不调用 `parseFillStyle`,不得让指针回退为 `-1`。
+ 2. 把 `parseFillStyle(pointer)` 改为从 `pointer` 指向的 `[` 读取参数:`const end = this.text.indexOf(']', pointer);` 与 `const param = this.text[pointer + 1] === '/' ? '' : this.text.slice(pointer + 3, end);`。其后的 `if (!param)` / `else` 两个分支、`fillStyleStack` 的 `pop` / `push`、`addTextNode`、`status.fillStyle` 赋值与两个 `return end` 全部保留。`if (!param)` 分支内既有的 `logger.warn(54, '\\r', pointer.toString());` 只把标签字面量 `'\\r'` 改为 `'[/c]'`,日志编号 `54` 不变;其它日志调用一律不改。
+ 3. 删除旧颜色标签的两个入口:反斜杠 switch 中的 `case 'r':`(连同其 `pointer = this.parseFillStyle(pointer);` 与 `break;`),以及主循环中的 `else if (char === '\r')` 分支。删除后反斜杠 r 与裸回车字符都不再有颜色语义;不得把 `parseFillStyle` 改接到其它标签上。
+ 4. 不得修改:其它标签分支(`\c`、`\g`、`\d`、`\e`、`\z`、`\i`、`\n`、`\\`、`\$`)、`${}` 表达式解析、`getChildableTagParam` / `getTagParam` / `indexParam`、`fillStyleStack` 之外的任何栈、分行 / 分词 / 测量 / 渲染逻辑、`ITextContentConfig`、`TextContentTyper`、`TextContentParser` 的签名与导出面。不得新增方法、字段、类型、导入或依赖。不得修改任何既有注释;如确需说明新语法,只允许新增单行 `//` 注释(遵循 `dev.md` 的注释规范)。
+ 5. 保持文件 CRLF 换行(`dev.md` 第 116 行),不得把整文件改写成 LF;尽量做最小 diff,不整文件格式化。不得运行测试、构建、浏览器或任何包管理命令。
+
+
+ - 源码中存在 `[c=` 与 `[/c]` 的识别;`[c=…]` 会压栈并设置 `status.fillStyle`,`[/c]` 会出栈并恢复。
+ - 旧颜色入口不存在:反斜杠 switch 中无 `case 'r'`,主循环中无 `char === '\r'` 分支。
+ - 其它标签(`\c`、`\g`、`\d`、`\e`、`\z`、`\i`、`\n`、`\\`、`\$`)与 `${}` 表达式分支逐字保留;`getChildableTagParam` / `getTagParam` / `indexParam` 未改。
+ - `parseFillStyle` 的 `fillStyleStack` 压栈 / 出栈与 `addTextNode` 行为保留;无新增方法、字段、类型、导出符号或依赖。
+ - 既有注释逐字未改;文件仍为 CRLF;只改本文件;未运行任何命令。
+
+
+
+ 逐项对照源码:① `parse` 主循环有 `[c=` 与 `[/c]` 的识别且先确认 `]` 存在;② `parseFillStyle` 用 `indexOf(']')` 与 `slice(pointer + 3, end)`,压栈 / 出栈与 `return end` 保留;③ 反斜杠 switch 无 `case 'r'`、主循环无 `char === '\r'`;④ `case 'c'` / `'g'` / `'d'` / `'e'` / `'z'` / `'i'` / `'n'` / `'\\'` / `'$'` 与 `${}` 分支逐字保留;⑤ 文件仍为 CRLF,既有注释未改。
+
+ MISSING — 用户明确要求本计划不跑测试 / 构建 / 浏览器;以 human-check 的源码断言代替。
+
+ `textboxTyper.ts` 只完成颜色标签语法的替换:`[c=…]` / `[/c]` 可用,旧反斜杠 r 与裸回车颜色入口已删除,其它标签与解析逻辑零改动,文件保持 CRLF,既有注释未改。
+
+
+
+ Task 2: 写入 `09-50-SUMMARY.md` 并自检
+ .planning/phases/09-minimum-browser-runnable/09-50-SUMMARY.md
+
+ packages-user/client-base/src/components/textboxTyper.ts
+ .planning/phases/09-minimum-browser-runnable/09-49-SUMMARY.md
+ AGENTS.md
+ dev.md
+
+
+ 用 Write 创建 `.planning/phases/09-minimum-browser-runnable/09-50-SUMMARY.md`(不要用 shell heredoc),使用中文、CRLF 换行(与 `09-49-SUMMARY.md` 一致)。摘要固定包含:① 改动点——颜色标签从 `\r[#DDD]xxxxx\r` 改为 `[c=#DDD]xxxxx[/c]`,`parseFillStyle` 的取值方式与主循环的 `[` 识别;② 删除项——反斜杠 switch 的 `case 'r'` 与主循环的 `char === '\r'`;③ 保留项——其它标签、`${}` 表达式、栈、分行 / 分词 / 测量逻辑、导出面与既有注释;④ 范围证明——只改 `textboxTyper.ts` 并新增本 SUMMARY,未改调用点 / 文档 / 测试 / 配置 / STATE / ROADMAP,未提交;⑤ 验证声明——本计划没有可运行的自动验证,未运行测试 / 构建 / 浏览器 / 包管理命令,正确性未在运行时验证;⑥ 命名声明——无新增公共 / 受保护 / 私有方法、字段、类型或导出符号;⑦ 放行记录——用户「可以执行」的结构化放行行与账户 / 时间门禁结果。
+ 最后自检:SUMMARY 的改动点与实际源码一致;没有把未运行的验证写成已通过;没有超出 `files_modified` 的改动。发现不一致就修 SUMMARY,不得放宽范围。
+
+
+ - SUMMARY 存在,使用中文与 CRLF 换行。
+ - 明确写出新旧语法、删除的两个旧入口、保留项与「无新增导出符号 / 无新增命名」。
+ - 明确写出只改 `textboxTyper.ts` 与新增本 SUMMARY,未改其它文件、未提交。
+ - 明确写出未运行测试 / 构建 / 浏览器 / 包管理命令,正确性未在运行时验证。
+ - 记录用户「可以执行」的结构化放行行与账户 / 时间门禁结果。
+
+
+ SUMMARY 含新旧语法、删除项、保留项、范围证明、未运行验证声明、无新增命名声明与放行记录,且换行为 CRLF。
+ MISSING — 用户明确要求本计划不跑测试 / 构建 / 浏览器;以 human-check 的文本断言代替。
+
+ `09-50-SUMMARY.md` 已写入并自检通过;范围、未运行验证与放行记录均已如实记录。
+
+
+
+
+
+## Trust Boundaries
+
+| Boundary | Description |
+|----------|-------------|
+| 执行器 → `textboxTyper.ts` | 唯一允许修改的源码文件,改动仅限颜色标签识别 |
+| 执行器 → 其它仓库文件 | 只读;除 `09-50-SUMMARY.md` 外不得写入 |
+
+## STRIDE Threat Register
+
+| Threat ID | Category | Component | Severity | Disposition | Mitigation Plan |
+|-----------|----------|-----------|----------|-------------|-----------------|
+| T-50-01 | Tampering | 颜色标签实现 | high | mitigate | 只允许改 `parseFillStyle` 与 `parse` 的 `[` 分支;其它标签分支、表达式、栈、分行逻辑逐一列入保留项并由人工源码断言核对 |
+| T-50-02 | Tampering | 修改范围 | high | mitigate | `files_modified` 只含 `textboxTyper.ts` 与 `09-50-SUMMARY.md`;不跑格式化与包管理命令;SUMMARY 记录范围证明 |
+| T-50-03 | Repudiation | 放行与验证 | medium | mitigate | Task 0 记录结构化「可以执行」放行行;SUMMARY 如实写「未运行验证」,不得写成已通过 |
+| T-50-SC | Tampering | 依赖安装 | high | mitigate | 不安装依赖、不改 lockfile、不调用 `opencode`、不执行任何包管理命令 |
+
+
+
+- `textboxTyper.ts` 存在 `[c=` 与 `[/c]` 识别;`parseFillStyle` 使用 `indexOf(']')` 与 `slice(pointer + 3, end)`,压栈 / 出栈与 `return end` 保留。
+- 反斜杠 switch 中无 `case 'r'`;主循环中无 `char === '\r'` 颜色分支。
+- 其它标签、`${}` 表达式、`getChildableTagParam` / `getTagParam` / `indexParam`、分行 / 分词 / 测量逻辑与既有注释逐字保留。
+- 未新增方法、字段、类型、导出符号或依赖;未改调用点、文档、测试、配置、STATE、ROADMAP。
+- 文件保持 CRLF;未运行测试、构建、浏览器或包管理命令;SUMMARY 如实记录未验证。
+
+
+
+- 颜色标签语法已变为 `[c=#DDD]xxxxx[/c]`,旧 `\r[...]` / 裸回车颜色入口已删除。
+- 除颜色标签外,解析器行为与代码结构零改动,导出面零改动。
+- 只改 `textboxTyper.ts` 并新增 `09-50-SUMMARY.md`;未提交、未运行验证。
+- SUMMARY 如实记录范围、保留项、未运行验证与放行记录。
+
+
+