docs: P9 batch-1 accepted and landed — crearte 26cd625 0.22.0 (five-leg green, review PASS with notes, ISSUE-1/2 pinned pre-merge); spec/roadmap counts corrected to six non-grid consumers (wrapper 0.3.1)

This commit is contained in:
2026-10-01 12:23:19 +08:00
parent 115dfd5fdf
commit 3eec67513c
3 changed files with 12 additions and 5 deletions
+7
View File
@@ -13,6 +13,13 @@ The format loosely follows Keep a Changelog and can be adapted to the team's hab
- Roadmap closing wave delivered — P8 batch-2 (③ account deletion + ④ static fallback catalog) and P3 reland (backup + observability), per owner's third directive 「实现 roadmap 所有待办事项」. Sub-repo commits: crearte-server `12b8ffb` (0.15.0 — migration 0011 tombstone column; AccountService deletion kernel: password re-check, works delisted, drafts removed with best-effort object delete, pending submissions auto-rejected, sessions invalidated via token_version, email/username rewritten to `deleted-<id>@deleted.invalid`/`gone-<id8hex>` so the original address is immediately reusable, sole-admin self-deletion refused 409 `last_admin` shared with the P7 demote guard; `DELETE /api/auth/account` (204/400/401/409/410, `Cache-Control: no-store`); CLI `user delete <email>` passwordless operator path; CLI `catalog export --out DIR [--pretty]` emitting the exact StaticContentRepository contract — `index.json` schemaVersion 2 + `games/<user>__<slug>.json`, virtual entries carry the bundle object, external entries omit it, cover/bundle.url empty when `STORAGE_S3_*` unset; `user set-role` gets `--by-id`) and crearte `7d5f338` (0.21.0 — AccountView fourth 「危险区:注销账号」 section: password + acknowledgement checkbox gate, busy lock, success → invalidate session → home, failure → alert row; `auth/client.ts` `deleteAccount` with the code-branching `toUserMessage`; AdminUsersView now localizes validation/not_found/internal (P7 copy tail pinned by tests, `7a54152`) and the 409 last_admin echo stays on the admin side — the account view deliberately shows the generic internal copy because the auth client normalizes unknown codes to `internal` and drops the backend message; review note about `AuthApiError` vs `UserManagementApiError` shape resolved in-test). crearte-deploy `12f7c10` (0.6.0) and crearte-server `d627e12` (0.16.0) reland P3 byte-for-byte via cherry-picks `7fcfe0e`/`6ffd1ee`/`93a3c70` whose originals had drifted off master during the rollback window: prod backup tooling (`scripts/backup.sh` pg_dump + mc-mirror with retention and manifest, `restore-drill.sh` against `db-test` only, `docs/BACKUP-RUNBOOK.md`, CI dry-run leg, compose `LOG_FORMAT`/`LOG_LEVEL` passthrough) and observability (stdlib `log` → `slog` mechanical migration across 30 sites incl. the P7/P8b2-new-surface files, per-request `http_request` middleware wired outside `gin.Recovery` so panic paths log status=500, hand-rolled `/metrics` exposition with http/go/pgpool families, `/healthz`+`/metrics` double-skipped, single-instance rate-limit tradeoff documented). P3M merge commit `cecfae1` reconciled the observability branch with the P8b2 surface (CHANGELOG top order 0.16.0→0.15.0, router/serve both-side wiring). Acceptance: server container four-green + fresh real-DB `-p 1 -count=1` (skip-guard grep 0, deletion-chain + observability suites PASS) on every leg; independent reviews PASS (P3S reviewer verified byte-level identity against `6ffd1ee`/`93a3c70`; frontend review returned PASS with two minor notes, pinned before merge as `7a54152`; server-side LOG_LEVEL case-sensitivity divergence between `config.applyLogging` and `observability.newLogger` deferred as a documented nit); branch-build curl smoke 14/14 PASS (wrong-pw 401 `invalid_credentials`, missing-pw 400, sole-admin 409 `last_admin` after verifying token rotation on role change, correct-pw 204 + `no-store`, old token 401, tombstone row fields, original email re-register 201, CLI `user delete` output shape, double-delete rejected, export schemaVersion 2); live-stack metrics smoke on the merged tree (request/duration counters with `nomatch` bucket, pgpool + go families, HELP/TYPE headers, both skips, slog JSON request lines). FE vitest 512 / vue-tsc clean / main e2e 71+1skip / noauth 4. Remaining manual tail for the owner: schedule `backup.sh` (cron or the runbook's systemd timer) and run `restore-drill.sh` against the real prod stack once it is up — this host has no prod stack running, so the drill leg ran against throwaway containers only. Roadmap: P0–P8 all closed; P8 remainder is ④'s render-side consumption (on demand) and nothing else is 待启动.
- 路线图收口波次交付——P8 第二批(③账号注销 + ④静态兜底目录导出)与 P3 重落(备份 + 可观测),依 owner 第三条指令「实现 roadmap 所有待办事项」。子仓提交:crearte-server `12b8ffb`(0.15.0——迁移 0011 墓碑列;AccountService 注销内核:密码复核、名下作品全部下架、草稿删除含对象 best-effort、pending 投稿自动驳回、token_version 递增废全部会话、email/username 改写为 `deleted-<id>@deleted.invalid`/`gone-<id8hex>` 使原邮箱即刻可复用、唯一 admin 自拒 409 `last_admin`(与 P7 降级护栏同源);`DELETE /api/auth/account`(204/400/401/409/410,`Cache-Control: no-store`);CLI `user delete <email>` 免密码运维通道;CLI `catalog export --out DIR [--pretty]` 按 StaticContentRepository 契约出 `index.json`(schemaVersion 2)+ `games/<user>__<slug>.json`,virtual 带 bundle、external 省略、未配 `STORAGE_S3_*` 时 cover/bundle.url 置空仍可浏览;`user set-role` 加 `--by-id`)与 crearte `7d5f338`(0.21.0——AccountView 第四段「危险区:注销账号」:密码 + 知晓勾选双闸门、busy 锁、成功即清会话回首页、失败出 alert 行;`auth/client.ts` 加 `deleteAccount` 并分支 `toUserMessage` 文案;AdminUsersView 补齐 validation/not_found/internal 中文化(P7 文案尾,`7a54152` 钉桩),409 原文回显留在管理侧——账号页有意展示通用 internal 文案,因 auth client 将未知码归一并丢弃后端原文;审查提出的错误类型形状问题已在测试内钉清)。crearte-deploy `12f7c10`(0.6.0)与 crearte-server `d627e12`(0.16.0)以 cherry-pick `7fcfe0e`/`6ffd1ee`/`93a3c70` 字节级重放 P3——原提交在回滚窗口脱离 master:prod 备份件(`scripts/backup.sh` pg_dump + mc-mirror + 保留策略 + manifest、`restore-drill.sh` 只连 `db-test`、`docs/BACKUP-RUNBOOK.md`、CI dry-run 腿、compose 透传 `LOG_FORMAT`/`LOG_LEVEL`)与可观测(stdlib `log` 机械迁 `slog` 共 30 处含 P7/P8b2 新面、每请求 `http_request` 中间件挂在 `gin.Recovery` 外层使 panic 路径记 status=500、手写 `/metrics` 出 http/go/pgpool 三族、`/healthz` 与 `/metrics` 双跳过、限流单实例权衡入档)。P3M 合流提交 `cecfae1` 把可观测分支与 P8b2 面调和(CHANGELOG 顶序 0.16.0→0.15.0、router/serve 双侧接线保留)。验收:每腿容器四连绿 + 全新真库 `-p 1 -count=1`(skip 守卫 grep 0,注销链与 observability 套件 PASS);独立审查 PASS(P3S 审查员逐文件对 `6ffd1ee`/`93a3c70` 核到字节级一致;前端审查 PASS with notes——两条次要已合主前钉桩 `7a54152`;server 侧 `config.applyLogging` 与 `observability.newLogger` 的 LOG_LEVEL 大小写策略不一致按次要 deferred);分支真产物 curl 冒烟 14/14 PASS(错密码 401 `invalid_credentials`、缺密码 400、角色变更后先验 token 轮换再证唯一 admin 409 `last_admin`、对密码 204 + `no-store`、旧 token 401、墓碑行字段、原邮箱重注册 201、CLI `user delete` 输出形状、二次注销被拒、导出 schemaVersion 2);合主树实栈 metrics 冒烟(请求/耗时计数含 `nomatch` 桶、pgpool 与 go 族、HELP/TYPE 头、双跳过、slog JSON 请求行)。FE vitest 512 / vue-tsc 零错 / 主 e2e 71+1skip / noauth 4。留给 owner 的手动尾巴:按 runbook 给 `backup.sh` 排定时(cron 或 systemd timer),并在真 prod 栈起来后跑一次 `restore-drill.sh`——本机无 prod 栈在跑,演练腿只对一次性容器做过。路线图:P0–P8 全部闭合;P8 仅剩④的 render 端消费(按需),无待启动项。
## [0.3.1] - 2026-10-01
### Done / 完成
- P9 UX batch-1 (browser feedback pack) delivered: crearte `26cd625` (0.22.0 — two-phase router-level `document.title`: `afterEach` static baseline over the full 19-name route table + refinement watches on exactly four data pages (game/catalog/docs/author), home deliberately kept as the bare `crearte 创艺` string so the existing e2e pin never moved; game-page `meta description` with 120-codepoint clipping, DEFAULT fallback and per-navigation reset back to default (review ISSUE-1 patched pre-merge, pinned by a router test); `StatePanel` skeletons honest at last — card variant 3→6 (≥1.5 rows at each 2/3/4-column breakpoint), new `lines` variant on the six non-grid consumers (eight instances incl. AdminView ×3), index.html gains the default description meta). Zero server/deploy changes. Acceptance: vitest 551 (baseline 512 + 39 new) / vue-tsc clean / build OK / main e2e 72+1skip incl. a new title leg / noauth 4. Independent review PASS with notes — ISSUE-1 (leave-game description not restored, spec D-C sub-clause) and ISSUE-2 (spec §1 said "seven non-grid pages", CreatorCenterView does not consume StatePanel — count is six; wording fixed in spec and changelog) both resolved before merge. B (keyboard/skip-link/mobile header) and C (dark mode) batches parked pending owner go-ahead.
- P9 UX 第一批(浏览器反馈包)交付:crearte `26cd625`(0.22.0——两段式路由级 `document.title`:`afterEach` 按 19 个路由名全表设静态基线 + 恰好四个数据页(作品/目录/文档/作者)watch 精化;home 有意保持裸 `crearte 创艺` 整串,既有 e2e 钉桩一字未动;作品页 `meta description` 截 120 码点、默认回落、每次导航复位(审查 ISSUE-1 合主前补钉并以 router 测试钉桩);`StatePanel` 骨架终诚实——cards 变体 3→6(2/3/4 列断点各≥1.5 行)、新增 `lines` 变体给六个非网格消费页(八实例含 AdminView×3);index.html 补默认 description)。server/deploy 零改动。验收:vitest 551(基线 512+新增 39)/ vue-tsc 零错 / build OK / 主 e2e 72+1skip(含新增标题腿)/ noauth 4。独立审查 PASS with notes——ISSUE-1(离开作品页 description 未恢复默认,spec D-C 子项)与 ISSUE-2(spec §1 写「7 个非网格页」,实际 CreatorCenterView 不消费 StatePanel,应为六个;spec 与 CHANGELOG 措辞已修正)均合主前处置。B(键盘/skip-link/移动端页头)与 C(暗色模式)两批挂账待 owner 发令。
## [0.2.9] - 2026-10-01
### Chores / 杂务