10 KiB
10 KiB
domainCheck Ops Stack Diagnosis Contract
1. 目标
这份文档用于冻结海外单脑控制面的“总检入口” contract。
它的职责不是替代:
overviewlink-snapshotinspection-overviewrelease launchpadactivity-stream
而是把这些正式 contract 再收口成一份:
第一现场诊断结果
让下面这些消费者都先看同一份判断:
- 海外 Ops Center 页面
- 海外 Codex 驾驶员
- CLI 总检脚本
- 后台按钮自动诊断
正式原则:
- 总检不能只回一段说明文字
- 总检必须给出结构化问题清单
- 总检必须给出默认下一步动作
- 总检必须给出可以直接执行的推荐命令
2. 入口接口
主入口:
GET /api/v1/ops/go-live-summaryGET /api/v1/ops/stack-diagnosis
配套来源:
GET /api/v1/ops/contractsGET /api/v1/ops/link-snapshotGET /api/v1/ops/overviewGET /api/v1/ops/nodesGET /api/v1/ops/releases/launchpadGET /api/v1/ops/playbook-runsGET /api/v1/ops/activity-stream
推荐 query:
base_url
用途:
go-live-summary- 给 Ops Center 顶部收口卡、CLI 总检、Codex 驾驶员直接消费
- 返回更偏“上线判断”的稳定摘要
- 用于生成
next_step.command - 用于生成
quick_commands - 让 CLI / Codex / 页面复制出来的命令口径一致
3. 顶层结构
建议最小结构:
{
"generated_at": "2026-04-18 09:00:00",
"diagnosis": {},
"api": {},
"surface_matrix": {},
"contracts": {},
"link_snapshot": {},
"overview": {},
"managed_nodes": {},
"release_hub": {},
"playbook_runs": {},
"activity_stream": {}
}
正式要求:
- 顶层每一段都必须是稳定 key
- 页面、CLI、Codex 不允许自己再拼第 2 套总检结构
go-live-summary- 是
stack-diagnosis的稳定摘要层 - 必须至少给出:
go_live_statusblocking_reasonswarningslaunchpad_recommended_target_node_codelaunchpad_recommended_recovery_labellaunchpad_recommended_recovery_summarylaunchpad_onboarding_bootstrap_pending_nodeslaunchpad_onboarding_acceptance_ready_nodesnext_step_action_codeoperator_titlerecommended_commands
- 是
playbook_runs.problem_runs[*]- 需要保留
focus_ref - 这样 CLI / Codex / 页面才能直接定位到问题编排的正式焦点
- 需要保留
activity_stream.top_items[*]- 需要保留:
occurred_atfocus_refsource_focus_refui_intent_kind
- 这样总检不会把“观察摘要”再次压扁成一段不可定位的纯文本
- 需要保留:
go-live-summary+stack-diagnosis+driver-feed.automation_coverage- 必须能共同驱动 Ops Center 首屏
- 不允许页面自己从局部接口重新推导一份“收口状态”
4. Diagnosis Contract
来源:
stack_diagnosis.diagnosis
最小字段:
{
"contract_key": "ops_stack_diagnosis_contract",
"contract_version": "v1",
"registry_version": "2026-04-18",
"base_url": "http://127.0.0.1:8100",
"surface_status": "partial",
"automation_status": "blocked",
"stack_status": "blocked",
"issue_total": 4,
"blocking_issue_total": 1,
"warning_issue_total": 3,
"missing_surfaces": [
"contracts"
],
"launchpad_recommended_target_node_code": "mainland-worker-01",
"launchpad_recommended_recovery_label": "待执行接入",
"launchpad_recommended_recovery_summary": "mainland-worker-01 还缺接入收口,先执行 bootstrap。",
"launchpad_onboarding_bootstrap_pending_nodes": 1,
"launchpad_onboarding_acceptance_ready_nodes": 0,
"next_step": {
"action_code": "bootstrap_run",
"source": "issue:managed_nodes_agent_pending",
"reason": "mainland-worker-01 还缺接入收口,先执行 bootstrap。",
"command": "bash domain-api/deploy/multi-region/drive_ops_center.sh driver-resolve http://127.0.0.1:8100 bootstrap_run",
"focus_ref": {
"kind": "managed_node",
"node_code": "mainland-worker-01"
}
},
"recommended_actions": [],
"issues": [],
"operator_hints": [],
"quick_commands": []
}
状态语义必须固定:
surface_statushealthypartialbroken
automation_statusreadyattentionblocked
stack_status- 总结论,面向人和程序
- 推荐值为
ready / attention / blocked
正式要求:
next_step是默认下一步,而不是“可能动作之一”- 当首个缺口节点已经明确收敛为
bootstrap_run / run_acceptance时,next_step.action_code不应再退回成泛化的fix_managed_nodes - 当存在
runtime_build_schema_stale时,next_step.action_code必须优先收敛为api-restart issues必须按可处理性组织,而不是只堆原始异常文本quick_commands必须是可以直接复制执行的命令next_step.focus_ref- 是首屏“定位下一步”的正式落点
- 页面、CLI、Codex 不允许再根据
action_code反推要跳去哪个区域
diagnosis.launchpad_recommended_target_node_code- 代表 stack-diagnosis 已经把 Release Hub 收敛出的首个接管缺口直接下沉到总检摘要
- 页面、CLI、doctor-export、Codex 不应再分别回源二次推导
diagnosis.launchpad_onboarding_bootstrap_pending_nodes / launchpad_onboarding_acceptance_ready_nodes- 代表当前接管缺口的阶段性计数
- 用来帮助总检直接区分“待 bootstrap”与“待 acceptance”
go-live-summary.launchpad_recommended_target_node_code- 是 launchpad 已经收敛出的首个接管缺口节点
- 页面、CLI、Codex 应优先直接显示它,而不是重新扫描 gap rows
go-live-summary.launchpad_onboarding_bootstrap_pending_nodes / launchpad_onboarding_acceptance_ready_nodes- 用于区分当前是“待接入”还是“待验收”
- 这两个计数应作为上线收口阶段的正式 warning 来源,而不是页面本地再统计
5. Issue Contract
diagnosis.issues[] 最小字段:
{
"code": "managed_nodes_agent_pending",
"severity": "blocked",
"layer": "managed_nodes",
"summary": "托管节点虽然已经纳入 Ops Center,但 0 台 remote-agent 就绪,当前第一动作已收敛为首台节点接入收口。",
"detail": "managed_enabled=3,remote_access_ready=0;首个缺口节点 mainland-worker-01:待执行接入。",
"action_code": "bootstrap_run",
"focus_ref": {
"kind": "managed_node",
"node_code": "mainland-worker-01"
},
"commands": [
"bash domain-api/deploy/multi-region/drive_ops_center.sh driver-resolve http://127.0.0.1:8100 bootstrap_run",
"bash domain-api/deploy/multi-region/drive_ops_center.sh node-bootstrap-plan http://127.0.0.1:8100 mainland-worker-01"
]
}
严重级别建议固定为:
blockedwarninginfo
正式要求:
summary用于列表展示detail用于展开解释commands用于终端直接执行- 不允许只有中文文案,没有结构化定位信息
对于运行时版本漂移,还应允许出现这类 issue:
{
"code": "runtime_build_schema_stale",
"severity": "warning",
"layer": "runtime_build_info.schema",
"summary": "仓库已经具备新的节点接管能力,但运行中的 build-info 仍未声明对应路由键,当前更像 API 还没重启到最新代码。",
"detail": "supports_install_command_block=true;route_surface_declares_bootstrap_plan=false",
"action_code": "api-restart",
"focus_ref": {
"kind": "runtime_build_info",
"section": "schema",
"expected_route_key": "ops_node_handover_bootstrap_plan"
},
"commands": [
"bash domain-api/deploy/multi-region/drive_ops_center.sh runtime-refresh-recover http://127.0.0.1:8100",
"bash domain-api/deploy/multi-region/drive_ops_center.sh stack-diagnosis http://127.0.0.1:8100 summary",
"bash domain-api/deploy/multi-region/drive_ops_center.sh node-bootstrap-plan http://127.0.0.1:8100 mainland-worker-01"
]
}
6. Surface Matrix Contract
来源:
stack_diagnosis.surface_matrix
最小字段:
{
"status_counts": {
"total": 8,
"available": 7,
"missing": 1
},
"items": [
{
"name": "contracts",
"available": false
}
]
}
7. Runtime Build Info Extension
stack_diagnosis.runtime_build_info 以及 /api/v1/runtime/build-info 建议至少包含:
{
"repository_capabilities": {
"supports_install_command_block": true,
"supports_multi_layout_bootstrap": true
},
"route_surface_declares_bootstrap_plan": false,
"runtime_schema_stale": true
}
语义要求:
repository_capabilities- 表示当前仓库代码本身具备的能力
route_surface_declares_bootstrap_plan- 表示运行中的 API build-info 是否已经声明节点级 bootstrap-plan 路由键
runtime_schema_stale- 表示“仓库能力已到位,但运行中的 API 结构还停留在旧版”
- 这是典型的“服务没重启到最新代码”信号,不应误判成“功能没开发完”
作用:
- 让页面和 CLI 直观看出“缺的是哪一层”
- 避免只看到最终 blocked,却不知道缺的是 contract、launchpad 还是 activity-stream
7. 与其他 Contract 的关系
ops_stack_diagnosis_contract 的定位是:
- 不替代
ops_driver_contract - 不替代
ops_observability_contract - 不替代
release_hub_contract
它负责:
- 把它们统一收口成第一现场诊断
对于 Ops Center 页面还必须补充一条:
- 首屏负责“结论 + 默认下一步 + 复制命令 + 动作回执”
- 下方详情区负责“issue / surface / launchpad / activity / runbook”的展开与下钻
- 不允许详情区覆盖首屏的默认下一步结论
所以正确消费顺序应该是:
- 先看
stack-diagnosis - 再根据
issues / next_step / focus_ref下钻到:overviewlink-snapshotinspection-overviewrelease launchpadactivity-stream
8. CLI / Codex / 页面统一约束
CLI:
check_ops_center_stack.sh应优先调用GET /api/v1/ops/stack-diagnosis
Codex:
- 默认先读取
stack-diagnosis - 再决定是继续
driver-resolve、doctor还是细分检查
页面:
- 顶部总检卡片必须优先消费
diagnosis - 不能重新从多个 endpoint 拼一份影子状态
只有这样,海外单脑控制面才能真正进入:
单入口观察,分层下钻,统一执行