refactor: systematic tech debt cleanup (U1-U5) #8
Loading…
Reference in New Issue
No description provided.
Delete Branch "refactor/react-engine-unified-loop"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
系统性清理综合评审(3.78/5)识别的 5 项技术债:ReActEngine 流式/非流式 ~800 行重复、TeamOrchestrator 2080 行上帝类、
except Exception345+ 处滥用(关键路径降级静默通过)、Any类型残留(bitable/ 等)、前端 chat.ts 2025 行巨型文件。重构在 5989 单测+35 新增 vitest 保障下完成,无新回归,关键路径测试全过。What Changed
core/react.py_execute_loop改为 async generator,execute/execute_stream共用骨架experts/orchestrator.py+ 7 个 mixinPhaseExecutor/DebateRunner/ReviewGate/DivergenceDetector/RollbackHandler/Synthesizer/InterventionHandlercore/+experts/except 治理except Exception分类收窄,新增ReviewResultdataclass 替代裸 tuple +[DEGRADED]字符串前缀review_resultWS 事件携带degraded字段bitable/+pipeline_state.py+tools/computer_use_session.pyAny→TypeAlias(BitableRecord/FormulaResult/SessionState) +object+TYPE_CHECKINGProtocolAny,恢复类型契约server/frontend/src/stores/chat*.tschatStore(498)/chatSocket(165)/chatStream(1557) + 35 新增 vitestdispatchWsEvent纯函数覆盖 30+ WS 事件类型,可独立测试Key Design Decisions
U1 async generator 统一骨架(KTD1):
_execute_loop始终yield ReActEvent,execute收集所有事件提取ReActResult,execute_stream直接async for透传。无需 callback/queue 桥接,最简。新增'final_result'event_type 字符串值携带ReActResult,不新建枚举。U2 Mixin 而非组合(KTD2):37 个方法大量访问
self._experts/self._workspace/self._broadcast_event共享状态,Mixin 保持self访问最小改动。每个 mixin 文件顶部注明# TYPE_CHECKING: 由 TeamOrchestrator 组合。U3 结构化降级(KTD3):
ReviewResult(passed, degraded, feedback)替代(bool, str)tuple +[DEGRADED]字符串前缀。_review_phase_output的except收窄为(LLMProviderError, asyncio.TimeoutError, ConnectionError, RuntimeError),降级返回passed=True, degraded=True。_phase_executor广播review_result事件时携带degraded字段。U4
object+ Protocol 模式(KTD4):循环依赖场景用object(最严格"任意类型",禁止属性访问)+TYPE_CHECKING块定义 Protocol(_RedisLike/_RecalcWorker)。可直接导入的类型用 TypeAlias。U5 按职责层拆分(KTD5):
chatSocket(连接/心跳/重连)、chatStream(dispatchWsEvent纯函数 + 30+ 事件分发)、chatStore(Pinia store 组合 composables)。chatStore保留向后兼容 export 别名。Test Plan
新增测试:
tests/unit/test_react_golden_trajectory.py(617 行) — U1 golden trajectory 快照,锁定 execute/execute_stream 行为等价tests/unit/server/frontend/tests/unit/stores/chatStream.test.ts(563 行, 19 tests) — U5 dispatchWsEvent 全事件类型覆盖tests/unit/server/frontend/tests/unit/stores/chatSocket.test.ts(255 行, 13 tests) — U5 useChatSocket composable + resolveIncomingConvId回归验证(与 main 基线对比):
环境约束:Python 3.14 + litellm 缺失,跳过
test_cache.py。Post-Deploy Monitoring & Validation
Log queries:
review_resultWS 事件中degraded: true计数 — 验收降级频率监控phase_violation事件计数 — phase 策略执行情况final_resultevent status 分布 (success/timeout/cancelled/empty_fallback)Metrics:
Healthy signals:
degraded: true比例 < 5% (LLM 验收正常)final_result.status=success比例 > 80%Failure signals:
degraded: true比例突增 → LLM gateway 可用性问题final_result.status=empty_fallback突增 → LLM 调用失败Rollback trigger: 任一指标超过阈值 2 倍持续 15 分钟 → 回滚到 main (
0962df1)Validation window: 合并后 24h,owner: @chiguyong
Known Residuals
chatStream.ts1557 行 vs plan 估计 ~300 行(30+ WS 事件类型决定,plan Verification 只要求 chatStore ≤500,已满足)test_synthesize_without_llm_concatenates间接覆盖 RuntimeError 降级路径)server/routes/的except Exception整治(portal.py 19、chat.py 16)deferred to follow-up PRllm//memory//client/的Any残留治理 deferred to follow-up PRAny残留(repository.py 5、recalc_worker.py 2、ingestion/* 3,共 10 处)deferred to follow-up PR