Commit Graph

80 Commits

Author SHA1 Message Date
浅念 fa27a3a308 fix(build): validation_issues 分批插入;import/build 报告写序对齐 HTML 先;canonical mismatch evidence 修正
- validation_issues 落库改分批(VALIDATION_ISSUES_CHUNK=1000 行/批循环):
  单 INSERT 占位符上限(pg ~65535 ÷ 6 列)会被超大 issue 集撞穿;
  run 行先落、批次间无序依赖。新增测试:1101 坏链注入 → 全量 1101 行
  落库、收口 VALIDATION_FAILED(非 GATE_INTERNAL)
- import 域报告写序换 HTML 先(与 build 域对齐——json 在则 html 必在)
- gates canonical 指错分支 evidence 改 kind:'canonical-mismatch'
  (mismatch 语义不再误用 missing 键;缺席分支保持 missing:'canonical')
- build.html 尾换行对齐 import 域
- 计划文档 Task 9 补审查遗留清单(helper 迁移/Plan 5 前置门禁面)

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-22 13:07:01 +08:00
浅念 3e436d907a docs(plan): P4 Task 5 勾选补全
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-22 11:53:32 +08:00
浅念 06ba069f9c fix(build): taskkill error 监听回退单杀(终验 nit)+ docs: P4 Task 5 勾选
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-22 11:53:01 +08:00
浅念 107642c1b3 docs(plan): P4 Task 4 勾选 + Task 8 分派观察项
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-22 10:06:38 +08:00
浅念 097cfd5609 docs(plan): P4 Task 3 勾选 + Task 5 备忘(包名 filter/Windows 退出码判据)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-22 09:03:14 +08:00
浅念 56e4ca96e7 docs(plan): P4 Task 2 勾选
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-22 08:18:57 +08:00
浅念 5686c5c8ba docs(plan): P4 Task 1 勾选 + brand 容忍契约入 Task 3
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-22 07:21:59 +08:00
浅念 a009f49961 docs(plan): Plan 4 终审定稿——ADR-018 枚举补全
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 22:48:09 +08:00
浅念 63056d33cf docs(plan): Plan 4 修复评审三 Issue 与建议——编码路径贯穿规则(54 条真实数据实测)、发布 actor/P0 门禁决策、无网证明测试、route-manifest 认领、URL 重写匹配键、ADR-010 双修订测试、分页统一不做、410/CSP/目录列表、redirect 全量与桌面截图
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 22:46:30 +08:00
浅念 171137bc8e docs(plan): Plan 4 实施计划——阶段4 发布/主题/构建/预览(9任务,浏览器时刻)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 22:34:57 +08:00
浅念 066ba289bb docs(plan): Plan 3 收官——移交清单第 9 项终审既定事实
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 21:27:58 +08:00
浅念 fc36239b35 docs: Plan 3 终审收官——ADR-017 补决策六/七(is_primary first-import-wins、§7.6 事务粒度偏差),移交清单补三点既定事实
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 21:27:16 +08:00
浅念 6d9f7b6ad7 docs: ADR-017/README/阶段4移交清单
- ADR-017 导入管道决策五项:幂等双轨身份键(六列快照行+五列内容身份)与
  canonical.ts 共享 checksum 输入域/收编 UPDATE 语义;自建 term((domain,nicename)
  兜底 + auto: 前缀 + name 回退 + 双序终态等价含 null-id 收编);counts 键全局
  命名空间求和聚合;stale 回收维持 created_at 近似 + 24h 不加心跳列(REST 化重审)
  与报告 issues 封顶;编排串行分派契约(锚点依赖推导)
- README:快速开始加 sf import 全链示例(register→import);当前状态更新
  (阶段 3 完成:192 条目真实落库/二导幂等 0 新修订/333 测试);ADR-001~017
