阶段 1 只做一条可验证主线闭环:
不做多租户,不做自动修复,不做复杂大屏,不做脚本自动生成。
为降低阶段 1 复杂度,建议采用单体应用 + 轻量 agent 的分层结构。
Next.js 15 + React + TypeScript + Ant DesignNestJS + TypeScriptPostgreSQLRedis + BullMQPlaywrightTypeORMBullMQ repeatable jobs 或 Nest ScheduleLLMProviderPino原因:
Playwright 适合实现步骤脚本、截图、状态码、DOM 检查。NestJS + TypeORM 便于按数据库方言切换到 MariaDB / PostgreSQL兼容模式。BullMQ 既能做定时调度,也能承接执行任务、诊断任务,避免后续重构。建议拆成 4 个运行单元:
职责:
职责:
API-01 到 API-08职责:
Playwright 执行步骤脚本职责:
metrics / probes / logs/agent/context/push阶段 1 可以先把 Context Agent 做成同仓库里的独立 Node 进程,既保留“内外网边界”的设计,又不把真实内网接入复杂化。
后端建议按模块组织:
authdashboardtasksrunsschedulerinspectortemplatescontextsecurity-pushdiagnosisreportsstorage每个模块尽量遵循:
controller: 对外 APIservice: 业务逻辑repository: 数据访问dto: 入参与出参校验entity/model: TypeORM Entity 或领域模型inspection_taskcron_expr 投递执行任务inspection_run,状态为 queued -> runningsteps_jsonrun_status=successinspection_run + context_payloaddiagnosis_result在文档给出的 4 张核心表基础上,建议至少补齐以下表,避免后续状态无法闭环。
保留文档字段,并补充:
created_atupdated_atcreated_bylast_run_at建议补充:
status:queued/running/success/failed/partialfailure_reasonstep_logs_jsonwatermarked_screenshots_jsoncontext_statusdiagnosis_status说明:
文档里同时出现了 run_status 和状态机中的 queued/running/success/failed/partial,实际落地时建议统一为 status,避免双状态冲突。
建议补充:
idtask_idrun_idpayload_status:pending/accepted/rejectedencrypted_payloadsignaturereceived_at建议补充:
status:pending/success/failedmodel_nameprompt_versionmasked_context_jsonraw_responsecreated_at用于承接 P-04:
idservice_keytemplate_nameprobe_type:http/tcptargetmethodheaders_jsontimeout_mssuccess_conditionthreshold_jsonidservice_keymetric_namepromqlthreshold_jsondisplay_orderidreport_datereport_textitems_jsoncreated_atsteps_json 不建议一开始支持自由脚本,阶段 1 应限制为声明式 DSL:
[
{ "action": "goto", "url": "https://example.com", "timeoutMs": 10000 },
{ "action": "waitForSelector", "selector": "input[name=q]", "timeoutMs": 5000 },
{ "action": "input", "selector": "input[name=q]", "value": "test" },
{ "action": "click", "selector": "button[type=submit]" },
{ "action": "assertText", "selector": "body", "contains": "结果" }
]
先只支持:
gotowaitForSelectorclickinputassertTextassertVisiblesleepscreenshot这样可控、易验收,也符合文档“不得抢跑复杂能力”的原则。
阶段 1 建议把异常检测收敛为 4 类:
HTTP_4XXHTTP_5XXELEMENT_MISSINGBLANK_PAGE判定逻辑:
waitForSelector/assertVisible 失败body.innerText 长度过低且无核心元素不要在阶段 1 加太多启发式规则,否则误报率和调试成本会上升。
阶段 1 重点是“验签失败不能入库”和“链路可复现”。
建议:
HMAC-SHA256(secret, trace_id + ts + payload_hash)AES-GCMencrypted_payloadsigntstrace_id如果当前阶段只是演示闭环,可以“真签名 + 真验签 + 简化加密实现”,但不要只做假字段。
输入模型的上下文建议固定为:
强制模型输出:
{
"root_cause": "可能为上游网关异常",
"confidence": 0.82,
"evidence_points": [
"外网访问返回 502",
"应用存活探测失败",
"CPU 正常但接口探活超时"
],
"next_actions": [
"检查网关 upstream 配置",
"核对应用实例健康状态"
],
"report_text": "本次故障初步判断为..."
}
diagnosis_result.status=failed组件:
阶段 1 重点是信息可读,不追求大屏。
能力:
分成两个 Tab:
字段:
建议三栏或纵向三块:
默认偏“技术排障视角”,因为这是阶段 1 的核心价值;后续可再补“领导汇报摘要卡片”。
输出两部分:
这样兼顾技术复盘和领导汇报。
POST /api/tasksGET /api/tasksPOST /api/runs/execute/:taskIdGET /api/runsGET /api/runs/:runIdPOST /agent/context/pushPOST /api/diagnosis/runGET /api/reports/daily为了支撑页面,建议增加:
PUT /api/tasks/:idPATCH /api/tasks/:id/statusGET /api/templates/metricsPOST /api/templates/metricsGET /api/templates/probesPOST /api/templates/probes这些属于页面所需的补全接口,不算越界扩展。
严格按文档的 S1-S6 推进,但工程上建议拆成下面 10 个开发包。
inspection_run 状态流转如果 1 人主开发,建议按 3 周压缩版推进:
如果 2 到 3 人并行:
结合文档的“先主线、后增强”,我建议阶段 1 先这样收敛:
service_key文档里 inspection_run.run_status 与状态机表有轻微冲突,建议统一成:
status: queued/running/success/failed/partial建议:
service_keyservice_key 可以关联多条指标模板和多条探测模板这样比“任务直接挂一堆模板”更稳。
不要只靠 run_id 聚合,因为后续上下文推送和诊断结果天然更适合用 trace_id 串联。
日报不要只做实时拼接,建议落 daily_report 表,便于复查与导出。
如果直接开工,最推荐的顺序是:
NestJS + Next.js + PostgreSQL + Redis + Playwright 基础工程。S1-S2,让任务创建、调度、手动执行、记录落库跑通。S3-S4,把异常证据和上下文补证据补齐。S5-S6,把 AI 归因与日报交付收口。这会是当前文档下最稳、最省返工的一条实现路径。