lhk229
|
cf01c99fe6
|
类名守门补上条件类与精确 selector 匹配,堵掉两处会静默放行的漏洞
Project CI / Repository checks (pull_request) Successful in 4m13s
Project CI / Frontend tests (pull_request) Successful in 4m22s
Project CI / Native shell tests (pull_request) Successful in 12m18s
Project CI / Backend tests (pull_request) Successful in 5m31s
这条守门是为「#193 把策划选择器整段误删」设的,但它自己有两处会放行:
一、条件类进不了清单。抽取时 `.replace(/\$\{[^}]*\}/g, ' ')` 把插值整段丢掉,而两个
组件里唯一的条件类恰好长在插值里:``plan-gdd-surface${showCard ? ' …--with-card' : ''}``。
清单 25 个类里没有 `plan-gdd-surface--with-card`。它不是装饰性的:
`.game-workbench-chat .plan-gdd-surface--with-card` 的 `grid-template-rows: auto
minmax(0, 1fr)` 是审批卡内滚的边界,策划面自己是 `display: grid` + `overflow: hidden`
的外壳,删掉这条,批准后的交付行连同路径和两个按钮会被切在壳外。实测把该类的两条
规则整段删掉,改前的测试照样绿。
改成只取插值里的字符串字面量——三元的条件和变量名不是类名,不能混进清单。清单
25 → 26,新进的正是 `plan-gdd-surface--with-card`,没有杂质。
二、`styles.includes('.' + name)` 是子串匹配,`.gdd-approval-card__header` 可以冒充
`.gdd-approval-card` 的存在证据。改成要求类名后面不再跟类名字符。当前 26 个类逐一
校验都有精确 selector,所以这一处堵的是潜在放行,不是正在掩盖的缺失。
另按评审要求补一条负向钉子:单独钉住上面那条承重的行模板。存在性检查只要 `--with-card`
还剩任意一条规则就绿,而两条里只有它是承重的。
三条负向都已验证非空转:删两条规则 → 红;只删承重那条留下分隔线 → 红;把
`.gdd-approval-card__details` 改名只留派生类 → 红(改前用 includes 会绿)。
评审同时建议做 computed-style/布局断言,这里没做:appSurface 跑 jsdom,没有布局引擎,
且这套 suite 不把 styles.css 挂进 DOM。要真断言得换真实浏览器 runner,是另一件事。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-08-25 10:13:34 +00:00 |
|
lhk229
|
763f4b5b4c
|
策划列布局的命中判据补上窄条,hydrate 还没回来时澄清卡不再被裁
Project CI / Repository checks (pull_request) Successful in 4m24s
Project CI / Frontend tests (pull_request) Successful in 4m55s
Project CI / Backend tests (pull_request) Successful in 6m15s
Project CI / Native shell tests (pull_request) Successful in 14m53s
上一笔只用 `:has(.plan-gdd-surface)` 认策划链路,漏了一格:`PlanGddSurface` 在
`planGddState === null` 时整个返回 null,而 `planGddState` 初值就是 null,要靠
`hydrate_game_creator_plan_gdd_state` 这一次独立 IPC 才填上。首帧竞态、以及 hydrate
持续失败(非写锁争用的错误会把 state 留在 null)这两种情形下,策划 run 照跑、
`PlanningLaneRuntimeStrip` 照渲染澄清卡,但容器上的 `:has()` 不命中,#193 那套
`display: block` + 列表 `height: 100%` + `overflow: hidden` 原样回来,卡片又被静默裁到
可视区外。
判据改成 `.plan-gdd-surface` 与 `.planning-lane-runtime-strip` 的并集。两个类都只属于
策划链路,做游戏与做素材仍走 master 的 block 列。窄条在场本身就等价于「有东西要用户
动手」,并进来之后「卡片存在」和「列布局生效」是同一件事,不再依赖另一条异步链路的
时序。
守门加在已有的策划样式测试里(同一处已经钉着 #193 误删的几条规则):断言这条 flex 列
规则的 `:has()` 必须包含窄条类。已验证非空转——把并集改回单一类,这条断言变红。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-08-25 10:03:24 +00:00 |
|
lhk229
|
f039337d06
|
策划链路恢复列布局,澄清卡与输入框不再被静默裁出可视区
Project CI / Repository checks (pull_request) Successful in 4m19s
Project CI / Frontend tests (pull_request) Successful in 4m45s
Project CI / Backend tests (pull_request) Successful in 6m16s
Project CI / Native shell tests (pull_request) Successful in 14m16s
现象:立项策划提交需求后,界面永远停在「任务已接收」,澄清问答卡不出现。后端、
模式判定、链路判据、readOnly、数据传递全部正确,卡片也确实渲染了——314px 高、
visible、opacity 1,只是被画在裁剪线外面。实测窄条 top=858 而容器 bottom=788,
超出 384px;scrollHeight 1235 vs clientHeight 734,输入框和状态行也一起在外面。
根因是 #193(5802048c3「Codex/agent chat layout fix」)重写这块布局时:
- 给 .game-workbench-chat .project-supervisor-conversation 加了 display: block,
杀死它从基础规则继承的 display: grid,行模板 minmax(340px,1fr) auto auto auto
整个失效;
- 把消息列表从 flex: 1 1 auto 改成 height: 100%,于是它独吞整列高度;
- 删掉了 .game-workbench-chat .project-supervisor-composer 的 4 条规则,所以列表
上那条 padding-bottom: 196px(本意是给「浮起来的输入框」留位)从来没有对应的
定位规则,那个模型压根没成立过。
容器又是 overflow: hidden,所以排在列表后面的成员全部被无声裁掉。
只给策划链路恢复:`:has(.plan-gdd-surface)` 仅在策划面在场时命中,做游戏与做素材
保持 master 的 block 列原样不动。用 flex 列而不是 grid——子元素个数随「待确认命令」
的有无浮动,固定行模板会错位;而且既有的 .plan-gdd-surface { flex: 0 0 auto } 本来
就是照 flex 写的,容器变成 flex 之后它才第一次真正生效,此前一直是死声明。
另加 overflow-y: auto 兜底:审批卡展开到 52dvh 且窄条同时在场时理论上仍可能超出,
届时给滚动条而不是继承裁剪。这个 bug 的全部代价都来自「悄悄裁掉」。
顺带补一条 appSurface 用例,覆盖「首页做方案 → 自动建项目 → 自动投递 → 工作台出
澄清卡」这条此前零覆盖的路径。必须说明:它拦不住本次这类问题——jsdom 没有布局引擎,
高度恒为 0,裁剪与溢出对它天然不可见。它守的是数据流,不是版面。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-08-25 09:43:32 +00:00 |
|
lhk229
|
b8dd1dc828
|
Merge branch 'master' into fix/design_frontend
Project CI / Repository checks (pull_request) Successful in 3m27s
Project CI / Frontend tests (pull_request) Successful in 4m16s
Project CI / Backend tests (pull_request) Successful in 4m56s
Project CI / Native shell tests (pull_request) Failing after 3m33s
|
2026-08-25 16:25:22 +08:00 |
|
lhk229
|
f829cef774
|
补回同批被删的单栏工作台规则,策划项目不再一打开就是空画布
Project CI / Repository checks (pull_request) Failing after 8s
Project CI / Backend tests (pull_request) Failing after 10s
Project CI / Frontend tests (pull_request) Successful in 3m58s
Project CI / Native shell tests (pull_request) Has been cancelled
上一发只按三组策划类根提取,漏了挂在工作台布局上的 is-conversation-only——
TSX 侧(planningStartMode && resources.length === 0 时给 game-workbench-layout
拼类名)经 #159 完整在主线上,规则同样死在 #193 那一刀里。症状:做方案项目一
打开,左边一整片空资源画布(文档 0 项、美术 0 项),本该收成单栏让对话铺满。
按「现有代码引用 + 现有 css 无规则 + #193 前有规则」三条同时成立做了全仓清点:
28 个被删类里受害者仅此一个,其余 27 个的引用方已在同批重构中移除,不属误删。
守门测试显式钉住这两条规则——它们不在策划组件文件里,靠类名推导扫不到。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-08-25 08:10:37 +00:00 |
|
lhk229
|
d170326a6b
|
恢复被 #193 误删的策划前端全部样式,并加上组件到样式的守门测试
Project CI / Repository checks (pull_request) Successful in 3m29s
Project CI / Frontend tests (pull_request) Successful in 4m27s
Project CI / Backend tests (pull_request) Successful in 5m44s
Project CI / Native shell tests (pull_request) Successful in 12m53s
症状:立项策划界面整体裸奔——审批卡、阶段进度条、交付行没有任何框和布局,
「查看 GDD 正文」弹层因 backdrop 丢掉 fixed 定位而内联平铺进消息流。
成因:策划前端经 squash PR #159 完整进入 master,组件(TSX)至今与源分支最终态
逐字节一致;随后 #193「Codex/agent chat layout fix」重写聊天区样式时,把
styles.css 里策划前端的选择器整段删除——gdd-approval-card 34 条、plan-gdd* 17
条、planning-lane-runtime-strip 上限——未搬往任何其他文件(全仓检索为 0)。同一
个 PR 把 project-development.suite.ts 大幅重写,原有的 CSS 守门断言一并消失,
所以没有任何测试变红。
修复:从 5802048c3^ 原样取回全部 42 个规则块,整段追加在 styles.css 末尾并注明
来历。这些选择器在当前文件中出现次数为 0,纯加法、零冲突,不触碰 #193/#194 有意
重构的聊天区规则;追加在末尾也保持了原有的同权重覆盖关系(策划窄条的上限仍压过
调试面板的 240px 天花板)。
守门:plan-gdd.suite.ts(两轮样式重构都未被触碰的文件)新增一条测试,类名清单
直接从 GddApprovalCard / PlanningLaneRuntimeStrip 源码推导,逐个断言 styles.css
里有对应规则,另单独锁弹层 backdrop 的 fixed 定位。A/B 验证:抽掉恢复段即红,报
「styles.css 缺少 .plan-gdd-surface 的规则」。组件加新类而样式缺失、或样式再次
被顺手清理,这条都会拦住。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-08-25 07:55:22 +00:00 |
|