- Plan 3 计划文档:Task 8 勾选 + 验收 6 项全过核验 + 文末新增"移交 Plan 4 清单"
  8 项(publish 命令/Render Snapshot 六文件/pilot-minimal 六类页面+Astro 五禁/
  Preview Server/最小门禁/导入产物消费接口与副本路径/续传项/度量基线 51.8s·20.3s·304MiB)

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 21:20:21 +08:00
浅念 3776a0d6ad docs(plan): P3 Task 7 勾选——真实全量导入验收通过
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 21:04:40 +08:00
浅念 1c4c163743 test(evidence): 阶段3真实全量导入验收
Plan 3 Task 7:真实 hesupipe 输入(WXR 5.5MB + 媒体 2625 文件/164.53MiB + 侧车 859 条)
全量导入验收证据——断言总表 21 项全过(content_entries=192 / source_records=1122 /
terms=451+476 自建 / media_assets=836 全侧车二级命中+19 missing 全列 / routes=2772
逐桶闭合 / published 指针全程未动);换 key 二导全幂等(五表行数不变);临时库验后
DROP;storage/incoming 副本保留(Plan 4 构建用)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 20:54:28 +08:00
浅念 cf6193acc5 docs(plan): P3 Task 6 勾选
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 20:40:51 +08:00
浅念 fa6e8a35dc chore(import): 终验三处一行补完——fact-12 JSDoc 分层和解、flush 措辞、tsbuildignore
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 20:40:30 +08:00
浅念 27a8282367 docs(plan): P3 Task 5 终验注记补全
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 19:46:05 +08:00
浅念 15d7c91648 docs(plan): P3 Task 5 审查移交的 Task 6 汇流契约底本
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 19:40:35 +08:00
浅念 fae44a11f8 docs(plan): P3 Task 5 勾选
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 19:15:38 +08:00
浅念 c8a2ed81e5 docs(plan): P3 Task 4 勾选 + Task 7 度量口径
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 18:56:44 +08:00
浅念 99c07906cd docs(plan): P3 Task 3 勾选 + Task 6 编排义务六项
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 18:20:08 +08:00
浅念 24220c5ee9 docs(plan): P3 Task 2 勾选
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 16:50:12 +08:00
浅念 2d57c3c814 docs(plan): P3 Task 1 勾选
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 16:00:14 +08:00
浅念 eb188da5c2 fix(import): 复用口径忠实化;管道 Outcome 契约与 succeeded_with_issues;报告写入时序;stale 警告
评审修复(Plan 3 Task 1 复审):
- 复用路径只返回 job 锚定字段(jobId/status/reused/siteId/mapping_version/
  report_path),快照/版本块仅在非复用时解析返回——复用结果不再回显编造数据
- ImportPipeline 契约钉死:返回 Promise<ImportPipelineOutcome>
  ({ counts, issues });服务按"累加器 ⊕ 返回值"合并(counts 同键返回值
  覆盖、issues 累加器在前),issues 非空 → succeeded_with_issues;
  ctx.report 即累加器(管道抛错时部分产出仍入报告)
- 报告时序:mkdir + tmp 写入 + rename 先于终态行更新——report_path 落库
  即文件存在;写失败 → failed(REPORT_WRITE_FAILED),不挂悬空路径
- CLI 复用命中非终态(queued/running)→ 崩溃残留警告(重试需显式换 --key)
- 管道抛 ImportError 保留原 code 入 error_code,summary 冠 [pipeline]
- 确定性 23505 探针:未提交孪生 job 行事务内持唯一键触发真实 PG 唯一
  冲突 → 败者复用既有 job
- 报告补 idempotencyKey / attempt 字段
- 计划文档 Task 6 增补 stale 回收决策项(ADR-017)

测试 282 通过(279 + 3:Outcome 合并/ImportError 前缀/23505 探针);
typecheck 四段链 + lint 全绿。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 15:56:00 +08:00
浅念 0e8b2b5356 feat(import): job 骨架与生命周期
Plan 3 Task 1:sf import 命令骨架 + import_jobs 生命周期(空管道,Task 6 接真实管道)。

- import.service.ts(零装饰器):createImportJob——站点/快照解析(缺省按 (connection,
  kind='wxr') 选最新;三快照绑定按前置事实 13 记入报告,job 行不扩列)、幂等建行
  (默认 key=site+wxr快照+三语义版本;重复提交复用既有 job 不重跑,并发撞唯一约束
  重查收敛)、状态推进 queued→running→succeeded/failed(attempt/started_at/finished_at/
  error_code/error_summary)、报告落 artifacts/import/<jobId>/reports/import.json
  (全四版本块:adapter/mapping/sanitizer/parser;job 行落 mapping_version)
- 可预期错误带 code:SITE_NOT_FOUND / SNAPSHOT_NOT_FOUND / NO_WXR_SNAPSHOT /
  PIPELINE_FAILED——解析期失败零 job 行
- adapter 事件加法式补 postId(前置事实 12):unsupported/error 事件可选携带
  String(postId),缺失时键缺席不硬造 source_id;row 事件与报告聚合零影响、不触发版本 bump
- canonicalJson 提取至 apps/api/src/common/canonical.ts 共享导出(前置事实 6),
  register 侧改 import 零行为变更(既有清单哈希测试守护)
