Yaojia Wang
|
7c4b3c95be
|
docs: 登记 AC-2 契约 C3 扩(AI 对话端点)+ PROGRESS 台账
- memory/contracts.md:C3 扩(AC-2)AI 对话端点登记「稳定」——POST/GET
/projects/{id}/ai-messages 请求/响应 schema + per-kind meta 形状 +
冻结 schema 名;标注 @frontend AC-3 须 pnpm gen:api。
- PROGRESS.md:AC-2 标 ✅(commit c675a74)+ 一行台账 + 变更日志。
|
2026-07-09 16:55:39 +02:00 |
|
Yaojia Wang
|
c675a74f1d
|
feat(backend): AI 对话聊天记录 repo + append/list 端点(AC-2)
在 C2 扩(AC-1) `ai_messages` 表上落 AC-2 后端(计划 §3):
- repo `SqlAiMessageRepo`:批 append(seq=批内 0 基位置、同 thread_id、只 flush)
+ `list_for_chapter` newest-first(created_at DESC, seq DESC)、chapter_no 过滤含
项目级 NULL union、可选 kind、limit/offset。
- schemas `ai_messages.py`:批级 append 信封 + Literal 枚举权威(kind/role)+ content
200k 上限 + meta 序列化兜底。
- 端点 `POST/GET /projects/{id}/ai-messages`(tag ai-messages,已注册):显式记录写入,
五个生成端点保持只读不变(守 #3);项目 404、校验 422、POST 端点提交。
- 注入缝 `get_ai_message_repo`。
TDD:repo 真 pg 单测(seq/定序/union/分页/flush-only)9 passed;端点集成测试
(round-trip/union/kind/404/422×5/commit 边界)12 passed。门禁全绿:ruff/format/mypy
238 files/alembic check 无漂移/pytest 992 passed;新模块 cov router+schemas 100% / repo 97%。
|
2026-07-09 16:54:52 +02:00 |
|
Yaojia Wang
|
1a188e6e5b
|
feat(db): ai_messages 表 + 迁移——作者↔AI 往复聊天记录 append-only 侧表(AC-1)
计划 §2 canonical DDL:AiMessage(UuidPk, CreatedAt, Base),project_id(FK CASCADE)/
chapter_no(nullable=项目级)/thread_id/seq(repo 批内定序)/kind/tool_key/role(CHECK)/
content/meta(JSONB '{}'),append-only 无 updated_at。复合索引 (project_id,chapter_no,
created_at DESC) 手写 sa.text DESC + FK 单列索引。迁移 ceabd3c2c00d(down=f6a7b8c9d0e1),
autogenerate 仅捕获 ai_messages 无杂散漂移。T0.2 后第一张新业务表;旁路侧记录非手稿真源,
assemble()/agent 永不读(守 #1/#3/#6)。契约 C2 扩已「稳定」。
|
2026-07-09 16:39:24 +02:00 |
|
Yaojia Wang
|
9da938d39b
|
docs: AI 对话(聊天记录)实施计划入库 + 台账登记(决策全 A,开工)
|
2026-07-09 16:33:14 +02:00 |
|
Yaojia Wang
|
31067abbed
|
merge: writing-first 工作台 + QA-CR 整改 + WFW-9 澄清收尾 + 本地端口 +1000(feat/writing-first-workspace,66 提交)
- 写作工作台重构 WFW-0~9:进来即写 / 编辑器内 refine·续写·工具箱·整章重写 / AI 反问澄清 M1–M3
- QA-CR 全项目评审整改:2 CRITICAL + 13 HIGH 全修(对抗式复核 0 遗留)+ MEDIUM/LOW 批
- 本地/compose 宿主端口 +1000 防冲突(web 4000 / api 9000 / pg 6432)
|
2026-07-08 18:53:57 +02:00 |
|
Yaojia Wang
|
c34dbf5d2d
|
chore(devops): 本地/compose 宿主端口 +1000 防冲突(web 4000 / api 9000 / pg 6432)+ 文档登记
|
2026-07-08 17:33:43 +02:00 |
|
Yaojia Wang
|
2145d33cc7
|
docs: 修正台账——CR-M4/M5/L1 状态标 ✅(代码早已提交,前端 agent 漏翻表格状态)+ MEDIUM/LOW 批收口
|
2026-07-08 14:37:35 +02:00 |
|
Yaojia Wang
|
a039a1e5d9
|
chore(devops): 抬高后端依赖下界至 lockfile 主次版本,保可复现(CR-D1)
|
2026-07-08 13:34:36 +02:00 |
|
Yaojia Wang
|
05f49d0b7f
|
docs: 登记 CR-M4/M5/L1 前端评审收尾(done/skipped)
|
2026-07-08 13:27:46 +02:00 |
|
Yaojia Wang
|
64145422eb
|
refactor(web): 去冗余 cast(idx.valueOf / dict[error] as string)
stream/sse.ts SseFrameBuffer 去 idx.valueOf()(idx 本就是 number);jobs/job.ts 去 dict["error"] as string(typeof 守卫后 TS 自动收窄)。typecheck 绿。
|
2026-07-08 13:27:45 +02:00 |
|
Yaojia Wang
|
16f2eae2d3
|
test(web): parseJsonBody 补非对象/非 JSON 守卫分支测试
server.parseJsonBody 已具边界校验,补两条守卫分支测试(200 返回原始值/非 JSON 体均抛结构化错误)。
|
2026-07-08 13:27:45 +02:00 |
|
Yaojia Wang
|
9cf4915d49
|
refactor(web): hasApplicableFix 改类型谓词,消除 applyConflictFix 强转
hasApplicableFix 重写为对象入参类型谓词 patch is ApplicablePatch,谓词命中后 applyConflictFix 里 original/replacement 自动收窄为 string,删两处 as string;补收窄单测。
|
2026-07-08 13:27:45 +02:00 |
|
Yaojia Wang
|
d80d41a08d
|
refactor(web): ApiErrorEnvelope 改由生成 schema 派生,防契约漂移
手写 ApiErrorEnvelope 改由 components["schemas"]["ErrorEnvelope"] 派生;accept 端点专属 details.missing_conflict_indices 就地收窄。运行时行为不变(既有 useAccept 测试全绿)。
|
2026-07-08 13:27:32 +02:00 |
|
Yaojia Wang
|
125908ed83
|
fix(web): ReviewReport flashMark 定时器卸载清理,防泄漏
flashMark 的 setTimeout 句柄入 ref + 卸载 useEffect 清理,重复触发先清旧定时器;提 FLASH_DURATION_MS 常量。闪烁行为不变。
|
2026-07-08 13:27:32 +02:00 |
|
Yaojia Wang
|
47d5558e4a
|
feat(web): NavDrawer 补 aria-controls + ForeshadowCard 语义化 dl/dt/dd(a11y)
NavDrawer 汉堡按钮补 aria-controls 指向抽屉面板(Drawer 新增可选 id prop,默认 nav-drawer);ForeshadowCard 的 <dl> 裸 <div> 行改真 <dt>/<dd> 结构,可视文案不变,importance 用 sr-only 标签。行为不变。
|
2026-07-08 13:27:32 +02:00 |
|
Yaojia Wang
|
1bda024141
|
chore: 撤销 c596a8d 误提交的非源文件(.coverage/AGENTS.md/example_skills),忽略 .coverage
|
2026-07-08 13:13:38 +02:00 |
|
Yaojia Wang
|
f160a7dac1
|
docs: 登记 QA-CR MEDIUM/LOW 网关+链整改批(CR-M2/M3/L1@llm/M1.4)——6 done 2 skip
|
2026-07-08 13:11:18 +02:00 |
|
Yaojia Wang
|
6a739cad5e
|
perf(chain): review 节点并行扇出五审——复用主图 add-only 记账并发范式(CR-M3-6)
|
2026-07-08 13:08:19 +02:00 |
|
Yaojia Wang
|
ec91c8fdf7
|
refactor(chain): 链 runner 经公开 aget_state.interrupts 判暂停——弃私有 __interrupt__ 键(CR-M3)
|
2026-07-08 13:04:28 +02:00 |
|
Yaojia Wang
|
c9ffada503
|
feat(orchestrator): 续写链前一章无已验收终稿发 warning——静默丢前文引子可观测(CR-L1)
|
2026-07-08 13:02:30 +02:00 |
|
Yaojia Wang
|
832ab7dfa1
|
refactor(gateway): 适配器暴露 probe_connection 公开探测——provider_deps 弃私有 _client 反手(CR-M1.4)
|
2026-07-08 13:00:50 +02:00 |
|
Yaojia Wang
|
9439b97804
|
fix(gateway): 适配器瞬时错误消息脱敏——只留类名+状态码不泄漏厂商响应体(CR-M2-2)
|
2026-07-08 12:58:25 +02:00 |
|
Yaojia Wang
|
32451a9bd0
|
feat(gateway): 未知模型缺价发结构化告警——成本账缺项可观测(CR-M2-1)
|
2026-07-08 12:56:00 +02:00 |
|
Yaojia Wang
|
9ee7c7b000
|
docs: 登记 CR-M1 + CR-L1 后端片落地——台账 + @llm item#4 请求
CR-M1 4/6 完成(volume 下推 / N+1→create_many / jobs→JobRepo / 列表分页),
item#4(_client) 与 item#6(assemble 并行) SKIP(理由入台账);CR-L1 后端片
(SSE OpenAPI)完成,print 属误报。附给 @llm 的 probe_connection 请求。
|
2026-07-08 12:48:51 +02:00 |
|
Yaojia Wang
|
49e3cb6dc4
|
docs(backend): SSE 端点在 OpenAPI 如实声明 text/event-stream
draft/rewrite/review 三个流式端点返回 StreamingResponse,OpenAPI 原按默认
application/json 标注 200,schema 不诚实。新增共享 _SSE_RESPONSE 声明 200 的
content 为 text/event-stream 并挂到三个装饰器。export_openapi 通过,schema 现
出现 3 处 text/event-stream。未跑前端 gen:api(按要求)。
|
2026-07-08 12:46:15 +02:00 |
|
Yaojia Wang
|
bf3dabea82
|
perf(backend): 角色/世界观入库改批量——create_many 一次 flush 落全部行
角色入库端点与 toolbox world_entities 入库端点原逐卡/逐条 create(每行一次
SELECT/flush/refresh,N+1 round-trip)。新增 create_many:世界观用 add_all,
角色用一次 IN 查已有名 + 一次 flush(保持 (project_id,name) upsert 幂等与批内
重名去重、保序返回)。单条 create 薄封装 create_many,行为不变(既有调用方/E2E
复用)。复活并复用 CharacterWriteFields、新增 WorldEntityFields 作批量入参。
补两端点「多行一次落库」测试;既有幂等/冲突 gate 测试与 m5 真 pg E2E 全绿。
|
2026-07-08 12:44:07 +02:00 |
|
Yaojia Wang
|
0892ff6cda
|
feat(backend): 无界列表端点加分页——projects/templates 支持 limit/offset
GET /projects 与 GET /templates 原一次返回全部 owner 行,行数随数据线性增长。
新增可复用分页依赖 ww_api.pagination.get_page(limit∈[1,200] 默认 50、offset≥0,
越界 → 422),两端点接入,Repository.list_for_owner 加 keyword-only limit/offset
把 LIMIT/OFFSET 下推 DB。向后兼容:不传参返回第一页。补 projects 分页 + 边界 422 测试。
|
2026-07-08 12:39:31 +02:00 |
|
Yaojia Wang
|
1392830e57
|
refactor(backend): jobs 读端点走 JobRepo 而非路由内裸 ORM
GET /jobs/{id} 原在路由里直接 select(Job) 裸 ORM 查询;改为经 get_job_repo
注入 JobRepo 调 .get(job_id),与项目其它端点的 Repository 分层一致,
测试可经 dependency_overrides 注 fake。行为不变(同一 session 同一查询)。
|
2026-07-08 12:35:09 +02:00 |
|
Yaojia Wang
|
c596a8d342
|
perf(backend): 大纲卷过滤下推 DB WHERE——list_for_project 加 volume 参数
GET /outline?volume=N 原在端点 Python 侧过滤全部章节;现把 volume 条件下推到
OutlineRepo.list_for_project 的 DB WHERE,只查该卷行(少读多余卷 + 语义正确)。
Protocol/SqlOutlineRepo/各 OutlineRepo fake 同步加 keyword-only volume;补 repo 级
下推断言测试。向后兼容:不传 volume 仍返回全部(默认 None)。
|
2026-07-08 12:34:06 +02:00 |
|
Yaojia Wang
|
c22f6b41d1
|
docs: WFW-9 M2/M3 收口——rewrite 侧澄清 + a11y + E2E 全交付,台账标完成
|
2026-07-08 12:23:05 +02:00 |
|
Yaojia Wang
|
a703a90c0c
|
test(qa): WFW-9 两阶段 AI 反问澄清 E2E——refine+rewrite 真 pg+mock 网关零 token
|
2026-07-08 12:16:06 +02:00 |
|
Yaojia Wang
|
ea9a9d9953
|
fix(frontend): 澄清反问块加 role=status 向读屏播报(WFW-9 M3,WCAG 4.1.3)
|
2026-07-08 12:05:54 +02:00 |
|
Yaojia Wang
|
8e29b33a11
|
feat(frontend): 整章重写接入 AI 反问澄清——useRewriteClarify + ChapterRewritePanel 门控(WFW-9 M2)
|
2026-07-08 12:00:17 +02:00 |
|
Yaojia Wang
|
4b1088a179
|
refactor(frontend): clarify toVM/PROCEED 提取到 clarify.ts 共享(WFW-9 M2)
|
2026-07-08 11:54:05 +02:00 |
|
Yaojia Wang
|
9b32743606
|
chore(frontend): gen:api 纳入 rewrite/clarify 端点(WFW-9 M2)
|
2026-07-08 11:52:11 +02:00 |
|
Yaojia Wang
|
6b7391d1b7
|
docs: 登记 WFW-9 M2 整章重写预检澄清——契约 C-Clarify 扩 + PROGRESS 台账
|
2026-07-08 11:47:26 +02:00 |
|
Yaojia Wang
|
6fd637596b
|
feat(backend): 整章重写 AI 反问澄清预检端点 rewrite/clarify(WFW-9 M2)
新增 POST /projects/{id}/chapters/{no}/rewrite/clarify(非流式 JSON)→ ClarifyDecision,
镜像 refine 侧 clarify:404 缺项目 → _build_rewrite_clarify_input(章级意见 + prior_draft
有界摘录 3000 字,不整章入 LLM)→ run_clarify(clarify_rewrite_spec, analyst 档) → 末尾
commit 落 usage_ledger → 返回决策。只读不写业务表(不变量 #3);日志只记 feedback_len(脱敏);
畸形 parsed 经 run_clarify 韧性回退 need_clarification=false(非 500)。新增 RewriteClarifyRequest
(feedback 必给、prior_draft 可选)。6 端点用例覆盖含糊/明确/404/fail-open/422/摘录有界不泄漏。
|
2026-07-08 11:46:24 +02:00 |
|
Yaojia Wang
|
4a09f273d9
|
feat(llm): 整章重写预检澄清 spec + 教条 clarify_rewrite(WFW-9 M2)
镜像 clarify_refine(仅 name/prompt 不同,复用 ClarifyDecision,不新增 schema):
新增 clarify_rewrite_spec(analyst 档、reads=()/writes=() 只读,不变量 #2/#3)+ 章级
教条 prompts/clarify_rewrite.md(segment→整章:判作者章级重写意见是否含糊)。注册进
SPECS/SCHEMA_CATALOG,自检数量 24→25,__init__ 导出,金标准仅新增 1 条哈希无漂移。
|
2026-07-08 11:42:21 +02:00 |
|
Yaojia Wang
|
331a07abc4
|
docs: QA-CR CRITICAL+HIGH 全部 ✅ 收口——台账标完成 + 变更日志登记
|
2026-07-08 11:32:47 +02:00 |
|
Yaojia Wang
|
dd6d2fce2b
|
docs(test): 更正 K1 E2E docstring 依赖名为 _http_client(CR-H2 收尾)
|
2026-07-08 11:29:27 +02:00 |
|
Yaojia Wang
|
e08b01ac58
|
test(llm): 锁定 llm_provider_failed 失败日志 request_id 条件透传(CR-H4 收尾)
|
2026-07-08 11:29:27 +02:00 |
|
Yaojia Wang
|
d6b53d08b2
|
fix(backend): 补 directive/instruction 文本上界——LLM 入参防超长(CR-H9 收尾)
|
2026-07-08 11:29:27 +02:00 |
|
Yaojia Wang
|
6e2b478ca9
|
fix(frontend): Drawer 焦点还原提取 useRestoreFocus + 回归测试 + DRY(CR-H11)
|
2026-07-08 11:10:23 +02:00 |
|
Yaojia Wang
|
5c02792e5f
|
fix(frontend): RefineView 取消在途 refine——AbortController 防段切换竞态(CR-H12)
|
2026-07-08 11:08:21 +02:00 |
|
Yaojia Wang
|
5665cc9a16
|
fix(frontend): errorCode 统一自 generation/cards 去重复定义(CR-H10)
|
2026-07-08 11:06:30 +02:00 |
|
Yaojia Wang
|
f4c2c4e8ec
|
fix(frontend): 升级 Next→15.5.20 + React 19.2.7 修 RCE/补丁 + 版本下界守卫(CR-C1)
- next/eslint-config-next 15.1.3→15.5.20(backport 安全维护线),react/react-dom 19.0.0→19.2.7
- @types/react(-dom) →^19.2.0;pnpm audit --prod 无 next/react/react-dom 高危/严重告警
- 新增 lib/security/dependencyFloors 守卫 + 回归测试锁定安全下界
- 连带修 useDraftStream.test noUncheckedIndexedAccess(重锁失效增量缓存后暴露,对齐 useReviewStream 既有 ! 约定)
|
2026-07-08 11:04:55 +02:00 |
|
Yaojia Wang
|
baa41d370b
|
fix(devops): .env.example 移除可用 Fernet key 换不可用占位符 + 轮换提示(CR-H8)
|
2026-07-08 10:56:01 +02:00 |
|
Yaojia Wang
|
e1a24a2c2c
|
fix(backend): API 文本输入加 max_length + 请求体大小中间件(CR-H9)
|
2026-07-08 10:53:44 +02:00 |
|
Yaojia Wang
|
26f10d023d
|
fix(backend): Kimi OAuth E2E 请求依赖 override 跟随改为 _http_client(CR-H2 lockstep)
|
2026-07-08 10:51:12 +02:00 |
|
Yaojia Wang
|
25d48b7aa7
|
fix(backend): 冻结 TOOLBOX 注册表为只读 MappingProxyType(CR-H7)
|
2026-07-08 10:41:15 +02:00 |
|