lixi 39cf422f89
CI / docs-build (push) Successful in 46s
docs: ADR-023 M4 架构与关键决策成文 + ADR-018 视频后置标记取代 + 补仓内 .gitignore
ADR-023 收录 M4 全部跨角色决策(13 节),来源为开工分析八份报告与逐项
讨论拍板。要点:

- 范围:视频与图片同批交付,**取代 ADR-018 的「视频后置」**(该条已加
  supersede 标记,其余裁剪继续有效)。schema 侧本无障碍——目标模型自始
  按 media_kind IN ('image','video') 建模;成本集中在契约与客户端。
  供应商:视频 Seedance、图片 gpt-image-2;生产服务器无 GPU 故一律云 API。
- 服务划分:新建 Java 模块 patbond-creation(:8085) 持有队列与客户端端点;
  patbond-ai 为独立 Python 仓、只调服务商 API、不访问数据库。
- 队列:Postgres FOR UPDATE SKIP LOCKED + 租约,不引入 Redis/MQ
  (偏离 development-plan.md:205,判例同 ADR-002 移除 Nacos)。
- Java↔Python:统一异步、REST 非 gRPC、内部契约独立 openapi-internal.yaml
  不进快照锁、轮询为保证回调仅预留字段、服务端轮询节律与租约 TTL 约束。
  产物走 presignPut 直传——**据此更正开工报告的「服务端零对象写能力=缺失
  地基」推论**:缺 putObject 是事实,但服务端需要的是签发上传凭证,
  presignPut/presignGet 早已存在;附带使 Python 零对象存储凭证。
- 鉴权:服务身份 JWT 独立密钥对,禁止转发用户 token。事实依据:现有
  JwtVerifier 仅验签名、不校验 aud/iss,且用户 token 无 aud claim,
  复用密钥对会使四个模块把服务票当合法用户 token 接受。
- 数据模型:V6 两处偏离(input_asset_id 可空、新增 first_attempt_at)
  逐条记录原因;V7 目录种子待官方文档,不编造取值。
- 对象存储:**决策挂起,现有本地实现一行不动**。已核实 media.assets 的
  storage_type IN ('object','external') 使两种存储可共存、渐进迁移,
  任一选择均无需 DDL;另登记「六容器栈当前仅在开发机运行」与「MinIO 9000
  对真机不可达」两项上线前置。
- 埋点:eventVersion 定型为每事件 props schema 版本 + bump 规则;服务端
  指标以 generation_jobs 为权威不建第二管道;毒丸批次放大器须修;
  A/B 前置重置 5 绿 3 半、首个实验为 A/A;北极星改事件驱动触发条件。
- 契约 v1.5.0 纯增量、429 拆两码、AI 来源须由服务端从 generation_job_id
  派生(不得由客户端声明或由 purpose 推断,否则可被任意图片伪造)。
- 客户端:自适应轮询非 SSE、超时按 media_kind 由服务端下发、不承诺推送、
  不押注百分比进度、第六个 UI 态僵死/超时。
- 遗留:widthPx/heightPx 两侧同批必修、SegmentedButton 降 P2(实测
  7.19:1 达标)、收藏与草稿两页搭车、草稿类目静默降级须与放开写侧同提交修。
- 门禁:必需上下文已改 (pull_request) 并复核生效;patbond-ai 纳入发布语义。
- 版本号:v0.5.0。

另补本仓 .gitignore:site/ 此前仅靠机器级 ~/.gitignore_global 屏蔽,
换机器或进 CI 时一次 git add -A 会提交上百个构建产物(ADR-023 §12)。

验证:secret-scan exit 0;mkdocs build --strict exit 0。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 16:43:49 +08:00
S
Description
Patbond doc
1.7 MiB
Languages
Shell 100%