- sf CLI + import 命令(--site/--snapshot/--key/--connection),输出 job 摘要与版本块
- 测试:tests/integration/import-job.test.ts(5 例:生命周期观察/最新快照解析/幂等复用
  与并发收敛/可预期失败零落行/failed 路径)+ adapter postId 3 例 + canonical 单测 6 例
  (265→279 全绿);typecheck 四段链/lint 绿;临时库 CLI 冒烟(register→import→复用)通过

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 15:30:42 +08:00
浅念 e52a2eb3e4 docs(plan): P3 Task 0 勾选
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 15:13:09 +08:00
浅念 a227cfac49 feat(source): 媒体映射侧车导出与登记
Plan 3 Task 0(评审 Issue 1):旧 cms 库 media_assets 的 source_url→file_path
映射只读导出为侧车 JSON(859 条,覆盖率对照 WXR 855 attachment_url:精确命中
836 / 归一命中 0 / 未命中 19,97.8%),register 新增 --media-map 输入通道
(kind=manual_url_list 快照,形状校验 INVALID_MEDIA_MAP,metadata 含条目数,
幂等复用)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 14:42:32 +08:00
浅念 9937f76856 docs(plan): Plan 3 定稿——Task 1 补 adapter 扩展提示
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 14:19:51 +08:00
浅念 9233f1ce5d docs(plan): Plan 3 终审收尾——unsupported 事件加法补 postId、product-tag 同步、Task0 SQL 过滤、措辞统一
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 14:17:56 +08:00
浅念 4f6d50a7ae docs(plan): Plan 3 复审两 minor+五建议——status 入 checksum 域、unsupported 也写 source_records(1122)、三快照绑定语义、product-tag 勘误、permalink 措辞
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 14:15:40 +08:00
浅念 d392370fda docs(plan): Plan 3 修复评审两 P0+四项——媒体映射侧车(真实数据实证扁平目录零命中)、checksum 输入域钉死(排 rawLocation)、attachment 降级 301、站点路径来源、悬空引用用例、§6.1 全行覆盖、locale 接缝、计数勘误
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 14:10:36 +08:00
浅念 664aade131 docs(plan): Plan 3 实施计划——阶段3 内容导入管道(8任务)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 14:00:09 +08:00
浅念 a96f35c854 docs(plan): Plan 2 收官——Task 9 勾选、终审账本补遗(issues 机器码化/媒体限额/ADR 第三处 paths)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 13:41:51 +08:00
浅念 2a0d830520 docs: 阶段2收尾——ADR-016/typecheck链/阶段3移交清单/README
- ADR-016:saxes ^6.0.0(勘误:计划曾误写 ^0.9)/commander ^14 根依赖/清洗三件套
  同 range + 镜像直调 launder.naughtyHref/tsx ^4 CLI 直吃 TS;跨包接线(根 tsconfig
  paths 三方消费、build 侧 dist+prebuild、tsconfig 双链型并存);根 engines 升
  >=22.12(对齐 sanitize-html 2.18 engines,CI node 22 与本机 24 均满足)
- 根 typecheck 链扩为四段:追加 pnpm --filter @sf/adapter-wp typecheck
- Plan 2 文末新增"移交阶段 3 清单"定稿(7 项:taxonomyRefs 自建缺失 term、
  media_bundle 映射、connection 库级唯一索引、REST 重审项、导入消费接口、
  Task 0.2 cms 备份续传携带、versions.ts bump 纪律);Task 9 与验收节勾选
