lhl
|
264054ba44
|
feat(ui): 折叠按钮位置统一到侧边栏内下边 + 状态切换图标
背景:原折叠按钮位置 top: 18px; right: -14px(顶部右外侧),
折叠态切换到底部左下角(top: auto; bottom: 14px; left: 14px),
导致两个问题:
- 折叠/展开状态位置不一致
- 按钮图标始终是 «,折叠态下也应该显示 »(UX 错误)
变更:
- chat.css #sidebar-toggle
- top: 18px; right: -14px → top: auto; bottom: 14px; left: 14px
- 折叠态位置规则 #sidebar.collapsed #sidebar-toggle 改为注释占位
(不再切换位置,按钮始终在侧边栏内下边)
- chat.html #sidebar-toggle
- 加 data-state="expanded" 属性
- title 从「折叠/展开侧边栏」改为「折叠侧边栏」
- chat.js toggleSidebar(force)
- 末尾加 8 行:根据 willCollapse 切换 textContent ('«' / '»')、
title ('折叠侧边栏' / '展开侧边栏')、data-state ('expanded' / 'collapsed')
- _AI_USAGE_LOG.md +1 条记录本轮所有 Agent 实现
副作用:折叠态下按钮因容器变窄(56px)且 left:14px,
视觉上自动居中(14+28+14=56),展开态下偏左。
这符合「侧边栏内下边」的语义(折叠态下按钮成为唯一视觉元素,居中更平衡)。
零行为变更:除位置/图标/title/data-state 切换逻辑外,
toggleSidebar 原有逻辑(classList toggle + localStorage 写入)完全保留。
验证(serve --fake @ http://127.0.0.1:8000):
- GET /static/chat.js -> 200 (text/javascript, 33669 bytes)
- GET / HTML 含 data-state="expanded" -> True
- GET / HTML 含 title="折叠侧边栏" -> True
|
2026-08-31 08:51:25 +08:00 |
|
lhl
|
4feaea6e1d
|
docs(frontend): 同步前端 UI 设计规范 + AI 使用日志
- docs/design.md 追加「前端 UI 设计规范」章节(设计系统、文件结构、兼容约束、本轮交付 vs 计划)
- _AI_USAGE_LOG.md 追加 5 条本轮记录(架构设计 / Agent 实现 / 反馈迭代 三个范式步骤)
参考:docs/superpowers/specs/2026-08-30-frontend-beautify-design.md
|
2026-08-30 22:59:43 +08:00 |
|
lhl
|
520c9e25b0
|
feat(ui): 前端整改 —— RAG 入口产品化、放开 select、高级字段折叠、字段级红框
按"不考虑时间、考虑正确合理"原则逐块实施。
P0-B 放开 select
- chat_state.js: shouldHideUploadSelect 始终 false; resolveUploadType 尊重用户选择
- chat.html: 选项目时 select 不再隐藏 + 不再强改 file_type=requirements
- 客户端 file_type↔扩展名校验(existing_system=.zip, requirements=.xlsx 等)
- 项目已预置同类型时 confirm() 显式覆盖确认(不藏起入口)
P0-C 高级字段折叠 + 字段级红框
- 项目抽屉主面板仅留 项目名/显示名;4 个服务器路径字段收进 details.advanced
- saveDrawerProject 错误时按 ProjectConfigError label 关键字(模板/做成说明书/
既有系统代码库/既有设计文档目录/项目名)给对应输入加 .invalid 3s 清除
- 删除按钮 pf-delete 改用 hidden 而非 style.display
P0-A RAG 入口产品化
- 后端 RagStore.count(scope) 线程安全读加锁
- GenesisService.rag_stats(sid) 含 except 兜底(count 抛错返回 0)
- GET /api/sessions/{sid}/rag-stats 端点
- 前端顶栏:RAG 开关 + RAG 已索引 N 片段 状态徽标 + 开始影响调查按钮
- 上传 existing_system 后自动 refreshRagStats 刷新徽标
- 开关持久化到 localStorage(genesis_rag_enabled)
P1-D loadSession 不再隐式覆盖 draftProject
- activeProject vs draftProject 分层;不一致时由 renderProjectMismatchHint
提示用户主动"切到该项目"或"保留当前项目"
- 保留 写入 sessionStorage 标记,避免每次 load 都提示
P1-F 删除抽屉项目 fallback 收敛
- 先记 deleted 再清 drawerSelected,修复"先 null 后比较"恒假 bug
- buildWelcome 唯一来源(chat_state.js 单点,前端内联重复移除)
P2-H 杂项
- send() in-flight 锁防双击
- input maxlength=2000
- 启动恢复前校验项目存在 + loading 占位
- select 关联 label for
- esc 转义加 引号
- sid 全程 encodeURIComponent
- avatar 按 name hash 选色 + 中文首字(Array.from)+ aria-label 含名字
测试:619 passed / 99.01% 99.0% 达标(+8 覆盖 store.count/service.rag_stats/
rag-stats 端点/rag_stats 异常);Node chat_state 9 passed
|
2026-08-30 21:16:07 +08:00 |
|
lhl
|
80daadcd31
|
fix(websocket): 修复 app.py 不可导入并新增真实链路验证
- 将 /api/sessions/{sid}/ws 端点移入 create_app(此前置于模块级导致整模块 import NameError,回归被验证拦截)
- register_loop + subscribe 调整至 accept 之前,缩小连接已开但未订阅期间的进度丢失窗口
- 新增 tests/test_verify_ws_real_flow.py:驱动真实 HTTP 聊天流程断言 WS 收到 agent 实际发射的 parse/impact 进度
- 同步 WebSocket 计划文档 Task 3 代码片段(标注端点必须位于 create_app 内)
- 全量 pytest 实测 583 passed / 99.03% 达标
|
2026-08-29 14:36:12 +08:00 |
|
lhl
|
9f5342e2be
|
docs: 追加 WebSocket 进度流实现记录(_AI_USAGE_LOG)
|
2026-08-29 12:21:04 +08:00 |
|
lhl
|
014a51a277
|
docs: 新增 WebSocket/RAG 迭代计划与工程评审记录(规划产物)
|
2026-08-29 11:37:45 +08:00 |
|
lhl
|
be79624db5
|
fix(chat): 前端审计修复——预览契约改HTML/状态机统一/进度错误持久化/chat_state.js抽取
- app.py: /result/preview 返回渲染 HTML(HTMLResponse) 而非 {html} JSON;新增 /chat_state.js 静态路由;预览缺失返回 404(RESULT_NOT_FOUND)
- chat.html: currentProject 统一为 draftProject;新会话继承已选项目(§4.2);上传区显隐/类型映射/抽屉脏检测改用 GenesisState;loadSession 按 role 渲染 progress/error;加 h1 标题
- chat_state.js(新): 抽取 autoBindProject/shouldHideUploadSelect/resolveUploadType/computeDrawerSnapshot/isDrawerDirty/buildWelcome 纯函数(U+1 分隔符)
- agent.py: 新增 _persist_progress/_store_error,进度与错误以 role 入库(重载可见)
- 测试: test_chat_state.js(11 passed) + test_frontend_audit_fixes.py(5) + 修正 test_server_api 旧 JSON 契约断言;全量 pytest 568 passed / 99.06%
|
2026-08-29 11:28:08 +08:00 |
|
lhl
|
c7897a15c1
|
docs: 更新 AI 使用日志(UI 修复 3 项)
|
2026-08-28 15:34:12 +08:00 |
|
lhl
|
a225c84dc8
|
docs: 新增 chat v4 DeepSeek 会话模式设计文档与实现计划 + 更新 AI 使用日志
|
2026-08-28 02:12:38 +08:00 |
|
lhl
|
e6702a2009
|
feat(web): 前端 v3 — 移除 Aura Pipeline 痕迹 / 项目切换器 / 删除会话 / 抽屉化项目配置 / 侧边栏折叠
按 docs/design-web-chat-v3.md 实施,仅前端改动,JS 与后端 0 改动:
- 移除品牌区 "Aura Pipeline" 装饰小标与 header 面包屑装饰
- 顶栏项目切换器(#proj-switcher):按钮 + 下拉菜单,含「不选择项目」+ 项目列表 + 「+ 项目管理」;
存在项目时自动绑首项(用户显式选过则不覆盖),项目被外部删除自动回退
- 会话项 hover 显示 × 删除图标 → confirm → DELETE /api/sessions/{sid};删的是当前会话自动 newSession
- 侧边栏 #sidebar-toggle 按钮整体折叠 56↔264px,状态 localStorage 持久化,刷新保持
- 项目配置(7 字段表单 + 列表 + 保存/删除)整体迁入主区右侧 #proj-drawer(460px 滑入,Esc 关闭);
侧边栏 #proj-panel / #proj-form 已移除
- 全量 558 passed, 覆盖率 99.10%
|
2026-08-28 00:01:13 +08:00 |
|
lhl
|
d6361cf025
|
style(web): 前端 UI 美化(Aura Space 规范,功能零改动)
- 按 Aura Space 暗色洁净混合美学 v2.0 重排 chat.html:google 色板令牌、Inter 字体、
12/16px 圆角、玻璃拟态 header(sticky + backdrop-blur)、品牌 logo 蓝色光晕、
助手消息前置 auraPulse 蓝色脉冲点、Material 多层阴影、全量 200ms 过渡动画
- 侧边栏改白底洁净风:品牌块、会话项 hover/active 蓝 50 态 + 左侧指示条、
项目配置面板卡片化;文件选择改用 label + 隐藏 input(上传逻辑不变)
- JS 逐字节不变(已程序化校验一致);test_root_serves_frontend 通过
|
2026-08-27 23:16:48 +08:00 |
|
lhl
|
916c5beed7
|
feat(web): 项目级配置 + 会话命名/历史 + 设计文档纳入影响调查
- 会话支持 name/project 字段,上传要件定义后自动命名;前端侧边栏会话历史 + localStorage 恢复,顶部只显示会话名
- 新增 ProjectsStore(SQLite)与 /api/projects CRUD;绑定项目后 _rebuild_source 合并模板/规则/代码库/设计文档,上传区仅要件定义
- StructuredSource.design_docs 与 ImpactReport.design_references;影响调查新增既有设计文档确定性交叉引用(无 LLM)
- 同步更新 docs/design.md §12.7、README、_AI_USAGE_LOG.md;全量测试 558 通过,覆盖率 99.10%
|
2026-08-27 12:13:28 +08:00 |
|
lhl
|
838a93720e
|
聊天式交互改造(Web UI 升级)
- 前端由分步表单页升级为 DeepSeek 式聊天页(static/chat.html)
- 新增 chat 包:意图识别(intent.py)+ ChatAgent(agent.py)自动驱动
解析→影响→生成→QA 整条工作流,影响确认节点反问、错误分支兜底
- store.py 扩展 pending_intent 字段与 chat_messages 表
- app.py 新增 POST/GET /api/chat/{sid}/messages,GET / 返回聊天页
- README/design.md 同步聊天模式说明;测试 4 文件覆盖
- 全量 pytest 522 passed / 99.03%,覆盖率红线达标
|
2026-08-27 05:11:40 +08:00 |
|
lhl
|
215c605650
|
feat(server): Web 服务化(FastAPI + SQLite + 内嵌零构建前端)
参赛成果物 03「交互界面 + 数据存储」落地:
- src/genesis/server/: store.py(SQLite 会话持久化)、service.py(会话化服务层:
上传→解析→确认→影响→确认→生成→QA)、app.py(api-design §2 核心端点 9 组)、
static/index.html(内嵌单页,零构建无 node_modules 依赖)
- scripts/serve.py 启动入口(--fake 离线引擎 / 默认真实 LLM)
- pyproject 加 fastapi/uvicorn/python-multipart
- 修复 qa_loop._build meta={} 导致真实模板 {{doc_title}} 等占位符残留 DocxInjectError
- README Web 服务说明 + service_url 登记指引;design.md §12.5 记录(含同步执行/
zip 既有系统/无 WebSocket 的诚实偏差标注)
- 测试:test_server_store/service/api 共 34 用例(TestClient 全链路 + zip 影响流程 + 错误分支)
全量 pytest 473 passed / 99.20%
|
2026-08-26 22:13:19 +08:00 |
|
lhl
|
a1fefd43eb
|
docs(deliverables): 参赛成果物补齐(README 五项 + 范式图/架构图 + coverage 报告)
按《参赛成果物提交规范·赛道一》§8:
- README:新增项目性质:新规声明、项目概述、整体功能说明、效果总结
(431 测试/99.15% 覆盖/双语试运行/影响调查基线)、团队分工、规模与难度自评
- design.md:开发范式流程图(mermaid,6 步与 AI 日志步骤列一致)+ §2.1
Agent 架构图(感知-规划-行动-记忆映射)
- _AI_USAGE_LOG.md:回填「待补充」→架构设计、「整体迭代」→反馈迭代
- tests/coverage/ 覆盖率 HTML 报告(99.15%)+ tests/test-execution-log.txt 执行日志
- docs/参赛成果物提交规范-赛道一.md → docs/submission-spec-track1.md(ASCII 化)
- pyproject: pytest norecursedirs 排除 test-execution-log.txt
全量 pytest 431 passed / 99.15%
|
2026-08-26 14:24:02 +08:00 |
|
lhl
|
becd3e1f57
|
chore(assets): 参赛提交规范红线修复(ASCII 化 + 相对路径)
按《参赛成果物提交规范·赛道一》§6 红线:
- samples/ 目录改名 sample/(git mv,保留历史)
- 10 个中日文样本文件 + docs 参赛手册 PDF 重命名为 ASCII
(requirements_*/template_*/rules_*/contestant-handbook.pdf)
- tests/test_zh_template.py 硬编码绝对路径 D:\00_project\Genesis 改为相对路径
- 全局更新 21 个活动文件引用;历史日志/审查文档不改(追加说明记录)
全量 pytest 431 passed / 99.15%
|
2026-08-26 14:15:52 +08:00 |
|
lhl
|
1925ef7239
|
feat(writer): 章级管道重试兜底 + 表格 caption 语言检查 + 文档收尾
#1/#2 真实 LLM 随机方差兜底:orchestrator.generate 新增 chapter_attempts(默认 3),
单章 WriterGenerationError 不连坐整次 run,重试耗尽才抛错(不吞错)。新增
tests/test_orchestrator_retry.py(前 N 次失败后恢复 / 耗尽仍抛错)。
#3 表格 caption 语言检查:find_language_violations 现检 table.caption(生成正文需跟随
输出语言),rows/headers 仍照抄源不检;QA 维度经 ChapterArtifact.blocks=(type,text,caption)
同步生效。修复真实 zh 输出中表格说明引用日文源表名绕过强制的问题。
文档收尾:README 新增 --output-language/中文模板用法;design.md §6.2.1 输出语言控制、
§7.2 校验清单 10→11 项;计划验收勾选;.gitignore 加 .opencode/。
全量 pytest 431 passed / 99.15%
|
2026-08-26 00:49:36 +08:00 |
|
lhl
|
3f4d17cf69
|
fix(writer): auto 模式语言 fallback 改用规则文档,修复日文文档被误判期望 zh
真实 ja 试运行暴露:auto 模式 fallback 误用 impact/data 源数据(含中文元素名
止损风控等 + 汉字标签无假名)→ 把日文文档误判为期望 zh → LLM 正常日文输出被
判违规 → 硬失败。修复:fallback 改用 write_rules/design_rules(RAG 自日文作成
说明书/记入规则检索,含假名可靠判 ja);加回归测试
test_generate_chapter_auto_with_ja_rules_but_chinese_source_data_enforces_ja。
修复后 ja 真实试运行成功(7章);zh 真实试运行成功(7章);425 passed / 99.15%
|
2026-08-26 00:36:54 +08:00 |
|
lhl
|
d01e1b720f
|
feat(writer): 输出语言一致性保障 + 用户可选输出语言
- 步骤0: 新增中文镜像模板 scripts/make_zh_template.py 与 samples/概要设计书模板_中文.docx(7章锚点原样保留)
- 步骤1: config.WriterConfig.output_language→Settings.writer;GenerationContext.output_language + to_vars.language_instruction(zh/ja/auto);writer_agent【语言约束】改引变量;context_builder/orchestrator/run_trial 透传 --output-language
- 步骤A: 新建 src/genesis/writer/language.py(detect_script/resolve_expected_language/find_language_violations);WriterAgent.generate_chapter 按期望语言强制、违规重试、耗尽硬失败;max_retries 默认 1→2
- 步骤B: _format_impact 影响调查标签按 output_language 本地化(zh 新建/变更/删除/警告)
- 步骤C: eval scorer 第 11 维度 language_consistency(不可验证=满分,不拉低总分);ChapterArtifact.expected_language;QAValidator.validate_doc 透传;QALoop.run 透传 output_language
- 测试: test_zh_template/test_language_plumbing/test_writer_language/test_scorer_language/test_language_coverage,并更新 test_phase5_e2e
- 全量 pytest 424 passed / 99.15%(覆盖率门槛 99% 达标)
|
2026-08-25 23:30:24 +08:00 |
|
lhl
|
9d0d3409c2
|
docs(log): 修复 _AI_USAGE_LOG.md 表格渲染断裂
- 删除表内 4 处空行与 1 处误写入的工具输出残留行
- L55 摘要内嵌错误码表的管道符转义为 \\|(GFM 表格内反引号不保护 |)
- 拆分被 || 拼接的两条 2026-08-23 记录为独立两行
- 零日志行删除;修复后 116 行均为有效 5 列,单一表格完整渲染
|
2026-08-24 16:03:09 +08:00 |
|
lhl
|
5091125fbc
|
fix(writer): 无子节章剔除 LLM 自造 heading 块
- writer_agent: prompt【小节约束】明确空结构时不得输出 heading 块
- writer_agent: generate_chapter 程序化强制——template_marker.sub_headings
为空的章,剔除生成结果中全部 type=heading 的内容块(LLM 遵循度不完美,
以模板结构为准做确定性兜底)
- 真实试运行验证:自造与章同名 H2 清零、H2 总数 14→6(仅模板定义子节)、
内容引用不受影响
|
2026-08-24 13:19:11 +08:00 |
|
lhl
|
0a498e4f7a
|
fix(writer): 无锚点子章归并父章生成 + 注入后裸重复子节去重
- template_mapper: 按 design §6.5 仅 Heading level<=1 起章,H2/H3 归入
父章 sub_headings(此前每个 heading 独立成章,无 {{section:id}} 锚点的
6 个子章生成后被静默丢弃)
- models: ChapterSpec.sub_headings 字段;to_vars 暴露 sub_headings 变量
- writer_agent: prompt 新增【小节约束】(有子节时按小节顺序以 level=2
heading 组织,不得遗漏或新增)
- docx_injector: 注入后删除同章内与已生成标题同名且完全无内容的模板裸
H2/H3(保守策略:带内容的模板子节保留)
- 真实试运行验证:7 章 / 无静默丢弃告警 / 14 个 H2 无重复
|
2026-08-24 12:23:35 +08:00 |
|
lhl
|
80ccc324fc
|
fix(writer): 章节级数据注入 + 修复 prompt 从未渲染的关键缺陷
- models: CHAPTER_SHEET_TYPES/CHAPTER_IMPACT_ELEMENT 章节→数据映射(design §6.8 ①)
- models: _format_chapter_data 按章定向渲染 ExcelTable 为 Markdown;GENERIC 自由記述作通用背景
- models: _format_impact 支持按 ElementType 过滤(章节级影响上下文)
- writer_agent: {{source}}(全量repr) → {{data}}(章节数据);新增【主题约束】
- writer_agent: 关键修复——真实 PromptRegistry.get 返回模板字符串,
引擎对 str 不做变量渲染,LLM 实际收到的是 {{占位符}} 原文;
_resolve_prompt 统一包装为 Prompt 对象保证渲染
- 真实试运行验证:13 章主题全部正确、引用影响调查数据、语言漂移消除
|
2026-08-24 11:50:59 +08:00 |
|
lhl
|
6372bb17b9
|
feat(run): 试运行脚本 + 运行说明(真实 LLM 默认 / --fake 离线)
- scripts/run_trial.py:库级端到端驱动(argparse 默认指向 samples/ 股票追加改修+sunOnly+真实模板)
- --fake 离线 FakeEngine(无 key)/ 默认 build_inference_engine 真实 LLM(读 .env)
- SourceParser → WriteOrchestrator 门控自动影响调查 → output/output.docx + impact-report.json
- 暴露 main(argv) 供测试
- tests/test_run_trial.py(fake 模式断言 13 章 + summary 16/5/8/3/50/0 + 文件产出 + docx 注入)
- .gitignore 新增 output/(试运行产物不入库)
- 新建 README.md(安装 / .env 配置 / 离线与真实试运行 / 输出 / 测试)
- 全量 364 passed / 99.28%;fake 试运行 PASS(13 章、summary 与 MVP 基线一致)
|
2026-08-24 11:05:45 +08:00 |
|
lhl
|
61ac47c7af
|
refactor(impact): CodeParser 多语言就绪——语言适配器注册表(仅 Java,行为不变)
- BaseLanguageParser 抽象基类 + JavaLanguageParser(迁移全部 Java 正则,输出逐字节一致)
- LANGUAGE_PARSERS 注册表 + register_language_parser 扩展点(新增语言=加适配器类并注册,下游零改动)
- CodeParser 分发器:parse(root, language=None) 自动按扩展名探测 / 显式语言覆盖 / 多语言合并(language 逗号连接)/ 无源码或语言不支持抛 CodeParseError
- source_aggregator 新增 existing_system_language 透传;config.py 探测扩展名补 .py/.ts/.go/.cs
- 删除自动探测下不可达死分支;全量 362 passed / 99.28%(基线 351/99.27%)
- 门禁复跑 PASS:summary 与 MVP 基线一致(16/5/8/3/50/0),概要设计书 13 章
|
2026-08-23 18:49:34 +08:00 |
|
lhl
|
2e11720a2d
|
feat(impact): Impact Agent MVP —— 变更点定位 + 影响调查书(追加改修场景)
- 门控:用户提供 existing_system 路径 → 进入影响调查;未提供 → 原流程不变
- CodeParser 解析 Java(@RestController/@Service/@Entity/@TableName)+ ExistingSystemExplorer 组装
- ImpactAgent 变更点定位(变更区分×既存対応 确定性比对,无 LLM)→ ImpactReport(JSON 可下载)
- 影响调查结果作为 Writer 生成概要设计书的主上下文({{impact}},无专用影响章)
- source_aggregator 解除 existing_system=None 硬编码
- 既有系统样本 sunOnly/stock-trade-system(无 LICENSE,仅测试输入,保留来源标注)
- 新造股票交易域追加改修样本 要件定義_追加改修_股票.xlsx(对齐 sunOnly 真实类名)
- 全量 351 passed / 99.27% 覆盖;门禁 PASS(16 要素:新规5/変更8/削除3/未受影响50)
|
2026-08-23 17:59:08 +08:00 |
|
lhl
|
da33df92e1
|
fix(writer): 防静默丢章告警 + 占位符正则宽容化(大小写/全角冒号)
|
2026-08-23 14:47:14 +08:00 |
|
lhl
|
48a9624723
|
fix(writer): 正文语言须与章节标题一致(模板日文则输出日文)
|
2026-08-14 00:12:51 +08:00 |
|
lhl
|
4da5f7087d
|
fix(inference): chat 每次调用新建 httpx client,修复同步门禁 Event loop is closed
|
2026-08-14 00:09:29 +08:00 |
|
lhl
|
752fd2df6d
|
fix(writer): 透传底层 LLM 错误详情(401 等)便于门禁定位
|
2026-08-13 23:55:38 +08:00 |
|
lhl
|
24b9511d43
|
test(writer/qa): 覆盖 engine=None 委托工厂的真实门禁路径
|
2026-08-13 23:13:58 +08:00 |
|
lhl
|
2cd3ecd0f3
|
docs: 追加 P5-T10 引擎工厂接线 AI 使用日志
|
2026-08-13 23:12:28 +08:00 |
|
lhl
|
545b9f4723
|
docs: backfill Phase 5 AI usage log entries
|
2026-08-13 11:36:11 +08:00 |
|
lhl
|
c7e7c95a19
|
plan(phase5): 锁定 Writer/QA 设计评审修正与实施计划基线
- spec 据 4 项评审决策落地 14 处修正 + GSTACK REVIEW REPORT
- 实施计划 16 任务 / 3 里程碑(M1 基础件 / M2 垂直切片 / M3 闭环硬化)
- _AI_USAGE_LOG.md 登记评审与计划
|
2026-08-13 09:06:11 +08:00 |
|
lhl
|
0b704fb07e
|
feat: QA 护栏 + fallback 路由(T15 架构审查整改收官,OV6)
- src/genesis/qa/guardrails.py: resolve_qa_model() 强制 QA 走 fallback 模型(防
DeepSeek 校验 DeepSeek 自校验盲区);QALoopController(max_rounds=3) 约束
「QA→Writer修正→重校验」循环边界防无限
- 集成测试验证 QA 调用实际落到 fallback 而非 primary(FakeLLMClient 记录 model)
- design.md §7.4 补 QA 护栏说明(循环边界 + 独立校验模型)
- TDD:257 passed / 100.00% 覆盖,17 项架构审查整改全部完成
|
2026-08-12 23:24:15 +08:00 |
|
lhl
|
a1336f6dd3
|
docs: Writer 串行约束写回(T10 架构审查整改,I14)
- design.md §6.8.1 新增串行生成约束:理由(章间引用依赖前章 WriterState /
并行收益低复杂度高 / Token 友好)+ 落地点(编排层严格顺序串行、UI 预估
总时长与逐章进度、禁止并发多章)
- api-design §4.3 补串行消费说明(对应 §6.8.1)
- web-ui-design 进度 UI 补串行语义(预计=章数×单章 3-5 分)
- 纯文档,无代码变更;全量 248 passed / 100.00% 不回归
|
2026-08-12 23:11:14 +08:00 |
|
lhl
|
3ae1f5f38f
|
refactor(parsers): 提取 _validate_path helper(T7 架构审查整改,I8 DRY)
- source_aggregator.py 三处重复校验(扩展名白名单 + 存在性)提取为
_validate_path(path, allowed_exts) -> Path,保留 ValueError/FileNotFoundError
语义与错误信息,parse 三分支改用 helper
- 外部契约不变:未知扩展名→ValueError、不存在→FileNotFoundError
- 新增 3 用例直接测 helper
- TDD: RED(helper 不存在)→ GREEN(聚焦 13 passed)→ 全量 248 passed / 100.00%(1356 stmts/332 br)
|
2026-08-12 23:01:58 +08:00 |
|
lhl
|
e3c714d5d9
|
feat(writer): docx 注入原型提前(T17 架构审查整改,OV8)
- T17 (OV8, P1): 新建 src/genesis/writer/ 包
- docx_injector.py: DocxInjector 用原生 python-docx 实现 §6.6 占位符注入
- 章节级 {{section:id}} → 内容块 docx 元素序列(heading/paragraph/table)
- 行内 {{meta}} → 元信息填充
- 残留检查: 未替换 {{...}} 抛 DocxInjectError
- 格式精度: 注入 heading 继承模板 Heading 样式,原内容不被破坏
- 新增 test_docx_injector.py(5 用例)
- 同步 design.md §6.7 渲染链路 T17 原型说明
- TDD: RED(模块缺失)→ GREEN(聚焦 5 passed)→ 全量 245 passed / 100.00%(1361 stmts/340 br)
|
2026-08-12 22:47:43 +08:00 |
|
lhl
|
d2e651bad0
|
feat(eval): 黄金集 + 评分器(T13 架构审查整改,OV4)
- T13 (OV4, P1): 新建 src/genesis/eval/ 包
- golden_set.py: GoldenCase/GoldenSet(YAML 加载,samples/ 真实脱敏样本作 input_ref)
- scorer.py: ChapterScorer 按 §7.2 指标体系打分
- 确定性维度: traceability(resolver 验证 source_uri 可解析率)/
placeholder_residue(无 {{...}} 残留)/chapter_completeness(章节覆盖)
- LLM 语义维度: llm_evaluators 钩子(默认中性分,待 Phase5)
- tests/fixtures/eval/golden_set.yaml 示例黄金集
- 新增 test_eval_scorer.py(9 用例)
- 同步 design.md §7.5 黄金集与评分器(定位 CI 质量门禁)
- TDD: RED(模块缺失)→ GREEN(聚焦 8 passed)→ 全量 240 passed / 100.00%(1279 stmts/308 br)
|
2026-08-12 22:44:47 +08:00 |
|
lhl
|
69aec7716c
|
feat(provenance): URI 统一 + resolver + 强验证(T12 架构审查整改)
- T12 (OV3, P1): 新建 src/genesis/parsers/resolver.py
- parse_source_uri: 解析 file.xlsx#Sheet!CellRef → SourceRef(格式非法 raise URIError)
- provenance_to_uri: Provenance 还原 URI(与 build_source_uri 互逆)
- resolve_source_uri: StructuredSource 内定位真实 CellValue
- validate_source_uris: 批量强验证 → ValidationResult(resolved/unresolved)
格式错误或源中不存在一律 unresolved(防 QA#8 编造 URI 作弊)
- URI 唯一生成入口 build_source_uri(provenance.py),无散落不一致
- 新增 test_resolver.py(13 用例);同步 design.md §9.2 + §6.8 第五步
- TDD: RED(模块缺失)→ GREEN(聚焦 10 passed)→ 全量 231 passed / 100.00%(1191 stmts/298 br)
|
2026-08-12 22:35:56 +08:00 |
|
lhl
|
6a54580ca4
|
feat(orchestrator): DataGate 机制化 + 任务级持久化(T14/T16 架构审查整改)
- T14 (OV5): 新建 src/genesis/orchestrator/datagate.py
- DataGate.load(source, selector) 机制化:子集加载 + 规模保护(超 500 行
无 selector 拒绝全量,1000 行 Excel 防上下文爆炸)+ token 预算(8000,
复用 CJK 保守估算)+ 未知表容错
- agent-runtime §4.2 原则→机制说明
- T16 (OV7): 新建 src/genesis/orchestrator/task_queue.py
- TaskQueue ABC + PersistentTaskQueue(SQLite 落盘)
- enqueue/poll/update_status/get/cancel/recover/close
- 幂等去重(§5.3 缓存结果)+ recover 将 running→failed、pending 保留
- api-design §5.2/5.3、agent-runtime §3.5/3.6、design §8.4.1 同步
- 新增 test_datagate.py(8 用例)+ test_task_queue.py(11 用例)
- TDD: RED(模块缺失)→ GREEN(聚焦 16 passed)→ 全量 218 passed / 100.00%(1140 stmts/278 br)
|
2026-08-12 15:43:10 +08:00 |
|
lhl
|
3decdfc31c
|
feat(rag): v1 rerank 精排 + bge-m3 多语言切换(T6/T11 架构审查整改)
- T6 (Issue6): RerankConfig(enabled/model=BAAI/bge-reranker-v2-m3/device)
- rag-layer-design §6.3 Rerank 精排:窗口=RRF top-10、候选≤top_k 跳过、
故障降级 RRF 原序;原 §6.3-6.6 顺延 6.4-6.7
- config-design §5 新增 rerank 段;design §5.5 检索策略加 rerank
- T11 (OV2): EmbeddingConfig.model 默认 bge-small-zh-v1.5 → BAAI/bge-m3(日文语料)
- rag-layer-design 选型表/依赖表/manifest/流程图同步 + 新增 §2.3 日文样本验证
- design.md / implementation-plan 4.3 / config-design embedding 同步
- 新增 test_rag_design_consistency.py 一致性门禁(6 用例防文档漂移)
- TDD: RED(默认模型仍旧 + rerank 字段不存在)→ GREEN → 全量 198 passed / 100.00%(996 stmts/252 br)
|
2026-08-12 11:32:28 +08:00 |
|
lhl
|
c170ec2edd
|
feat(config): 删死配置 + 同步文档(T5 架构审查整改)
- Issue5: 删除 QdrantStoreConfig / VectorStoreConfig.qdrant / task_queue.redis_url
- OV1: 同步 6 处文档(api-design §1/§4.3/§5/§6、rag-layer §9、agent-runtime §3、
design §5.5/§8.4.1、config-design、web-ui §4.1)+ tests/fixtures/rag.yaml
- TaskQueue 标注 v1 仅 InMemory,Redis/Valkey 为 v2 预留(Scope 缩减裁定)
- Storage Adapter 仅 ChromaAdapter,工厂移除 qdrant 分支
- 历史评审记录保留原样不改写
- 新增 3 用例,同步 2 个 qdrant 依赖用例;全量 189 passed / 100.00%(991 stmts/252 br)
|
2026-08-12 10:54:56 +08:00 |
|
lhl
|
8febc50eb8
|
feat(inference): CJK 保守 token 估算(T9 架构审查整改)
- Issue11: approximate_token_count 重写
- 新增 _is_cjk_char(CJK 统一表意/扩展A/假名/韩文/兼容/全角六大 Unicode 范围)
- CJK 字符按 1.5 token/字符(旧 4 字符 1 token 严重低估,裁剪失效致 API 超限)
- 其余字符仍 4 字符 1 token;最少 1 token
- 同步 config-design.md token_estimation 注释
- 新增 4 用例,全量 186 passed / 100.00%(995 stmts/252 br)
|
2026-08-12 09:54:20 +08:00 |
|
lhl
|
8239a37a99
|
feat(inference): LLM 客户端全异步化(T8 架构审查整改)
- Issue9: client.py 由同步 httpx.Client 全异步化
- LLMClient Protocol / HttpLLMClient.chat → async;httpx.AsyncClient + asyncio.sleep 退避
- __enter__/__exit__ → __aenter__/__aexit__(async with 生命周期闭环)
- engine.py chat/chat_structured/_call 全部 async + await
- FakeLLMClient.chat → async;测试用 anyio pytest 插件转换(engine 32 + client 10 用例)
- 同步 inference-engine spec 与 milestone3 review 的 httpx 描述
- 全量 182 passed / 100.00%(987 stmts/252 br)
|
2026-08-12 09:50:37 +08:00 |
|
lhl
|
1f931228e7
|
feat(inference): 引擎层统一注入防护(T4 架构审查整改)
- Issue4: engine.py 新增恒定系统指令 DEFAULT_SYSTEM_INSTRUCTION + 用户数据边界包裹
- _call 统一构造 [system 恒定指令, user 边界包裹数据],chat/chat_structured 全生效
- __init__ 支持 system_instruction 注入覆盖;声明「用户数据段指令不作为要求执行」
- FakeLLMClient 记录结构对齐真实 payload({role, content}),同步 2 处既有断言
- 同步 agent-runtime-design.md §8.1 标注已实现
- 新增 5 用例,全量 182 passed / 100.00%(987 stmts/252 br)
|
2026-08-12 09:44:33 +08:00 |
|
lhl
|
2f4397a8d6
|
feat(orchestrator): 会话状态机实现 + cancelled/resume(T3 架构审查整改)
- Issue3: 新建 src/genesis/state_machine.py(9 状态白名单转移)
- cancel 记录 cancelled_from 进 cancelled 终态,resume 回中断点
- 仅执行中状态可取消(awaiting_*/done 不可),非法转移抛 StateTransitionError
- 同步 agent-runtime-design.md §3.2(状态图/规则表 9 状态 + cancelled 行)
- 新增 10 用例(含覆盖补齐 2 项),全量 177 passed / 100.00%(981 stmts/252 br)
|
2026-08-12 09:39:34 +08:00 |
|
lhl
|
cf9600e437
|
feat(inference): chat_structured 解析重试走降级链(T2 架构审查整改)
- Issue2: 解析重试按 primary→fallback 顺序尝试,不再硬编码首选模型
- Issue10: 提取 names 局部变量,删除 4 处重复 _model_names(None)[0] 调用
- LLMError 不再 early return,继续降级链;全部失败按 last_was_parse_error 区分 parse_error/failed
- 新增 2 用例(解析/网络失败降级 fallback),同步更新 7 个既有用例至降级链语义
- 全量 165 passed / 100.00% 覆盖(941 stmts/242 br),fail_under=99 达标
|
2026-08-12 09:36:10 +08:00 |
|
lhl
|
25fc472d9b
|
feat(inference): chat_structured 接入 jsonschema 真校验(T1 架构审查整改)
- pyproject.toml 新增 jsonschema>=4.23 依赖
- engine.py: json.loads 后 jsonschema.validate,校验失败按解析失败重试(带错误信息)
- 新增 3 用例:违规重试成功/耗尽 parse_error 含详情/合法一次通过
- 全量 163 passed / 100.00% 覆盖(936 stmts/238 br),fail_under=99 达标
|
2026-08-12 09:32:02 +08:00 |
|
lhl
|
0a79b07356
|
docs: Phase3 Word 解析里程碑评审报告
|
2026-08-11 08:42:54 +08:00 |
|