Add reliable execution reporting and coordinated dashboard views
This commit is contained in:
@@ -4,15 +4,16 @@
|
||||
|
||||
## 页面与布局
|
||||
|
||||
复用官方 sidebar block 的侧边导航、页头和内容容器,登录复用官方 login block 的表单与组件。维持五个独立路由:
|
||||
复用官方 sidebar block 的侧边导航、页头和内容容器,登录复用官方 login block 的表单与组件。维持六个独立路由:
|
||||
|
||||
| 页面 | 主要问题 | 内容 |
|
||||
|---|---|---|
|
||||
| 总览 | 现在进展如何? | 少量状态统计、当前阶段/阻塞、重要汇报与决策摘要 |
|
||||
| 任务 | 谁在做什么? | 工作包、状态、阶段、ETA 范围/依据和更新时刻 |
|
||||
| 任务 | 谁在做什么? | 工作包、状态、阶段、目前进度一句话、ETA范围和业务更新时刻 |
|
||||
| 集群 | 资源和调度是否可用? | 节点内存/负载、NFS、Slurm、LSF与故障/采集时间 |
|
||||
| 沟通 | 我如何询问进度和讨论方案? | 固定人类入口的正常聊天、输入框、必要待办和简洁发送提示 |
|
||||
| 决策 | 哪些事项需要我决定? | 方案、影响、依据、待定与已决定记录 |
|
||||
| 决策 | 哪些事项需要我决定? | 卡片展板、方案、影响、选择与提交记录 |
|
||||
| 日志 | 出过什么问题、恢复了吗? | 分级聚合事件、恢复状态、筛选与安全详情 |
|
||||
|
||||
总览不重现所有详情;页面不把数据全部挤在一个长列。窄屏折叠导航,沟通输入和消息列表保持可操作。
|
||||
|
||||
@@ -28,7 +29,7 @@
|
||||
|
||||
先定位已有页面和数据适配层,复用组件完成需求;只在设计系统确需变化时修改集中 token。业务数据来自当前 API,不能为了套模板保留示例收入、销售图、假用户或无效按钮。
|
||||
|
||||
提交前运行锁定依赖构建,并验证五页切换、刷新/返回、沟通会话目标、登录退出、过期/离线状态和窄屏布局。截图和生产数据仅留在私有验收产物,不自动加入公开库。
|
||||
提交前运行锁定依赖构建,并验证六页切换、刷新/返回、沟通会话目标、登录退出、过期/离线状态和窄屏布局。截图和生产数据仅留在私有验收产物,不自动加入公开库。
|
||||
|
||||
## 沟通页的低噪声规则
|
||||
|
||||
@@ -37,3 +38,29 @@
|
||||
页面固定连接人类入口,不显示会话选择、绑定状态说明、原会话跳转或新建会话表单。页头只提供“刷新”,重新读取聊天和必要状态,保留登录、草稿、目标与幂等发送记录,不做浏览器整页重载。正常聊天不堆时间、来源、投递徽标;只在等待或失败时用自然语言提示。
|
||||
|
||||
聊天读取独立GET /api/conversation投影视图;原始GET /api/messages继续用于后台审计、桥接和对账。投影通过保存的turn/phase/reply关系隐藏内部或验收轮次;网页封装只有与已保存原输入完整匹配才折叠为原文。重大真实故障显示人类可读摘要,不透出原始事件载荷。首次打开显示最近对话,阅读旧消息时不强制滚到底部。
|
||||
|
||||
## 决策展板
|
||||
|
||||
需要用户决定的事项使用卡片展板,不做长日志列表。卡片只展示问题、影响、优先级及状态,点击打开详情抽屉。详情包括背景、问题、推荐与依据、方案说明和真实有依据的期限。可枚举方案使用可点击单选项,默认不选,推荐不视为批准。备注可补充;显式“提交选择”按钮与选择动作分开,失败保留草稿,同一草稿重试复用幂等键。
|
||||
|
||||
提交后显示实际选择与结果,权限相关显示“待核实”,不显示“已授权”。采用#/decisions?decision=<id>打开具体卡片;沟通只做一句提醒并链接卡片,不复制全部方案。空状态不加入合成演示决策。既有tasks.decision文本保留只读兼容,不伪造选项。
|
||||
|
||||
任务卡的“目前进度”只展示current_progress,不能替换旧标签后仍显示eta_basis。进度实际变化后自动刷新,保留业务更新时间;活跃任务过期显示待更新需核查,完成剩余为0。新增改进单独登记,不沿用旧完成记录遮盖正在进行的工作。
|
||||
|
||||
沟通布局将“项目沟通”和简短介绍移入页面标题栏,刷新位于对话右上角。标题栏下聊天占满可用内容区域,消息独立滚动、输入区固定底部,保留必要导航;不触发浏览器全屏模式。桌面与窄屏都需保证输入、发送、刷新可见且不被外层滚动挤走。
|
||||
|
||||
## 日志与通知
|
||||
|
||||
日志等级与恢复状态独立:信息蓝色、警告琥珀色、错误浅红、严重实红;处理中中性色、已恢复绿色,都配中文文字。按source/event_id聚合为一条,repeat_count是累计firing上报,界面重复次数显示max(0,count-1)。详情仅安全摘要、影响、处理、下一步、证据和时间,不展示原JSON/工具/推理或私有凭据。支持等级/状态筛选及#/logs?incident=<id>直达详情。
|
||||
|
||||
沟通不显示自动短暂故障/恢复轮次;只有持续重大影响或需用户行动时显示一句简报并链接日志/决策。用户主动问故障时的解释保留。计划内或可恢复的短时断连先有界重试,不立即对用户发严重告警。
|
||||
|
||||
## 关注红点
|
||||
|
||||
导航红点是“仍值得关注”而非未读或变化计数,颜色同时配可访问的原因说明。按当前页所有有效attention.items聚合,点击页面不清除;服务器撤销后随既有同步取消。页面顶部只放简短原因和具体事项链接(任务支持?task=、决策?decision=、日志?incident=),聊天不再塞内部载荷。多事项分别定位,不用一个全局清零操作。普通心跳或自动恢复不标,恢复/选择完成时清关联项;刷新和重启不得复活已撤销项。
|
||||
|
||||
## 任务三视图与详情
|
||||
|
||||
同一任务数据可切换展板、列表、分支,view参数保留选择。展板用于概要,列表便于比较当前进度、阶段、ETA与负责人,分支用于父子拆分、前置依赖和汇总集成关系;明确标注不是Git分支。关系没有登记时如实显示,不补假箭头。多依赖不等于全程串行或全程并行,详情说明可先做部分及等待同步点。
|
||||
|
||||
点击任务打开详情,展示目标、范围、负责人/真实会话、当前进度、版本、前置条件、并行部分、同步点、验收条件和集成状态。URL view=board/list/branches、task=<id>可定位,关闭详情只移除task。空/单任务/已完成/多依赖保持一致,过期状态与ETA规则不因切换消失。任务关系与Git分支不混用。
|
||||
|
||||
@@ -62,17 +62,77 @@ LSF主机/队列RUN计数可能是槽位数,不能等同作业记录数量。S
|
||||
|
||||
面向用户默认事件驱动,仅重大里程碑、关键结果、阻塞、关键失败、重大风险与待决策触发;普通进展合并,无变化不打扰。总控可使用正式heartbeat每10分钟进行内部巡检与会话汇总,记录真实计划ID/目标;内部巡检不固定向用户播报。项目结束且无待处理事件后暂停计划。
|
||||
|
||||
真实验收分别记录:认证和来源保护、消息隔离/幂等、租期/失联恢复、同一真实会话往返、原会话汇报镜像、五分页及返回刷新、窄屏、真实采集、局域网直连。模拟通过不能替代真实模型/集群测试。原业务项目仍执行其自己的测试和原生工具验收。
|
||||
真实验收分别记录:认证和来源保护、消息隔离/幂等、租期/失联恢复、同一真实会话往返、原会话汇报镜像、六分页及返回刷新、窄屏、真实采集、局域网直连。模拟通过不能替代真实模型/集群测试。原业务项目仍执行其自己的测试和原生工具验收。
|
||||
|
||||
## 故障钩子
|
||||
|
||||
`POST /api/hooks` 只收认证结构事件:event_id/source、severity(info/warning/critical)、status(firing/resolved)、summary,以及可选task_id/session_id、impact、evidence字符串数组、action、next_step。来源与ID各最多128字符;摘要1000、其他说明2000、证据最多8项各1000。引用的任务或会话必须存在。正文不执行任何命令,也不能指定通知目标。
|
||||
`POST /api/hooks` 只收认证结构事件:event_id/source、severity(info/warning/error/critical)、status(firing/resolved)、summary,以及可选task_id/session_id、impact、evidence字符串数组、action、next_step。来源与ID各最多128字符;摘要1000、其他说明2000、证据最多8项各1000。引用的任务或会话必须存在。正文不执行任何命令,也不能指定通知目标。
|
||||
|
||||
source+event_id+status持久幂等,相同故障重复不打扰;恢复必须对应原故障并保留原严重性。每次新故障使用新ID。所有事件进入总控outbox,critical额外进入人类入口。`GET /api/hook-notifications`读pending通知,`POST /api/hooks/ack`以notification_id幂等确认。`GET /api/state`的hooks字段显示待投递数、活动故障和最近事件;通知确认仅代表进入目标会话队列,不代表修复成功。
|
||||
source+event_id+status持久幂等,相同故障重复不打扰;恢复必须对应原故障并保留原严重性。每次新故障使用新ID。服务保留按control/human目标生成的持久outbox记录;这不是向人类直接广播的依据。启用下述内部审查路由后,notifier将同一hook的两个目标合并交副主控审查,再按实际影响决定是否升级。`GET /api/hook-notifications`读pending通知,`POST /api/hooks/ack`以notification_id幂等确认。`GET /api/state`的hooks字段显示待投递数、活动故障和最近事件;通知确认仅代表进入目标会话队列,不代表修复成功。
|
||||
|
||||
在桥接私有配置增加 notification_targets: {"control":"<总控真实UUID>","human":"<入口真实UUID>"}、notification_state_file(仓库外私有状态)。bridge_service同时运行notifier,保存队列回执,进程异常退出自动发关键故障,功能健康且持续成功30秒后发恢复,不把进程存活等同功能恢复。bridge-faults.json和通知状态中的health显示钩子自身失败;同一通知不因ack失败而重发,未知结果只对账。后台执行主机离线时无法保证立即通知,内部巡检负责发现失联。
|
||||
在桥接私有配置增加 notification_targets: {"control":"<总控真实UUID>","human":"<入口真实UUID>"}、notification_state_file(仓库外私有状态)。bridge_service同时运行notifier,保存队列回执,进程异常退出进入故障记录并按持续影响分级,功能健康且持续成功30秒后发恢复,不把进程存活等同功能恢复。bridge-faults.json和通知状态中的health显示钩子自身失败;同一通知不因ack失败而重发,未知结果只对账。后台执行主机离线时无法保证立即通知,内部巡检负责发现失联。
|
||||
|
||||
显式开发检查可用 `python3 scripts/hooks.py --config <私有配置> --source build --event-id <本次故障ID> --severity critical --summary "开发检查失败" --evidence "本地检查日志位置" -- <已授权程序与参数>`。不使用shell,不上传原始日志或命令参数,保留原程序退出码。恢复时同ID使用 --status resolved,或运行成功的修复验证命令;包装器在私有配置旁持久保存检查生命周期;首次检查成功直接返回0,不上报不存在的恢复。钩子投递失败自身返回失败并提示核查,不隐瞒。
|
||||
|
||||
这是通用接入机制。集群其他服务、CI、调度作业的故障需在各自受授权检查入口接入;不自动修改站点Runner或业务服务配置。事件文字只作事实资料,不扩大修复权限。
|
||||
恢复通知发送失败后组件又失去健康时,保存 uncertain_recovery/needs_reconciliation,不继续宣布恢复。先核对服务事件与原会话,再人工收敛记录;不能盲重发或复用旧故障ID启动新周期。
|
||||
|
||||
## 决策与响应投递
|
||||
|
||||
GET /api/state的decisions保存卡片与响应。POST /api/decisions登记固定id/title/question及impact/priority/details/recommendation/options/deadline/requires_authorization/task_id;同ID相同规范正文幂等,不同内容冲突。options是{id,label,description}数组,不指定真实thread或任意命令。
|
||||
|
||||
POST /api/decisions/<id>/respond提交{option_id,comment,idempotency_key}。有选项须选择合法项,无选项至少写意见;第一次提交原子保存,同key同正文返回原响应,冲突重用或其他提交拒绝。普通状态为decided,权限相关为pending_verification;响应含authorization:false,不能作为提权批准。GET /api/decision-notifications提供最早100条待投递,POST /api/decision-notifications/ack以notification_id幂等确认。
|
||||
|
||||
桥接私有配置decision_notifications:true启用notifier投递到notification_targets.control。保存回执与完整输入哈希,未知投递先对账,不盲重发;投递确认不代表方案执行。通知只携带问题、实际选项与意见,背景仍由总控通过API读取,避免塞满会话。沟通展示使用/api/conversation;后台继续用原始/api/messages做恢复与审计。
|
||||
|
||||
## 任务当前进度
|
||||
|
||||
任务的current_progress是一句实际正在做什么,与eta_basis的估计理由分别保存。创建或PATCH任务时可显式提交current_progress(最多1000字),服务端设置progress_updated,不接受客户端自填时间。其他字段更新保留原进度和时间,旧任务默认空/None,不回填旧ETA依据。用户页面标“目前进度”,空值如实显示尚未汇报;活跃任务10分钟未更新提示待核查,完成任务剩余为0。前端沿用3秒轮询,不能把轮询时间当成任务心跳。
|
||||
|
||||
新增页面/功能需求另登记真实任务,开始、推进、阶段切换、阻塞与完成时更新一句话进度和状态。已送达且真实回复的网页需求若暂有旧失败事件,先按保存的thread/turn回执对账,不重发;桌面历史的临时interrupted且无确定error不是可验证失败,等待真实最终回复或转待核查。
|
||||
|
||||
## ETA 内部检查点
|
||||
|
||||
服务后台每15秒调用持久eta_tick;state.eta_clock显示时钟健康和last_tick。有效范围在显式写入时初始化eta_estimated_at/eta_revision,旧记录只读取不伪造起算时间。相同范围的心跳不重置;实际更改范围必须eta_change_reason。upper bound定义周期,50%/80%/100%分别写half/near/overdue唯一记录,只扫描活跃任务;任务完成或换版后旧未投递记录取消且保留审计。
|
||||
|
||||
GET /api/eta-notifications返回{notifications:[{notification_id,target:"control",task,checkpoint,revision}],pending_count},POST /api/eta-notifications/ack只确认排队投递。私有桥接eta_notifications:true启用notifier,有execution_notification_targets任务归属映射时先投执行者;否则配置eta_review_thread_id时投向获委派的内部核查会话,未配置则回退总控。核查会话查询真实执行状态后POST /api/eta-reviews/<notification_id>/complete:result keep/revise/unknown、reason非空,可选current_progress;revise附eta_min_minutes/eta_max_minutes。相同完成正文幂等,不同或旧版本冲突;keep不重置范围/时刻,unknown显示待核查,revise生成新版本及理由。延长次数同任务累积最多3次,第4次保留原范围并标needs_decision,不能无限续期。
|
||||
|
||||
消息进入核查会话队列不代表已经查询或重评估;ack与complete分开。超期且未取得状态保持待核查,活跃任务不能显示0分钟。内部检查不周期打扰用户,仅显著延期或待决策升级。
|
||||
|
||||
## 日志投影与持续故障升级
|
||||
|
||||
GET /api/logs提供最近100条按source/event_id聚合的安全日志,可选level=info/warning/error/critical、status=active/resolved筛选。first_seen/last_seen/resolved_at分别记录发生、最近上报与恢复;repeat_count从1起是累计firing次数,重复不新增通知。投影遮蔽私有路径和凭据,原审计仍保留。
|
||||
|
||||
桥接故障初报warning仅进内部审查和日志;持续功能不健康超过fault_escalation_seconds(默认120,范围60至3600)调用POST /api/hooks/escalate {source,event_id,reason,impact?}。同一生命周期相同升级幂等,不同理由冲突,已恢复不可升级。通知副本含log_id,升级及其恢复带escalated:true,原firing审计不变。人类入口仅接持续重大升级与必要恢复,聊天保留简报和日志链接,普通自动恢复整轮隐藏。ETA可用eta_review_thread_id配置总控明确委派的内部核查会话,避免总控忙碌时检查点长期排队;此目标绑定到持久发送状态,改目标须先对账旧投递并显式新状态。
|
||||
|
||||
## 持久关注事项
|
||||
|
||||
POST /api/attention登记{id,page,required,reason,href?,decision_id?,task_id?,hook_source?,hook_event_id?}。page为六个固定页面之一,reason最多240字;true须非空,false可空撤销。href只允许已知站内页面及query,拒协议、双斜杠、反斜杠、HTML和编码绕过。id绑定page/关联主体,不能移绑;省略关联时保留。同内容幂等,不更新时间或重复审计。state.attention包含有效items及六页pages布尔值,原始撤销历史持久保留。
|
||||
|
||||
decision与升级hook在同事务创建稳定关注,重复事件不补回agent已撤销项。decision响应、hook恢复、task取消撤销关联项;普通completed任务不自动清,避免清掉重大完成结果。其他任务/集群/沟通关注由agent明确创建/取消,不根据轮询或点击推断。查看页面与解决分开,没有“已读即全部清除”。
|
||||
|
||||
旧版bridge-mirror把短暂中断也标成critical的已恢复记录,安全日志视图在120秒内自动恢复且无升级审计时按warning呈现;原始严重性与审计不改。历史聊天中的该自动故障/恢复轮次及仅确认恢复的内部汇报被隐藏,主动用户询问不受影响。
|
||||
|
||||
## 任务关系与集成登记
|
||||
|
||||
Task新增goal/scope/coupling_assessment、owner/integration_owner/version、parent_id/depends_on/parallel_with/parallel_scope、sync_points、acceptance_criteria、merge_sources/merged_into_id、integration_status。默认空值,不造关系;引用必须已登记。父层级、依赖因果图和归并图分别无环;包含与回父汇总可并存,不能把包含当先后。依赖与并行有交集时必须解释parallel_scope的先行部分与等待点。
|
||||
|
||||
POST /api/tasks/<target>/integrate {source_ids,owner,status,version?,reason}事务记录target.merge_sources及source.merged_into_id,status为waiting/integrating/integrated/verified。源/目标存在且不同,已有其他归属或归并环拒绝,同语义幂等;源任务状态与进度不自动改变。这个API不是Git合并,也不是验收,只有总控核实代码集成和检查后才提升状态。任务三视图及详情直接使用这些真实字段。
|
||||
|
||||
## 一层副主控的路由与可靠上报
|
||||
|
||||
职责以SKILL.md的一层规则为准:归属执行agent先处理并落库,跨任务/阻塞交唯一直属副主控,副主控定向核查后只将人类决策、冲突或重大事件升级总控。人类需求、决策响应仍直达总控,不受底层事件排队链替代。紧急越级须记录副主控失联证据、约定时限与有界尝试,沿用原关联ID,不广播或循环转发。
|
||||
|
||||
**当前路由:** 私有桥接 `execution_notification_targets` 是看板session_id到真实执行thread的显式映射。notifier从正式 `/api/state` 读取task.id与session_id,用ETA的task.id或hook.task_id查归属;存在映射且不是决策通知时,优先投该执行thread。没有映射、没有关联任务或系统hook时,hook回退 `internal_event_thread_id`;ETA回退 `eta_review_thread_id`,再回退notification_targets中的目标。本一层流程将两个内部回退字段均指向唯一直属副主控。决策响应始终走notification_targets.control,不被执行者映射覆盖。没有有效显式目标会报错,不猜thread或广播。配置内部事件目标时,同一hook的control/human通知仍合并为一次投递并分别确认原outbox项,即使最终目标为执行者。
|
||||
|
||||
映射只选择真实已授权目标,不新增工作包、层级或权限。已持久记录的thread和输入哈希不得随归属变化静默改写。control、notification_targets、internal_event_thread_id、eta_review_thread_id及execution_notification_targets参与状态绑定;改变绑定须先对账旧投递,再使用新的私有notification_state_file,保留旧文件作为prior_notification_states,不把换文件当清队列。
|
||||
|
||||
启用coalesce_stale_hooks时,notifier只读取control连接相同的旧通知状态,先对账accepted/submitting/observed的hook回执;有receipt_id或已observed才确认原通知,未知发送保持受保护,无法映射的未知记录要求人工核查。随后按服务端规则合并过时hook,不盲重放既有积压。这是hook旧回执对账,不等于所有ETA/决策记录已自动迁移,也不证明宿主原生排队已取消;迁移后仍须验证目标绑定、去重与真实处理回执。
|
||||
|
||||
完成报告需先保存私有持久outbox,包含稳定report_id、task_id、任务版本、执行负责人、目标、证据与检查结果,再有界退避重试。接收方以报告ID和正文校验幂等;落库回执与外部队列回执分别保存。超时/结果未知先查原记录,不重跑业务、不换ID盲发;达到约定上限转待核查并定向交副主控。该段规定报告流程,不新增不存在的通用完成报告API;worker的complete/pending_completion和通知outbox只证明各自消息链路,不能宣称覆盖所有手工执行agent。执行完成、报告落库、集成验收和版本发布分别记录,未完成集成时保持真实等待状态。
|
||||
|
||||
## 通知背压与宿主队列边界
|
||||
|
||||
每个目标最多一条未处理通知;应用侧启用 `enforce_backpressure`,并配置 `max_inflight_per_target: 1`(当前实现允许1至3,本协作规则要求1)。accepted/submitting/observed且未processing_done的投递仍占名额,只有真实处理证据才能释放;发送确认本身不释放。后续通知留在持久outbox,同一关联事项合并,未知项先对账。仅限制单次发送批量不等于每目标背压;未启用或未验收时不得宣称已满足。
|
||||
|
||||
queue_health分别报告application_pending、inflight_by_target及已知完成情况。当前host_full_queue_count为null、host_queue_cancel_supported为false,表示没有完整宿主原生队列总数和取消能力;不代表原生队列为空。停止本机notifier、清应用待办或取消旧ETA记录都不能证明已进入宿主的输入已撤回。只能用受支持宿主接口核实取消结果,无法核实时保留未知并禁止盲重发,不访问内部数据库或抢writer锁。
|
||||
|
||||
Reference in New Issue
Block a user