- README:快速开始加 pnpm sf 示例;目录结构/文档导航/当前状态更新为阶段 2 完成
- 三绿:lint / typecheck(四段)/ test 263 全部通过(数量不变)

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 13:34:15 +08:00
浅念 57357cd493 docs(plan): P2 Task 8 勾选——真实冒烟验收通过
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 13:28:03 +08:00
浅念 21ef37232d test(evidence): 阶段2真实WXR冒烟通过
真实 hesupipe WXR(5,490,399B,SHA-256 与 Plan 1 基线一致)跑 wxr:probe 全链:
计数 18 项对照全过(rows 1047 / terms 451 / unsupported 75 细分一致 / failed 0 /
item 总数 1122);heapUsed max 62.2MiB < 100MiB(setInterval(100ms) 双 max 口径,
全程 167ms 仅 2 样本如实注明);parseMs 含流 IO 等待口径注明。
nicename 锚点核对:在表 taxonomy 706/706 全命中(nicename≡slug,违例 0);
category/post_tag 共 807 引用因 wp:term 表缺该 taxonomy 不可解析——阶段 3 需按
(domain, nicename) 自建缺失 term,不能假设 term 表完备。
eslint.config.js:scripts/*.mjs 显式 node 全局(no-undef 误报)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 13:25:09 +08:00
浅念 75028e8a16 docs(plan): P2 Task 7 勾选 + Task 9 移交清单
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 13:14:35 +08:00
浅念 c28c1655a4 fix(source): DB 事务化;storageRoot 入 metadata;siteCreated 与并发测试;CLI 体验与校验小修
评审修复(4 项 Important + 8 项 Minor):
- DB 事务化:site→connection→snapshots 全部落库包进 db.transaction 单事务
  ("任何失败零落库"字面成立);助手改收 Pick<select|insert|execute> 结构类型
  (tx 与直连 db 通用)。并发撞唯一约束不在事务内补查(语句失败后续查 25P02),
  改为 registerSource 层事务级重试(≤3 次,第二次 select 命中复用分支)
- connection 并发:select-then-insert 无约束可兜底,事务内 pg_advisory_xact_lock
  (siteId:name) 串行化同键登记(kind 枚举扩展推迟 REST 通道,注释注明)
- storageRoot 绝对路径固化进每条 snapshot metadata 与报告 inputs(快照不可变,
  事后无法补写——永久缺口封堵)
- ensureSite 返回 created;RegisterResult.siteCreated;CLI 站点已存在时提示
  --name/--locale/--origin 未生效
- 媒体复制期逐文件 sha 复核(copyAndHash 对拍清单,源中途变更 → COPY_FAILED)
- 空媒体目录拒绝(EMPTY_MEDIA_DIR)
- CLI:PATH_NOT_ALLOWED 追加 --allow 提示;--origin 经 new URL 校验(http/s)、
  --locale 语言标签形状校验,fail fast;开跑打印生效白名单(审计)
- makeRunId 服务导出、CLI 复用;.tmp 残留手工清理策略写入文件头注释
- 测试 +2:并发同输入恰好一组行/双方同 id/新建标志恰一(3 次重跑稳定);
  isUniqueViolation 形状单测(drizzle cause.code / 裸 code / 其他)

全套 263 绿;typecheck / lint 绿;CLI 冒烟对临时库验证事务路径、siteCreated
输出、defaults 落库(en-US / https://qa.example)、白名单打印与校验报错

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 13:06:48 +08:00
浅念 9732e1b684 fix(source): 中间段符号链接逃逸堵截(无条件 realpath);注释口径修正
- validateInputPath 原先只在末段是符号链接时 realpath——中间目录段含 junction
  (链接在白名单内、目标在外,Windows 免特权可构造)时词法前缀判定被绕过,
  会读到白名单外内容(评审 PoC 复现)。改为 lstat 存在性探测后无条件
  realpath(abs),整条路径解析到物理位置再做白名单与类型判定;断链场景
  realpath 抛 ENOENT 仍归入 INPUT_NOT_FOUND(语义不变)
- 回归测试:中间段 junction 逃逸用例(incoming/junc → pkg-outside/escape.xml,
  断言 PATH_NOT_ALLOWED + 零落库);已对修复前代码验证为红(逃逸被接受)、
  修复后绿
- 注释口径修正:registerSource 的"任何失败零落库零复制"只在校验阶段成立——
  摄取中途失败不回滚已落位副本(content-addressed、幂等无害),但 DB 写入
  在全部摄取完成后才开始,任何失败零落库不变
- 计划勾选:Task 7 "CLI 执行机制(钉死)"(已实现并双命令冒烟验证)

全套 261 测试绿(+1);typecheck / lint 绿

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 12:47:07 +08:00
浅念 46b823e667 docs(plan): P2 Task 7 勾选
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 12:31:31 +08:00
浅念 a535cde270 docs(plan): P2 Task 6 勾选
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 12:09:41 +08:00
浅念 15e1e51a14 docs(plan): P2 Task 5 勾选 + Task 6 对接清单
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 11:27:18 +08:00
浅念 8796da03f1 docs(plan): P2 Task 4 勾选
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 10:14:47 +08:00
浅念 f4971a943b docs(plan): P2 Task 3 勾选 + 两批审查移交件并入 Task 4
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 09:26:49 +08:00
浅念 6eb5fa6dda docs(plan): P2 Task 2 勾选
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 08:41:17 +08:00
浅念 ec898f6e0a docs(plan): P2 Task 1 勾选;tsconfig 双链型注释(ADR-016 待记)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 08:16:18 +08:00
浅念 2d33dd17dd docs(plan): Plan 2 采纳复审建议——paths 统一三方消费、commander 定根依赖
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-20 22:53:40 +08:00
浅念 5cc98c584f docs(plan): Plan 2 修复评审三 Issue 与建议——CLI机制/跨包接线前置/media清单哈希定义/probe路径策略/内存采样法/报告路径/责任链续传
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-20 22:51:53 +08:00
浅念 ecff5a34af docs(plan): Plan 2 实施计划——阶段2 WXR 流式适配器(9任务)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-20 22:46:37 +08:00