Commit Graph
57 Commits
Author SHA1 Message Date
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 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 84d3b87da3 docs: 输出语言功能文档收尾(README/design.md/计划/opencode忽略)
- README 新增 --output-language 参数表、中文模板用法、auto 推导规则与中文场景注意
- design.md §6.2.1 新增输出语言控制设计(贯通链路/auto推导/生成期强制/标签本地化);
  §7.2 十项校验清单 → 11 项(新增语言一致性维度)
- 计划文档验收复选框勾选
- .gitignore 加入 .opencode/(AI 工具本地配置不入库)
2026-08-26 00:45:09 +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 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 e4f533799d chore: cleanup unused imports + design.md Phase5 notes 2026-08-13 11:49:58 +08:00
lhl 7368626de6 docs(design): add Phase 5 Writer/QA subsystem section 2026-08-13 11:36:08 +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 dbf8c12881 docs: Phase5 spec 自审固化两处歧义(循环耗尽标记 / note 渲染降级) 2026-08-12 23:32:52 +08:00
lhl 0b16aeab49 docs: Phase 5 Writer/QA 完整实现设计规格(方案A,离线条到端) 2026-08-12 23:32:26 +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 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 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
lhl 7bc9175ebe docs: Phase3 计划修订(Task1 前缀 test:、_heading_level 提取共享 helper、兜底分支覆盖) 2026-08-10 09:09:40 +08:00
lhl 129c75bb06 docs: Phase3 Word 解析实施计划(5任务TDD) 2026-08-10 08:50:00 +08:00
lhl af3e756ba0 docs: Phase3 spec 工程审阅修正(做成说明书 ref→write、列表双通道、显式角色参数) 2026-08-10 00:45:35 +08:00
lhl 17cf385a6f docs: Phase3 Word 解析优先设计(模板/规则/聚合三模块) 2026-08-09 23:05:28 +08:00
lhl 464423b7ef chore: 一致性门禁收尾(plan 计数、尾换行、消息与注释润色) 2026-08-09 17:11:38 +08:00
lhl f6172903b8 docs: 修正错误码一致性 spec/plan 计数笔误(LLM 错误码实为 4 条非 5) 2026-08-09 16:56:49 +08:00
lhl bfcfbaef92 docs: 错误码一致性测试实施计划(TDD 单任务) 2026-08-09 15:23:32 +08:00
lhl 49f6ca80d8 docs: 错误码一致性测试设计(api §7 ↔ 异常树机器验证) 2026-08-09 15:19:55 +08:00
lhl 857bc789ed docs: api §7 补 LLM_NETWORK_ERROR 行(对齐异常树错误码) 2026-08-09 13:51:21 +08:00
lhl a0a40afd45 docs: LLM 错误码对齐实施计划(4 任务 TDD 分解) 2026-08-09 13:28:45 +08:00
lhl 1a3c829d4c docs: Web UI 设计评审修订(v1.0→v1.1,7 项发现全修 + api §2.2 write_instruction) 2026-08-09 13:28:38 +08:00
lhl 69f04ecda2 docs: LLM 错误码对齐设计(error_code 字段 + api §7 对齐) 2026-08-09 10:00:24 +08:00
lhl a5eaec4de8 docs: 里程碑3.1 回顾归档(首次 retro) 2026-08-09 09:08:26 +08:00
lhl 8ec63d1c48 docs: 里程碑3.1 InferenceEngine 设计规格与实施计划 2026-08-09 08:36:47 +08:00
lhl 1eb07db123 docs: 里程碑3.1 InferenceEngine 交付报告与进度账本 2026-08-09 08:36:33 +08:00
lhl 8bc5e5e571 feat: InferenceEngine chat/chat_structured 全流程 + 文档补丁(补丁1/2/3) 2026-08-09 08:26:37 +08:00
lhl 2fbff07d3f test: 覆盖率提升至 100%(fail_under 90→99,13 个防御/边界用例) 2026-08-09 04:49:29 +08:00
lhl 737911cf25 test: 补齐覆盖率工具(pytest-cov,fail_under=90,基线 96.67%) 2026-08-09 04:32:11 +08:00
lhl ba092f2df7 docs: 里程碑2.5 交付报告(MIXED 段落解析闭环) 2026-08-09 04:25:31 +08:00
lhl 81c6b6c522 docs: 计划查漏补缺修正(formatting_map 段内坐标/样本合并/枚举测试/防御实现) 2026-08-09 03:57:02 +08:00