TianHeng 是一个面向公开仓库的 fuzz 编排系统。它解决的不是“单次生成一个 harness”这一个动作,而是把一个仓库的 fuzz 工作拆成可恢复、可观测、可复现的阶段闭环。
TianHeng 当前关注的是完整流程:
- 选目标
- 产脚手架
- 构建(含自动 coverage 插桩注入)
- 运行(libFuzzer +
-fsanitize-coverage) - 覆盖率改进(per-input replay + frontier 分析)
- 崩溃分诊
- 崩溃复现与分析
flowchart LR
U["用户"] --> FE["前端"]
FE --> API["FastAPI 控制面"]
API --> DB[("Postgres")]
API --> JOB["Kubernetes 阶段作业"]
JOB --> WF["workflow_graph.py"]
WF --> GEN["fuzz_unharnessed_repo.py"]
JOB --> OUT["/shared/output"]
职责边界:
- 控制面:
harness_generator/src/langchain_agent/main.py - 工作流状态机:
harness_generator/src/langchain_agent/workflow_graph.py - 执行原语:
harness_generator/src/fuzz_unharnessed_repo.py - 覆盖率回放:
harness_generator/src/langchain_agent/coverage_replay.py - 阶段级 AI 契约:
harness_generator/src/langchain_agent/opencode_skills/ - 前端:
frontend-next/(Next.js 14 + MUI + TanStack Query)
TianHeng 的主线可以按三条闭环理解:
flowchart TD
INIT["init"] --> PLAN["plan"]
PLAN --> SYN["synthesize"]
SYN --> BUILD["build"]
BUILD --> RUN["run"]
RUN --> CA["coverage-analysis"]
CA --> RP["per-input-replay"]
RP --> IH["improve-harness"]
IH --> BUILD
IH --> PLAN
RUN --> TRIAGE["crash-triage"]
TRIAGE --> FH["fix-harness"]
FH --> BUILD
TRIAGE --> RB["re-build"]
RB --> RR["re-run"]
RR --> CAA["crash-analysis"]
CAA --> PLAN
阶段职责:
plan:生成目标规划、执行意图和目标元数据。synthesize:在fuzz/下生成可构建脚手架。build:编译脚手架并自动注入-fsanitize-coverage=trace-pc-guard,inline-8bit-counters,校验目标覆盖是否真的落地。run:初始化种子、执行 fuzzer、采集 coverage / execs / crash 信号。coverage-analysis:判断是继续原地改进还是重新规划。per-input-replay:用 replay 二进制逐种子回放,通过llvm-cov export导出源级覆盖,生成 frontier summary 喂给 AI。improve-harness:在不切换目标的前提下提升当前目标表现。crash-triage:把候选 crash 分成 harness 问题、上游问题或不确定。fix-harness:只修 harness 侧缺陷。re-build/re-run:在隔离复现链路中重建并回放崩溃。crash-analysis:对已复现 crash 做误报/真实 bug 分流,误报回plan,否则停止并保留分析结果。
补充(当前实现口径):
- plateau 检测窗口固定为 30 秒(
idle_no_growth=30s)。 - OpenCode agent 空闲超时默认 600 秒(
SHERPA_OPENCODE_IDLE_TIMEOUT_SEC=600),适配 deepseek-reasoner 长推理时间。 - build 阶段自动注入
-fsanitize-coverage标志到build.py,确保 libFuzzer 覆盖率反馈可用。 run_no_progress、run_timeout、run_idle_timeout、run_finalize_timeout、run_resource_exhaustion属于可恢复 run 信号,会进入coverage-analysis持续改进闭环。
说明:
fix_build、fix_crash仍有兼容节点,但不是当前主线推荐路径。- 文档里的“当前主线”以当前代码路径与阶段路由为准,不以历史交接材料为准。
典型任务目录:
/shared/output/<repo>-<shortid>/
常见输出:
fuzz/PLAN.mdfuzz/targets.jsonfuzz/selected_targets.jsonfuzz/execution_plan.jsonfuzz/harness_index.jsonfuzz/analysis_context.jsonfuzz/constraint_memory.jsonfuzz/repo_understanding.jsonfuzz/build_strategy.jsonfuzz/build_runtime_facts.jsonrun_summary.jsoncrash_info.mdcrash_analysis.mdcrash_triage.jsonrepro_context.json
阶段作业记录:
/shared/output/_k8s_jobs/<job_id>/stage-*.json/shared/output/_k8s_jobs/<job_id>/stage-*.error.txt
前端与外部工具主要通过 main.py 暴露的 API 与系统交互:
POST /api/taskGET /api/task/{job_id}POST /api/task/{job_id}/resumePOST /api/task/{job_id}/stopGET /api/tasksGET /api/systemPUT /api/config
详细契约见 docs/API_REFERENCE.md。
TianHeng 当前采用的运行形态是:
- FastAPI 后端 + Postgres 常驻
- 前端独立部署
- 每个阶段由 Kubernetes Job 执行
- worker 默认按非 root 运行假设配置
- 共享输出目录通过集群可见存储提供
部署与排障资料:
docs/README.mddocs/CODEBASE_TECHNICAL_ANALYSIS.mddocs/TECHNICAL_DEEP_DIVE.mddocs/API_REFERENCE.mddocs/k8s/DEPLOY.md
标准路径:
- 从
dev拉分支开发 - 提交 PR 到
dev - 等待
dev验证通过 - 再从
dev发 PR 到main
更详细的流程见 docs/STANDARD_CHANGE_PROCESS.md。