docs(tasks): composer first-glyph clip brief (agent loop, issue #52)

Co-Authored-By: Claude (agent loop) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SKLQ768nneCz8kp5QwHfhf
This commit is contained in:
Jesse_Chen
2026-10-13 13:08:50 +08:00
co-authored by Claude
parent 941b06c193
commit 8380224a22
3 changed files with 99 additions and 0 deletions
+1
View File
@@ -134,6 +134,7 @@
| 任务书 | 进度 | 主题 | 状态 | 落点 |
| --- | --- | --- | --- | --- |
| `TASK-composer-first-glyph-clip-20261013.md` | — | **输入框第一个字被圆角裁掉(agent 循环 issue #52)**:`Textarea` 原语自带 12px 圆角,`.composer textarea` 清了边框与左右内边距却没清圆角,浏览器按圆角裁滚动内容,第一个字左缘被裁成圆弧;只在 `.composer textarea` 加 `border-radius: 0`,原语不动。执行方 Grok。BUG-1311 | 待领取 | `codex/composer-first-glyph-clip-20261013` |
| `TASK-consult-card-full-source-20261007.md` | `PROGRESS-consult-card-full-source-20261007.md` | **对话数据卡与报告同源 + 领域综合判断表**:事业卡只有约 7,600 字符、无自然代表星、无大运主星关系、D10 联动只能补取、补取上限 1;全 12 领域;综合判断表、参与清单(不止 D1/D9,含精度闸)、补取 3 次、资料目录均已确认;KP 不上卡、不联网、不接书籍语料;排在 sync6 与报告单之后 | 验收未通过(`35dafd1e`,见 fix-20261009) | `codex/consult-card-full-source-20261007` |
| `TASK-consult-card-full-source-fix-20261009.md` | `PROGRESS-consult-card-full-source-fix-20261009.md` | **对话卡同源修复**:缓存键无日期致当前大运冻结、整卡 37.5K(每格带内部路径)、星照整列 blocked(资料库其实有出处)、前端测试手写数据、无预热;合入前用临时 key 跑模型 A/B 与生平回测 | F1–F5 已验收,F6 未过(见 fix2) | `codex/consult-card-full-source-20261007` |
| `TASK-consult-card-full-source-fix2-20261009.md` | `PROGRESS-consult-card-full-source-fix2-20261009.md` | **对话卡同源第二轮**:齐达内事业被「水星=说写算」带偏致严重冲突 1→3;事业清单加「代表星只看力量受冲、不按星性猜职业」后重跑回测(≤1 才合入);预热改为不占重计算名额 | 已验收并快进合入 staging(2026-10-09,产品按严重冲突 ≤ 1 放行;剩余 1 次见 career-type-residual) | `codex/consult-card-full-source-20261007` |
@@ -0,0 +1,86 @@
# 任务书 · 输入框第一个字被圆角裁掉(agent 循环 issue #52)
- 日期:2026-10-13(北京时间)
- 写:Claude(agent 循环 · 规划)
- 执行方:**Grok(Windows + Docker)**,分支 `codex/composer-first-glyph-clip-20261013`,只推这个分支
- 来源:Gitea issue #52「输入框里面是圆形的导致输入时第一个文字会有缺失」
## 1. 基线
`origin/staging` = `941b06c19`(开工时以 `git fetch origin --prune` 后的 `origin/staging` 为准;本单只改 CSS、测试与文档,与基线漂移无关)。
## 2. 事故实证
- 产品负责人截图:聊天输入框里,placeholder「想聊什么都可以」的第一个字左侧边缘可见一道圆弧轮廓;打字时第一个字左边缺一块。
- 本机复现(无头 Chrome,4 倍像素):按 `.composer textarea` 的实际计算样式(左右内边距 0、上内边距 4px、高约 28px)分别渲染 `border-radius: 12px` 与 `0`,像素差集中在第一个字的左边缘:圆角版本把第一个字左侧裁成一段圆弧,直角版本完整。复现页只在会话 scratchpad,未进仓库。
## 3. 根因
`frontend/src/components/ui/textarea.tsx` 的 `Textarea`(shadcn 原语)默认带 `rounded-lg`(`--radius-lg` = 12px)。`frontend/src/app/globals.css` 的 `.composer textarea` 规则把它的边框、背景、左右内边距都清零了(外框改由 `.composer` 画),**却没有清掉圆角**。textarea 是滚动容器,浏览器按圆角裁剪其内容;左内边距为 0 时第一个字正好压在左上 / 左下两个 12px 圆角上,被裁掉一块。输入框只有一行高(约 28px),12px 圆角几乎占满半高,所以轮廓很明显。
两个聊天面(普通聊天、生时校正)共用同一个 `ChatComposer`,都受影响。
`docs/BUG_HISTORY.md` 检索「输入框 圆 / 首字 / 第一个字 / textarea radius / rounded-lg」无相关记录,这是新问题。
## 4. 决策记录
- 产品负责人在 issue 里直接描述了现象,期望第一个字完整显示。只有一种合理改法(去掉内层圆角,外框圆角不变),用户可见的变化只是「第一个字不再缺」,无需拍板。
- 不推翻任何既有任务书或 Bug 历史红线。
## 5. 硬红线
1. 只改 `.composer textarea` 这一条规则(加 `border-radius: 0`),**不改** `components/ui/textarea.tsx` 原语(别的表单还在用它的圆角)。
2. 外框 `.composer` 的圆角、边框、内边距不动;不改 placeholder 文案。
3. 不得新增第二个输入框、不改 `ChatComposer` 结构(`AGENTS.md` §6)。
4. 不升级依赖、不顺手修别的 warning(§7.7)。
5. 不碰 `frontend/src/app/(app)/page.tsx`、数据库、迁移、`.gitea/**`。
## 6. 任务分解
### T1 · 去掉内层圆角
- `frontend/src/app/globals.css`:`.composer textarea { … }` 规则里加 `border-radius: 0;`。
- 验收:浏览器里普通聊天与生时校正两个输入框,placeholder 与输入的第一个字左缘完整;外框圆角不变。
### T2 · 合同测试
- 在 `frontend/tests/chat-reading-load-mobile.test.ts`(已有 `ruleFor(".composer textarea {")` 辅助函数)或新文件 `frontend/tests/composer-first-glyph-clip.test.ts` 加一条:`.composer textarea {` 规则含 `border-radius:\s*0`,测试名写明原因(左内边距为 0 时圆角会裁掉第一个字)。
- 验收:新断言在改 CSS 前失败、改后通过(进度记录里写明两次结果)。
### T3 · 文档
- `frontend/DESIGN.md`「Input and composer」小节加一句:内层 textarea 无圆角(`border-radius: 0`),圆角只在外框 `.composer`;原因同上。
- `docs/BUG_HISTORY.md` 新增 **BUG-1311**:状态、现象、触发条件、根因、修复、验证、防复发、修复版本(不得写任何用户资料)。
- `docs/tasks/PROGRESS-composer-first-glyph-clip-20261013.md`:做了什么、测试数字、偏离与原因。
- `docs/tasks/README.md` 状态板本单一行改为「待验收」。
## 7. 验收命令
| 检查 | Grok 自跑 | Claude 验收 |
| --- | --- | --- |
| `cd frontend && ./node_modules/.bin/tsc --noEmit` | 必跑,0 错 | 复验 |
| `npm run lint` | 必跑,0 error | 复验 |
| `node --test` 跑 T2 改到的测试文件 | 必跑,fail=0、cancelled=0 | 复验 |
| 前端全量 `npm test` | 不跑 | 以 Claude 为准,测试总数不低于基线 |
| `npm run build`,`/` 仍 `○ Static` | 可选 | 复验 |
| `npm run test:db` | 不需要(未动数据库访问层) | — |
真机走查清单:`docs/testing/composer-first-glyph-clip-20261013.md`。
## 8. 让步顺序
T1 > T2 > T3。T1 必须完成;T2 测试位置可二选一;DESIGN.md 措辞可简写。
## 9. 开工前置命令
```
git fetch origin --prune
git worktree add -b codex/composer-first-glyph-clip-20261013 .worktrees/composer-first-glyph-clip-20261013 origin/staging
cd .worktrees/composer-first-glyph-clip-20261013
git status -sb
grep -o "^## BUG-[0-9]*" docs/BUG_HISTORY.md | sort -t- -k2 -n | tail -1
```
## 10. BUG 编号起点
开工时最大号为 BUG-1310,本单用 **BUG-1311**。同日 issue #53 的任务书从 BUG-1312 起编,若开工时 1311 已被占用,顺延并在进度记录里说明。
@@ -0,0 +1,12 @@
# 真机走查 · 输入框第一个字完整(BUG-1311,issue #52)
部署到 staging 后,在 `https://staging.jyotisha.chat` 登录,按顺序看:
1. 电脑浏览器打开首页,输入框里灰字「想聊什么都可以」——第一个字「想」左边完整,没有圆弧缺口。
2. 在输入框里打一个字(中文、英文各试一次)——第一个字左边完整。
3. 浅色、深色主题各看一遍第 1、2 步。
4. 输入框的外框仍是圆角,和以前一样。
5. 进入生时校正的对话界面,底部输入框重复第 1、2 步。
6. 手机(iPhone Safari)打开首页,重复第 1、2 步。
任何一步不对,在 issue #52 里写是哪一步、哪台设备,并把标签改回 `agent/待规划`。