docs: P12 narrow-viewport batch delivered (crearte 0.25.0 / server 0.17.1 / deploy 0.7.1)
Register the P12 spec and plan in the ROADMAP doc index, add the P12 batch row, and update two backlog lines that this batch's measurements settled: - The 'mobile header / hamburger menu' backlog entry carried since P9-B is falsified and removed: nav content width is only 74-158px and measures zero horizontal overflow at 320/360/375/412/768/1280px. Building it would have shipped a hamburger menu nobody needs. - Nav links wrapping per-character at phone widths stays parked pending a design decision, not a CSS tweak: it is cosmetic only (no overflow, no clipping, no lost function), whitespace-nowrap costs +11px at 320px, and all seven gap-reduction variants measured fail at 320px + long name because logo 77px + nowrap nav 138-158px + truncated name 96px do not fit. It competes for the same pixels as the header fix. - The P11 polish backlog is partially retired: three of P9-B's four items plus P11-N5/N6 are closed by this batch; the remaining nine P11 minor notes are documentation-only with no actionable change. Merged and pushed: crearte e59a171 (0.25.0), crearte-server d56c593 (0.17.1), crearte-deploy 529a988 (0.7.1). Three task-level reviews plus a whole-branch final review verdict APPROVE with notes, zero critical and zero important; all notes adjudicated before merge. The final reviewer independently reproduced three mutations rather than accepting the controller's claims.
This commit is contained in:
@@ -6,6 +6,16 @@ All notable changes to this repository should be documented in this file.
|
||||
The format loosely follows Keep a Changelog and can be adapted to the team's habits.
|
||||
本文档参考了 Keep a Changelog 的思路,也可以根据团队习惯调整。
|
||||
|
||||
## [0.3.5] - 2026-10-02
|
||||
|
||||
### Done / 完成
|
||||
|
||||
- P12 narrow-viewport batch delivered across all three product repos: crearte `e59a171` (0.25.0, merge-base `d25c497`), crearte-server `d56c593` (0.17.1, `9da39b6`), crearte-deploy `529a988` (0.7.1, `740958a`). Zero new features, zero backend behaviour changes. Dispatch followed the one-writer-per-repo rule (`sdd-parallel-dispatch` §1): T1/T2/T3/T5 all touch crearte's single worktree and git index, so they went to **one** subagent rather than four racing the same `.git/index.lock`; the controller wrote T6 (server) and T7 (deploy) itself. The guard task was **pulled forward to be the first step** rather than a second wave — write the guards, watch them go RED reproducing the spec's measured numbers verbatim (`+380px`, `+325px`, `+3px`, five missing wrappers), then implement until GREEN. That ordering removed the throwaway verification scripts the survey phase needed and made the RED output itself the proof the guards have teeth, instead of requiring an after-the-fact revert to demonstrate it. **Four measured defects fixed** (header long-name overflow hitting every route at a *legal* 60-char name; account-page nickname escape; catalog sort-select `shrink-0`; five admin tables with no scroll wrapper — reproducing with short data) **plus one found on the way** (the user dropdown escaping the viewport, closed by the header fix). Two machine guards added: `e2e/responsive.spec.ts` (12 tests, joins the CI main leg with zero config change) and `app/lib/tableOverflow.test.ts` (source-level, per-table parent check). Three P9-B polish items landed (P9B-1/2/4). Three task-level reviews (frontend PASS with 8 notes, server PASS, deploy PASS with 3 notes plus one spec erratum) and a whole-branch final review verdict **APPROVE with notes — zero critical, zero important**; every note adjudicated before merge, three fixed forward (`20215e7`, `fa39d27`). **The final reviewer independently reproduced three mutations rather than accepting the controller's or the reviewer's claims**: reverting the header fix turns 6 e2e legs red; commenting out a table wrapper turns the source guard red; echoing the raw env value turns both server assertions red. **Two parked items decided by measurement, not taste**: the ROADMAP's "mobile header / hamburger menu" backlog entry is **falsified and deleted** (nav content is 74–158px wide with zero horizontal overflow at 320/360/375/412/768/1280px), and nav's per-character link wrapping is **parked pending a design decision** (cosmetic only — no overflow, no clipping, no lost function; `whitespace-nowrap` costs +11px at 320px and all seven gap-reduction variants fail at 320px + long name because logo 77px + nowrap nav 138–158px + truncated name 96px physically do not fit). Acceptance: crearte vitest **635**/74 files (baseline 626/73) / vue-tsc clean / build + build-runtime OK / main e2e **92+1skip** (baseline 80+1skip) / noauth 4 — re-run independently by the controller twice and by both reviewers, four-way zero deviation; server gofmt/vet clean, 11 packages ok; deploy four-profile `config -q` green with the new guard verified in three states.
|
||||
- P12 窄屏批交付,横跨三个产品仓:crearte `e59a171`(0.25.0,merge-base `d25c497`)、crearte-server `d56c593`(0.17.1,`9da39b6`)、crearte-deploy `529a988`(0.7.1,`740958a`)。零新功能、零后端行为变更。派发遵循「一仓一写者」(`sdd-parallel-dispatch` §1):T1/T2/T3/T5 都动 crearte 的单一工作树与 git index,故交给**一个**子代理而非四路争用同一个 `.git/index.lock`;T6(server)与 T7(deploy)由控制者本人写。守卫任务被**提前为第一步**而非第二波——先写守卫、看它变红并逐字复现 spec 的实测数字(`+380px`、`+325px`、`+3px`、五处缺失包裹层),再实现到绿。这个顺序消除了勘查期所需的 throwaway 验证脚本,并使 RED 输出本身成为「守卫有牙」的证明,而不必事后再回退一次来自证。**四个实测缺陷已修**(页头长名溢出波及全站每个路由,而 60 字名是**合法上限**;账号页昵称逃逸;目录排序 select 的 `shrink-0`;五个 admin 表格无滚动包裹层——短数据也复现)**外加途中发现的一个**(用户下拉菜单逃逸视口,由页头修复一并闭合)。新增两道机器守卫:`e2e/responsive.spec.ts`(12 测试,零配置改动进 CI 主腿)与 `app/lib/tableOverflow.test.ts`(源码级,逐表格父元素判定)。三项 P9-B 打磨落地(P9B-1/2/4)。三份任务级审查(前端 PASS with 8 notes、server PASS、deploy PASS with 3 notes 加一条 spec 勘误)与一次全分支终审,裁定 **APPROVE with notes——零关键零重要**;全部 notes 在合并前裁定完毕,三处 fix-forward(`20215e7`、`fa39d27`)。**终审独立复现了三处 mutation,而非采信控制者或审查者的声称**:回退页头修复 → 6 腿 e2e 变红;注释掉表格包裹层 → 源码守卫变红;错误文案回显原始 env → server 两条断言同时变红。**两个挂账项由实测定夺、非口味**:ROADMAP 的「移动端页头 / 汉堡菜单」挂账**已证伪并删除**(nav 内容宽 74–158px,320/360/375/412/768/1280px 实测零横向溢出),nav 链接逐字换行**park 待设计决策**(纯外观——无溢出、无裁剪、无功能损失;`whitespace-nowrap` 在 320px 代价 +11px,且七种 gap 收缩变体在 320px + 长名下全部失败,因 logo 77px + nowrap nav 138–158px + 截断名 96px 物理上放不下)。验收:crearte vitest **635**/74 文件(基线 626/73)/ vue-tsc 零错 / build + build-runtime OK / 主 e2e **92+1skip**(基线 80+1skip)/ noauth 4——控制者独立复跑两次、两位审查者各复跑一次,四方零偏差;server gofmt/vet 净、11 包 ok;deploy 四 profile `config -q` 全绿且新守卫经三态验证。
|
||||
|
||||
- Lessons recorded. **A parked backlog item must be falsified or confirmed before being implemented** — "mobile header" had been carried in the ROADMAP since P9-B, and measurement showed the nav fits every viewport; implementing it would have shipped a hamburger menu nobody needed. **When every candidate fix fails at the same residue, the diagnosis is wrong, not the fix** — eight one-line remedies all stopped at exactly +32px (including `overflow: hidden`), which is what forced the ablation method (element-by-element `display: none` plus re-measure) that immediately found the culprit: P9-B's own 1px `sr-only` span, `position: absolute` with no `top`/`left`, escaping a `static` scroll wrapper because such a wrapper is not a containing block. Border-box scanning could not see it (the offender scan reported `trueOffenders=0` while the document still overflowed, because its "has a scrollable ancestor" filter classified the escapee as legitimate). **Runtime style injection cannot validate a template-level fix**: Vue compiles `{{ user.display_name }} ▾` into one text node, so three variants that tried to keep the caret outside the truncating span all measured `caret=HIDDEN` — the template had to split it explicitly, and only then could the flex shape be measured. **Source-level mutation testing can read a stale `dist/`** under `reuseExistingServer: !CI`, producing a false GREEN; the attribution that mattered (which of two fixes owns the 768px symptom) was settled by runtime-injection ablation instead, which needs no rebuild. **Guards get the same scrutiny as the code they guard**: review found the new source-level parser would stay green if someone commented out a wrapper — the same false-confidence class as the dead CIDR assertion caught in the deploy guard, both fixed before merge. **The controller itself made two verification errors this batch, both caught by reverse-testing its own work**: an assertion written as `"[0-9]` could never match compose's bare-scalar rendering (a dead assertion = false confidence), and a comment claimed a SIGPIPE/pipefail hazard that measurement did not reproduce (removed rather than left as unfounded lore).
|
||||
- 教训入账。**挂账项在实现前必须先证伪或证实**——「移动端页头」自 P9-B 起就挂在 ROADMAP 上,而实测表明 nav 在所有视口都放得下;实现它等于交付一个没人需要的汉堡菜单。**当每个候选修法都失败在同一残差上,错的是诊断而非修法**——八种一行修法全停在恰好 +32px(含 `overflow: hidden`),这才逼出烧蚀法(逐元素 `display: none` 加重测),并立即找到元凶:P9-B 自己那个 1px 的 `sr-only` span,`position: absolute` 而无 `top`/`left`,因 `static` 滚动包裹层不构成包含块而逃出裁剪。边框盒扫描看不见它(offender 扫描在文档仍溢出时报 `trueOffenders=0`,因为它的「有可滚动祖先」过滤把这个逃逸者归为合法)。**运行时样式注入无法验证模板级修法**:Vue 把 `{{ user.display_name }} ▾` 编译成单个文本节点,故三个试图把 caret 留在截断 span 之外的变体全部实测 `caret=HIDDEN`——必须在模板里显式拆开,之后才谈得上测量 flex 形态。**源码级 mutation 测试可能读到 stale `dist/`**(`reuseExistingServer: !CI` 下)而产生假 GREEN;真正要紧的那次归因(两个修复中谁拥有 768px 症状)改用运行时注入消融定案,它不需要重建。**守卫自身要接受与被守卫代码同等的审视**:审查发现新的源码级解析器在有人注释掉包裹层时会保持绿——与 deploy 守卫里抓到的死 CIDR 断言属同一类假信心,两者都在合并前修掉。**控制者本人本批也犯了两个验证错误,均由反向测试自己的工作抓出**:一条断言写成 `"[0-9]` 而永不匹配 compose 的裸标量渲染(死断言 = 假信心);一句注释声称存在 SIGPIPE/pipefail 危害,而实测未复现(已删除,而非留作无据传闻)。
|
||||
|
||||
## [0.3.4] - 2026-10-02
|
||||
|
||||
### Done / 完成
|
||||
|
||||
Reference in New Issue
Block a user