feat: /qe-fleet run 安徽运八需求 + 系统坑修复

系统修复:
- fleet_runner.py: Windows UTF-8 编码兼容(reconfigure stdout/stderr)
- fleet_runner.py: run 命令自动生成合并清单供导出使用
- fleet_manifest.py: 新增 save_merged_manifest() 保存统一清单
- fleet_config.yml: 修复 YAML keywords 格式(block sequence → flow sequence)
- 恢复被误删的知识库文件(payment_flow_cases, marketing_activity_cases)

QE Fleet 产物 (安徽运八需求):
- 153个测试点 + 53条可执行测试用例
- 需求分析/风险评估/测试策略/质量裁决(PASS)
- Excel 导出 + 版本快照 v2
- 确认结论文件已归档
This commit is contained in:
xst
2026-07-13 09:49:54 +08:00
parent b958b75899
commit acdb441507
77 changed files with 4134 additions and 1597 deletions
+11
View File
@@ -86,6 +86,17 @@ def build_merged_manifest(base_name: str, zones: list[str] | None = None) -> dic
return merged
def save_merged_manifest(base_name: str, zones: list[str] | None = None) -> Path:
"""合并所有战区 manifest 并保存为统一清单文件(供导出等步骤使用)。"""
merged = build_merged_manifest(base_name, zones)
ensure_manifests_dir()
path = MANIFESTS_DIR / f"{base_name}.json"
merged.setdefault("_meta", {})
merged["_meta"]["updated_at"] = datetime.now(timezone.utc).isoformat()
path.write_text(json.dumps(merged, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
return path
def get_zone_status(base_name: str) -> dict[str, str]:
"""返回各战区完成状态。"""
status: dict[str, str] = {}
+11
View File
@@ -20,9 +20,15 @@ from __future__ import annotations
import argparse
import json
import os
import sys
import subprocess
from datetime import datetime, timezone
# Windows GBK 编码兼容:强制 stdout/stderr 使用 UTF-8
if sys.platform == "win32":
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
sys.stderr.reconfigure(encoding="utf-8", errors="replace")
from pathlib import Path
from typing import Any
@@ -52,6 +58,7 @@ from fleet_manifest import (
load_manifest,
load_manifest_safe,
build_merged_manifest,
save_merged_manifest,
get_zone_status,
mark_zone_completed,
manifest_path,
@@ -1670,6 +1677,10 @@ def main() -> None:
# 自动导出
if args.command == "run" and not args.skip_export:
# 先生成合并清单(export 需要统一清单文件)
merged_path = save_merged_manifest(base_name)
print(f"\n📋 合并清单已生成: {to_repo_relative(merged_path)}")
review_manifest = load_manifest_safe(base_name, "review")
if review_manifest:
verdict = review_manifest.get("quality_verdict", {}).get("verdict")