Compare commits

..

12 Commits

Author SHA1 Message Date
chiguyong 92fc38de7e fix(review): Wave 3 code review fixes
P1: bash/shell tool name mismatch. PhasePolicy whitelist used "bash" but
ShellTool registers as "shell". The bash_command_filter was dead code
(never matched the real tool name). Fixed in phase.py whitelist,
react.py filter check, agentkit.yaml config, and all tests.

P1: AdvancePhaseTool missing import in tools/__init__.py. Was in
__all__ but never imported. Added the import.

P2: chat.py phase policy error message echoed verbatim to WS client.
Truncated to 200 chars to match nearby error paths and avoid leaking
config internals.

P2: policy_from_config rebuilt PhasePolicy 3x via full-field copy.
Replaced with dataclasses.replace() so new PhasePolicy fields are not
silently dropped in future reconstructions.

ce-code-review (mode:agent) step of LFG pipeline.
2026-06-30 05:08:03 +08:00
chiguyong ce6eb004a0 refactor(advance_phase): simplify previous_phase capture
Remove over-engineered _previous_value static method that did index
math on a hardcoded phase list. Instead, capture the previous phase
before the transition — clearer intent, fewer lines, same behavior.

ce-simplify-code step of LFG pipeline.
2026-06-30 05:06:38 +08:00
chiguyong 7869caddc7 feat(U4): G6 PLAN_EXEC wiring at chat WebSocket path
- PLAN_EXEC branch builds PhasePolicy from ServerConfig.plan_exec
- Empty config → default_policy(); enabled=False → falls back to REACT
- Bad config → error event sent, returns early (no engine constructed)
- ReActEngine created with phase_policy; AdvancePhaseTool registered
- phase_changed events emitted on phase transitions (PLAN_EXEC only)
- REST send_message with execution_mode=plan_exec → HTTP 501 (KTD4)
- REWOO/REFLEXION/TEAM_COLLAB still fall back to REACT (no regression)
- 9 unit tests covering REST 501, characterization, happy path, edge cases, error path, phase_changed events
2026-06-30 00:16:39 +08:00
chiguyong c0a44b413b feat(U3): G6 AdvancePhaseTool + ReActEngine phase enforcement
- AdvancePhaseTool calls engine.advance_phase(), returns new phase or error
- ReActEngine.__init__ accepts phase_policy param (None = no enforcement, backward compat)
- _current_phase + _steps_in_phase fields track state machine
- advance_phase() transitions PLANNING → BUILDING → VERIFICATION → DELIVERY
- _check_phase_permission() returns structured error dict if tool blocked
- _execute_tool checks phase before dispatch (advance_phase name bypasses)
- Auto-advance safety net via _maybe_auto_advance() + auto_advance_after_steps
- Phase reset in reset() method
- 27 unit tests covering characterization, permission, transitions, auto-advance, tool integration
2026-06-30 00:07:58 +08:00
chiguyong abf758fa9c feat(U2): G6 PhaseState + PhasePolicy + ServerConfig.plan_exec
- PhaseState enum (PLANNING/BUILDING/VERIFICATION/DELIVERY) with next_of/from_string
- PhasePolicy dataclass with whitelist + bash_command_filter + auto_advance_after_steps
- default_policy() factory — KTD5 whitelist matching R24 (Planning: search/read_file;
  Building: write_file; Delivery: wildcard)
- bash_command_filter blocks rm/mv/cp/>/>> in PLANNING/VERIFICATION phases
- policy_from_config() parses plan_exec YAML section (R26) with override merge
- ServerConfig.plan_exec field + from_dict parsing (extends Wave 1/2 pattern)
- agentkit.yaml gains commented plan_exec section (opt-in)
- 37 unit tests covering PhaseState, default_policy, is_tool_allowed,
  bash filter, config parsing, and ServerConfig integration
