生成日期:2026-07-09
26.0828-Taglauncher.AppGrid备注气泡-placeholder验收.mdplaceholderString 改为显式 placeholderAttributedString。white alpha 0.48,可接受范围 0.46-0.52;正文颜色、输入框背景、文案和尺寸均不改。tr("appNote.placeholder"),不写死中文。Scripts/app_note_bubble_input_qa.sh 增加 placeholder 可读性防回归,并保留 IME marked text、提交 / 取消和备注长度上限检查。8.3.7 (20260822.2207) ad-hoc signed 本地测试 DMG;不是 ASC 上传包,也未做公证。8.3.7 (20260822.2207) 本地测试 DMG,并确认 placeholder 字色效果 OK。# Taglauncher 会话记录 - 2026-06-08 AppGrid抖动修复
## 用户目标
用户确认采用低风险方案:hover 只保留高亮/填色,不再自动滚动;点击 tag 仍滚动到对应分组。
## 已完成事项
- 将任务登记到 `/Users/ar/Projects/Taglauncher/src/TODO.md` 的 `In Progress`。
- 修改 `/Users/ar/Projects/Taglauncher/src/Apptag/ContentView.swift`:
- 移除 `AppGridInteractionState` 中只服务于 hover 自动滚动的 `tagNavigationLastHoverScrollID` 与 `tagNavigationLastHoverScrollAt`。
## 用户目标
用户确认采用低风险方案:hover 只保留高亮/填色,不再自动滚动;点击 tag 仍滚动到对应分组。
## 已完成事项
- 将任务登记到 `/Users/ar/Projects/Taglauncher/src/TODO.md` 的 `In Progress`。
- 修改 `/Users/ar/Projects/Taglauncher/src/Apptag/ContentView.swift`:
- 移除 `AppGridInteractionState` 中只服务于 hover 自动滚动的 `tagNavigationLastHoverScrollID` 与 `tagNavigationLastHoverScrollAt`。
- 移除 `tagNavigationHoverScrollInterval`。
- 从 `handleTagNavigationHover()` 中移除 `scrollToTagFromHover(id)` 调用。
- 删除 `scrollToTagFromHover(_:)` 函数。
## 已完成事项
- 将任务登记到 `/Users/ar/Projects/Taglauncher/src/TODO.md` 的 `In Progress`。
- 修改 `/Users/ar/Projects/Taglauncher/src/Apptag/ContentView.swift`:
- 移除 `AppGridInteractionState` 中只服务于 hover 自动滚动的 `tagNavigationLastHoverScrollID` 与 `tagNavigationLastHoverScrollAt`。
- 移除 `tagNavigationHoverScrollInterval`。
- 从 `handleTagNavigationHover()` 中移除 `scrollToTagFromHover(id)` 调用。
- 删除 `scrollToTagFromHover(_:)` 函数。
- 保留 `activateTagNavigation(_:)` 中的 `scrollTo(id)`,因此点击 tag 仍会滚动到对应分组。
## 验证结果
# Taglauncher 会话记录 - 2026-06-08 AppGrid抖动排查
## 用户目标
用户提供 `/Users/ar/Desktop/奇怪的抖动问题.mp4`,要求先判断奇怪交互抖动的成因,并评估修复风险。
## 已完成事项
- 读取并遵守 `~/.codex/rules/qa-workflow.md` 与 `~/.codex/rules/delivery-gate.md`。
- 使用 `ffprobe` 检查视频:8.88 秒,1920x1080,约 19.49 fps。
- 使用 `ffmpeg` 抽取 contact sheet:
- 使用 `ffmpeg` 抽取 contact sheet:
- `/private/tmp/taglauncher-jitter-frames/contact.jpg`
- `/private/tmp/taglauncher-jitter-frames/contact-4fps.jpg`
- 读取并分析相关源码:
- `/Users/ar/Projects/Taglauncher/src/Apptag/ContentView.swift`
- `/Users/ar/Projects/Taglauncher/src/Apptag/AppGridCollectionView.swift`
- `/Users/ar/Projects/Taglauncher/src/Apptag/TagNavigationView.swift`
- `/Users/ar/Projects/Taglauncher/src/Apptag/AppGridSupport.swift`
## 初步判断
- `/private/tmp/taglauncher-jitter-frames/contact.jpg`
- `/private/tmp/taglauncher-jitter-frames/contact-4fps.jpg`
- 读取并分析相关源码:
- `/Users/ar/Projects/Taglauncher/src/Apptag/ContentView.swift`
- `/Users/ar/Projects/Taglauncher/src/Apptag/AppGridCollectionView.swift`
- `/Users/ar/Projects/Taglauncher/src/Apptag/TagNavigationView.swift`
- `/Users/ar/Projects/Taglauncher/src/Apptag/AppGridSupport.swift`
## 初步判断
- 视频中的抖动主要表现为 AppGrid 内容在不同分组位置之间跳动,而不是单个图标 hover 的局部放大。
# Taglauncher 会话记录 - 2026-06-08 AppGrid抖动验收
## 用户目标
用户使用新版后反馈:与修复前相比变化不大,仍有一点小抖,但当前效果可以接受。
## 已完成事项
- 将 `/Users/ar/Projects/Taglauncher/src/TODO.md` 中 App Grid 顶部 tag hover 抖动修复任务从 `In Progress` 移动到 `Done`。
- 在 Done 记录中补充用户真实体验验收结论:仍有轻微小抖,但可接受,本轮不继续扩大修复范围。
## 已完成事项
- 将 `/Users/ar/Projects/Taglauncher/src/TODO.md` 中 App Grid 顶部 tag hover 抖动修复任务从 `In Progress` 移动到 `Done`。
- 在 Done 记录中补充用户真实体验验收结论:仍有轻微小抖,但可接受,本轮不继续扩大修复范围。
## 关键决策
- 当前不再继续扩大到 AppGrid 布局算法、hover bubble 或窗口层级的更大改动。
- 保留本轮低风险改动:hover 不触发自动滚动,点击 tag 仍滚动。
## 文件变更
- `/Users/ar/Projects/Taglauncher/src/TODO.md`
- 当前不再继续扩大到 AppGrid 布局算法、hover bubble 或窗口层级的更大改动。
- 保留本轮低风险改动:hover 不触发自动滚动,点击 tag 仍滚动。
## 文件变更
- `/Users/ar/Projects/Taglauncher/src/TODO.md`
## 未决问题
- 残余轻微小抖仍存在,后续如需要继续优化,可单独复盘 AppGrid layout bounds invalidation、hover bubble 命中区域和 tag navigation 高亮/填色重绘。
## 后续建议
- 新增 PRD:
- `/Users/ar/Projects/Taglauncher/src/Docs/Requirements/2026-07-01-pro-custom-container-quota-prd.md`
- 新增长期备忘:
- `/Users/ar/Projects/Taglauncher/src/Docs/Requirements/free-vs-pro-feature-memo.md`
## 核心事实 / 变更快照
### 变更对象
TagLauncher 免费版 / Pro 版标签维护权限边界。
- 新增长期备忘:
- `/Users/ar/Projects/Taglauncher/src/Docs/Requirements/free-vs-pro-feature-memo.md`
## 核心事实 / 变更快照
### 变更对象
TagLauncher 免费版 / Pro 版标签维护权限边界。
### 事实来源
## 核心事实 / 变更快照
### 变更对象
TagLauncher 免费版 / Pro 版标签维护权限边界。
### 事实来源
- 本轮用户讨论。
作为代码审核员 C / QA,只读审查 TagLauncher 8.3.0 新问题的验收方案:免费用户编辑或维护标签后,Settings Tags 顶部自定义容器额度文案没有实时刷新,仍显示 0/6。用户要求不要改代码,并回答静态 QA 断言、应跑的现有 QA 命令,以及不截图 / 不真实点击时自动化证据与人工验收边界。
## 已完成事项
- 已读取 `qa-workflow` skill、`CODE_GOVERNANCE.md`、全局 QA 规则、研发前置讨论规则、`CODEGRAPH.md`。
- 已只读检查当前工作区状态:当前分支 `codex/pro-custom-hotkeys-8.2.0`,工作区已有多处未提交改动,本轮不修改。
- 已定位相关源码:
- `src/Apptag/TagEditorView.swift`
- `src/Apptag/PreferencesView.swift`
- 已定位相关源码:
- `src/Apptag/TagEditorView.swift`
- `src/Apptag/PreferencesView.swift`
- `src/Apptag/ContentView.swift`
- `src/Apptag/ProEntitlement.swift`
- `src/Apptag/DataLayer.swift`
- `src/Scripts/pro_custom_container_quota_qa.sh`
## 关键判断
- `src/Apptag/TagEditorView.swift`
- `src/Apptag/PreferencesView.swift`
- `src/Apptag/ContentView.swift`
- `src/Apptag/ProEntitlement.swift`
- `src/Apptag/DataLayer.swift`
- `src/Scripts/pro_custom_container_quota_qa.sh`
## 关键判断
- 现有 `pro_custom_container_quota_qa.sh` 主要覆盖额度模型、门禁、文案和数据层规则,不足以覆盖“成功维护标签后顶部额度文案触发 SwiftUI 重新渲染”。
作为 TagLauncher 崩溃 / 新问题代码审核员 A,只读审查 8.3.0 新问题的最小修复方案,不修改源码。
问题:免费用户编辑 / 维护 4 个标签后,标签页顶部“免费用户可以使用6个自定义标签(容器):已使用 0 / 6”没有实时变化。
关注文件:
- `/Users/ar/Projects/Taglauncher/src/Apptag/TagEditorView.swift`
- `/Users/ar/Projects/Taglauncher/src/Apptag/ContentView.swift`
- `/Users/ar/Projects/Taglauncher/src/Apptag/PreferencesView.swift`
- `/Users/ar/Projects/Taglauncher/src/Apptag/TagEditorView.swift`
- `/Users/ar/Projects/Taglauncher/src/Apptag/ContentView.swift`
- `/Users/ar/Projects/Taglauncher/src/Apptag/PreferencesView.swift`
- `/Users/ar/Projects/Taglauncher/src/Apptag/ProEntitlement.swift`
- `/Users/ar/Projects/Taglauncher/src/Scripts/pro_custom_container_quota_qa.sh`
## 已完成事项
- 只读检查当前工作区、分支和 worktree。
- `/Users/ar/Projects/Taglauncher/src/Apptag/TagEditorView.swift`
- `/Users/ar/Projects/Taglauncher/src/Apptag/ContentView.swift`
- `/Users/ar/Projects/Taglauncher/src/Apptag/PreferencesView.swift`
- `/Users/ar/Projects/Taglauncher/src/Apptag/ProEntitlement.swift`
- `/Users/ar/Projects/Taglauncher/src/Scripts/pro_custom_container_quota_qa.sh`
## 已完成事项
- 只读检查当前工作区、分支和 worktree。
- 只读审查自定义标签容器额度状态流、TagEditorView mutation 回调、ContentView / PreferencesView 顶部 accessory、ProEntitlement quota policy 和现有 QA 脚本。
# 26.0701-Taglauncher.Coder3-标签额度文案补修
## 用户目标
根据用户直接提供的截图 `/Users/ar/Desktop/Screencapture/SCR-20260701-phds.png`,修正 8.3.0 标签额度相关 UI 文案:
- Pro 对比表“可维护标签数量”的 Pro 列“没有限制”前漏了一个 `✅`。
- 标签页顶部额度行文案改为“免费用户可以使用6个自定义标签(容器):”。
- 更新 29 个本地化 JSON:
- `settings.proStatus.unlimitedTags` 全部加上前置 `✅`。
- `pro.customContainers.quotaShort` 改为“免费用户 / free users 可使用 6 个自定义标签(容器)”语义,并保留 `%used%`、`%limit%` 占位符。
- 更新自动化 QA:
- `Scripts/pro_localization_qa.sh` 增加英文、简体中文和全语言 `unlimitedTags` 前置 `✅` 检查。
- `Scripts/pro_custom_container_quota_qa.sh` 增加简体中文额度文案和 `✅没有限制` 检查。
## 核心事实 / 变更快照
- 变更对象:Pro 对比表第一行 Pro 列状态、标签页自定义容器额度行。
- 更新自动化 QA:
- `Scripts/pro_localization_qa.sh` 增加英文、简体中文和全语言 `unlimitedTags` 前置 `✅` 检查。
- `Scripts/pro_custom_container_quota_qa.sh` 增加简体中文额度文案和 `✅没有限制` 检查。
## 核心事实 / 变更快照
- 变更对象:Pro 对比表第一行 Pro 列状态、标签页自定义容器额度行。
- 变更前:
- 简体中文 Pro 列第一行显示 `没有限制`。
- 简体中文标签页额度行显示 `自定义容器:已使用 %used% / %limit%`。
# Taglauncher 8.3.0 编辑标签崩溃和额度刷新
## 用户目标
- 修复 8.3.0 中“试图编辑标签时系统卡死 / 崩溃”的阻塞问题。
- 用户人工验证后确认:现在可以编辑标签,不会在编辑标签时卡死。
- 同轮补修免费用户自定义标签额度顶部文案不实时刷新:用户已编辑 4 个标签,但仍显示 `0 / 6`。
- 生成新的 8.3.0 DMG 供最终人工验收。
- 代码仓库:`/Users/ar/Projects/Taglauncher`
- 源码根目录:`/Users/ar/Projects/Taglauncher/src`
- 用户提供 hang 日志:`/Users/ar/Desktop/26.0701crashlog`
- 用户明确要求:排查崩溃时拉一位架构师和三位代码审核员共同看原因;后续额度刷新方案也拉架构师和代码审核员看。
## 关键决策
- 编辑标签卡死根因判断:`NSTextField.mouseDown(with: event)` 被同一个 `NSEvent` 手动转发,可能进入 AppKit 控件追踪递归。
- 修复策略:不再手动把原始 `mouseDown` 事件转发给 `NSTextField`,改为语义聚焦 / 首次选中,后续点击让原生文本框处理光标。
- 代码仓库:`/Users/ar/Projects/Taglauncher`
- 源码根目录:`/Users/ar/Projects/Taglauncher/src`
- 用户提供 hang 日志:`/Users/ar/Desktop/26.0701crashlog`
- 用户明确要求:排查崩溃时拉一位架构师和三位代码审核员共同看原因;后续额度刷新方案也拉架构师和代码审核员看。
## 关键决策
- 编辑标签卡死根因判断:`NSTextField.mouseDown(with: event)` 被同一个 `NSEvent` 手动转发,可能进入 AppKit 控件追踪递归。
- 修复策略:不再手动把原始 `mouseDown` 事件转发给 `NSTextField`,改为语义聚焦 / 首次选中,后续点击让原生文本框处理光标。
- 额度刷新根因判断:顶部 `customContainerQuotaAccessory` 直接读数据库派生值,但缺少明确 SwiftUI 状态驱动,保存后父视图不稳定重算。
# 2026-08-22|TagLauncher|AppGrid 备注气泡|placeholder 字色
## 用户目标
用户在截图中指出 AppGrid 图标备注气泡的输入框提示文字“APP 用途备注”太暗,几乎看不见;但该文字只是 placeholder,不应过分抢眼。
## 关键决策
- 本轮只改 placeholder 字色,不改文案、不改输入框尺寸、不改输入框背景、不改正文颜色。
- placeholder 仍使用 `tr("appNote.placeholder")`,不写死中文;多语言继续显示各自翻译。
- 本轮生成的是 ad-hoc signed 本地安装测试 DMG,不是 App Store Connect 上传 `.pkg`,也不做公证 / ASC 发布。
## 核心事实 / 变更快照
- 变更对象:AppGrid 备注气泡输入框 placeholder 视觉层级。
- 事实来源:
- `/Users/ar/Projects/Taglauncher/03-O/C1.source/Apptag/AppGridSupport.swift`
- `/Users/ar/Projects/Taglauncher/03-O/C1.source/Scripts/app_note_bubble_input_qa.sh`
- `/Users/ar/Projects/Taglauncher/03-O/CODEGRAPH.md`
- 变更前:`NSTextField` 使用 `field.placeholderString = placeholder`,系统默认 placeholder 色在 `Color.black.opacity(0.92)` bubble 和 `Color.white.opacity(0.12)` 输入框背景上过暗。
- 变更后:`placeholderAttributedString` 使用 `NSColor.white.withAlphaComponent(0.48)`。
- 源码变更 commit:`1ec08b1dedff313e385767edb0c2b815b6dd56f3`。
- 测试包归档 commit:`eab3bec`。
- 本地测试 DMG:`/Users/ar/Projects/Taglauncher/03-O/C2.builds/LocalTest-8.3.7-20260822.2207/Archive/TagLauncher-8.3.7-build20260822.2207-localtest.dmg`。
- SHA256:`4fef51bfa26eb1d73fbb5de4e3a336d5a2a5ed02aa658995126012ace6e04c9f`。
## 验证
已通过 `Scripts/app_note_bubble_input_qa.sh`、`Scripts/macos14_availability_typecheck_qa.sh`、构建、codesign、metadata QA、DMG verify 和只读挂载检查。
# 2026-08-28|TagLauncher|AppGrid 备注气泡|placeholder 验收
## 用户目标
用户反馈已安装 `8.3.7 (20260822.2207)` 本地测试包并验证视觉效果,结论为“效果 OK”。
## 核心事实 / 变更快照
- 对应本地测试包:`/Users/ar/Projects/Taglauncher/03-O/C2.builds/LocalTest-8.3.7-20260822.2207/Archive/TagLauncher-8.3.7-build20260822.2207-localtest.dmg`。
- 源码变更 commit:`1ec08b1dedff313e385767edb0c2b815b6dd56f3`。
- 测试包归档 commit:`eab3bec`。
- DMG SHA256:`4fef51bfa26eb1d73fbb5de4e3a336d5a2a5ed02aa658995126012ace6e04c9f`。
- 变更后:Owner 已确认安装验证通过,placeholder 字色效果 OK。
- 范围边界:本结论只覆盖 AppGrid 备注气泡 placeholder 字色优化和上述本地体验包;不代表 ASC 上传包、公开发布放行、其它 UI 问题或后续新需求已验收。
legacy/codex-20260610/session-history/2026-06-08-AppGrid抖动修复.mdlegacy/codex-20260610/session-history/2026-06-08-AppGrid抖动排查.mdlegacy/codex-20260610/session-history/2026-06-08-AppGrid抖动验收.md2026-07-01-标签额度PRD.md2026-07-01-标签额度刷新审查.md2026-07-01-额度状态审查.md26.0701-Taglauncher.Coder3-标签额度文案补修.md26.0701-Taglauncher.发布修复-编辑标签崩溃和额度刷新.md26.0822-Taglauncher.AppGrid备注气泡-placeholder字色.md26.0828-Taglauncher.AppGrid备注气泡-placeholder验收.md/Users/ar/Projects/Taglauncher/src/TODO.md 的 In Progress。/Users/ar/Projects/Taglauncher/src/Apptag/ContentView.swift:AppGridInteractionState 中只服务于 hover 自动滚动的 tagNavigationLastHoverScrollID 与 tagNavigationLastHoverScrollAt。tagNavigationHoverScrollInterval。handleTagNavigationHover() 中移除 scrollToTagFromHover(id) 调用。~/.codex/rules/qa-workflow.md 与 ~/.codex/rules/delivery-gate.md。ffprobe 检查视频:8.88 秒,1920x1080,约 19.49 fps。ffmpeg 抽取 contact sheet:/private/tmp/taglauncher-jitter-frames/contact.jpg/private/tmp/taglauncher-jitter-frames/contact-4fps.jpg/Users/ar/Projects/Taglauncher/src/TODO.md 中 App Grid 顶部 tag hover 抖动修复任务从 In Progress 移动到 Done。/Users/ar/Projects/Taglauncher/src/TODO.md/Users/ar/Projects/Taglauncher/src/Docs/Requirements/2026-07-01-pro-custom-container-quota-prd.mdqa-workflow skill、CODE_GOVERNANCE.md、全局 QA 规则、研发前置讨论规则、CODEGRAPH.md。codex/pro-custom-hotkeys-8.2.0,工作区已有多处未提交改动,本轮不修改。src/Apptag/TagEditorView.swiftsrc/Apptag/PreferencesView.swiftbash src/Scripts/pro_custom_container_quota_qa.sh,结果 PASS。customContainerQuotaStatus 或等价 refresh token。customContainerQuotaAccessory 在 ContentView 和 PreferencesView 的 computed view 中直接调用 ProEntitlementPolicy.customContainerQuotaStatus(),SwiftUI 不会自动订阅数据库文件或 TagDef.isCustomMaintained 派生计数变化。settings.proStatus.unlimitedTags 全部加上前置 ✅。pro.customContainers.quotaShort 改为“免费用户 / free users 可使用 6 个自定义标签(容器)”语义,并保留 %used%、%limit% 占位符。Scripts/pro_localization_qa.sh 增加英文、简体中文和全语言 unlimitedTags 前置 ✅ 检查。NSTextField.mouseDown(with: event) 被同一个 NSEvent 手动转发,可能进入 AppKit 控件追踪递归。mouseDown 事件转发给 NSTextField,改为语义聚焦 / 首次选中,后续点击让原生文本框处理光标。customContainerQuotaAccessory 直接读数据库派生值,但缺少明确 SwiftUI 状态驱动,保存后父视图不稳定重算。ContentView 和 PreferencesView 分别持有 quota @State;TagEditorView 在成功保存或被 quota 拦截时回传最新 ProCustomContainerQuotaStatus。white alpha 0.48,可接受范围 0.46-0.52;正文、输入框背景、文案和尺寸不动。AppBubbleNoteTextField 从系统默认 placeholderString 改为显式 placeholderAttributedString,并继续使用 tr("appNote.placeholder")。Scripts/app_note_bubble_input_qa.sh 增加 placeholder 可读性防回归,同时保留 IME、提交 / 取消和长度上限检查。1ec08b1dedff313e385767edb0c2b815b6dd56f3;测试包归档 commit eab3bec;本地测试 DMG 为 8.3.7 (20260822.2207),SHA256 4fef51bfa26eb1d73fbb5de4e3a336d5a2a5ed02aa658995126012ace6e04c9f。8.3.7 (20260822.2207) 本地测试包并验证视觉效果,结论为“效果 OK”。