2026-06-29 23:58:56 +08:00
chiguyong 50885fbc62 feat(U1): G5 SymbolExtractor + ReadFileTool with symbol slicing
- SymbolExtractor protocol + SymbolSpan dataclass
- AstSymbolExtractor for Python (stdlib ast, no tree-sitter dep — KTD1)
- RegexSymbolExtractor for TS/JS/Go/Rust/Java (language-aware regex)
- ReadFileTool with path/symbol/start_line/end_line params
- symbol=None returns full file (characterization baseline matching _FakeTool)
- symbol='foo' returns first matching symbol's line range
- symbol not found returns available_symbols list (soft error)
- Unsupported extension returns full file with note
- Manual start_line/end_line overrides symbol
- 66 unit tests covering R22/R23 + characterization + edge cases
2026-06-29 23:54:44 +08:00
chiguyong 23f7448d55 docs(plan): Wave 3 strategic coupling plan (G5/G6) 2026-06-29 23:48:45 +08:00
chiguyong 80b02f58a6 feat(U3): G7 三级 fallback 链路接通 chat REST
Test / backend-test (pull_request) Has been cancelled Details
Test / frontend-unit (pull_request) Has been cancelled Details
Test / api-e2e (pull_request) Has been cancelled Details
Test / frontend-e2e (pull_request) Has been cancelled Details
- 新增 agentkit/server/_fallback_chain.py: execute_with_fallback_chain
  Main (ReActEngine) → Recovery (ReflexionEngine) → Emergency (EmergencyRules)
- chat.py send_message 用 chain 包装 react_engine.execute (KTD5)
- ReflexionEngine 内部 ReAct 调用不走 chain (避免递归)
- TaskCancelledError 直接传播, 不进入 Emergency (KTD3)
- soft failure (empty_fallback/verify_failed) 也触发 Recovery
- Recovery 失败/异常 → Emergency 用 EmergencyRules.classify 分类
- ServerConfig.from_dict 读取 fallback_chain.{recovery,emergency}
- 17 个测试覆盖 Main/Recovery/Emergency 三层 + 配置
2026-06-29 23:07:38 +08:00
chiguyong b1841ce21b feat(U4): G9 PlanPhase rollback + RollbackExecutor
- PlanPhase 新增 validation_command / rollback_command 可选字段 (KTD6 opt-in)
- to_dict 仅在字段非 None 时输出新键,保持既有 dict shape (KTD6 契约)
- 新增 RollbackExecutor (orchestrator/rollback.py) 复用 VerificationLoop
  subprocess 模式,绕过 ShellTool 避免 confirm_callback 拦截 (KTD7)
- TeamOrchestrator._run_phase_rollback 实现 R21 顺序:
  validation → rollback → checkpoint.save (仅在前者通过时调用)
- ServerConfig.from_dict 读取 rollback.default_timeout
- 20 个测试覆盖 characterization / happy / timeout / git integration / 配置
2026-06-29 22:55:08 +08:00
chiguyong 5b2377469a feat(U2): G7 Emergency 规则模板 + TaskResult.error_struct
新增 EmergencyError 数据类(stable error_code + 中文 message + suggestions
+ retryable + original_error)和 EmergencyRules 规则分类器(纯规则,无 LLM):
- TaskTimeoutError → timeout (retryable)
- LoopDetectedError → loop_detected (retryable)
- LLMProviderError → llm_failure (retryable)
- Exception → internal_error (not retryable)
- TaskCancelledError 不分类(调用方须先检查,否则 ValueError)

TaskResult 新增并行 error_struct 字段(默认 None 保持既有契约)。
to_dict 当 error_struct=None 时不输出该键(byte-for-byte 兼容)。

- fallback.py 既有 3 常量不变(EMPTY_LLM_RESPONSE/MAX_STEPS_REACHED/SHELL_NO_OUTPUT)
- 支持 config 覆盖(suggestions/retryable/message 按 error_code 分组)
- 27 测试覆盖分类/序列化/配置覆盖/契约保持
2026-06-29 22:43:22 +08:00
chiguyong 8d5ccca604 feat(U1): G4 ContextCompressor 辅助 LLM 路由
_summarize 优先尝试 auxiliary_model(成本优化的廉价模型,如 qwen-turbo),
失败或返回空内容(Finding 4 反模式)时回退到主模型,主模型失败仍走
_simple_summary 兜底。auxiliary_model=None 时保持既有单模型调用行为。

- ContextCompressor 新增 auxiliary_model 参数
- LLMConfig 新增 auxiliary_model 字段,ServerConfig._build_llm_config 透传
- agentkit.yaml 文档化 llm.auxiliary_model: fast(注释,保留默认行为)
- 测试: 9 场景覆盖成功/空内容/异常/双向失败/aux=main 跳过/审计字段/配置接线
2026-06-29 22:37:14 +08:00
chiguyong 88bfe71d30 docs(plan): Wave 2 medium-coupling plan (G4/G7/G9) 2026-06-29 22:30:51 +08:00

Diff Content Not Available