From 630190e4d333866ec8bb6d0a0454610f65925ae9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E7=82=8E?= <635735027@qq.com> Date: Thu, 9 Apr 2026 10:43:09 +0800 Subject: [PATCH] docs: add command center analysis artifacts Capture the command-center operation analyses, inventory outputs, and browser pipeline reference files produced during the current research pass so they can be reviewed from the branch. Co-Authored-By: Claude Sonnet 4.6 --- ...repair-city-dispatch-operation-analysis.md | 217 +++ ...eekly-monitor-report-operation-analysis.md | 155 ++ ...6-04-08-command-center-evidence-grading.md | 203 +++ ...ommand-center-standard-config-structure.md | 639 ++++++++ ...center-virtual-employee-inventory-table.md | 121 ++ ...tual-employee-inventory-table.rebuilt.xlsx | Bin 0 -> 6104 bytes ...nter-virtual-employee-inventory-table.xlsx | Bin 0 -> 5839 bytes ...and-center-virtual-employee-inventory.json | 1280 +++++++++++++++++ ...fault-details-report-operation-analysis.md | 142 ++ ...ayuguan-meter-outage-operation-analysis.md | 225 +++ ...onment-weekly-report-operation-analysis.md | 143 ++ docs/多核浏览器管道API接口文档.docx | Bin 0 -> 85215 bytes 12 files changed, 3125 insertions(+) create mode 100644 docs/superpowers/specs/2026-04-08-95598-repair-city-dispatch-operation-analysis.md create mode 100644 docs/superpowers/specs/2026-04-08-95598-weekly-monitor-report-operation-analysis.md create mode 100644 docs/superpowers/specs/2026-04-08-command-center-evidence-grading.md create mode 100644 docs/superpowers/specs/2026-04-08-command-center-standard-config-structure.md create mode 100644 docs/superpowers/specs/2026-04-08-command-center-virtual-employee-inventory-table.md create mode 100644 docs/superpowers/specs/2026-04-08-command-center-virtual-employee-inventory-table.rebuilt.xlsx create mode 100644 docs/superpowers/specs/2026-04-08-command-center-virtual-employee-inventory-table.xlsx create mode 100644 docs/superpowers/specs/2026-04-08-command-center-virtual-employee-inventory.json create mode 100644 docs/superpowers/specs/2026-04-08-fault-details-report-operation-analysis.md create mode 100644 docs/superpowers/specs/2026-04-08-jiayuguan-meter-outage-operation-analysis.md create mode 100644 docs/superpowers/specs/2026-04-08-jinchang-business-environment-weekly-report-operation-analysis.md create mode 100644 docs/多核浏览器管道API接口文档.docx diff --git a/docs/superpowers/specs/2026-04-08-95598-repair-city-dispatch-operation-analysis.md b/docs/superpowers/specs/2026-04-08-95598-repair-city-dispatch-operation-analysis.md new file mode 100644 index 0000000..2cb12bb --- /dev/null +++ b/docs/superpowers/specs/2026-04-08-95598-repair-city-dispatch-operation-analysis.md @@ -0,0 +1,217 @@ +# 95598-repair-city-dispatch 操作分析 + +## 1. 场景概述 + +`95598-repair-city-dispatch` 对应“95598抢修-市指”场景,目标是监测抢修工单队列,并在必要时触发提醒、日志写入与自动派单等后续动作。根据 `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\scenes\95598-repair-city-dispatch\scene.json`、`D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\95598-repair-city-dispatch\SKILL.md`、`D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\95598-repair-city-dispatch\scripts\collect_repair_orders.js` 以及两份规则资产,当前最严谨的结论是:本场景的 packaged JS collector 已经实现输入驱动的 `monitor-snapshot` 归一化 / 比较逻辑,会按状态分桶 repair orders、解析 monitor/dispose logs、推导 `pending_ids` / `new_pending_ids`、给出 `success/partial/empty/blocked` 状态,并附带 desk 规则来源、配置基础页与已知问题元数据;但更强的业务监测、提醒与自动派单 workflow 证据仍主要存在于 desk 规则资产中,证据等级分别为 `code-confirmed`。 + +必须显式区分三层证据: + +1. packaged runtime-snapshot-collector:`collect_repair_orders.js` 已直接实现 repair-order 分类、历史比较、状态判定与标准化快照输出,并显式携带 `workflow_rule_sources`、`config_base_page`、`config_base_role`、`packaged_collector_role` 与 `known_issues`,证据等级:`code-confirmed`。 +2. 业务监测逻辑:`D:\desk\智能体资料\大四区报告监测项\95598抢修-市指_业务检测配置.txt` 直接展示了队列采集、状态分类、监测日志比较、音频提醒与监测日志写入逻辑,证据等级:`code-confirmed`。 +3. 自动派单 / 提醒逻辑:`D:\desk\智能体资料\大四区报告监测项\95598抢修-市指_自动处理配置.txt` 直接展示了去重、班组匹配、自动派单请求、音频提醒、短信发送、外呼触发与处置日志写入逻辑,证据等级:`code-confirmed`。 + +但这些 `code-confirmed` 只表示“代码或规则资产中存在这些实现分支或动作定义”,不等于“运行时已验证成功”。本文不对运行时成功做任何拔高表述。 + +## 2. 证据来源 + +本分析统一只使用四个证据等级标签:`code-confirmed`、`contract-defined`、`implementation intent exists but not rigorous / buggy`、`no direct evidence / candidate only`。 + +1. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\95598-repair-city-dispatch\scripts\collect_repair_orders.js` + - 直接定义 `STATUS_GROUPS`、`LOCAL_SERVICE_ENDPOINTS`、`WORKFLOW_RULE_SOURCES`、`CONFIG_BASE_PAGE`、`KNOWN_ISSUES`,并实现 repair-order 分类、monitor/dispose log 解析比较、`new_pending_ids` 推导、`success/partial/empty/blocked` 状态判定,以及带 `evidence` / `known_issues` 的 `monitor-snapshot` 输出,证据等级:`code-confirmed`。 +2. `D:\desk\智能体资料\大四区报告监测项\95598抢修-市指_业务检测配置.txt` + - 直接实现工单队列采集、按状态分桶、待处理列表比较、音频提醒、监测日志写入,且暴露待处理分类 bug,证据等级:`code-confirmed`。 +3. `D:\desk\智能体资料\大四区报告监测项\95598抢修-市指_自动处理配置.txt` + - 直接实现处置日志去重、班组范围匹配、自动派单请求、自动派单成功/失败/异常/未匹配分支、音频日志、短信日志、外呼触发与 `setDisposeLog` 写入,证据等级:`code-confirmed`。 +4. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\95598-repair-city-dispatch\SKILL.md` + - 定义“优先使用 packaged collector、把监测快照与下游动作分离、允许 partial”的运行契约,证据等级:`contract-defined`。 +5. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\95598-repair-city-dispatch\references\collection-flow.md` + - 定义以页面配置为入口、结合规则资产理解语义、采集状态 `00/01/06/08`、对比 monitor/dispose logs 的一阶流程,证据等级:`contract-defined`。 +6. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\95598-repair-city-dispatch\references\data-quality.md` + - 定义状态分类、partial 规则、empty/failure 区分和下游副作用边界,证据等级:`contract-defined`。 +7. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\scenes\95598-repair-city-dispatch\scene.json` + - 声明场景分类、输入 `time`、依赖和动作类型,证据等级:`code-confirmed`。 +8. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\scenes\95598-repair-city-dispatch\scene.draft.json` + - 展示早期推断中对 `trigger-alert`、`configServices` 是否拆分的犹豫,属于候选整理结果,证据等级:`no direct evidence / candidate only`。 + +## 3. 实际入口与运行边界 + +实际入口在 `scene.json` 中已固定:场景页面入口为 `index.html`,技能工具名为 `95598-repair-city-dispatch.collect_repair_orders`,输出类型为 `monitor-snapshot`,输入为 `time`,这些都属于 `code-confirmed`。 + +其中 `assets/scene-snapshot/index.html` 只应被视为配置基础页(例如班组、联系人、范围维护),不应被当作规则 workflow 的主执行证据。 + +运行边界方面,需要做两个强制区分: + +- packaged JS runtime collector 的实际边界:它已经能基于输入 `repair_orders`、`monitor_logs`、`dispose_logs` 做状态分类、历史比较、`new_pending_ids` 推导与 `success/partial/empty/blocked` 判定,并返回标准 `monitor-snapshot`;但它仍是输入驱动归一化 collector,不直接发起浏览器请求,也不直接承载完整业务 workflow,证据等级:`code-confirmed`。 +- rule-asset 行为边界:业务检测规则和自动处理规则分别展示了浏览器请求、日志比较、提醒副作用与自动派单副作用,证据等级:`code-confirmed`。 + +也就是说,本场景不能被单句描述成“统一 packaged collector 已完整实现实时队列监测与自动派单”。更严谨的说法是:packaged collector 已实现可测试的输入驱动快照归一化 / 比较逻辑;而较强的实时监测与自动处理链路证据仍来自 desk 规则资产,证据等级:`code-confirmed`。 + +同时,`SKILL.md` 与 reference 明确要求把“快照采集成功”与“音频、短信、外呼、自动派单等下游效果”分开表达;这属于运行契约约束,证据等级:`contract-defined`。 + +## 4. 代码已证实的实际操作流程 + +### 4.1 packaged runtime-snapshot-collector 已证实流程 + +`collect_repair_orders.js` 中现在能严格确认: + +1. 调用 `collectRepairOrders(input)`,读取 `input.repair_orders`、`input.monitor_logs || input.monitor_log`、`input.dispose_logs || input.dispose_log`、`input.local_write_failures`、`input.blocked_reason` 等输入。 +2. 通过 `classifyRepairOrders(...)` 按 `STATUS_GROUPS.pending = ["00", "01"]`、`STATUS_GROUPS.audit = ["06"]`、`STATUS_GROUPS.processed = ["08"]` 对 repair orders 分桶,并记录未知状态。 +3. 从 pending orders 提取 `pending_ids`,再解析 monitor/dispose logs,识别 malformed payload,并据此推导 `new_pending_ids`。 +4. 按 `blocked > partial > empty > success` 的优先级计算 `status`,并把未知状态、日志缺失、日志解析失败、本地写失败等写入 `partial_reasons`。 +5. 返回 `type: "monitor-snapshot"`、`scene: "95598-repair-city-dispatch"`、`pending`、`audit`、`processed`、`pending_ids`、`new_pending_ids`、`status`、`partial_reasons`。 +6. 在返回对象中附带 `evidence.workflow_rule_sources`、`evidence.config_base_page`、`evidence.config_base_role`、`evidence.packaged_collector_role = "runtime-snapshot-collector"`,以及 `known_issues`。 +7. 模块额外导出 `STATUS_GROUPS`、`LOCAL_SERVICE_ENDPOINTS`、`WORKFLOW_RULE_SOURCES`、`CONFIG_BASE_PAGE`、`KNOWN_ISSUES`。 + +以上都属于 `code-confirmed`。 + +### 4.2 业务监测规则已证实流程 + +`95598抢修-市指_业务检测配置.txt` 中可直接确认: + +1. 通过 `BrowserAction("sgBrowerserJsAjax2", ...)` 请求 `repairOrder/list`,查询条件包含 `statusName=00,01,06,08` 与当天时间窗,证据等级:`code-confirmed`。 +2. 将返回列表按状态分到 `list`、`shlist`、`ycjList`,并构造 `pending/audit/processed` 与 `pendingList`,证据等级:`code-confirmed`。 +3. 读取 `getMonitorLog`,并基于待处理列表对比决定是否播报音频提醒,证据等级:`code-confirmed`。 +4. 将监测结果写入 `setMonitorData` 与 `setMonitorLog`,证据等级:`code-confirmed`。 +5. 音频提醒结果会写入 `setAudioPlayLog` 成功/失败/异常三类状态,证据等级:`code-confirmed`。 + +但这里同时存在一个直接可见的 bug:待处理判断写成了 `item.status == "00" && item.status == "01"`,这在单个状态值上不可能同时成立,因此规则中的 `pending` 列表构造逻辑不严谨,证据等级:`implementation intent exists but not rigorous / buggy`。 + +### 4.3 自动处理规则已证实流程 + +`95598抢修-市指_自动处理配置.txt` 中可直接确认: + +1. 先写一条“进入自动派单”的监测日志,再读取 `getDisposeLog` 做已派单去重,证据等级:`code-confirmed`。 +2. 对未派过单的待处理工单,读取 `getClassList`,按 `scope` 对故障地点 `gzdd` 做班组匹配,证据等级:`code-confirmed`。 +3. 匹配成功时,请求 `repairOrder/initProcess` 进行自动派单,证据等级:`code-confirmed`。 +4. 自动派单成功时,会触发成功音频播报、短信发送、外呼触发,并写 `setDisposeLog(state="成功")`,证据等级:`code-confirmed`。 +5. 自动派单失败时,会触发失败音频播报,并写 `setDisposeLog(state="失败")`,证据等级:`code-confirmed`。 +6. 自动派单异常时,会触发异常音频播报,并写 `setDisposeLog(state="异常")`,证据等级:`code-confirmed`。 +7. 未匹配到班组时,会触发未匹配音频播报,并写 `setDisposeLog(state="未匹配")`,证据等级:`code-confirmed`。 + +以上动作都只是“规则层实现分支存在”的直接证据,不代表运行时已经验证成功。 + +## 5. 标准化抽象流程 + +若为 command-center 做严格抽象,本场景更合理的标准化流程应写成: + +1. 接收监测任务输入 `time`。 +2. 使用规则资产定义的浏览器请求采集 95598 抢修队列。 +3. 将源数据分为 `pending`、`audit`、`processed`,并保留规则层可见的待处理列表语义。 +4. 用 monitor log / dispose log 做比较上下文,得出“新增待处理”或待自动处理集合。 +5. 若进入标准配置归一层,再把这些结果映射为 `pending_ids`、`new_pending_ids` 等 canonical 字段。 +6. 先返回或保留监测快照语义。 +7. 再执行音频提醒、短信、外呼、自动派单、日志写入等下游动作。 + +其中第 1 步可由 packaged collector 的显式输入 `time` 支撑,第 3、4、5、6 步可由 packaged collector 的输入驱动归一化 / 比较逻辑支撑,证据等级:`code-confirmed`;第 2、7 步主要由规则资产直接支撑,证据等级:`code-confirmed`;“快照应先于下游副作用表达”这一边界来自 `SKILL.md` / references,证据等级:`contract-defined`。 + +如果进一步把这个抽象流程说成“已由统一 packaged collector 严格承载实时浏览器采集与自动派单副作用”,那就不严谨了,因为这些更强 workflow 证据仍在 desk 规则资产而不是 packaged collector 中,证据等级只能降为 `implementation intent exists but not rigorous / buggy`。 + +## 6. 输入、上下文与依赖 + +### 输入 + +- `time` 是 scene 与 packaged script 共同声明的显式输入,证据等级:`code-confirmed`。 +- 当天时间窗拼接逻辑出现在业务监测规则中,即 `00:00:00` 到 `23:59:59`,证据等级:`code-confirmed`。 +- “当前队列窗口通常是当天”在 reference 中被明确说明,证据等级:`contract-defined`。 + +### 运行上下文 + +- 平台 session、org/user 上下文、浏览器可执行 `BrowserAction` 是规则资产和 reference 共同依赖的前提,证据等级分别为 `code-confirmed` 与 `contract-defined`。 +- 页面本身更偏配置页,而真正监测语义来自规则资产,这一点在 `collection-flow.md` 中被明确指出,证据等级:`contract-defined`。 + +### 依赖 + +- `scene.json` 中声明 `browser`、`local-service`、`repair-order-source`、`history-log`、`status-classification`,证据等级:`code-confirmed`。 +- 业务监测规则直接使用 `repairOrder/list`、`MonitorServices/getMonitorLog`、`setMonitorData`、`setMonitorLog`、`setAudioPlayLog`,证据等级:`code-confirmed`。 +- 自动处理规则直接使用 `getDisposeLog`、`getClassList`、`repairOrder/initProcess`、`setDisposeLog`、`setSendMessageLog` 与外呼触发 `mac.callOutLogin`,证据等级:`code-confirmed`。 +- `configServices` 是否需要单独提升为正式依赖,在 `scene.draft.json` 中仍是待确认项,证据等级:`no direct evidence / candidate only`。 + +## 7. 输出结构 + +当前输出结构需要分层描述。 + +### 7.1 packaged runtime collector 已直接定义的输出 + +`collect_repair_orders.js` 直接定义: + +- `type: "monitor-snapshot"` +- `scene: "95598-repair-city-dispatch"` +- `time` +- `pending` +- `audit` +- `processed` +- `pending_ids` +- `new_pending_ids` +- `status` +- `partial_reasons` +- `evidence.workflow_rule_sources` +- `evidence.config_base_page` +- `evidence.config_base_role` +- `evidence.packaged_collector_role` +- `known_issues` + +以上全部属于 `code-confirmed`。 + +### 7.2 规则资产已展示的实际快照字段语义 + +业务监测规则直接构造了: + +- `time` +- `type: "95598抢修-市指"` +- `pending` +- `pendingList` +- `audit` +- `processed` + +这说明规则层实际快照对象与 packaged stub 的字段命名并不完全一致,尤其是 `pendingList` vs `pending_ids`、`type` vs `scene`,证据等级:`code-confirmed`。 + +### 7.3 `new_pending_ids` 的证据强度 + +`SKILL.md`、reference 和 `data-quality.md` 都把 `new_pending_ids` 当作期望输出的一部分,证据等级:`contract-defined`。但在已读规则资产里,能直接看到的是“对 monitor log / dispose log 做比较并决定是否提醒或进入自动派单”,而没有看到显式字段 `new_pending_ids` 被直接写出,因此“存在历史比较意图”是 `code-confirmed`,“`new_pending_ids` 已被当前实现严谨产出”只能标为 `implementation intent exists but not rigorous / buggy`。 + +## 8. 下游动作证据表 + +| 下游动作 | 当前证据 | 证据等级 | 严谨结论 | +| --- | --- | --- | --- | +| 返回 `monitor-snapshot` runtime collector 输出 | `collect_repair_orders.js` 直接返回对象 | `code-confirmed` | packaged JS 直接证明标准 snapshot 字段、状态判定与 collector metadata 已存在。 | +| 队列采集请求 | 业务监测规则调用 `repairOrder/list` | `code-confirmed` | 队列采集逻辑直接存在于规则资产中。 | +| 音频提醒调用 | 业务监测规则和自动处理规则都调用 `mac.audioPlay(...)` | `code-confirmed` | 只能确认规则层存在音频提醒调用,不代表运行时已验证成功。 | +| 短信发送调用 | 自动处理规则调用 `mac.sendMessages(request)` | `code-confirmed` | 只能确认规则层存在短信发送调用。 | +| 电话 / 外呼触发 | 自动处理规则调用 `mac.callOutLogin(params)` | `code-confirmed` | 只能确认规则层存在外呼触发分支。 | +| 自动派单请求调用 | 自动处理规则请求 `repairOrder/initProcess` | `code-confirmed` | 自动派单请求分支可直接定位。 | +| `setDisposeLog` 成功写入 | 自动处理规则成功分支写 `state="成功"` | `code-confirmed` | 成功路径处置日志写入定义明确存在。 | +| `setDisposeLog` 失败写入 | 自动处理规则失败分支写 `state="失败"` | `code-confirmed` | 失败路径处置日志写入定义明确存在。 | +| `setDisposeLog` 异常写入 | 自动处理规则异常分支写 `state="异常"` | `code-confirmed` | 异常路径处置日志写入定义明确存在。 | +| `setDisposeLog` 未匹配写入 | 自动处理规则未匹配分支写 `state="未匹配"` | `code-confirmed` | 未匹配路径处置日志写入定义明确存在。 | +| `new_pending_ids` 严格产出 | 只在 skill/reference/data-quality 中被要求 | `implementation intent exists but not rigorous / buggy` | 有明确目标语义,但当前读到的规则资产未直接产出同名字段。 | +| 把下游动作结果等同于采集成功 | skill/reference 明确禁止 | `contract-defined` | 契约要求把快照成功与副作用成功分离。 | + +## 9. 当前代码疑点 / 不严谨点 + +1. 最明显的已知 bug 是业务监测规则中的待处理分类条件写成 `item.status == "00" && item.status == "01"`。这会导致 `pending` 分桶逻辑不可能按作者意图工作,证据等级:`implementation intent exists but not rigorous / buggy`。 +2. packaged collector 与规则资产的输出命名仍不一致:collector 使用 `scene`、`pending_ids`、`new_pending_ids`,规则对象使用 `type`、`pendingList`,证据等级:`code-confirmed`。 +3. `SKILL.md` 把 `new_pending_ids` 作为输出重点,但当前直接证据更强的是“做日志比较并决定提醒/自动派单”,而不是“显式产出同名字段”,证据等级:`implementation intent exists but not rigorous / buggy`。 +4. `scene.draft.json` 仍在犹豫 `trigger-alert` 是否拆成 audio-alert、message-alert、callout 三类动作,说明标准动作建模尚未完全收敛,证据等级:`no direct evidence / candidate only`。 +5. 虽然规则层存在音频、短信、外呼、自动派单与日志写入定义,但本文不能据此声称这些动作已完成运行时验证,任何这种拔高都不严谨。 + +## 10. 对 command-center 标准配置的修订建议 + +1. 对本场景应显式拆分两层实现证据: + - `packaged_collector`: `collect_repair_orders.js` 的 runtime snapshot collector、状态判定、历史比较与 metadata(规则来源、配置基础页角色、已知问题),证据等级:`code-confirmed`; + - `rule_asset_workflow`: 业务监测与自动处理规则资产中的真实流程分支,证据等级:`code-confirmed`。 +2. 在标准配置中把业务监测与自动处理拆成两个子流程: + - `monitoring_flow` 对应 `95598抢修-市指_业务检测配置.txt`; + - `auto_processing_flow` 对应 `95598抢修-市指_自动处理配置.txt`。 + 这样可以避免把两份规则混成单一 collector。 +3. 输出 schema 建议区分: + - `canonical_snapshot_fields`: `pending_ids` / `new_pending_ids` 等标准字段; + - `observed_rule_fields`: `pendingList` / `type` 等规则层字段。 + 当前两套命名并存,证据等级:`code-confirmed`。 +4. 对状态分类增加 `known_bug_note`,明确记录 `status == "00" && status == "01"` 的待处理分类 bug,防止后续文档误把 pending 计数写成稳定事实,证据等级:`implementation intent exists but not rigorous / buggy`。 +5. 对下游动作增加 `effect_channels` 明细,至少拆出 `audio-reminder`、`sms-send`、`callout-trigger`、`auto-dispatch-request`、`dispose-log-write`,因为这些都已在规则资产中直接出现,证据等级:`code-confirmed`。 + +## 11. 最终严谨结论 + +关于 `95598-repair-city-dispatch`,当前最可靠的结论是:仓库已经同时存在一个可测试的 packaged JS runtime collector,以及两份更强的 desk 规则脚本实现(`D:\desk\智能体资料\大四区报告监测项\95598抢修-市指_业务检测配置.txt`、`D:\desk\智能体资料\大四区报告监测项\95598抢修-市指_自动处理配置.txt`),其中 packaged collector 已直接实现 repair-order 分类、monitor/dispose log 比较、`new_pending_ids` 推导与 `success/partial/empty/blocked` 状态判定;业务监测规则直接证实了队列采集、日志比较、音频提醒与监测日志写入,自动处理规则直接证实了去重、班组匹配、自动派单请求、短信发送、外呼触发以及 `setDisposeLog` 在成功 / 失败 / 异常 / 未匹配路径上的写入定义,证据等级:`code-confirmed`。 + +但同样必须严格说明:这些 `code-confirmed` 只证明“代码或规则层存在这些实现分支”,不证明运行时已验证成功。此外,desk 业务监测规则里还存在 `status == "00" && status == "01"` 的待处理分类 bug,因此 rule workflow 本身也不能被描述为严谨无误。对 command-center 而言,本场景最应该被建模为“packaged collector 已具备输入驱动快照归一化能力、desk rule-asset workflow 证据更强、且监测流与自动处理流必须分开表达”的 monitor scene。 \ No newline at end of file diff --git a/docs/superpowers/specs/2026-04-08-95598-weekly-monitor-report-operation-analysis.md b/docs/superpowers/specs/2026-04-08-95598-weekly-monitor-report-operation-analysis.md new file mode 100644 index 0000000..1fb5d8f --- /dev/null +++ b/docs/superpowers/specs/2026-04-08-95598-weekly-monitor-report-operation-analysis.md @@ -0,0 +1,155 @@ +# 95598-weekly-monitor-report 操作分析 + +## 1. 场景概述 + +`95598-weekly-monitor-report` 对应“95598、12398及配网设备监控情况周统计”场景,目标是汇总 95598、12398 与配网设备多来源周统计并生成统一周报。根据 `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\scenes\95598-weekly-monitor-report\scene.json`、`D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\95598-weekly-monitor-report\SKILL.md` 与 `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\95598-weekly-monitor-report\scripts\collect_weekly_metrics.js`,当前最硬直接证据是:脚本定义了六个 section template、空 artifact、`period`、`status: "ok"` 与 `partial_reasons: []`,证据等级:`code-confirmed`。 + +同时必须明确:当前 packaged script 对 artifact schema / section template 的定义,远强于对实时浏览器采集、多源周统计归并、双周期对齐或导出行为的证明。也就是说,本场景现在更接近“周报结构模板脚本”,而非“已被代码严格证明可跑通的 live browser collector”,证据等级:`code-confirmed`。 + +## 2. 证据来源 + +本分析统一只使用四个证据等级标签:`code-confirmed`、`contract-defined`、`implementation intent exists but not rigorous / buggy`、`no direct evidence / candidate only`。其中,脚本直接定义的 artifact schema / section template 归入 `code-confirmed`;未见脚本直接实现的双周期语义、采集逻辑与下游动作,不拔高于其对应较弱标签。 + +1. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\95598-weekly-monitor-report\scripts\collect_weekly_metrics.js` + - 直接定义六个 section template,并返回空 artifact,证据等级:`code-confirmed`。 +2. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\95598-weekly-monitor-report\SKILL.md` + - 描述应读取 current-period 与 cumulative-period、校验会话、收集多来源 source groups、归一 section 数据,并在输出中返回两个周期、included source groups、period alignment issues 等;这更像运行契约与实现方向,证据等级以 `contract-defined` 与 `implementation intent exists but not rigorous / buggy` 为主。 +3. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\scenes\95598-weekly-monitor-report\scene.json` + - 定义场景输入 `period`、依赖 `browser` / `multi-source` / `period-alignment` / `local-report-service`,动作包括 `query` / `collect-report` / `aggregate-sections` / `align-periods`,证据等级:`code-confirmed`。 +4. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\95598-weekly-monitor-report\references\collection-flow.md` + - 明确入口页面提供两个日期范围:current-period 与 cumulative-period,并说明要先读两个范围,再收集 source groups、再按 section 归一,证据等级:`contract-defined`。 +5. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\95598-weekly-monitor-report\references\data-quality.md` + - 规定完整结果、partial 规则、常见弱点和 empty/failure 区分,证据等级:`contract-defined`。 +6. `D:\data\ideaSpace\rust\sgClaw\claw-new\docs\superpowers\specs\2026-04-08-command-center-virtual-employee-inventory.json` + - 已将该场景整理为 `workflow`、`status_model`、`hidden_dependencies`、`open_questions` 等 command-center 视图;但其中部分是再抽象结果,不应反向拔高为实现证据,证据等级:`no direct evidence / candidate only`(仅限 inventory 不能单独证明 packaged script 已实现的部分)。 + +## 3. 实际入口与运行边界 + +实际入口已在 `scene.json` 固定:浏览器场景 `index.html`,技能工具名为 `95598-weekly-monitor-report.collect_weekly_metrics`,输出 artifact 为 `report-artifact`,这些都是 `code-confirmed`。 + +运行边界方面出现了本场景最明显的不严谨点: + +- scene 与脚本都只保留一个 `period` 字段,证据等级:`code-confirmed`。 +- `SKILL.md`、`collection-flow.md` 与 inventory 整理结果都明确说明页面实际有 `current-period` 与 `cumulative-period` 两套输入,证据等级:`contract-defined`。 +- scene 还把 `period-alignment` 声明为依赖,并把 `align-periods` 声明为动作,但脚本没有任何相应执行逻辑,证据等级:`code-confirmed` 对元数据存在成立,而“已实现 period alignment”只能标为 `implementation intent exists but not rigorous / buggy`。 + +因此,当前最严谨的边界判断是:上层元数据与参考文档都把本场景描述成“双周期、多来源、需周期对齐的 section 周报”,但 packaged script 实际只提供了一个空 artifact 模板壳,尚未证明 live collection 行为。 + +## 4. 代码已证实的实际操作流程 + +当前脚本中可直接证实的流程只有: + +1. 调用 `collectWeeklyMetrics(input)`。 +2. 读取 `input.period || ""` 写入返回对象的 `period`。 +3. 构造空主表:`columns: []`、`rows: []`。 +4. 基于 `SECTION_TEMPLATES` 复制出 6 个 section,且每个 section 初始 `rows: []`。 +5. 返回 `type: "report-artifact"`、`report_name`、`status: "ok"` 与 `partial_reasons: []`。 + +这些都属于 `code-confirmed`。 + +至于“读取 current-period / cumulative-period 两个日期范围”“验证多系统会话”“按 source group 采集 95598 / 12398 / 配网设备指标”“执行 period alignment”“导出周报或写报告日志”等行为,只在 `SKILL.md` 与 reference 中被描述,没有在 packaged script 中以可执行逻辑出现,因此不能算“代码已证实的实际操作流程”。 + +## 5. 标准化抽象流程 + +若做 command-center 的标准化抽象,可将本场景整理为: + +1. 接收周报任务请求。 +2. 解析 current-period 与 cumulative-period。 +3. 验证多系统访问与会话上下文。 +4. 按 source groups 收集周统计数据。 +5. 将结果归并到六个 section。 +6. 对 current-period 与 cumulative-period 做一致性校验或对齐。 +7. 生成 `report-artifact`。 +8. 视情况执行导出/日志等下游动作。 + +其中第 5 步“六个 section schema 已存在”以及第 7 步“返回 artifact 壳”是 `code-confirmed`。第 2、3、4、6、8 步主要来自 skill/reference/scene 的目标流程描述,证据等级为 `contract-defined`;若要说这些步骤已被 packaged script 落地,则只能降为 `implementation intent exists but not rigorous / buggy`。 + +## 6. 输入、上下文与依赖 + +### 输入 + +- `period` 是 scene 与脚本共享的显式输入,证据等级:`code-confirmed`。 +- `currentPeriod` / `cumulativePeriod`(或 current-period / cumulative-period)是 `SKILL.md`、reference 与 inventory 隐含/显式要求的真实业务输入,证据等级:`contract-defined`。 +- 这意味着当前输入建模存在明显冲突:统一配置只暴露 `period`,但场景语义其实依赖双周期,证据等级:`implementation intent exists but not rigorous / buggy`。 + +### 运行上下文 + +- `session`、多源系统账号/缓存 token、浏览器可见页面、周期对齐上下文等在 scene/reference 中被描述,scene 元数据层面的声明是 `code-confirmed`,具体业务语义是 `contract-defined`。 +- “period-alignment-context” 被 inventory 当作 runtime_context 整理出来,可视为对 scene/reference 的再抽象;作为建议结构可以保留,但不宜拔高成脚本已实现能力。 + +### 依赖 + +- `browser`、`multi-source`、`period-alignment`、`local-report-service` 在 `scene.json` 中可直接定位,证据等级:`code-confirmed`。 +- `/a_js/YPTAPI.js`、`http://localhost:13313/ReportServices/*` 等具体依赖来自 reference,证据等级:`contract-defined`。 + +## 7. 输出结构 + +当前脚本直接证实的输出结构包括: + +- `type: "report-artifact"` +- `report_name: "95598-weekly-monitor-report"` +- `period` +- `columns: []` +- `rows: []` +- 6 个固定 section template +- `status: "ok"` +- `partial_reasons: []` + +以上全部属于 `code-confirmed`。 + +六个已被脚本直接定义的 section 分别为: + +1. `fault-repair` +2. `frequent-outage` +3. `full-aperture-work-orders` +4. `key-opinion-control` +5. `device-monitoring` +6. `proactive-dispatch` + +这些 section 中,前三个使用 `current_period`、`cumulative`、`year_over_year` 三类值列,后三个只使用 `value`,证据等级:`code-confirmed`。但这里也出现了建模歧义: + +- 输出 artifact 顶层只保留一个 `period`。 +- section 内部却已经暗示了 `current_period` 与 `cumulative` 的双周期视角。 +- skill/reference 又在文字上强调 current-period 与 cumulative-period 两个输入。 + +因此,“双周期输入如何映射到 artifact 顶层 period 与 section 列结构”当前并不严谨,证据等级:`implementation intent exists but not rigorous / buggy`。 + +## 8. 下游动作证据表 + +| 下游动作 | 当前证据 | 证据等级 | 严谨结论 | +| --- | --- | --- | --- | +| 返回 section 化 `report-artifact` | `collect_weekly_metrics.js` 直接返回对象 | `code-confirmed` | 已有周报 artifact 模板壳,但仍为空数据。 | +| 六类 section 模板存在 | 脚本直接定义 `SECTION_TEMPLATES` | `code-confirmed` | 只能确认输出分区 schema 存在,不能确认真实数据采集。 | +| 双周期读取 | 只在 `SKILL.md` / `collection-flow.md` 中描述 | `contract-defined` | 契约明确需要 current-period 与 cumulative-period,但脚本未实现。 | +| 多来源周统计采集 | 只在 skill/reference 中描述 | `contract-defined` | 有清晰目标流程,当前 packaged script 未直接证明。 | +| period alignment | scene 动作/依赖 + skill/reference 说明 | `implementation intent exists but not rigorous / buggy` | 元数据和文档都表达了需要对齐,但脚本没有对齐逻辑,建模仍含糊。 | +| 导出周报 | reference 提及 localhost report services | `contract-defined` | 只能确认存在下游服务约束,不能确认当前 skill 已执行导出。 | +| 报告日志写入 | skill/reference 提及 report-log | `contract-defined` | 只有体系级概念证据,当前脚本无直接调用。 | +| partial / blocked / empty 状态细分 | reference 有定义,脚本固定 `status: "ok"` | `implementation intent exists but not rigorous / buggy` | 状态模型意图明确,但 packaged script 尚未承载。 | + +## 9. 当前代码疑点 / 不严谨点 + +1. `period` 与 `currentPeriod/cumulativePeriod` 的建模冲突最突出。scene 与 script 顶层只保留 `period`,但 skill/reference 明确要求双周期输入,前三个 section 的列结构也隐含双周期,这说明现有标准输入设计不严谨,证据等级:`implementation intent exists but not rigorous / buggy`。 +2. `period-alignment` 既被声明为依赖,也被列为动作 `align-periods`,但脚本没有任何对齐实现;因此“周期对齐能力已实现”不能成立,证据等级:`implementation intent exists but not rigorous / buggy`。 +3. 前三个 section 使用 `cumulative` 列名,而 skill/output 描述用的是 `cumulative period`;列名、输入名、顶层字段名之间没有形成统一建模,证据等级:`implementation intent exists but not rigorous / buggy`。 +4. `status` 固定为 `"ok"`,与 reference 对 partial / empty / blocked 的细分要求不一致,证据等级:`code-confirmed` 对现状成立。 +5. 尽管 scene/skill 明确是多来源周统计,但脚本完全没有 source group 采集或映射逻辑,因此“周统计 collector 已落地”不能提升为当前代码事实,证据等级:`no direct evidence / candidate only`(对 live collection 执行层而言)。 + +## 10. 对 command-center 标准配置的修订建议 + +1. 本场景应把标准输入从单一 `period` 修订为显式双周期结构,例如 `currentPeriod` 与 `cumulativePeriod`。若仍需要统一路由入口,可额外保留上层 `period` 摘要,但不能替代执行层双周期字段,证据等级:`implementation intent exists but not rigorous / buggy`。 +2. 对 `period-alignment` 建议在标准配置中拆成两部分: + - `period_model`: 双周期输入结构; + - `alignment_rule`: 这两组周期如何校验一致性。 + 当前 scene 只表达了需要对齐,但未给出严格模型,因此这是必要修订。 +3. 在 artifact 配置中区分: + - `implemented_section_templates`: 当前六个 section 已被脚本直接实现,证据等级:`code-confirmed`; + - `implemented_collection_logic`: 当前未被 packaged script 直接证明,需显式标低。 +4. 对前三个 section 的列名建议统一成更一致的配置命名,如 `current_period` / `cumulative_period` / `year_over_year`,避免脚本列名、skill 文本、标准配置三套口径混用。 +5. 状态模型建议拆成“契约层”和“实现层”,防止 command-center 把 `partial` / `blocked` 误当成当前 collector 已具备的稳定判定能力。 + +## 11. 最终严谨结论 + +关于 `95598-weekly-monitor-report`,当前最可靠的结论是:仓库已经存在一个六分区周报 artifact 模板实现,明确给出了 section 名称、列 schema、顶层 `period` 字段以及基础状态字段,证据等级:`code-confirmed`。 + +但当前证据并不足以把它描述成“已严格实现双周期、多来源、含 period alignment 的真实浏览器周统计 collector”。相关双周期读取、source group 采集、period alignment、导出与日志行为,主要存在于 `SKILL.md`、`collection-flow.md`、`data-quality.md` 与 scene 元数据的目标描述中。尤其是 `period` vs `currentPeriod/cumulativePeriod` 以及 `period-alignment` 的建模仍明显含糊,说明本场景现在最适合被归类为“section schema 已定义,但 live browser collection 行为尚未被脚本严格证实”的 staged report scene。 \ No newline at end of file diff --git a/docs/superpowers/specs/2026-04-08-command-center-evidence-grading.md b/docs/superpowers/specs/2026-04-08-command-center-evidence-grading.md new file mode 100644 index 0000000..1f7db2b --- /dev/null +++ b/docs/superpowers/specs/2026-04-08-command-center-evidence-grading.md @@ -0,0 +1,203 @@ +# 指挥中心规格文档证据分级规则 + +## 目的 + +这份文档用于统一指挥中心相关规格文档中的证据表达方式,明确区分: + +- 已被代码或规则资产直接证实的事实 +- 已被外部接口或文档契约明确约束的事实 +- 代码中表达了实现方向,但实现质量、完整性或正确性仍不充分的内容 +- 当前没有直接证据、只能作为候选判断的内容 + +目标不是让规格文档写得更保守,而是让“观察到的事实”“归纳后的结构”“目标态设计”之间的边界始终可追溯、可复核、可讨论。 + +## 为什么必须分级 + +如果不做证据分级,指挥中心文档很容易把三类内容混写在一起: + +1. 代码里已经存在并可直接定位的行为 +2. 为了便于抽象而做出的归一化整理 +3. 未来希望达成、但当前未被运行时或资产严格证明的目标结构 + +混写的直接问题是: + +- 读者会把“推断出的整理结果”误认为“当前已实现事实” +- 后续实现或重构时,无法判断某一条到底是在复述现状,还是在提出目标 +- 多份规格文档之间会出现证据强弱不一致、措辞口径不一致的问题 + +因此,所有指挥中心规格文档都必须对关键判断显式标注证据等级。 + +## 证据标签 + +以下 4 个标签为唯一允许使用的标准标签,必须按原文书写,不得改写,不得替换为同义词。 + +### 1. `code-confirmed` + +定义:该结论可由当前仓库中的代码、规则资产、静态配置或可直接定位的实现内容直接支持。 + +适用场景: + +- 某个字段、流程步骤、状态分类、规则动作在代码或规则资产中可直接定位 +- 某个输出结构、配置项、动作通道已被实现内容明确写出 +- 某条成功路径虽然未证明线上真实跑通,但“存在该逻辑分支”这一事实已被代码直接证实 + +使用边界: + +- `code-confirmed` 只证明“代码/资产中存在该实现或定义” +- 不自动等于“生产可用”“运行时已验证成功”“端到端已闭环” + +### 2. `contract-defined` + +定义:该结论不是直接来自仓库实现,而是由当前被认可的接口契约、协议文档、外部约束文档明确规定。 + +适用场景: + +- 浏览器侧/服务侧接口字段、消息格式、状态码语义由契约文档定义 +- 某一能力边界来自明确的外部 API 文档或经项目认可的集成约束 + +使用边界: + +- `contract-defined` 证明“契约如此定义” +- 不自动等于“本仓库已实现” +- 如果代码实现与契约不一致,应分别描述,不得互相覆盖 + +### 3. `implementation intent exists but not rigorous / buggy` + +定义:代码中已经出现实现意图、雏形或局部链路,但当前证据不足以把它写成稳定事实;或者已知实现不严谨、存在缺口、疑似有 bug、成功语义未被严格证明。 + +适用场景: + +- 能看到相关函数、分支、调用点、配置项或动作名,但缺少足够证据证明其稳定成立 +- 逻辑存在,但状态语义混乱、异常处理不足、前后约束不完整 +- 只能证明“作者想做这件事”,不能证明“这件事已经被可靠实现” + +使用边界: + +- 该标签用于承认“实现方向存在” +- 同时明确指出“不能把它提升为已确认事实” +- 这是指挥中心文档中承接“代码里有影子,但证据不够硬”的唯一合法标签 + +### 4. `no direct evidence / candidate only` + +定义:当前没有找到代码、规则资产、契约文档或其他直接证据;该内容只能作为候选结构、候选能力、候选拆分或待确认项。 + +适用场景: + +- 为了统一配置结构而提出的候选字段 +- 为了后续架构演进而提出的候选能力名称 +- 仅由推测、命名习惯、经验归纳得到的判断 + +使用边界: + +- 该标签明确表示“目前只是候选,不是事实” +- 不能把它写成“已有但待接入”“已支持但未启用”之类更强说法,除非另有直接证据 + +## 推荐表述模板 + +### `code-confirmed` + +可用表述: + +- “根据当前代码/规则资产,可直接确认……,证据等级:`code-confirmed`。” +- “文档中的……来自现有实现直接证据,证据等级:`code-confirmed`。” +- “这里只能确认代码层存在该成功路径/动作定义,证据等级:`code-confirmed`;不代表运行时已验证。” + +### `contract-defined` + +可用表述: + +- “根据当前接口契约,……被定义为……,证据等级:`contract-defined`。” +- “该字段/消息结构来自认可的集成契约,证据等级:`contract-defined`。” +- “这里描述的是契约约束,不等于仓库内实现已完成,证据等级:`contract-defined`。” + +### `implementation intent exists but not rigorous / buggy` + +可用表述: + +- “当前实现中可以看到……的意图,但证据尚不足以将其写成稳定事实,证据等级:`implementation intent exists but not rigorous / buggy`。” +- “代码存在相关链路,但实现不够严谨/疑似有缺口,因此仅标为 `implementation intent exists but not rigorous / buggy`。” +- “目前最多只能确认作者试图支持……,不能确认其已被可靠实现,证据等级:`implementation intent exists but not rigorous / buggy`。” + +### `no direct evidence / candidate only` + +可用表述: + +- “……目前没有直接证据,只能作为候选项,证据等级:`no direct evidence / candidate only`。” +- “该拆分/命名属于归一化建议,不代表现状事实,证据等级:`no direct evidence / candidate only`。” +- “除非后续补到代码或契约证据,否则这里只能保持为 `no direct evidence / candidate only`。” + +## 禁止表述模式 + +以下表述在指挥中心规格文档中禁止使用,除非同时给出更低证据等级并明确限定范围。 + +### 1. 禁止把代码存在误写为运行时已验证 + +禁止示例: + +- “系统已经稳定支持……” +- “该链路已完成闭环……” +- “运行时已证明可以成功……” + +问题:这些表述把“代码里有逻辑”错误提升成“真实运行已被验证”。 + +### 2. 禁止把推断结构误写为既有事实 + +禁止示例: + +- “当前配置结构就是……” +- “系统已有统一能力模型……” +- “所有任务已经按该 schema 实现……” + +问题:如果只是为了整理而归纳出的标准结构,应标为候选或目标态,不能写成现状。 + +### 3. 禁止使用模糊强化词替代证据标签 + +禁止示例: + +- “基本可以认为……” +- “大概率就是……” +- “看起来已经支持……” +- “应该算是实现了……” + +问题:模糊判断会绕开证据分级,导致读者无法判断结论强度。 + +### 4. 禁止自造同义标签或混用近义词 + +禁止示例: + +- “代码已确认” +- “契约已定义” +- “半实现” +- “待验证” +- “候选” + +问题:这些中文近义词会破坏跨文档一致性。必须使用本文规定的 4 个精确标签原文。 + +## 示例:`95598-repair-city-dispatch` + +示例结论: + +- 对 `95598-repair-city-dispatch` 而言,音频提醒、短信/消息提醒、外呼、处置日志等成功路径行为,如果能够在规则资产或实现内容中直接定位,应写为 `code-confirmed`。 +- 但这只能说明“代码或规则里存在这些成功路径定义”。 +- 不能据此直接写成“运行时已经稳定成功触发音频/短信/外呼/处置日志”。 +- 如果当前没有端到端运行验证证据,那么“运行时成功”只能写为 `implementation intent exists but not rigorous / buggy`,或者在证据更弱时写为 `no direct evidence / candidate only`;不能提升为 `code-confirmed`。 + +推荐写法: + +“在 `95598-repair-city-dispatch` 中,音频提醒、短信/消息提醒、外呼、处置日志相关成功路径可在规则资产中直接定位,因此这些‘规则层已定义的成功路径行为’可标注为 `code-confirmed`。但目前没有同等强度证据证明这些动作在真实运行时已稳定成功,因此‘运行时成功已验证’这一结论不能标为 `code-confirmed`;在缺少严格运行证据时,应标为 `implementation intent exists but not rigorous / buggy`。” + +## 执行规则 + +- 所有指挥中心相关规格文档,必须使用本文定义的 4 个精确标签。 +- 不允许使用任何同义词、中文替代词、缩写或自定义等级名。 +- 一条关键结论如果没有证据等级,就视为表达不合格。 +- 当同一主题同时涉及“代码事实”和“目标结构”时,必须拆句分别标注,不能合并成一个模糊结论。 + +## 最短落地准则 + +写每一条关键判断前,先问两个问题: + +1. 我是在复述当前已被直接证据支持的事实,还是在做归一化整理/目标设计? +2. 我手上的证据,到底支撑的是代码存在、契约约束、实现意图,还是根本没有直接证据? + +只有先回答这两个问题,指挥中心规格文档才能保持严格、可复核和可持续重写。 \ No newline at end of file diff --git a/docs/superpowers/specs/2026-04-08-command-center-standard-config-structure.md b/docs/superpowers/specs/2026-04-08-command-center-standard-config-structure.md new file mode 100644 index 0000000..b00846e --- /dev/null +++ b/docs/superpowers/specs/2026-04-08-command-center-standard-config-structure.md @@ -0,0 +1,639 @@ +# 指挥中心虚拟员工标准配置清单建议结构 + +> 免责声明:本文件描述的是“未来可采用的规范化目标配置结构”,不是当前 staged runtime 已稳定实现的结构,也不是对现状的直接复述。文中所有“目标 schema 字段”都必须与当前证据分级文档一起阅读;凡缺乏静态资产直接支撑的字段,只能视为 normalization choice 或 open / candidate 字段,不能表述为当前已稳定存在。 + +## 目标 + +这份结构文档的用途,是把当前 evidence-graded 现状文档中的信息,逐步映射为后续可维护、可扩展、可复用的目标配置清单。 + +因此必须同时保持两条边界: + +1. 当前已观察到的事实,来自 evidence-graded current-state docs。 +2. 这里提出的统一 schema,则是为后续 command-center 配置治理而做的 normalization proposal。 + +它们不能混写,更不能把 normalization proposal 误写成当前实现事实。 + +--- + +## 一、当前证据文档与目标配置的关系 + +当前已经存在三类文档角色: + +1. `2026-04-08-command-center-virtual-employee-inventory-table.md` + - 作用:给人读的 current-state 总览 + - 性质:当前观察结果,不是配置 schema +2. `2026-04-08-command-center-virtual-employee-inventory.json` + - 作用:给机器读的 current-state inventory + - 性质:机器可消费的盘点结果,不是目标配置 +3. 各 scene 的 `*-operation-analysis.md` + - 作用:记录每个场景的证据来源、强弱、已知问题和边界 + - 性质:最关键的证据支撑层 + +本文件提出的目标配置结构,是在这些 current-state 文档之上的“规范化目标层”。 + +### 映射原则 + +- operation-analysis 文档中的 `code-confirmed` 结论,可优先映射为目标 schema 中的“evidence-derived fields”。 +- `contract-defined` 结论,可映射为“declared / contract-backed fields”,但不能默认等于当前 runtime 已实现。 +- `implementation intent exists but not rigorous / buggy` 的内容,应进入目标 schema 的 `known_issues`、`implementation_gap`、`notes` 或 `open_questions`,而不是被包装成稳定主字段。 +- `no direct evidence / candidate only` 的内容,只能作为 normalization choice、candidate field 或未来扩展项保留。 + +简言之:evidence-graded current-state docs 告诉我们“现在能严谨说什么”,本文件只负责说明“未来若要统一配置,可怎样承接这些信息”。 + +--- + +## 二、推荐文件组织 + +```text +command-center/ + employee.json + capabilities.json + tasks/ + fault-details-report.json + jinchang-business-environment-weekly-report.json + 95598-weekly-monitor-report.json + 95598-repair-city-dispatch.json + jiayuguan-meter-outage.json +``` + +### 文件职责 + +- `employee.json` + - 描述这个虚拟员工是谁、职责范围是什么、默认采用什么证据口径 +- `capabilities.json` + - 维护归一化能力词表 + - 明确哪些能力来自现有证据,哪些只是规范化命名 +- `tasks/*.json` + - 每个场景一份目标配置 + - 承接当前证据与未来标准字段的映射关系 + +### 为什么仍然推荐三层拆分 + +这类拆分仍然成立,但要加一条限定: + +- 这是一种 target architecture proposal +- 不是当前仓库已存在的稳定目录结构 +- 尤其 `capabilities.json` 代表“统一能力词表”的目标态,而不是当前 staged assets 已实现的统一能力注册表 + +因此,三层拆分本身属于 normalization choice,证据等级不应高于 `no direct evidence / candidate only`,除非未来真的落地成文件结构。 + +--- + +## 三、`employee.json` 目标结构 + +### 3.1 推荐示例 + +```json +{ + "id": "command-center-virtual-employee", + "name": "指挥中心虚拟员工", + "domain": "电力业务指挥中心", + "positioning": "负责业务监测、统计报表、异常识别与后续提醒/处置支撑的虚拟运营员工", + "mission": [ + "采集业务数据并生成结构化报表", + "监测工单/事件并识别待处理对象", + "比较历史记录识别新增待办", + "为提醒、外呼、自动派单、自动处理等下游动作提供输入" + ], + "task_ids": [ + "fault-details-report", + "jinchang-business-environment-weekly-report", + "95598-weekly-monitor-report", + "95598-repair-city-dispatch", + "jiayuguan-meter-outage" + ], + "default_evidence_model": [ + "code-confirmed", + "contract-defined", + "implementation intent exists but not rigorous / buggy", + "no direct evidence / candidate only" + ], + "default_status_model": [ + "success", + "partial", + "empty", + "blocked" + ] +} +``` + +### 3.2 字段分层说明 + +#### A. 可直接由当前证据承接的字段 + +- `name` +- `domain` +- `task_ids`(前提是仅映射当前已盘点的 5 个 scene) +- `default_evidence_model` + +这些字段之所以较容易承接,是因为 current-state inventory 已经稳定整理出对应对象和场景清单。 + +但仍要注意:这只是“可从当前文档整理得到”,不是说仓库里已经存在一个运行中的 `employee.json`。 + +#### B. normalization choices + +- `id` +- `positioning` +- `mission` +- `default_status_model` + +这些字段主要是为了让目标配置更易治理、更可复用,属于规范化整理,不应表述为 staged runtime 现状。 + +#### C. open / candidate 字段 + +建议预留但暂不稳定化: + +- `default_runtime_requirements` +- `default_result_types` +- `default_downstream_policy` +- `org_scope` +- `region_scope` + +原因是:当前不同 scene 在“上下文依赖、输出类型、地区语义、下游策略”上并不一致,过早把这些做成员工级稳定字段会拔高现状。 + +--- + +## 四、`capabilities.json` 目标结构 + +### 4.1 推荐示例 + +```json +{ + "catalog_version": 1, + "evidence_method": "evidence-graded", + "core": [ + { + "id": "browser-collection", + "name": "浏览器采集", + "kind": "normalized-capability", + "evidence_basis": "derived-from-multiple-scenes" + }, + { + "id": "report-generation", + "name": "报表生成", + "kind": "normalized-capability", + "evidence_basis": "derived-from-report-scenes" + }, + { + "id": "monitor-snapshot", + "name": "监测快照", + "kind": "normalized-capability", + "evidence_basis": "derived-from-monitor-scenes" + } + ], + "channels": [ + { + "id": "audio-remind", + "name": "音频提醒", + "kind": "normalized-channel", + "observed_in": [ + "95598-repair-city-dispatch", + "jiayuguan-meter-outage" + ] + }, + { + "id": "message-remind", + "name": "消息提醒", + "kind": "normalized-channel", + "observed_in": [ + "95598-repair-city-dispatch" + ], + "notes": "在 jiayuguan-meter-outage 中只看到保留意图,不应等同视为稳定现状。" + } + ], + "actions": [ + { + "id": "auto-dispatch", + "name": "自动派单", + "kind": "normalized-action" + } + ] +} +``` + +### 4.2 字段分层说明 + +#### A. 可由当前证据承接的字段 + +- `observed_in` +- `notes` +- `evidence_basis` + +如果后续真的落地 `capabilities.json`,最应该优先保留的不是“能力名本身”,而是能力和 scene 之间的 evidence mapping。因为当前场景的能力证据强弱明显不同: + +- 3 个报表 scene 多为 schema/template stub +- 2 个监测 scene 更强 workflow 主要来自规则资产 +- `message-remind`、`callout`、`auto-dispatch` 等通道在不同 scene 中强度不一致 + +#### B. normalization choices + +- `core` +- `channels` +- `actions` +- `id` +- `name` +- `kind` + +这些统一词表字段本身就是规范化选择。当前没有直接证据表明仓库中已经存在统一 capability registry。 + +#### C. open / candidate 字段 + +建议保持候选态: + +- `required_contexts` +- `result_semantics` +- `stability_level` +- `implemented_by` +- `runtime_owner` + +这些字段看起来很有用,但 staged assets 还不足以稳定支撑它们。 + +### 4.3 对能力词表的关键限制 + +- 不要把 `report-export`、`audio-remind`、`callout` 之类词条本身写成“已全局统一支持”。 +- 不要因为某个规则资产里出现了调用,就把它提升为所有 scene 的稳定 capability。 +- `email` 目前仍应保持 candidate,不应进入“已支持通道”集合。 + +--- + +## 五、`tasks/*.json` 目标结构 + +### 5.1 统一推荐骨架 + +```json +{ + "id": "95598-repair-city-dispatch", + "name": "95598抢修-市指", + "category": "monitor", + "current_state": { + "primary_evidence_summary": "rule assets stronger than packaged JS stub", + "source_refs": [], + "known_issues": [] + }, + "binding": { + "scene_id": "95598-repair-city-dispatch", + "skill_package": "95598-repair-city-dispatch", + "tool": "collect_repair_orders" + }, + "trigger": { + "observed": {}, + "normalized": {}, + "open_questions": [] + }, + "inputs": { + "observed": {}, + "normalized": {}, + "open_questions": [] + }, + "systems": { + "observed": {}, + "normalized": {}, + "open_questions": [] + }, + "workflow": { + "observed": [], + "normalized": [], + "open_questions": [] + }, + "result": { + "observed": {}, + "normalized": {}, + "open_questions": [] + }, + "downstream_effects": { + "observed": [], + "normalized": [], + "open_questions": [] + }, + "required_capabilities": { + "normalized": [], + "open_questions": [] + }, + "status_model": { + "declared": {}, + "implemented_notes": [] + }, + "evidence_grades": {}, + "open_questions": [] +} +``` + +这个骨架的核心目标不是“把所有字段都填满”,而是强制区分: + +- `observed` +- `normalized` +- `open_questions` + +这样可避免把 future-facing target config 误写成 current-state。 + +--- + +## 六、报表类任务在目标 schema 中应如何表达 + +适用对象: + +- `fault-details-report` +- `jinchang-business-environment-weekly-report` +- `95598-weekly-monitor-report` + +### 6.1 当前证据对目标 schema 的约束 + +这 3 个任务当前最强直接证据主要是: + +- 已有 `report-artifact` 结构壳 +- 已有 section/template 定义 +- 已有 `status` / `partial_reasons` 字段壳 + +但它们共同缺少同等强度的 live collection 证据。因此若采用该目标 schema,建议保留一个明确的 current-state 提示,例如: + +```json +"current_state": { + "primary_evidence_summary": "packaged script mainly confirms artifact schema / section template; live collection remains contract-defined or weaker" +} +``` + +### 6.2 报表类字段分层 + +#### A. evidence-derived fields + +- `binding.scene_id` +- `binding.skill_package` +- `binding.tool` +- `result.observed.artifact_type` +- `result.observed.key_fields` +- `systems.observed.browser_pages` +- `source_refs` + +#### B. normalization choices + +- `trigger.normalized.natural_language_examples` +- `inputs.normalized.runtime_context` +- `workflow.normalized` +- `required_capabilities.normalized` +- `downstream_effects.normalized` + +#### C. open / candidate fields + +- `period_model` +- `section_semantics` +- `region_scope` +- `alignment_rule` +- `report_export_policy` + +### 6.3 各报表任务的特别约束 + +#### `fault-details-report` + +- 若采用该目标 schema,建议对外保留 `period`,但执行层最好允许展开为 `startTime/endTime`。 +- `summary-sheet` 建议标记为“template confirmed”,不要误写成“summary derivation implemented”。 + +#### `jinchang-business-environment-weekly-report` + +- 若采用该目标 schema,建议把“4 个固定 section 模板已观察到”与“真实多源采集已实现”分开表达。 +- `region` 是否成为稳定字段,目前仍是 open item。 + +#### `95598-weekly-monitor-report` + +- 若采用该目标 schema,建议预留 `currentPeriod` 与 `cumulativePeriod`,但必须注明这属于对当前建模冲突的修正提案。 +- `period alignment` 建议单列为 schema group 或 `alignment_rule`,而不是默认已经在 runtime 中稳定存在。 + +--- + +## 七、监测类任务在目标 schema 中应如何表达 + +适用对象: + +- `95598-repair-city-dispatch` +- `jiayuguan-meter-outage` + +### 7.1 当前证据对目标 schema 的约束 + +这两个任务与报表类不同: + +- packaged JS collector 已具备输入驱动的 `monitor-snapshot` 归一化 / 比较逻辑,并会附带规则来源、配置基础页角色、已知问题/身份模型说明 +- 更强 workflow 证据主要来自规则资产(当前按盘点口径以 `D:/desk/智能体资料/大四区报告监测项/*.txt` 规则脚本为主) +- `assets/scene-snapshot/index.html` 仅属于配置基础层,不应计入 workflow 主执行证据 + +因此若采用该目标 schema,建议显式区分: + +```json +"current_state": { + "packaged_stub_strength": "code-confirmed", + "rule_asset_workflow_strength": "code-confirmed", + "notes": "workflow evidence is stronger in rule assets than in packaged JS stub" +} +``` + +### 7.2 监测类字段分层 + +#### A. evidence-derived fields + +- `binding.*` +- `inputs.observed.explicit` +- `systems.observed.upstream_apis` +- `systems.observed.local_services` +- `workflow.observed` +- `result.observed` +- `downstream_effects.observed` +- `current_state.known_issues` + +#### B. normalization choices + +- `workflow.normalized` +- `required_capabilities.normalized` +- `canonical_snapshot_fields` +- `effect_channels` + +#### C. open / candidate fields + +- `identity_model` +- `downstream_policy` +- `alert_channel_split` +- `auto_processing_policy` +- `dependency_promotion_rules` + +### 7.3 各监测任务的特别约束 + +#### `95598-repair-city-dispatch` + +若采用该目标 schema,建议保留以下说明: + +- workflow 强证据主要来自规则资产(当前盘点以 `D:/desk/智能体资料/大四区报告监测项/95598抢修-市指_业务检测配置.txt` 与 `D:/desk/智能体资料/大四区报告监测项/95598抢修-市指_自动处理配置.txt` 为主),而不是 packaged JS stub +- `pending` 分类存在 `status == "00" && status == "01"` bug +- `pending_ids/new_pending_ids` 更像 canonical target fields,而不是当前规则层已严格同名产出字段 + +建议把这个 bug 直接纳入: + +```json +"current_state": { + "known_issues": [ + "pending classification bug: status == \"00\" && status == \"01\"" + ] +} +``` + +#### `jiayuguan-meter-outage` + +若采用该目标 schema,建议保留以下说明: + +- workflow 强证据主要来自规则资产(当前盘点以 `D:/desk/智能体资料/大四区报告监测项/户表失电-嘉峪关_业务监测配置.txt` 与 `D:/desk/智能体资料/大四区报告监测项/户表失电-嘉峪关_自动处理配置.txt` 为主),而不是 packaged JS stub +- marketing token 是自动处理链路的强依赖 +- monitor pending list 用 `consNo`,dispose dedupe 用 `eventId`,身份模型不一致 + +因此在该目标 schema 提案中,建议单列: + +```json +"identity_model": { + "monitor_pending_identity": "consNo", + "dispose_dedupe_identity": "eventId", + "status": "implementation intent exists but not rigorous / buggy" +} +``` + +这类字段不应被伪装成“已经统一好的 snapshot identity model”。 + +--- + +## 八、推荐统一字段清单与证据边界 + +下面给出一个更严格的统一字段视图。 + +### 1. 元数据层 + +较适合作为稳定 target schema 的字段: + +- `id` +- `name` +- `category` +- `binding.scene_id` +- `binding.skill_package` +- `binding.tool` + +其中: + +- `binding.*` 更偏 evidence-derived +- `id/name/category` 更偏 normalization choice + +### 2. 现状映射层 + +建议新增并长期保留: + +- `current_state.primary_evidence_summary` +- `current_state.source_refs` +- `current_state.known_issues` +- `current_state.notes` + +这是本次重写后最重要的新增设计点之一。没有这层,target schema 很容易再次把“目标结构”和“现状证据”混在一起。 + +### 3. 触发层 + +- `trigger.observed` +- `trigger.normalized` +- `trigger.open_questions` + +### 4. 输入层 + +- `inputs.observed` +- `inputs.normalized` +- `inputs.open_questions` + +### 5. 系统层 + +- `systems.observed` +- `systems.normalized` +- `systems.open_questions` + +### 6. 流程层 + +- `workflow.observed` +- `workflow.normalized` +- `workflow.open_questions` + +### 7. 结果层 + +- `result.observed` +- `result.normalized` +- `result.open_questions` + +### 8. 下游动作层 + +- `downstream_effects.observed` +- `downstream_effects.normalized` +- `downstream_effects.open_questions` + +### 9. 能力层 + +- `required_capabilities.normalized` +- `required_capabilities.open_questions` + +### 10. 证据层 + +- `evidence_grades` +- `source_refs` + +### 11. 人工确认层 + +- `open_questions` +- `known_issues` + +--- + +## 九、为什么这次建议在 target schema 中显式保留“现状层” + +旧版结构容易出现的问题是: + +- 把 aggregate inventory 直接写成“标准配置已经长这样” +- 把 `required_capabilities`、`downstream_effects` 这样的归一化字段误读成 runtime 现状 +- 把规则资产中的 workflow 直接等价成 packaged script 实现 + +因此这次建议最关键的修订不是多加几个字段,而是要求 target schema 同时携带: + +1. `observed current state` +2. `normalized target structure` +3. `open / candidate items` + +只有这样,后续继续扩展新 scene 时,文档才不会再次把三类内容混在一起。 + +--- + +## 十、建议的落地顺序 + +1. 先把 current-state inventory 保持为证据分级后的事实盘点。 +2. 再基于 inventory 生成目标态 `employee.json` / `capabilities.json` / `tasks/*.json` 草案。 +3. 落地草案时,强制为每个 major group 补齐: + - `observed` + - `normalized` + - `open_questions` +4. 先优先收敛已知关键不严谨点: + - `fault-details-report` 的 `period` vs `startTime/endTime` + - `95598-weekly-monitor-report` 的双周期 / period alignment + - `95598-repair-city-dispatch` 的 pending classification bug + - `jiayuguan-meter-outage` 的 `consNo` vs `eventId` 身份不一致 +5. 最后再考虑是否把能力词表与 target config 接入真实消费链路。 + +注意:在这些问题未收敛前,不应把目标配置字段写成“已经稳定”。 + +--- + +## 十一、推荐结论 + +如果目标是形成“指挥中心虚拟员工的标准配置清单”,那么未来仍然可以采用: + +- `employee.json` +- `capabilities.json` +- `tasks/*.json` + +这样的三层结构。 + +但和旧版不同的是,这套结构必须显式承认: + +- 它是 target architecture proposal,不是现状复述 +- 每个 major schema group 都要区分 evidence-derived fields、normalization choices、open / candidate fields +- evidence-graded current-state docs 才是现状依据 +- 报表类 3 个 scene 当前主要是 schema/template stub +- `95598-repair-city-dispatch` 与 `jiayuguan-meter-outage` 的 workflow 强证据主要在规则资产 +- `95598-repair-city-dispatch` 存在 pending classification bug +- `jiayuguan-meter-outage` 存在 `consNo` / `eventId` 身份不一致问题 +- 任何地方都不应宣称 runtime verification + +只有在保持这些边界的前提下,这份“标准配置结构”才是严谨可持续的目标态提案,而不是再次把现状、推断和目标混写在一起。 diff --git a/docs/superpowers/specs/2026-04-08-command-center-virtual-employee-inventory-table.md b/docs/superpowers/specs/2026-04-08-command-center-virtual-employee-inventory-table.md new file mode 100644 index 0000000..7625fb3 --- /dev/null +++ b/docs/superpowers/specs/2026-04-08-command-center-virtual-employee-inventory-table.md @@ -0,0 +1,121 @@ +# 指挥中心虚拟员工业务盘点清单(表格版) + +> 说明:本文件是“当前状态总览”,不是目标配置 schema。自本次重写起,所有判断统一采用 `code-confirmed`、`contract-defined`、`implementation intent exists but not rigorous / buggy`、`no direct evidence / candidate only` 四级证据模型;结论仅基于已暂存/已落库资产的静态检查结果,不代表任何运行时验证。 + +## 盘点范围 + +本表覆盖当前已整理的 5 个 staged scene / skill: + +- `fault-details-report` +- `jinchang-business-environment-weekly-report` +- `95598-weekly-monitor-report` +- `95598-repair-city-dispatch` +- `jiayuguan-meter-outage` + +## 虚拟员工定位 + +以下“虚拟员工定位”是对当前 5 个 scene 的归一化汇总视角,不是当前仓库里已存在统一员工对象的直接事实;证据等级:`no direct evidence / candidate only`。在这个归一化视角下,可把它理解为“面向电力业务指挥中心的任务型虚拟运营员工”,其职责边界可概括为: + +- 以报表模板或监测快照形式承载结构化结果 +- 对工单/事件队列做规则化监测与历史比较 +- 为提醒、日志、外呼、自动派单、自动处理等下游动作提供输入语义 +- 为未来统一配置清单提供归一化抽象基础 + +但必须强调:以上职责并不等于所有场景都已由统一 packaged runtime 严格实现,更不等于已完成运行时验证。 + +## 证据标签速记 + +| 标签 | 严格含义 | +| --- | --- | +| `code-confirmed` | 当前仓库代码、规则资产、静态配置中可直接定位到的事实 | +| `contract-defined` | 由场景说明、参考流程、接口/文档契约明确规定的事实 | +| `implementation intent exists but not rigorous / buggy` | 已看到实现方向或局部链路,但不够严谨、存在缺口或已知 bug | +| `no direct evidence / candidate only` | 当前没有直接证据,只能作为候选抽象、候选结构或待确认项 | + +## 业务盘点表 + +| 名称 | 场景 ID | 类别 | 当前任务目标 | 已观察系统 / 证据基础 | 证据分级摘要 | 严格说明 / 未解决问题 | 对应分析文档 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| 故障明细 | `fault-details-report` | 报表 | 以“故障明细主表 + summary-sheet 分区”形式承载故障明细报表结果。 | `scene.json`、`SKILL.md`、`scripts/collect_fault_details.js`、`references/collection-flow.md`、`references/data-quality.md` | `code-confirmed`:已直接定义 `report-artifact` 外壳、主表列、`summary-sheet` 模板、`status`/`partial_reasons` 字段。`contract-defined`:页面时间读取、故障查询、字段归一、汇总派生、导出/日志语义。`implementation intent exists but not rigorous / buggy`:`period` 与 `startTime/endTime` 建模不严谨,状态细分只停留在契约层。 | 当前更像“报表 schema/template stub”,不能写成已严格实现实时浏览器采集器;不得表述为已运行验证。 | `D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-fault-details-report-operation-analysis.md` | +| 国网金昌供电公司营商环境周例会报告 | `jinchang-business-environment-weekly-report` | 报表 | 以四个固定 section 模板承载营商环境周报。 | `scene.json`、`SKILL.md`、`scripts/collect_business_environment_metrics.js`、`references/collection-flow.md`、`references/data-quality.md` | `code-confirmed`:四个 section template、空 artifact、`period`、基础状态字段已存在。`contract-defined`:多来源指标采集、周范围读取、section 聚合、导出/日志语义。`implementation intent exists but not rigorous / buggy`:`region` 仅在文案层出现,未进入稳定 schema。 | 这是“分区化周报模板”而不是已证实的 live collector;不能写成已稳定采集多个业务系统。 | `D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jinchang-business-environment-weekly-report-operation-analysis.md` | +| 95598、12398及配网设备监控情况周统计 | `95598-weekly-monitor-report` | 报表 | 以六个固定 section 模板承载周统计结果。 | `scene.json`、`SKILL.md`、`scripts/collect_weekly_metrics.js`、`references/collection-flow.md`、`references/data-quality.md` | `code-confirmed`:六个 section template、空 artifact、顶层 `period`、基础状态字段已存在。`contract-defined`:双周期输入、period alignment、多来源周统计采集。`implementation intent exists but not rigorous / buggy`:`period` vs `currentPeriod/cumulativePeriod` 冲突明显,period alignment 只在元数据/文档层被要求。 | 三个报表 scene 都更接近“已打包的 schema/template stub”,不应写成已实现 live collector;本场景还存在双周期建模未闭合问题。 | `D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-weekly-monitor-report-operation-analysis.md` | +| 95598抢修-市指 | `95598-repair-city-dispatch` | 监测 | 监测抢修工单队列,识别待处理/审核/已处理,并为提醒、日志、自动派单等链路提供输入。 | `scene.json`、`SKILL.md`、`scripts/collect_repair_orders.js`、`D:/desk/智能体资料/大四区报告监测项/95598抢修-市指_业务检测配置.txt`、`D:/desk/智能体资料/大四区报告监测项/95598抢修-市指_自动处理配置.txt` | `code-confirmed`:packaged JS 现已直接实现输入驱动的 `monitor-snapshot` collector,可做 repair-order 分类、monitor/dispose log 比较、`new_pending_ids` 推导、`success/partial/empty/blocked` 状态判定,并携带 `workflow_rule_sources`、`config_base_page/config_base_role`、`known_issues` 元数据;更强的队列采集、日志比较、音频提醒、短信、外呼、自动派单、处置日志写入证据直接存在于 desk 规则脚本。`contract-defined`:快照语义与下游副作用需分开表达。`implementation intent exists but not rigorous / buggy`:desk 规则内存在 `status == "00" && status == "01"` 的待处理分类 bug;规则层 `new_pending_ids` 仍更像归一化目标而非同名稳定字段。 | 本场景 desk workflow 证据仍强于 packaged collector,且当前实际定时执行证据以 desk 规则脚本为主;`assets/scene-snapshot/index.html` 仅是配置基础页。仍不能宣称任何运行时成功。 | `D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-repair-city-dispatch-operation-analysis.md` | +| 户表失电-嘉峪关 | `jiayuguan-meter-outage` | 监测 | 监测户表失电事件,结合服务工单状态与历史日志识别待处理对象,并为自动处理链路提供输入。 | `scene.json`、`SKILL.md`、`scripts/collect_outage_events.js`、`D:/desk/智能体资料/大四区报告监测项/户表失电-嘉峪关_业务监测配置.txt`、`D:/desk/智能体资料/大四区报告监测项/户表失电-嘉峪关_自动处理配置.txt` | `code-confirmed`:packaged JS 现已直接实现输入驱动的 `monitor-snapshot` collector,可从 outage/service-order 数据计算 `pending/audit/processed`、比较 monitor/dispose logs、推导 `new_pending_ids`、输出 `success/partial/empty/blocked`,并携带 `workflow_rule_sources`、`config_base_page/config_base_role`、`identity_model` 元数据;更强的 outage collection、service-order enrichment、monitor/dispose log 比较、营销 token 依赖自动处理与派单分支直接存在于 desk 规则脚本。`contract-defined`:快照与下游自动处理需分开理解。`implementation intent exists but not rigorous / buggy`:监测 pending 列表用 `consNo`,处置去重用 `eventId`,身份模型不一致;短信通道只看到保留意图/注释代码。 | 本场景 desk workflow 证据也强于 packaged collector,且当前实际定时执行证据以 desk 规则脚本为主;`assets/scene-snapshot/index.html` 仅是配置基础页。必须保留身份不一致问题,不能把 `pending_ids/new_pending_ids` 写成已被严格统一定义。 | `D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jiayuguan-meter-outage-operation-analysis.md` | + +## 当前状态汇总 + +### 1. 报表类场景的共同结论 + +- `fault-details-report` +- `jinchang-business-environment-weekly-report` +- `95598-weekly-monitor-report` + +这 3 个 scene 当前最强直接证据都集中在“已打包脚本定义了 artifact schema / section template / 基础状态字段”。 + +因此,对这 3 个 scene 的严谨表述应是: + +- `code-confirmed`:已存在结构模板、字段壳和分区定义 +- `contract-defined`:存在明确的目标采集流程与质量要求 +- `implementation intent exists but not rigorous / buggy`:运行时采集、周期对齐、状态细分、导出/日志等链路没有被 packaged JS 同等强度证实 + +换言之,它们当前主要是“结构化报表模板场景”,不应表述为“已验证的 live collector”。 + +### 2. 监测类场景的共同结论 + +- `95598-repair-city-dispatch` +- `jiayuguan-meter-outage` + +这 2 个 scene 的情况与报表类不同: + +- packaged JS collector 已具备输入驱动的 `monitor-snapshot` 归一化 / 比较逻辑 +- 更强 workflow 证据主要存在于 desk 规则资产 +- 规则资产直接展示了采集、比较、提醒、日志、派单等流程分支 + +因此,对这 2 个 scene 的严谨表述应是: + +- `code-confirmed`:规则资产中确有较强监测/自动处理链路定义 +- 但这仍只证明“规则层存在这些实现分支” +- 不得进一步写成“运行时已稳定成功” + +### 3. 当前全局未闭合问题 + +- `fault-details-report`:`period` 与 `startTime/endTime` 的关系未闭合 +- `jinchang-business-environment-weekly-report`:`region` 语义只在文案层出现,未形成稳定字段 +- `95598-weekly-monitor-report`:`period` 与 `currentPeriod/cumulativePeriod`、period alignment 之间的关系未闭合 +- `95598-repair-city-dispatch`:待处理分类规则存在 `status == "00" && status == "01"` bug +- `jiayuguan-meter-outage`:monitor pending 使用 `consNo`,dispose dedupe 使用 `eventId`,身份模型不一致 + +## 按证据等级整理的能力视图 + +### `code-confirmed` + +- 报表 artifact / monitor snapshot 的基础结构壳 +- 报表 scene 的固定 section/template 定义 +- 两个监测 scene 规则资产中的采集、比较、日志、提醒、派单分支存在性 + +### `contract-defined` + +- 报表类 scene 的目标采集流程、导出语义、质量约束 +- 监测类 scene 的“快照成功”与“副作用成功”分离原则 +- 周报类双周期/多来源/对齐语义 + +### `implementation intent exists but not rigorous / buggy` + +- 报表类 scene 中对 live collector、period alignment、状态细分的实现意图 +- `95598-repair-city-dispatch` 的 pending 分类 bug +- `jiayuguan-meter-outage` 的身份键不一致 +- 若干下游通道存在定义或注释代码,但不足以提升为稳定现状 + +### `no direct evidence / candidate only` + +- 统一 capability 名称本身 +- 未来标准配置里的字段拆分方案 +- `email` 等当前未见直接证据的候选通道 + +## 使用边界 + +本文件只用于帮助人快速理解“当前观察到的业务盘点状态”。如需: + +- 看每个场景的证据出处与分级理由,读对应 operation-analysis 文档 +- 看机器可读盘点结构,读 `2026-04-08-command-center-virtual-employee-inventory.json` +- 看未来目标配置结构提案,读 `2026-04-08-command-center-standard-config-structure.md` diff --git a/docs/superpowers/specs/2026-04-08-command-center-virtual-employee-inventory-table.rebuilt.xlsx b/docs/superpowers/specs/2026-04-08-command-center-virtual-employee-inventory-table.rebuilt.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3fb925c3bb06b3f0e8453b36f4d52aaadc799fcc GIT binary patch literal 6104 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 literal 0 HcmV?d00001 diff --git a/docs/superpowers/specs/2026-04-08-command-center-virtual-employee-inventory-table.xlsx b/docs/superpowers/specs/2026-04-08-command-center-virtual-employee-inventory-table.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..967ab899e72b99d2c85dfa0ee45bd71f74a894bd GIT binary patch literal 5839 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 XZR+q_*uU?>xjx#jB|iCW@Bse>G2d7C literal 0 HcmV?d00001 diff --git a/docs/superpowers/specs/2026-04-08-command-center-virtual-employee-inventory.json b/docs/superpowers/specs/2026-04-08-command-center-virtual-employee-inventory.json new file mode 100644 index 0000000..2bd35a6 --- /dev/null +++ b/docs/superpowers/specs/2026-04-08-command-center-virtual-employee-inventory.json @@ -0,0 +1,1280 @@ +{ + "document_role": { + "description": "指挥中心虚拟员工当前状态的机器可读盘点,不是目标配置 schema,也不是运行时已实现结构。", + "evidence_method": "Only uses the exact four labels: code-confirmed, contract-defined, implementation intent exists but not rigorous / buggy, no direct evidence / candidate only.", + "inspection_scope": "Based on static inspection of staged scene metadata, packaged scripts, rule assets, and related operation-analysis docs. No runtime verification is claimed." + }, + "virtual_employee": { + "name": "指挥中心虚拟员工", + "domain": { + "observed": "电力业务指挥中心", + "evidence_grade": "code-confirmed", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-command-center-virtual-employee-inventory-table.md" + ] + }, + "positioning": { + "normalized": "负责业务监测、工单识别、周报生成、异常识别与后续提醒/处置支撑的虚拟运营员工", + "evidence_grade": "no direct evidence / candidate only", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-command-center-virtual-employee-inventory-table.md" + ], + "notes": "这是 aggregate 文档中的归一化定位,不应反向当作 staged runtime 已有统一员工对象的证据。" + }, + "mission": { + "normalized": [ + "采集业务数据并生成结构化报表", + "监测工单/事件队列并识别待处理对象", + "比较历史记录识别新增待办", + "为提醒、外呼、自动派单、自动处理等下游动作提供结构化输入" + ], + "evidence_grade": "no direct evidence / candidate only", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-command-center-virtual-employee-inventory-table.md" + ] + } + }, + "capability_catalog": { + "core": [ + { + "id": "browser-collection", + "kind": "normalized-capability", + "evidence_grade": "no direct evidence / candidate only", + "notes": "这是跨场景归一化命名,不应表述为当前统一 runtime capability 注册表。" + }, + { + "id": "report-generation", + "kind": "normalized-capability", + "evidence_grade": "no direct evidence / candidate only" + }, + { + "id": "monitor-snapshot", + "kind": "normalized-capability", + "evidence_grade": "no direct evidence / candidate only" + }, + { + "id": "multi-source-aggregation", + "kind": "normalized-capability", + "evidence_grade": "no direct evidence / candidate only" + }, + { + "id": "history-comparison", + "kind": "normalized-capability", + "evidence_grade": "no direct evidence / candidate only" + }, + { + "id": "status-classification", + "kind": "normalized-capability", + "evidence_grade": "no direct evidence / candidate only" + }, + { + "id": "partial-status-management", + "kind": "normalized-capability", + "evidence_grade": "no direct evidence / candidate only" + } + ], + "runtime_dependencies": [ + { + "id": "platform-session-context", + "kind": "normalized-dependency", + "evidence_grade": "no direct evidence / candidate only" + }, + { + "id": "org-context", + "kind": "normalized-dependency", + "evidence_grade": "no direct evidence / candidate only" + }, + { + "id": "user-context", + "kind": "normalized-dependency", + "evidence_grade": "no direct evidence / candidate only" + }, + { + "id": "token-context", + "kind": "normalized-dependency", + "evidence_grade": "no direct evidence / candidate only" + } + ], + "downstream_channels": [ + { + "id": "report-export", + "kind": "normalized-channel", + "evidence_grade": "no direct evidence / candidate only" + }, + { + "id": "local-log", + "kind": "normalized-channel", + "evidence_grade": "no direct evidence / candidate only" + }, + { + "id": "audio-remind", + "kind": "normalized-channel", + "evidence_grade": "no direct evidence / candidate only" + }, + { + "id": "message-remind", + "kind": "normalized-channel", + "evidence_grade": "no direct evidence / candidate only" + }, + { + "id": "callout", + "kind": "normalized-channel", + "evidence_grade": "no direct evidence / candidate only" + }, + { + "id": "auto-dispatch", + "kind": "normalized-channel", + "evidence_grade": "no direct evidence / candidate only" + }, + { + "id": "auto-processing", + "kind": "normalized-channel", + "evidence_grade": "no direct evidence / candidate only" + }, + { + "id": "email", + "kind": "candidate-channel", + "evidence_grade": "no direct evidence / candidate only" + } + ] + }, + "tasks": [ + { + "id": "fault-details-report", + "name": "故障明细", + "category": { + "observed": "report", + "evidence_grade": "code-confirmed", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-fault-details-report-operation-analysis.md" + ] + }, + "business_goal": { + "normalized": "以故障明细主表和 summary-sheet 分区承载故障明细报表结果。", + "evidence_grade": "no direct evidence / candidate only", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-fault-details-report-operation-analysis.md" + ] + }, + "trigger": { + "observed": { + "scene_tool": "fault-details-report.collect_fault_details", + "declared_input": [ + "period" + ] + }, + "normalized": { + "natural_language_examples": [ + "导出故障明细", + "生成某时间段故障明细报表" + ], + "preconditions": [ + "logged-in", + "page-date-range-available", + "browser-page-accessible" + ] + }, + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "contract-defined" + }, + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-fault-details-report-operation-analysis.md", + "D:/data/ideaSpace/rust/sgClaw/claw/claw/skills/skill_staging/scenes/fault-details-report/scene.json", + "D:/data/ideaSpace/rust/sgClaw/claw/claw/skills/skill_staging/skills/fault-details-report/SKILL.md" + ] + }, + "systems": { + "observed": { + "browser_pages": [ + "故障明细/index.html" + ], + "declared_dependencies": [ + "browser", + "report-history", + "local-report-service" + ], + "artifact_stub_source": "scripts/collect_fault_details.js" + }, + "normalized": { + "upstream": [ + "browser-business-page", + "fault-detail-query-source" + ], + "local_services": [ + "local-report-service" + ] + }, + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "contract-defined" + }, + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-fault-details-report-operation-analysis.md" + ] + }, + "inputs": { + "observed": { + "explicit": [ + "period" + ], + "implicit_runtime_context": [ + "page-date-range" + ] + }, + "normalized": { + "business_inputs": [ + "period" + ], + "runtime_context": [ + "session", + "page-date-range" + ], + "hidden_dependencies": [ + "report-history-context" + ] + }, + "evidence_grade": { + "explicit": "code-confirmed", + "implicit_runtime_context": "contract-defined", + "normalized": "no direct evidence / candidate only" + }, + "notes": "`period` 与 `startTime/endTime` 的执行层关系仍未闭合。", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-fault-details-report-operation-analysis.md" + ] + }, + "workflow": { + "observed": [ + "read input.period", + "return report-artifact stub", + "emit detail columns", + "emit summary-sheet template" + ], + "normalized": [ + "read-period", + "collect-detail-rows", + "normalize-columns", + "build-summary-sheet", + "return-report-artifact" + ], + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "contract-defined" + }, + "notes": "live browser collection、字段归一与汇总派生在 packaged JS 中没有同等强度实现证据。", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-fault-details-report-operation-analysis.md" + ] + }, + "result": { + "observed": { + "artifact_type": "report-artifact", + "key_fields": [ + "period", + "columns", + "rows", + "sections.summary-sheet", + "status", + "partial_reasons" + ] + }, + "normalized": { + "human_outcome": "故障明细结构化报表" + }, + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "no direct evidence / candidate only" + }, + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-fault-details-report-operation-analysis.md" + ] + }, + "downstream_effects": { + "observed": [], + "normalized": [ + "report-export", + "report-log" + ], + "evidence_grade": { + "observed": "no direct evidence / candidate only", + "normalized": "contract-defined" + }, + "notes": "导出与报告日志主要来自 scene/reference 契约,不应写成 packaged script 已直接执行。", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-fault-details-report-operation-analysis.md" + ] + }, + "required_capabilities": { + "normalized": [ + "browser-collection", + "field-normalization", + "summary-derivation", + "report-export" + ], + "evidence_grade": "no direct evidence / candidate only", + "notes": "能力名是 aggregate 归一化结果,不应拔高为当前已存在统一能力层。" + }, + "status_model": { + "declared": { + "success": "明细采集与汇总派生完成。", + "partial": "数据已采集,但字段归一、汇总、导出或日志链路不完整。", + "empty": "合法查询返回空结果。", + "blocked": "登录、页面、请求、权限或解析失败。" + }, + "implemented_observation": "packaged script 固定返回 status 与 partial_reasons 字段壳,但未严格承载 success/partial/empty/blocked 细分。", + "evidence_grade": { + "declared": "contract-defined", + "implemented_observation": "implementation intent exists but not rigorous / buggy" + } + }, + "open_questions": [ + "period 是否需要拆成 startTime / endTime" + ], + "source_refs": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-fault-details-report-operation-analysis.md", + "D:/data/ideaSpace/rust/sgClaw/claw/claw/skills/skill_staging/skills/fault-details-report/scripts/collect_fault_details.js" + ] + }, + { + "id": "jinchang-business-environment-weekly-report", + "name": "国网金昌供电公司营商环境周例会报告", + "category": { + "observed": "report", + "evidence_grade": "code-confirmed", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jinchang-business-environment-weekly-report-operation-analysis.md" + ] + }, + "business_goal": { + "normalized": "以四个固定 section 模板承载营商环境周报。", + "evidence_grade": "no direct evidence / candidate only", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jinchang-business-environment-weekly-report-operation-analysis.md" + ] + }, + "trigger": { + "observed": { + "scene_tool": "jinchang-business-environment-weekly-report.collect_business_environment_metrics", + "declared_input": [ + "period" + ] + }, + "normalized": { + "natural_language_examples": [ + "生成金昌营商环境周例会报告", + "采集营商环境周报数据" + ], + "preconditions": [ + "logged-in", + "multi-source-access-available" + ] + }, + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "contract-defined" + }, + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jinchang-business-environment-weekly-report-operation-analysis.md" + ] + }, + "systems": { + "observed": { + "browser_pages": [ + "国网金昌供电公司营商环境周例会报告/index.html" + ], + "declared_dependencies": [ + "browser", + "multi-source", + "local-report-service" + ], + "artifact_stub_source": "scripts/collect_business_environment_metrics.js" + }, + "normalized": { + "upstream": [ + "browser-business-page", + "multi-source-business-systems" + ], + "local_services": [ + "local-report-service" + ] + }, + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "contract-defined" + }, + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jinchang-business-environment-weekly-report-operation-analysis.md" + ] + }, + "inputs": { + "observed": { + "explicit": [ + "period" + ] + }, + "normalized": { + "runtime_context": [ + "session" + ], + "hidden_dependencies": [ + "multi-source-availability" + ] + }, + "evidence_grade": { + "explicit": "code-confirmed", + "normalized": "contract-defined" + }, + "notes": "`region` 只在文案/输出说明中出现,未形成 scene 输入或稳定 artifact 字段。", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jinchang-business-environment-weekly-report-operation-analysis.md" + ] + }, + "workflow": { + "observed": [ + "read input.period", + "return empty report-artifact", + "emit four section templates" + ], + "normalized": [ + "read-period", + "verify-session", + "collect-metric-groups", + "aggregate-sections", + "return-report-artifact" + ], + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "contract-defined" + }, + "notes": "当前更像 section-based report template,不应表述为已证实的 live multi-source collector。", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jinchang-business-environment-weekly-report-operation-analysis.md" + ] + }, + "result": { + "observed": { + "artifact_type": "report-artifact", + "key_fields": [ + "period", + "sections.abnormal-transformer-monitoring", + "sections.power-outage-monitoring", + "sections.work-order-acceptance", + "sections.dispatch-summary", + "status", + "partial_reasons" + ] + }, + "normalized": { + "human_outcome": "营商环境周例会结构化报告" + }, + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "no direct evidence / candidate only" + }, + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jinchang-business-environment-weekly-report-operation-analysis.md" + ] + }, + "downstream_effects": { + "observed": [], + "normalized": [ + "report-export", + "report-log" + ], + "evidence_grade": { + "observed": "no direct evidence / candidate only", + "normalized": "contract-defined" + }, + "notes": "导出与日志是契约/参考流程中的下游语义,而非 packaged script 当前直接执行事实。" + }, + "required_capabilities": { + "normalized": [ + "multi-source-aggregation", + "section-assembly", + "report-export" + ], + "evidence_grade": "no direct evidence / candidate only" + }, + "status_model": { + "declared": { + "success": "多个 section 完整采集并组装成功。", + "partial": "部分 section 缺失、周期不一致或导出/日志失败。", + "empty": "合法查询返回空结果。", + "blocked": "登录、页面、请求或多源系统访问失败。" + }, + "implemented_observation": "packaged script 固定返回空模板和基础状态字段壳,未严格承载真实 partial/blocked/empty 分支。", + "evidence_grade": { + "declared": "contract-defined", + "implemented_observation": "implementation intent exists but not rigorous / buggy" + } + }, + "open_questions": [ + "是否需要把 section 元数据提升为 scene 级显式配置", + "region 是否应成为稳定输出字段" + ], + "source_refs": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jinchang-business-environment-weekly-report-operation-analysis.md", + "D:/data/ideaSpace/rust/sgClaw/claw/claw/skills/skill_staging/skills/jinchang-business-environment-weekly-report/scripts/collect_business_environment_metrics.js" + ] + }, + { + "id": "95598-weekly-monitor-report", + "name": "95598、12398及配网设备监控情况周统计", + "category": { + "observed": "report", + "evidence_grade": "code-confirmed", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-weekly-monitor-report-operation-analysis.md" + ] + }, + "business_goal": { + "normalized": "以六个固定 section 模板承载周统计结果。", + "evidence_grade": "no direct evidence / candidate only", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-weekly-monitor-report-operation-analysis.md" + ] + }, + "trigger": { + "observed": { + "scene_tool": "95598-weekly-monitor-report.collect_weekly_metrics", + "declared_input": [ + "period" + ] + }, + "normalized": { + "natural_language_examples": [ + "生成95598周统计", + "汇总12398及配网设备周报" + ], + "preconditions": [ + "logged-in", + "multi-source-access-available", + "period-alignment-available" + ] + }, + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "contract-defined" + }, + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-weekly-monitor-report-operation-analysis.md" + ] + }, + "systems": { + "observed": { + "browser_pages": [ + "95598、12398及配网设备监控情况周统计/index.html" + ], + "declared_dependencies": [ + "browser", + "multi-source", + "period-alignment", + "local-report-service" + ], + "artifact_stub_source": "scripts/collect_weekly_metrics.js" + }, + "normalized": { + "upstream": [ + "browser-business-page", + "multi-source-business-systems" + ], + "local_services": [ + "local-report-service" + ] + }, + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "contract-defined" + }, + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-weekly-monitor-report-operation-analysis.md" + ] + }, + "inputs": { + "observed": { + "explicit": [ + "period" + ], + "implicit_runtime_context": [ + "current-period", + "cumulative-period" + ] + }, + "normalized": { + "runtime_context": [ + "session", + "period-alignment-context" + ] + }, + "evidence_grade": { + "explicit": "code-confirmed", + "implicit_runtime_context": "contract-defined", + "normalized": "no direct evidence / candidate only" + }, + "notes": "`period` 与 `currentPeriod/cumulativePeriod` 的关系仍是核心 open question。", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-weekly-monitor-report-operation-analysis.md" + ] + }, + "workflow": { + "observed": [ + "read input.period", + "return empty report-artifact", + "emit six section templates" + ], + "normalized": [ + "read-current-period-and-cumulative-period", + "verify-session", + "collect-source-groups", + "aggregate-sections", + "align-periods", + "return-report-artifact" + ], + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "contract-defined" + }, + "notes": "当前不能把双周期读取、period alignment、多来源周统计采集写成 packaged JS 已证实现状。", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-weekly-monitor-report-operation-analysis.md" + ] + }, + "result": { + "observed": { + "artifact_type": "report-artifact", + "key_fields": [ + "period", + "sections.fault-repair", + "sections.frequent-outage", + "sections.full-aperture-work-orders", + "sections.key-opinion-control", + "sections.device-monitoring", + "sections.proactive-dispatch", + "status", + "partial_reasons" + ] + }, + "normalized": { + "human_outcome": "95598/12398/配网设备周统计报表" + }, + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "no direct evidence / candidate only" + }, + "notes": "前三个 section 的列结构已暗示双周期视角,但顶层输入/输出建模仍未闭合。", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-weekly-monitor-report-operation-analysis.md" + ] + }, + "downstream_effects": { + "observed": [], + "normalized": [ + "report-export", + "report-log" + ], + "evidence_grade": { + "observed": "no direct evidence / candidate only", + "normalized": "contract-defined" + }, + "notes": "导出与日志是文档契约中的下游动作,不应当作 packaged script 已直接执行事实。" + }, + "required_capabilities": { + "normalized": [ + "multi-source-aggregation", + "period-alignment", + "section-assembly", + "report-export" + ], + "evidence_grade": "no direct evidence / candidate only" + }, + "status_model": { + "declared": { + "success": "多来源周统计采集完成且周期对齐成功。", + "partial": "部分来源缺失、周期不一致或导出/日志失败。", + "empty": "合法查询返回空结果。", + "blocked": "会话、请求、权限、周期对齐或解析失败。" + }, + "implemented_observation": "packaged script 只提供空模板和基础状态字段壳,未严格实现 period alignment 或状态细分。", + "evidence_grade": { + "declared": "contract-defined", + "implemented_observation": "implementation intent exists but not rigorous / buggy" + } + }, + "open_questions": [ + "period 是否要正式拆分为 currentPeriod 与 cumulativePeriod", + "period alignment 应如何映射到标准配置字段" + ], + "source_refs": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-weekly-monitor-report-operation-analysis.md", + "D:/data/ideaSpace/rust/sgClaw/claw/claw/skills/skill_staging/skills/95598-weekly-monitor-report/scripts/collect_weekly_metrics.js" + ] + }, + { + "id": "95598-repair-city-dispatch", + "name": "95598抢修-市指", + "category": { + "observed": "monitor", + "evidence_grade": "code-confirmed", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-repair-city-dispatch-operation-analysis.md" + ] + }, + "business_goal": { + "normalized": "监测抢修工单队列,识别待处理/审核/已处理,并为提醒、日志、自动派单等链路提供输入。", + "evidence_grade": "no direct evidence / candidate only", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-repair-city-dispatch-operation-analysis.md" + ] + }, + "trigger": { + "observed": { + "scene_tool": "95598-repair-city-dispatch.collect_repair_orders", + "declared_input": [ + "time" + ], + "rule_window": "当天 00:00:00 - 23:59:59" + }, + "normalized": { + "natural_language_examples": [ + "监测95598抢修工单", + "查看市指待处理工单", + "识别新待办并提醒" + ], + "preconditions": [ + "platform-session-available", + "org-context-available", + "user-context-available", + "browser-page-accessible" + ] + }, + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "contract-defined" + }, + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-repair-city-dispatch-operation-analysis.md", + "D:/desk/智能体资料/大四区报告监测项/95598抢修-市指_业务检测配置.txt" + ] + }, + "systems": { + "observed": { + "browser_pages": [ + "95598抢修-市指/index.html(configuration-base-only)" + ], + "packaged_stub": "scripts/collect_repair_orders.js", + "packaged_collector_strength": "input-driven runtime snapshot collector", + "packaged_bridge_metadata": { + "workflow_rule_sources": [ + "D:/desk/智能体资料/大四区报告监测项/95598抢修-市指_业务检测配置.txt", + "D:/desk/智能体资料/大四区报告监测项/95598抢修-市指_自动处理配置.txt" + ], + "config_base_page": "assets/scene-snapshot/index.html", + "config_base_role": "configuration-only", + "packaged_collector_role": "runtime-snapshot-collector", + "known_issues": [ + "pending classification bug: status == \"00\" && status == \"01\"" + ] + }, + "upstream_apis": [ + "qxgl/repairOrder/list", + "qxgl/repairOrder/initProcess" + ], + "local_services": [ + "MonitorServices/getMonitorLog", + "MonitorServices/setMonitorData", + "MonitorServices/setMonitorLog", + "MonitorServices/getDisposeLog", + "MonitorServices/setDisposeLog", + "MonitorServices/setAudioPlayLog", + "MonitorServices/setSendMessageLog", + "configServices/getClassList" + ] + }, + "normalized": { + "upstream": [ + "browser-business-page", + "repair-order-source" + ], + "local_services": [ + "localhost-monitor-services", + "localhost-config-services" + ] + }, + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "no direct evidence / candidate only" + }, + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-repair-city-dispatch-operation-analysis.md" + ] + }, + "inputs": { + "observed": { + "explicit": [ + "time" + ], + "runtime_context": [ + "platform-session", + "org-context", + "user-context" + ], + "hidden_dependencies": [ + "monitor-log", + "dispose-log", + "business-rule-asset", + "auto-processing-rule-asset" + ] + }, + "normalized": { + "browser_class_list_config": true + }, + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "implementation intent exists but not rigorous / buggy" + }, + "notes": "`configServices` 是否应提升为独立正式 dependency 仍未收敛。", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-repair-city-dispatch-operation-analysis.md" + ] + }, + "workflow": { + "observed": { + "packaged_collector": [ + "read input.time as snapshot time label", + "classify input repair_orders into pending/audit/processed using status groups 00/01/06/08", + "parse monitor/dispose logs and derive pending_ids/new_pending_ids", + "compute success/partial/empty/blocked status and partial_reasons", + "return monitor-snapshot with collector metadata and known issues" + ], + }, + "normalized": { + "flow": [ + "attach-city-dispatch-page", + "verify-session-and-context", + "read-rule-assets", + "query-status-00-01-06-08-repair-orders", + "classify-pending-audit-processed", + "candidate-canonical-mapping-for-pending-ids-and-new-pending-ids", + "compare-history", + "return-monitor-snapshot", + "trigger-downstream-alert-or-dispatch" + ] + }, + "evidence_grade": { + "packaged_stub": "code-confirmed", + "rule_asset_workflow": "code-confirmed", + "normalized": "no direct evidence / candidate only" + }, + "notes": "workflow 直接证据主要在规则脚本(当前以 desk 目录 txt 为 source-of-truth),但 packaged collector 已具备输入驱动的归一化 / 比较逻辑;scene-snapshot 页面仅为配置基础层。", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-repair-city-dispatch-operation-analysis.md" + ] + }, + "result": { + "observed": { + "packaged_stub_fields": [ + "time", + "pending", + "audit", + "processed", + "pending_ids", + "new_pending_ids", + "status", + "partial_reasons" + ], + "rule_fields": [ + "time", + "type", + "pending", + "pendingList", + "audit", + "processed" + ] + }, + "normalized": { + "artifact_type": "monitor-snapshot", + "human_outcome": "市指工单监测快照" + }, + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "no direct evidence / candidate only" + }, + "notes": "`pendingList` vs `pending_ids`、`type` vs `scene` 说明规则层字段与 canonical 字段尚未完全统一。", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-repair-city-dispatch-operation-analysis.md" + ] + }, + "downstream_effects": { + "observed": [ + { + "effect": "audio-remind", + "evidence_grade": "code-confirmed" + }, + { + "effect": "message-remind", + "evidence_grade": "code-confirmed" + }, + { + "effect": "callout", + "evidence_grade": "code-confirmed" + }, + { + "effect": "auto-dispatch", + "evidence_grade": "code-confirmed" + }, + { + "effect": "dispose-log-write", + "evidence_grade": "code-confirmed" + }, + { + "effect": "monitor-log-write", + "evidence_grade": "code-confirmed" + } + ], + "normalized": [ + "local-log", + "audio-remind", + "message-remind", + "callout", + "auto-dispatch", + "auto-processing" + ], + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "no direct evidence / candidate only" + }, + "notes": "这些证据只说明规则层分支存在,不代表运行时已验证成功;`auto-processing` 更像 aggregate 归一化抽象。", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-repair-city-dispatch-operation-analysis.md" + ] + }, + "required_capabilities": { + "normalized": [ + "browser-request-execution", + "queue-monitoring", + "status-classification", + "history-comparison", + "local-log", + "audio-remind", + "message-remind", + "callout", + "auto-dispatch" + ], + "evidence_grade": "no direct evidence / candidate only", + "notes": "属于归一化能力抽象,不应写成当前统一能力清单现状。" + }, + "status_model": { + "declared": { + "success": "工单队列采集成功且快照构建完成。", + "partial": "队列采集成功,但日志、比较、提醒、外呼或自动派单链路不完整。", + "empty": "合法查询返回零工单。", + "blocked": "登录、上下文、请求、权限或解析失败。" + }, + "implemented_observation": "packaged collector 已实现输入驱动的状态分类、历史比较与 snapshot 状态判定;但规则层仍包含更强的实时副作用分支,且不能把副作用成功与快照成功混写。", + "evidence_grade": { + "declared": "contract-defined", + "implemented_observation": "implementation intent exists but not rigorous / buggy" + } + }, + "open_questions": [ + "trigger-alert 是否应拆成 audio-alert / message-alert / callout", + "configServices 是否需要独立暴露为正式 dependency" + ], + "known_issues": [ + { + "issue": "pending classification bug: status == \"00\" && status == \"01\"", + "evidence_grade": "implementation intent exists but not rigorous / buggy" + } + ], + "source_refs": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-95598-repair-city-dispatch-operation-analysis.md", + "D:/data/ideaSpace/rust/sgClaw/claw/claw/skills/skill_staging/skills/95598-repair-city-dispatch/scripts/collect_repair_orders.js", + "D:/desk/智能体资料/大四区报告监测项/95598抢修-市指_业务检测配置.txt", + "D:/desk/智能体资料/大四区报告监测项/95598抢修-市指_自动处理配置.txt" + ] + }, + { + "id": "jiayuguan-meter-outage", + "name": "户表失电-嘉峪关", + "category": { + "observed": "monitor", + "evidence_grade": "code-confirmed", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jiayuguan-meter-outage-operation-analysis.md" + ] + }, + "business_goal": { + "normalized": "监测户表失电事件,结合服务工单状态与历史日志识别待处理对象,并为自动处理链路提供输入。", + "evidence_grade": "no direct evidence / candidate only", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jiayuguan-meter-outage-operation-analysis.md" + ] + }, + "trigger": { + "observed": { + "scene_tool": "jiayuguan-meter-outage.collect_outage_events", + "declared_input": [ + "time" + ], + "outage_query_window": "近两天到当天", + "service_order_query_window": "当天" + }, + "normalized": { + "natural_language_examples": [ + "监测嘉峪关户表失电", + "识别新增失电待办", + "驱动户表失电自动处理" + ], + "preconditions": [ + "platform-session-available", + "org-context-available", + "browser-page-accessible", + "marketing-token-available-for-auto-processing" + ] + }, + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "contract-defined" + }, + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jiayuguan-meter-outage-operation-analysis.md" + ] + }, + "systems": { + "observed": { + "browser_pages": [ + "户表失电-嘉峪关/index.html(configuration-base-only)" + ], + "packaged_stub": "scripts/collect_outage_events.js", + "packaged_bridge_metadata": { + "workflow_rule_sources": [ + "D:/desk/智能体资料/大四区报告监测项/户表失电-嘉峪关_业务监测配置.txt", + "D:/desk/智能体资料/大四区报告监测项/户表失电-嘉峪关_自动处理配置.txt" + ], + "config_base_page": "assets/scene-snapshot/index.html", + "config_base_role": "configuration-only", + "packaged_collector_role": "runtime-snapshot-collector", + "identity_model": { + "pending_identity": "consNo", + "dispose_dedupe_identity": "eventId", + "status": "implementation intent exists but not rigorous / buggy" + } + }, + "upstream_apis": [ + "outage/dhsd/dhsdList", + "gdgl/active/service/order/list", + "queryEleCust", + "gdgl/zdfw/tgforderzdfw/gdbh", + "gdgl/active/service/order/saveAndSend" + ], + "local_services": [ + "MonitorServices/getMonitorLog", + "MonitorServices/setMonitorData", + "MonitorServices/setMonitorLog", + "MonitorServices/getDisposeLog", + "MonitorServices/setDisposeLog", + "MonitorServices/setAudioPlayLog", + "configServices/getClassList" + ] + }, + "normalized": { + "upstream": [ + "outage-source", + "service-order-source", + "marketing-system-source" + ], + "local_services": [ + "localhost-monitor-services", + "localhost-config-services" + ] + }, + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "no direct evidence / candidate only" + }, + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jiayuguan-meter-outage-operation-analysis.md" + ] + }, + "inputs": { + "observed": { + "explicit": [ + "time" + ], + "runtime_context": [ + "platform-session", + "org-context", + "marketing-token-context" + ], + "hidden_dependencies": [ + "monitor-log", + "dispose-log", + "business-rule-asset", + "auto-processing-rule-asset" + ] + }, + "normalized": { + "browser_class_list_config": true + }, + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "implementation intent exists but not rigorous / buggy" + }, + "notes": "marketing token 在规则层是直接依赖,但在 scene 正式 dependency 建模中仍未完全闭合。", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jiayuguan-meter-outage-operation-analysis.md" + ] + }, + "workflow": { + "observed": { + "packaged_stub": [ + "read input.time as snapshot time label", + "build outage context from input outage_events and classify input service_orders", + "parse monitor/dispose logs and derive pending_ids/new_pending_ids with identity tracking", + "compute success/partial/empty/blocked status and partial_reasons", + "return monitor-snapshot with collector metadata and identity model" + ], + }, + "normalized": { + "flow": [ + "attach-outage-config-page", + "verify-session-org-and-token-context", + "read-rule-assets", + "collect-outage-events", + "collect-related-service-order-states", + "normalize-pending-audit-processed", + "candidate-canonical-mapping-for-pending-ids-and-new-pending-ids-with-identity-reconciliation", + "compare-history", + "return-monitor-snapshot", + "trigger-downstream-remind-or-auto-processing" + ] + }, + "evidence_grade": { + "packaged_stub": "code-confirmed", + "rule_asset_workflow": "code-confirmed", + "normalized": "no direct evidence / candidate only" + }, + "notes": "workflow 直接证据主要在规则脚本(当前以 desk 目录 txt 为 source-of-truth),但 packaged collector 已具备输入驱动的归一化 / 比较逻辑;scene-snapshot 页面仅为配置基础层。", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jiayuguan-meter-outage-operation-analysis.md" + ] + }, + "result": { + "observed": { + "packaged_stub_fields": [ + "time", + "pending", + "audit", + "processed", + "pending_ids", + "new_pending_ids", + "status", + "partial_reasons" + ], + "rule_fields": [ + "time", + "type", + "pending", + "pendingList", + "audit", + "processed" + ], + "identity_observation": { + "monitor_pending_identity": "consNo", + "dispose_dedupe_identity": "eventId" + } + }, + "normalized": { + "artifact_type": "monitor-snapshot", + "human_outcome": "嘉峪关户表失电监测快照" + }, + "evidence_grade": { + "observed": "code-confirmed", + "normalized": "no direct evidence / candidate only" + }, + "notes": "`pending_ids/new_pending_ids` 的统一身份模型当前不严谨。", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jiayuguan-meter-outage-operation-analysis.md" + ] + }, + "downstream_effects": { + "observed": [ + { + "effect": "audio-remind", + "evidence_grade": "code-confirmed" + }, + { + "effect": "auto-dispatch-request", + "evidence_grade": "code-confirmed" + }, + { + "effect": "dispose-log-write", + "evidence_grade": "code-confirmed" + }, + { + "effect": "monitor-log-write", + "evidence_grade": "code-confirmed" + }, + { + "effect": "message-remind", + "evidence_grade": "implementation intent exists but not rigorous / buggy" + } + ], + "normalized": [ + "local-log", + "audio-remind", + "auto-processing" + ], + "evidence_grade": { + "normalized": "no direct evidence / candidate only" + }, + "notes": "短信函数存在但主成功链路发送代码被注释;`auto-processing` 是 aggregate 归一化抽象,不应误写为统一稳定能力。", + "sources": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jiayuguan-meter-outage-operation-analysis.md" + ] + }, + "required_capabilities": { + "normalized": [ + "event-monitoring", + "service-order-enrichment", + "history-comparison", + "token-driven-runtime", + "local-log", + "audio-remind", + "auto-processing" + ], + "evidence_grade": "no direct evidence / candidate only" + }, + "status_model": { + "declared": { + "success": "失电事件采集、工单富化与快照构建成功。", + "partial": "事件已拿到,但工单富化、比较、日志、提醒或自动处理链路不完整。", + "empty": "合法查询返回零失电事件。", + "blocked": "登录、token、请求、权限或解析失败。" + }, + "implemented_observation": "packaged collector 已实现输入驱动的 outage/service-order 归一化、历史比较与 snapshot 状态判定;规则层 workflow 更强,但仍不能把下游副作用成功写成运行时已验证事实。", + "evidence_grade": { + "declared": "contract-defined", + "implemented_observation": "implementation intent exists but not rigorous / buggy" + } + }, + "open_questions": [ + "marketing token context 是否应提升为正式 dependency", + "auto-processing 是否应与提醒动作拆成两个独立动作" + ], + "known_issues": [ + { + "issue": "identity mismatch: monitor pending list uses consNo, dispose dedupe uses eventId", + "evidence_grade": "implementation intent exists but not rigorous / buggy" + } + ], + "source_refs": [ + "D:/data/ideaSpace/rust/sgClaw/claw-new/docs/superpowers/specs/2026-04-08-jiayuguan-meter-outage-operation-analysis.md", + "D:/data/ideaSpace/rust/sgClaw/claw/claw/skills/skill_staging/skills/jiayuguan-meter-outage/scripts/collect_outage_events.js", + "D:/desk/智能体资料/大四区报告监测项/户表失电-嘉峪关_业务监测配置.txt", + "D:/desk/智能体资料/大四区报告监测项/户表失电-嘉峪关_自动处理配置.txt" + ] + } + ] +} diff --git a/docs/superpowers/specs/2026-04-08-fault-details-report-operation-analysis.md b/docs/superpowers/specs/2026-04-08-fault-details-report-operation-analysis.md new file mode 100644 index 0000000..9876d6f --- /dev/null +++ b/docs/superpowers/specs/2026-04-08-fault-details-report-operation-analysis.md @@ -0,0 +1,142 @@ +# fault-details-report 操作分析 + +## 1. 场景概述 + +`fault-details-report` 对应“故障明细”场景,目标表述为查询故障明细并生成包含明细与汇总分区的结构化报表。根据 `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\scenes\fault-details-report\scene.json`、`D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\fault-details-report\SKILL.md` 与 `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\fault-details-report\scripts\collect_fault_details.js`,当前最强直接证据在于:已打包脚本明确了报表 artifact 的列结构、汇总 section 名称、空结果形态与 `status: "ok"` 默认值,证据等级:`code-confirmed`。 + +但同一批证据并没有展示真实浏览器页面抓取、请求触发、行级归一化或汇总派生的实际执行代码。也就是说,当前 packaged script 对 artifact schema / section template 的定义,明显强于对实时浏览器采集行为的证明,证据等级:`code-confirmed`。 + +## 2. 证据来源 + +本分析统一只使用四个证据等级标签:`code-confirmed`、`contract-defined`、`implementation intent exists but not rigorous / buggy`、`no direct evidence / candidate only`。其中,脚本直接定义的 artifact schema / section template 归入 `code-confirmed`;未见脚本直接实现的运行语义与下游动作,不拔高于其对应较弱标签。 + +1. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\fault-details-report\scripts\collect_fault_details.js` + - 直接定义 `DETAIL_COLUMNS`、`SUMMARY_COLUMNS`、返回对象字段、空 `rows`、空 `sections[0].rows`、`status: "ok"`、`partial_reasons: []`,证据等级:`code-confirmed`。 +2. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\fault-details-report\SKILL.md` + - 说明预期工作流为读取时间范围、收集原始故障明细、按规范列顺序归一、派生汇总 sheet、返回 artifact;这是技能说明与目标运行契约,能证明意图与期望输出,但不能单独证明脚本已实现全部步骤,整体证据等级以 `contract-defined` 与 `implementation intent exists but not rigorous / buggy` 并存描述更严谨。 +3. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\scenes\fault-details-report\scene.json` + - 定义场景输入为 `period`、依赖为 `browser` / `report-history` / `local-report-service`、动作包括 `query` / `collect-report` / `build-summary-section`,属于场景元数据定义,证据等级:`code-confirmed`。 +4. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\fault-details-report\references\collection-flow.md` + - 给出“读取开始结束时间、触发 repair-order query、收集明细、按 `excleIni[0].cols` 归一、派生 summary-sheet、再返回 artifact”的参考流程;它定义了预期采集语义,证据等级:`contract-defined`。 +5. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\fault-details-report\references\data-quality.md` + - 给出必填列、可空列、summary 派生期望、partial 规则与 empty/failure 区分,属于质量约束参考,证据等级:`contract-defined`。 +6. `D:\data\ideaSpace\rust\sgClaw\claw-new\docs\superpowers\specs\2026-04-08-command-center-virtual-employee-inventory.json` + - 已把该场景整理为 `workflow`、`result.key_fields`、`status_model` 与 `open_questions`,可作为当前 command-center 侧归纳结果,但其中部分内容是对 scene/skill/reference 的再整理,不应反向当作新实现证据;证据等级:`no direct evidence / candidate only`(仅限 inventory 不能单独证明 packaged script 已实现的部分)。 + +## 3. 实际入口与运行边界 + +实际入口已在 `scene.json` 中声明为浏览器场景 `index.html`,技能包工具名为 `fault-details-report.collect_fault_details`,artifact 类型为 `report-artifact`,这些都是当前仓库可直接定位的定义,证据等级:`code-confirmed`。 + +运行边界方面: + +- 场景元数据只声明了 `inputs: ["period"]`,证据等级:`code-confirmed`。 +- 参考流程却明确要求从页面 datetime range control 读取 `start` / `end` 时间,证据等级:`contract-defined`。 +- 因而“外部统一输入叫 `period`,但页面真实业务输入更像 `startTime/endTime` 二元组”这一判断是当前最严谨的归纳,且 inventory 文件也把它列入 `open_questions`,证据等级:`implementation intent exists but not rigorous / buggy`。 + +还要强调:当前可直接运行的打包脚本并未包含浏览器操作、请求调用、页面解析或 localhost 导出调用代码,因此它的实际边界更接近“返回一个预定义空 artifact 的 schema stub”,而不是“已严格实现端到端浏览器采集器”,证据等级:`code-confirmed`。 + +## 4. 代码已证实的实际操作流程 + +当前代码真正能严格确认的流程只有以下最小闭环: + +1. 调用 `collectFaultDetails(input)`。 +2. 读取 `input.period || ""` 填入返回对象的 `period` 字段。 +3. 将 `DETAIL_COLUMNS` 写入主表 `columns`。 +4. 将空数组写入主表 `rows`。 +5. 构造一个名为 `summary-sheet` 的 section,并写入 `SUMMARY_COLUMNS` 与空 `rows`。 +6. 返回 `type: "report-artifact"`、`report_name: "fault-details-report"`、`status: "ok"`、`partial_reasons: []`。 + +以上每一步都能在 `collect_fault_details.js` 中直接定位,证据等级:`code-confirmed`。 + +至于以下操作:读取页面时间、触发 repair-order 查询、抓取故障行、归一字段、按明细派生汇总、判断 partial/empty/blocked、调用导出服务或报告日志服务,目前在 packaged script 中没有对应实现代码,只在 skill/reference 文本里出现,证据等级最多是 `contract-defined` 或 `implementation intent exists but not rigorous / buggy`,不能写成当前代码已证实的实际流程。 + +## 5. 标准化抽象流程 + +若为 command-center 做严格抽象,当前更合理的标准化流程应写成: + +1. 解析外部任务输入。 +2. 将业务时间范围映射到页面查询参数。 +3. 执行浏览器态查询并收集故障明细行。 +4. 按约定列顺序归一主表数据。 +5. 基于明细结果派生 `summary-sheet`。 +6. 生成 `report-artifact`。 +7. 如有需要再执行导出/日志等下游动作。 + +其中第 6 步“生成具有主表+summary-sheet 的 artifact 结构”可由脚本直接支撑,证据等级:`code-confirmed`。第 2、3、4、5、7 步主要来自场景说明与 reference 文档,不是当前脚本已实现事实,证据等级应分别按 `contract-defined` 或 `implementation intent exists but not rigorous / buggy` 标注。 + +## 6. 输入、上下文与依赖 + +### 输入 + +- `period` 被 scene 元数据与脚本入参直接使用,证据等级:`code-confirmed`。 +- “页面实际读取开始时间与结束时间”来自 `references/collection-flow.md` 和 `SKILL.md` 的 workflow 描述,证据等级:`contract-defined`。 +- 因此 `period` 与 `startTime/endTime` 的关系当前并不严谨:很可能 `period` 只是上层统一抽象,而底层真实 collector 需要双时间字段,证据等级:`implementation intent exists but not rigorous / buggy`。 + +### 运行上下文 + +- 浏览器页面可访问、页面日期控件存在、会话已登录,来自 scene/inventory/reference 的联合描述,证据等级以 `code-confirmed`(元数据存在)和 `contract-defined`(具体语义)共同成立。 +- `report-history`、`local-report-service` 被声明为依赖,但 reference 同时强调历史报告不是主数据源、localhost 服务是下游依赖,证据等级:`code-confirmed` 与 `contract-defined`。 + +### 依赖 + +- `browser`、`fault-detail-query-source`、`local-report-service` 等依赖名称或整理项可直接在 scene 或 inventory 中定位,证据等级:`code-confirmed`。 +- `/a_js/YPTAPI.js`、`http://localhost:13313/ReportServices/*`、`faultDetailsExportXLSXS` 等更具体依赖来自 reference,证据等级:`contract-defined`。 + +## 7. 输出结构 + +当前输出结构是本场景最硬的直接证据。`collect_fault_details.js` 已直接定义: + +- `type: "report-artifact"` +- `report_name: "fault-details-report"` +- `period` +- 主表 `columns` = `DETAIL_COLUMNS` +- 主表 `rows` = `[]` +- `sections[0].name = "summary-sheet"` +- `sections[0].columns = SUMMARY_COLUMNS` +- `sections[0].rows = []` +- `status = "ok"` +- `partial_reasons = []` + +以上全部属于 `code-confirmed`。 + +但 `SKILL.md` 与 `data-quality.md` 还要求输出中体现 detail row count、summary row count、required column coverage、complete/partial status、missing columns、weak mappings、downstream failures 等诊断信息。除了 `status` 与 `partial_reasons` 字段壳子已经存在,其他诊断性内容并未在脚本中实现,证据等级:`implementation intent exists but not rigorous / buggy`。 + +## 8. 下游动作证据表 + +| 下游动作 | 当前证据 | 证据等级 | 严谨结论 | +| --- | --- | --- | --- | +| 生成 `report-artifact` 返回给上游 | `collect_fault_details.js` 直接返回对象 | `code-confirmed` | 已有稳定的 artifact 结构桩实现,但当前返回为空数据模板。 | +| 明细列顺序标准化 | `DETAIL_COLUMNS` 明确定义 | `code-confirmed` | 只能确认列 schema 被定义,不能确认真实行数据已按此顺序完成映射。 | +| `summary-sheet` 分区存在 | `sections` 中直接构造 `summary-sheet` | `code-confirmed` | 只能确认 section 模板存在,不能确认真实汇总派生逻辑已实现。 | +| 页面采集故障明细行 | 只在 `SKILL.md` / `collection-flow.md` 中描述 | `contract-defined` | 存在明确目标流程,但当前 packaged script 未直接证明已实现。 | +| 汇总派生 | 只在 `SKILL.md` / `collection-flow.md` / `data-quality.md` 中描述 | `contract-defined` | 有契约与质量要求,但没有脚本级派生代码证据。 | +| 导出 Excel | scene 依赖与 reference 提到 localhost export service | `contract-defined` | 这是下游依赖定义,不等于本 skill 当前已实际执行导出。 | +| 写报告日志 | scene 依赖 `report-history`,reference 提到 report-log | `contract-defined` | 只能确认体系中有该下游概念,当前脚本未直接实现日志写入。 | +| partial / empty / blocked 状态细分 | skill/reference 有规则,脚本固定 `status: "ok"` | `implementation intent exists but not rigorous / buggy` | 状态模型意图存在,但 packaged script 目前未严格承载这些分支。 | + +## 9. 当前代码疑点 / 不严谨点 + +1. `period` 与 `startTime/endTime` 的建模不一致。scene 与脚本只保留 `period`,reference 却明确要求读取开始/结束时间;这会让 command-center 难以判断标准输入究竟是一段字符串还是两个独立时间字段,证据等级:`implementation intent exists but not rigorous / buggy`。 +2. 脚本把 `status` 固定为 `"ok"`,但 reference 与 `SKILL.md` 明确区分 success / partial / empty / blocked;当前实现无法承载这些语义,证据等级:`code-confirmed` 对现状成立,而“应支持细分状态”属于 `contract-defined`。 +3. `partial_reasons` 虽存在字段,但脚本没有任何填充逻辑,只能算 schema 占位,证据等级:`code-confirmed`。 +4. `DETAIL_COLUMNS` 与 `SUMMARY_COLUMNS` 已定义,但没有任何从页面数据到列值的映射代码;“字段归一化能力已落地”不能成立,证据等级最多为 `implementation intent exists but not rigorous / buggy`。 +5. 下游导出与日志在参考资料中存在,但当前 skill 脚本并未调用相关服务,因此“报表可直接生成 Excel”不能写成当前代码事实,证据等级:`no direct evidence / candidate only`(就 packaged script 内实际执行而言)。 + +## 10. 对 command-center 标准配置的修订建议 + +1. 将本场景输入从单一 `period` 修订为更严谨的双层表达: + - 对外统一层可保留 `period` 便于路由; + - 执行层建议显式展开 `startTime` / `endTime`。 + 其中“需要展开”的结论来自 scene 与 reference 的冲突修正,证据等级:`implementation intent exists but not rigorous / buggy`。 +2. 在标准配置里把“artifact schema 已明确、live collector 未证实”作为单独字段或备注保留,避免 command-center 误把 schema stub 当成已实现采集器,证据等级:`code-confirmed`。 +3. 将 `summary-sheet` 标记为 `section template confirmed`,而不是 `summary derivation implemented`。前者是 `code-confirmed`,后者当前没有同等强度证据。 +4. 状态模型建议分成两层: + - `declared_status_model`: success / partial / empty / blocked,来源于 skill/reference,证据等级:`contract-defined`; + - `implemented_status_behavior`: 当前仅看到固定 `ok` 成功壳,证据等级:`code-confirmed`。 +5. 对下游动作增加 `evidence_note`,明确 report-export / report-log 目前主要来自场景与参考定义,不是当前 packaged script 已证实行为。 + +## 11. 最终严谨结论 + +关于 `fault-details-report`,当前最可靠的结论是:仓库已经具备一个明确的报表 artifact 模板实现,能够稳定返回故障明细主表列定义、`summary-sheet` 汇总分区模板、空结果数组以及基础状态字段,证据等级:`code-confirmed`。 + +但如果把结论提升为“已经实现真实浏览器故障明细采集、列归一化、汇总派生、导出与日志闭环”,则证据并不充分。相关行为主要存在于 `SKILL.md`、`references/collection-flow.md`、`references/data-quality.md` 与 scene 元数据中,能够证明的是目标流程与契约要求,而不是当前 packaged script 已严格完成这些逻辑。因此,本场景目前应被描述为“artifact schema / section template 定义强,live browser collection 行为证据弱”的 staged report scene,而不能被描述为已严谨落地的实时采集器。 \ No newline at end of file diff --git a/docs/superpowers/specs/2026-04-08-jiayuguan-meter-outage-operation-analysis.md b/docs/superpowers/specs/2026-04-08-jiayuguan-meter-outage-operation-analysis.md new file mode 100644 index 0000000..28b884e --- /dev/null +++ b/docs/superpowers/specs/2026-04-08-jiayuguan-meter-outage-operation-analysis.md @@ -0,0 +1,225 @@ +# jiayuguan-meter-outage 操作分析 + +## 1. 场景概述 + +`jiayuguan-meter-outage` 对应“户表失电-嘉峪关”场景,目标是采集户表失电事件、关联服务工单状态、对比历史监测 / 处置日志,并在必要时触发音频提醒或自动派单等后续动作。根据 `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\scenes\jiayuguan-meter-outage\scene.json`、`D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\jiayuguan-meter-outage\SKILL.md`、`D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\jiayuguan-meter-outage\scripts\collect_outage_events.js` 以及两份规则资产,当前最严谨的结论是:packaged JS collector 已经实现输入驱动的 `monitor-snapshot` 归一化 / 比较逻辑,会从 outage events 与 service orders 计算 `pending/audit/processed`、解析 monitor/dispose logs、推导 `pending_ids` / `new_pending_ids`、输出 `success/partial/empty/blocked` 状态,并附带 source endpoint 常量、localhost 端点、desk 规则来源、配置基础页标记与身份模型元数据;更强的业务工作流证据则主要存在于 desk 规则资产中,证据等级分别为 `code-confirmed`。 + +必须明确区分以下几层: + +1. packaged runtime-snapshot-collector:`collect_outage_events.js` 已直接实现 outage/service-order 归一化、历史比较、身份模型暴露与标准快照输出,并显式携带 `workflow_rule_sources`、`config_base_page`、`config_base_role`、`packaged_collector_role` 与 `identity_model` 元数据,证据等级:`code-confirmed`。 +2. outage collection:业务监测规则直接请求 `outage/dhsd/dhsdList` 收集失电事件,证据等级:`code-confirmed`。 +3. service-order enrichment:业务监测规则再请求 `gdgl/active/service/order/list` 收集服务工单状态并补全 `audit` / `processed`,证据等级:`code-confirmed`。 +4. monitor-log comparison:业务监测规则通过 `getMonitorLog` 对比历史待处理列表并决定是否音频提醒,证据等级:`code-confirmed`。 +5. dispose-log dedupe:业务监测规则通过 `getDisposeLog` 做已派单去重并决定是否进入自动处理,证据等级:`code-confirmed`。 +6. marketing-token-dependent auto-processing and dispatch:自动处理规则显式读取营销系统 token,并基于营销系统查询结果、班组配置和自动派单接口推进派单,证据等级:`code-confirmed`。 + +但这些 `code-confirmed` 仍只证明“代码或规则资产中存在这些实现链路”,不代表运行时已验证成功。本文不声称任何运行时验证结论。 + +## 2. 证据来源 + +本分析统一只使用四个证据等级标签:`code-confirmed`、`contract-defined`、`implementation intent exists but not rigorous / buggy`、`no direct evidence / candidate only`。 + +1. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\jiayuguan-meter-outage\scripts\collect_outage_events.js` + - 直接定义 `SOURCE_GROUPS`、`LOCAL_SERVICE_ENDPOINTS`、`WORKFLOW_RULE_SOURCES`、`CONFIG_BASE_PAGE`、`IDENTITY_MODEL`,并实现 outage/service-order 分类、monitor/dispose log 解析比较、`new_pending_ids` 推导、`success/partial/empty/blocked` 状态判定,以及带 `evidence` / `identity_model` 的 `monitor-snapshot` 输出,证据等级:`code-confirmed`。 +2. `D:\desk\智能体资料\大四区报告监测项\户表失电-嘉峪关_业务监测配置.txt` + - 直接实现失电事件采集、服务工单状态补充、monitor log 比较、dispose log 去重、音频提醒与监测日志写入,证据等级:`code-confirmed`。 +3. `D:\desk\智能体资料\大四区报告监测项\户表失电-嘉峪关_自动处理配置.txt` + - 直接实现营销 token 读取、营销系统用户查询、工单编号获取、班组分配、自动派单请求、音频提醒、处置日志写入,以及备用短信函数定义,证据等级:`code-confirmed`。 +4. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\jiayuguan-meter-outage\SKILL.md` + - 定义“失电事件采集与工单状态采集要分开,再组合成一份快照;下游提醒与自动派单不应重定义采集成功”的运行契约,证据等级:`contract-defined`。 +5. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\jiayuguan-meter-outage\references\collection-flow.md` + - 定义以配置页为入口、组合 outage-event collection、service-order enrichment、历史比较和 auto-processing context 的流程,证据等级:`contract-defined`。 +6. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\jiayuguan-meter-outage\references\data-quality.md` + - 定义 pending / audit / processed 的来源语义、partial 规则与依赖告警,证据等级:`contract-defined`。 +7. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\scenes\jiayuguan-meter-outage\scene.json` + - 声明场景分类、输入 `time`、依赖与动作,证据等级:`code-confirmed`。 +8. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\scenes\jiayuguan-meter-outage\scene.draft.json` + - 暴露对 marketing token context 和 `trigger-alert` / `auto-processing` 是否进一步拆分的待定整理,证据等级:`no direct evidence / candidate only`。 + +## 3. 实际入口与运行边界 + +实际入口在 `scene.json` 中已固定:场景页面入口为 `index.html`,技能工具名为 `jiayuguan-meter-outage.collect_outage_events`,输出类型为 `monitor-snapshot`,输入为 `time`,这些都属于 `code-confirmed`。 + +其中 `assets/scene-snapshot/index.html` 只应被视为配置基础页(例如班组、联系人、范围维护),不应被当作规则 workflow 的主执行证据。 + +运行边界方面,需要特别强调 packaged collector 与 rule workflow 的分层: + +- packaged JS runtime collector 的直接能力边界:它已经能基于输入 `outage_events`、`service_orders`、`monitor_logs`、`dispose_logs` 做 `pending/audit/processed` 归一化、历史比较、`new_pending_ids` 推导与 `success/partial/empty/blocked` 判定,并公开两个上游 source endpoint、一组 localhost endpoint、desk 规则来源、配置基础页角色与身份模型元数据;但它仍是输入驱动归一化 collector,不直接发起浏览器请求,也不直接承载完整业务 workflow,证据等级:`code-confirmed`。 +- 更强的业务流程边界,主要体现在 desk 规则资产:先采集户表失电事件,再请求服务工单列表补充状态,再做 monitor/dispose 日志比较,最后才决定提醒或自动处理,证据等级:`code-confirmed`。 + +因此,本场景不能被描述成“packaged collector 已完整实现嘉峪关户表失电实时工作流”。更严谨的说法是:packaged collector 已实现可测试的输入驱动快照归一化 / 比较逻辑;较强 workflow 证据主要在 desk 规则资产中,证据等级:`code-confirmed`。 + +此外,`collection-flow.md` 与 `SKILL.md` 都明确要求把 outage collection、service-order enrichment、历史比较与下游 auto-processing 分开理解;这是运行边界契约,证据等级:`contract-defined`。 + +## 4. 代码已证实的实际操作流程 + +### 4.1 packaged runtime-snapshot-collector 已证实流程 + +`collect_outage_events.js` 中现在能严格确认: + +1. 调用 `collectOutageEvents(input)`,读取 `input.outage_events`、`input.service_orders`、`input.monitor_logs || input.monitor_log`、`input.dispose_logs || input.dispose_log`、`input.local_write_failures`、`input.blocked_reason` 等输入。 +2. 通过 `buildOutageContext(...)` 从 outage events 提取 `pending_ids`、`eventIds` 与 `eventIdsByConsNo`,并通过 `classifyServiceOrders(...)` 基于 `gdztmc` 计算 `audit` / `processed`。 +3. 解析 monitor/dispose logs,识别 malformed payload,并结合 `consNo` 与 `eventId` 的映射推导 `new_pending_ids`。 +4. 对未知工单状态、日志缺失、日志解析失败、缺失 event identity、identity crosswalk ambiguity、本地写失败等情况记录 `partial_reasons`。 +5. 按 `blocked > partial > empty > success` 的优先级计算 `status`,返回 `type: "monitor-snapshot"`、`scene: "jiayuguan-meter-outage"`、`pending`、`audit`、`processed`、`pending_ids`、`new_pending_ids`、`status`、`partial_reasons`。 +6. 在返回对象中附带 `evidence.workflow_rule_sources`、`evidence.config_base_page`、`evidence.config_base_role`、`evidence.packaged_collector_role = "runtime-snapshot-collector"`,以及 `identity_model`。 +7. 模块额外导出 `SOURCE_GROUPS`、`LOCAL_SERVICE_ENDPOINTS`、`WORKFLOW_RULE_SOURCES`、`CONFIG_BASE_PAGE`、`IDENTITY_MODEL`。 + +以上都属于 `code-confirmed`。 + +### 4.2 业务监测规则已证实流程 + +`户表失电-嘉峪关_业务监测配置.txt` 直接证实了以下分段流程: + +1. outage collection:通过 `BrowserAction(... outage/dhsd/dhsdList ...)` 查询近两天到当天的失电事件,并把每条 `consNo` 放入 `idList`,证据等级:`code-confirmed`。 +2. service-order enrichment:随后通过 `BrowserAction(... gdgl/active/service/order/list ...)` 查询当天工单列表,并按 `gdztmc == "待审核"` / `gdztmc == "已归档"` 分别累计 `audit` 与 `processed`,证据等级:`code-confirmed`。 +3. monitor-log comparison:通过 `getMonitorLog` 读取历史 `pendingList`,对比当前 `idList`,如发现新增待处理则触发音频提醒,并把快照写入 `setMonitorData` / `setMonitorLog`,证据等级:`code-confirmed`。 +4. dispose-log dedupe:通过 `getDisposeLog` 读取历史处置日志,解析 `orderID` 后提取其中 `id`,再以 `eventId` 为键从当前失电事件中筛出未处置事件 `pendingList`,证据等级:`code-confirmed`。 +5. 若存在未处置事件,则把 `pendingList` 塞给 `_this.queueObj.pendingList` 并触发 `_this.autoTask()`;否则直接 `_this.processQueue()`,证据等级:`code-confirmed`。 + +### 4.3 自动处理规则已证实流程 + +`户表失电-嘉峪关_自动处理配置.txt` 直接证实: + +1. 自动处理依赖营销系统 token:代码从 `localStorage["markYXObj"]` 中读取 `token` 与 `loginUserInfo`,证据等级:`code-confirmed`。 +2. 自动处理先按 `eqPsrName` 合并事件,再读取 `getClassList` 获取班组配置,证据等级:`code-confirmed`。 +3. 用营销系统接口 `queryEleCust` 按 `consNo` 查询用户营销归属,再据此确定 `ecssMgtOrgCode`,证据等级:`code-confirmed`。 +4. 之后还会调用 `gdgl/zdfw/tgforderzdfw/gdbh` 获取工单编号,再调用 `gdgl/active/service/order/saveAndSend` 发起自动派单,证据等级:`code-confirmed`。 +5. 自动派单成功 / 失败 / 异常分支都会触发不同音频提醒,并写 `setDisposeLog`,证据等级:`code-confirmed`。 +6. 短信函数 `msgFC` 在自动处理规则中被定义,但当前成功分支里的短信发送代码被整体注释掉,因此“短信通道已成为当前有效工作流”不能被写成稳定事实,证据等级:`implementation intent exists but not rigorous / buggy`。 + +## 5. 标准化抽象流程 + +若为 command-center 做严格抽象,本场景更合理的标准化流程应写成: + +1. 接收监测任务输入 `time`。 +2. 单独采集 outage events。 +3. 单独采集 service-order states,并用其补充 `audit` / `processed`。 +4. 使用 monitor log 做待处理比较,判断提醒语义。 +5. 使用 dispose log 做已处置去重,筛出需要自动处理的事件集合。 +6. 先形成或保留监测快照语义。 +7. 若满足条件,再进入依赖营销 token 的自动处理 / 派单流程。 +8. 记录音频、日志与处置结果等下游动作。 + +其中第 1 步可由 packaged collector 的显式输入 `time` 支撑,第 2、3、4、5、6 步可由 packaged collector 的输入驱动归一化 / 比较逻辑支撑,证据等级:`code-confirmed`;第 7、8 步主要由规则资产直接支撑,证据等级:`code-confirmed`;“这些步骤应被分离理解、下游动作不应覆盖采集成功语义”的边界来自 `SKILL.md` / references,证据等级:`contract-defined`。 + +如果把上述流程进一步说成“已由 packaged collector 严格统一承载实时 outage 请求、service-order 查询与自动派单副作用”,则不严谨,因为这些更强 workflow 证据主要来自 desk 规则资产而不是 packaged collector,证据等级只能降为 `implementation intent exists but not rigorous / buggy`。 + +## 6. 输入、上下文与依赖 + +### 输入 + +- `time` 是 scene 与 packaged script 共同声明的显式输入,证据等级:`code-confirmed`。 +- 业务监测规则对失电事件使用“近两天到今天”的 `offTime` 查询窗,对服务工单使用“当天”的 `createTime` 查询窗,证据等级:`code-confirmed`。 +- “当前 outage 和 service-order query windows 都属于实际输入的一部分”在 reference 中被明确说明,证据等级:`contract-defined`。 + +### 运行上下文 + +- 平台 session、org/user 上下文、浏览器 `BrowserAction` 能力在规则资产中直接使用,证据等级:`code-confirmed`。 +- marketing token context 在自动处理规则中是实际依赖,而不仅仅是文档说法,证据等级:`code-confirmed`。 +- reference 也把 marketing token context 明确列为 downstream enrichment / dispatch 依赖,证据等级:`contract-defined`。 + +### 依赖 + +- `scene.json` 声明 `browser`、`local-service`、`outage-source`、`service-order-source`、`history-log`,证据等级:`code-confirmed`。 +- 业务监测规则直接使用 `outage/dhsd/dhsdList`、`gdgl/active/service/order/list`、`getMonitorLog`、`setMonitorData`、`setMonitorLog`、`getDisposeLog`、`setAudioPlayLog`,证据等级:`code-confirmed`。 +- 自动处理规则直接使用营销系统 `queryEleCust`、工单编号接口 `gdgl/zdfw/tgforderzdfw/gdbh`、自动派单接口 `gdgl/active/service/order/saveAndSend`、`setDisposeLog` 与 `setAudioPlayLog`,证据等级:`code-confirmed`。 +- `scene.draft.json` 中 marketing token context 是否应提升为正式 dependency 仍是待确认项,因此在标准配置整理上属于 `no direct evidence / candidate only`。 + +## 7. 输出结构 + +当前输出结构需要分层描述。 + +### 7.1 packaged runtime collector 已直接定义的输出 + +`collect_outage_events.js` 直接定义: + +- `type: "monitor-snapshot"` +- `scene: "jiayuguan-meter-outage"` +- `time` +- `pending` +- `audit` +- `processed` +- `pending_ids` +- `new_pending_ids` +- `status` +- `partial_reasons` +- `evidence.workflow_rule_sources` +- `evidence.config_base_page` +- `evidence.config_base_role` +- `evidence.packaged_collector_role` +- `identity_model` + +以上全部属于 `code-confirmed`。 + +### 7.2 业务监测规则已展示的实际快照字段语义 + +业务监测规则直接构造了: + +- `time` +- `type: "户表失电-嘉峪关"` +- `pending` +- `pendingList` +- `audit` +- `processed` + +这说明规则层快照对象与 packaged stub 的标准字段命名并不完全一致,尤其是 `pendingList` vs `pending_ids`、`type` vs `scene`,证据等级:`code-confirmed`。 + +### 7.3 `new_pending_ids` 的证据强度与身份不一致问题 + +`SKILL.md`、reference 与 `data-quality.md` 把 `new_pending_ids` 当成目标输出的一部分,证据等级:`contract-defined`。但当前规则资产里更强的直接事实是: + +- monitor pending list 使用的是 `consNo`,即 `idList.push(item.consNo)`,证据等级:`code-confirmed`; +- dispose dedupe 使用的是 `eventId`,即比较 `resList.indexOf(y.eventId)`,证据等级:`code-confirmed`。 + +这意味着当前实现存在明显身份不一致:监测 pending 列表是 `consNo` 视角,而处置去重是 `eventId` 视角。因而“`pending_ids` / `new_pending_ids` 已被当前实现严谨统一定义”不能成立,证据等级:`implementation intent exists but not rigorous / buggy`。 + +## 8. 下游动作证据表 + +| 下游动作 | 当前证据 | 证据等级 | 严谨结论 | +| --- | --- | --- | --- | +| 返回 `monitor-snapshot` runtime collector 输出 | `collect_outage_events.js` 直接返回对象 | `code-confirmed` | packaged JS 直接证明标准 snapshot 字段、状态判定、身份说明与 collector metadata 已存在。 | +| 失电事件采集 | 业务监测规则调用 `outage/dhsd/dhsdList` | `code-confirmed` | outage collection 在规则资产中直接存在。 | +| 服务工单状态补充 | 业务监测规则调用 `service/order/list` 并按 `gdztmc` 分桶 | `code-confirmed` | service-order enrichment 直接存在。 | +| monitor-log 比较 | 业务监测规则调用 `getMonitorLog` 并对比 `consNo` 列表 | `code-confirmed` | 历史比较逻辑直接存在。 | +| dispose-log 去重 | 业务监测规则调用 `getDisposeLog` 并按 `eventId` 过滤 | `code-confirmed` | 去重逻辑直接存在,但身份键与 monitor pending list 不一致。 | +| 音频提醒调用 | 业务监测规则和自动处理规则都调用 `mac.audioPlay(...)` | `code-confirmed` | 只能确认规则层存在音频提醒调用。 | +| 自动派单请求 | 自动处理规则调用 `service/order/saveAndSend` | `code-confirmed` | 自动派单请求分支可直接定位。 | +| 依赖营销 token 的用户查询 | 自动处理规则调用营销系统 `queryEleCust`,请求头带 `auth_token` | `code-confirmed` | 自动处理对 marketing token 有明确硬依赖。 | +| `setDisposeLog` 成功 / 失败 / 异常写入 | 自动处理规则各分支都写 `setDisposeLog` | `code-confirmed` | 处置日志写入分支存在。 | +| 短信发送通道 | 自动处理规则定义 `msgFC`,但成功分支短信代码被注释 | `implementation intent exists but not rigorous / buggy` | 说明短信意图存在,但当前读取到的有效工作流未严格启用。 | +| `pending_ids` / `new_pending_ids` 严格统一 | skill/reference 有目标要求,但规则层 `consNo` 与 `eventId` 混用 | `implementation intent exists but not rigorous / buggy` | 当前身份模型不统一,不能写成严谨既成事实。 | + +## 9. 当前代码疑点 / 不严谨点 + +1. 最关键的不严谨点是身份不一致:monitor pending list 以 `consNo` 作为待处理标识,而 dispose dedupe 以 `eventId` 作为去重标识。这会让 `pending_ids`、`new_pending_ids` 与“已处置集合”的语义难以严格对齐,证据等级:`implementation intent exists but not rigorous / buggy`。 +2. packaged collector 与规则资产输出命名仍不一致:collector 使用 `scene`、`pending_ids`、`new_pending_ids`,规则对象使用 `type`、`pendingList`,证据等级:`code-confirmed`。 +3. `SKILL.md` 明确要求把 outage collection 与 service-order enrichment 分离理解;当前规则确实这样做了,但 packaged stub 没有承载这层结构,因此如果 command-center 只读 packaged stub 会低估真实 workflow,证据等级:`code-confirmed`。 +4. 自动处理强依赖 marketing token,但 `scene.json` 现有正式 dependencies 没把它显式列出;`scene.draft.json` 已把这点作为待确认项,说明标准依赖建模尚未闭合,证据等级:`implementation intent exists but not rigorous / buggy`。 +5. 自动处理规则中短信发送函数虽然存在,但主成功路径短信代码被注释,说明短信通道更像保留意图而非当前可靠工作流,证据等级:`implementation intent exists but not rigorous / buggy`。 +6. 本文不能根据规则中存在自动派单和音频分支,就声称这些分支已经过运行时验证;任何这种表述都应避免。 + +## 10. 对 command-center 标准配置的修订建议 + +1. 对本场景应显式拆分两层证据: + - `packaged_collector`: `collect_outage_events.js` 的 runtime snapshot collector、状态判定、历史比较与 metadata(规则来源、配置基础页角色、身份模型),证据等级:`code-confirmed`; + - `rule_asset_workflow`: 规则资产中的 outage collection、service-order enrichment、历史比较与自动处理流程,证据等级:`code-confirmed`。 +2. 标准工作流建议强制拆成五段: + - `outage_collection` + - `service_order_enrichment` + - `monitor_log_comparison` + - `dispose_log_dedupe` + - `marketing_token_dependent_auto_processing` + 这些拆分都能由现有规则资产直接支撑,证据等级:`code-confirmed`。 +3. 标准配置中应单独增加 `identity_model_note`,明确当前监测 pending list 基于 `consNo`,而 dispose dedupe 基于 `eventId`,两者尚未统一,证据等级:`implementation intent exists but not rigorous / buggy`。 +4. 对 dependencies 建议把 `marketing-token-context` 提升为显式依赖项,因为自动处理规则确实直接读取并使用营销 token,证据等级:`code-confirmed`;但“如何在标准 scene schema 中表达”目前仍是配置整理问题,证据等级:`implementation intent exists but not rigorous / buggy`。 +5. 对输出 schema 建议区分: + - `canonical_snapshot_fields`: `pending_ids` / `new_pending_ids` 等标准字段; + - `observed_rule_fields`: `pendingList` / `type` 等规则字段。 + 并额外记录 `pending_identity = consNo`、`dispose_identity = eventId` 的差异,避免误建模。 + +## 11. 最终严谨结论 + +关于 `jiayuguan-meter-outage`,当前最可靠的结论是:仓库已经存在一个可测试的 packaged JS runtime collector,以及两份更强的 desk 规则脚本实现(`D:\desk\智能体资料\大四区报告监测项\户表失电-嘉峪关_业务监测配置.txt`、`D:\desk\智能体资料\大四区报告监测项\户表失电-嘉峪关_自动处理配置.txt`)。其中 packaged collector 已直接实现 outage/service-order 归一化、monitor/dispose log 比较、`new_pending_ids` 推导与 `success/partial/empty/blocked` 状态判定;业务监测规则直接证实了 outage collection、service-order enrichment、monitor-log comparison、dispose-log dedupe 与音频提醒 / 监测日志写入;自动处理规则则直接证实了依赖 marketing token 的用户归属查询、工单编号获取、自动派单请求以及音频 / 处置日志副作用分支,证据等级:`code-confirmed`。 + +但同样必须严格说明:更强 workflow 证据主要在 desk 规则资产中,而不是 packaged collector;因此不能把本场景描述成“packaged collector 已严谨实现全部实时业务流程”。此外,当前实现仍存在关键身份不一致问题:monitor pending list 使用 `consNo`,dispose dedupe 使用 `eventId`。这说明本场景虽然 workflow 证据较强,但 `pending_ids` / `new_pending_ids` 的统一身份模型仍不严谨,最适合被描述为“packaged collector 已具备输入驱动快照归一化能力、desk rule-asset workflow 较强、且身份键需要在 command-center 标准配置中显式澄清”的 monitor scene。 \ No newline at end of file diff --git a/docs/superpowers/specs/2026-04-08-jinchang-business-environment-weekly-report-operation-analysis.md b/docs/superpowers/specs/2026-04-08-jinchang-business-environment-weekly-report-operation-analysis.md new file mode 100644 index 0000000..40f02ad --- /dev/null +++ b/docs/superpowers/specs/2026-04-08-jinchang-business-environment-weekly-report-operation-analysis.md @@ -0,0 +1,143 @@ +# jinchang-business-environment-weekly-report 操作分析 + +## 1. 场景概述 + +`jinchang-business-environment-weekly-report` 对应“国网金昌供电公司营商环境周例会报告”场景,目标是采集多来源指标并组装为分区结构化周报。根据 `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\scenes\jinchang-business-environment-weekly-report\scene.json`、`D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\jinchang-business-environment-weekly-report\SKILL.md` 与 `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\jinchang-business-environment-weekly-report\scripts\collect_business_environment_metrics.js`,当前已被代码直接证实的是:打包脚本定义了四个 section template、空主表、`period` 字段、`status: "ok"` 与 `partial_reasons: []`,证据等级:`code-confirmed`。 + +同时必须明确说明:当前 packaged script 更强地定义了 artifact schema / section template,而没有同等强度地定义真实浏览器采集、跨系统查询、period 对齐或导出执行逻辑。换言之,本场景当前更像“结构化周报模板脚本”,而不是“已被脚本严格实现的多源实时采集器”,证据等级:`code-confirmed`。 + +## 2. 证据来源 + +本分析统一只使用四个证据等级标签:`code-confirmed`、`contract-defined`、`implementation intent exists but not rigorous / buggy`、`no direct evidence / candidate only`。凡涉及脚本直接定义的 schema / section template,标为 `code-confirmed`;凡涉及将真实采集结果映射进这些结构的运行语义,如脚本未直接实现,则不高于 `contract-defined`。 + +1. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\jinchang-business-environment-weekly-report\scripts\collect_business_environment_metrics.js` + - 直接定义四个 section template:`abnormal-transformer-monitoring`、`power-outage-monitoring`、`work-order-acceptance`、`dispatch-summary`,并返回空 artifact,证据等级:`code-confirmed`。 +2. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\jinchang-business-environment-weekly-report\SKILL.md` + - 说明应读取周范围、校验会话、收集多个 metric group、映射到 report sections、必要时标记 partial,并在输出里返回 `region`、`period`、缺失 section、周期对齐问题等。它主要定义目标契约与运行意图,证据等级以 `contract-defined` 和 `implementation intent exists but not rigorous / buggy` 为主。 +3. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\scenes\jinchang-business-environment-weekly-report\scene.json` + - 声明场景输入为 `period`,依赖包括 `browser`、`multi-source`、`local-report-service`,动作包括 `query` / `collect-report` / `aggregate-sections`,证据等级:`code-confirmed`。 +4. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\jinchang-business-environment-weekly-report\references\collection-flow.md` + - 描述周范围读取、跨系统会话校验、多指标组采集、section 装配与下游导出关系,证据等级:`contract-defined`。 +5. `D:\data\ideaSpace\rust\sgClaw\claw\claw\skills\skill_staging\skills\jinchang-business-environment-weekly-report\references\data-quality.md` + - 描述完整结果、partial 规则、弱点区域与 empty/failure 区分,证据等级:`contract-defined`。 +6. `D:\data\ideaSpace\rust\sgClaw\claw-new\docs\superpowers\specs\2026-04-08-command-center-virtual-employee-inventory.json` + - 归纳出 workflow、key_fields、status_model 等 command-center 视图;它能帮助识别当前整理结果,但不应被当成比原始 scene/skill/script 更强的实现证据,证据等级:`no direct evidence / candidate only`(仅限 inventory 不能单独证明 packaged script 已实现的部分)。 + +## 3. 实际入口与运行边界 + +实际入口在 `scene.json` 中已固定:场景页面入口为 `index.html`,技能调用为 `jinchang-business-environment-weekly-report.collect_business_environment_metrics`,输出 artifact 类型为 `report-artifact`,这些都属于 `code-confirmed`。 + +运行边界方面,当前仓库能确认的内容是: + +- 对外输入名为 `period`,证据等级:`code-confirmed`。 +- 需要浏览器页面、多源系统访问与本地报告服务,证据等级:`code-confirmed`。 +- 参考资料要求按周范围收集多个指标组并组装 section,证据等级:`contract-defined`。 + +但“真实 collector 已在 packaged script 中实现多源访问、登录态校验、周期一致性检查”这一说法并不成立。当前脚本只返回空 section 模板,因而其可直接证明的运行边界仍是 schema stub;多源采集与组装仅体现为明确实现意图,而非已严格落地逻辑,证据等级:`implementation intent exists but not rigorous / buggy`。 + +## 4. 代码已证实的实际操作流程 + +当前代码能严格确认的实际操作流程如下: + +1. 调用 `collectBusinessEnvironmentMetrics(input)`。 +2. 读取 `input.period || ""` 写入 artifact 的 `period`。 +3. 构造空主表:`columns: []`、`rows: []`。 +4. 基于 `SECTION_TEMPLATES` 复制出 4 个 section,并确保每个 section 的 `rows: []`。 +5. 返回 `type: "report-artifact"`、`report_name`、`status: "ok"`、`partial_reasons: []`。 + +这些步骤均可在 `collect_business_environment_metrics.js` 中直接定位,证据等级:`code-confirmed`。 + +以下步骤虽然在 `SKILL.md` 与 reference 中多次出现,但并未被脚本直接实现:读取页面周范围、校验多源 token/session、采集变压器监测/停电监测/工单受理/调度总结等真实数据、检查 period alignment、生成最终文档或导出结果。这些内容不能写成“代码已证实的实际流程”,最多只能分别标记为 `contract-defined` 或 `implementation intent exists but not rigorous / buggy`。 + +## 5. 标准化抽象流程 + +若做 command-center 的标准化抽象,本场景可整理为: + +1. 接收周报任务输入。 +2. 解析页面周范围并绑定会话上下文。 +3. 访问多个业务来源,按指标组采集数据。 +4. 按四类 section 模板/列结构承载结果。 +5. 形成统一 `report-artifact`。 +6. 视情况执行导出/日志等下游动作。 + +其中第 4 步仅“四类 section 名称与列结构存在”是 `code-confirmed`;“真实采集结果已被映射进四类 section”仍只属于 `contract-defined` 的流程约定。第 2、3、6 步主要来自 skill/reference 的运行说明,证据等级应为 `contract-defined`。如果把这些步骤进一步写成“当前 packaged script 已可靠执行”,就会过度推断,证据等级只能降为 `implementation intent exists but not rigorous / buggy`。 + +## 6. 输入、上下文与依赖 + +### 输入 + +- `period` 是 scene 与脚本已共同声明的业务输入,证据等级:`code-confirmed`。 +- `SKILL.md` 还要求输出中包含 `region`,但 scene 输入与 script 返回结构都未显式声明 `region` 字段,证据等级:`implementation intent exists but not rigorous / buggy`。 + +### 运行上下文 + +- `session`、多源系统可访问性、缓存 token 可用性等在 scene/reference 中被描述,scene 元数据层面的存在是 `code-confirmed`,更具体的业务语义是 `contract-defined`。 +- 页面历史报告区、执行日志区被 reference 提到,但被明确描述为下游历史/辅助区域,而非主数据源,证据等级:`contract-defined`。 + +### 依赖 + +- `browser`、`multi-source`、`local-report-service` 可直接在 scene 中定位,证据等级:`code-confirmed`。 +- `/a_js/YPTAPI.js`、`http://localhost:13313/ReportServices/*`、导出或 surface 服务来自 reference,证据等级:`contract-defined`。 + +## 7. 输出结构 + +当前脚本直接证实的输出结构包括: + +- `type: "report-artifact"` +- `report_name: "jinchang-business-environment-weekly-report"` +- `period` +- `columns: []` +- `rows: []` +- `sections` 包含 4 个固定模板 +- `status: "ok"` +- `partial_reasons: []` + +这些均属于 `code-confirmed`。 + +四个固定 section template 分别为: + +1. `abnormal-transformer-monitoring` +2. `power-outage-monitoring` +3. `work-order-acceptance` +4. `dispatch-summary` + +它们的列结构也都在脚本中已明确定义,证据等级:`code-confirmed`。 + +但 `SKILL.md` 输出部分提到应返回 `region`、missing sections、period alignment issues、downstream export/logging failures。除 `period` 与空 `partial_reasons` 字段外,其余诊断信息都没有在脚本中被明确建模。尤其是 `region` 出现在输出文案中,却没有进入 artifact schema,这是一处场景特定的不一致点,证据等级:`implementation intent exists but not rigorous / buggy`。 + +## 8. 下游动作证据表 + +| 下游动作 | 当前证据 | 证据等级 | 严谨结论 | +| --- | --- | --- | --- | +| 返回分区化 `report-artifact` | `collect_business_environment_metrics.js` 直接返回对象 | `code-confirmed` | 已有稳定 artifact 壳,但内容为空模板。 | +| 四类 section 模板存在 | 脚本直接定义 `SECTION_TEMPLATES` | `code-confirmed` | 只能确认 section schema 已确定,不能确认 section 数据采集已实现。 | +| 多源指标采集 | 只在 `SKILL.md` / `collection-flow.md` 中描述 | `contract-defined` | 契约上明确需要多源采集,但当前 packaged script 未直接证明。 | +| 周期一致性判断 | `SKILL.md` / `data-quality.md` 提到 period alignment | `contract-defined` | 存在质量要求,但脚本没有 period alignment 逻辑。 | +| 导出周报文档 | reference 提到 localhost export/surface services | `contract-defined` | 属于下游依赖定义,不等于当前 skill 已执行文档导出。 | +| 报告日志写入 | `SKILL.md` / reference 提到 report-log | `contract-defined` | 只能确认有该下游概念,当前脚本没有调用证据。 | +| `partial` 结果建模 | 脚本保留 `partial_reasons`,reference 定义 partial 语义 | `implementation intent exists but not rigorous / buggy` | 字段壳子存在,但没有真实 partial 分支。 | +| `region` 输出 | 只在 `SKILL.md` 输出说明中出现 | `implementation intent exists but not rigorous / buggy` | 表达上存在地区语义,但未进入 scene 输入或 artifact schema。 | + +## 9. 当前代码疑点 / 不严谨点 + +1. `region` 出现在 `SKILL.md` 的输出项中,但 scene.json 与脚本 schema 都没有显式 `region` 字段;这意味着“金昌”可能只是场景名称隐含语义,而非可追踪输出字段,证据等级:`implementation intent exists but not rigorous / buggy`。 +2. 脚本固定返回空 `columns` 与空 `rows`,说明主表并不是核心结构,真正的核心是 4 个 section template;如果 command-center 仍把它当通用主表型报表,容易误建模,证据等级:`code-confirmed`。 +3. `status` 固定为 `"ok"`,与 skill/reference 所要求的 partial / empty / blocked 区分不一致,证据等级:`code-confirmed` 对现状成立,而目标状态模型仅为 `contract-defined`。 +4. 参考资料强调多源系统会话与 token 缓存,但脚本完全没有这些依赖的执行路径,因此“多源采集能力已落地”不能被提升为当前代码事实,证据等级:`implementation intent exists but not rigorous / buggy`。 +5. 导出与报告历史区域在 reference 中存在,但未被脚本直接接入;若在 command-center 中直接把它配置为“可导出 Word/Excel”现状,将属于过度推断,证据等级:`no direct evidence / candidate only`(就 packaged script 执行层而言)。 + +## 10. 对 command-center 标准配置的修订建议 + +1. 本场景应把核心输出建模为 `section-based report artifact`,而不是普通二维表。原因是脚本对四个 section template 的定义明显强于对主表的定义,证据等级:`code-confirmed`。 +2. 在标准配置中补充 `region_semantics` 或 `fixed_region` 字段,明确“金昌”究竟只是场景命名,还是应成为可展示/可审计输出的一部分。目前这是未闭合问题,证据等级:`implementation intent exists but not rigorous / buggy`。 +3. 状态模型建议拆分: + - 契约层声明 success / partial / empty / blocked,证据等级:`contract-defined`; + - 实现层当前只有固定 `ok` artifact stub,证据等级:`code-confirmed`。 +4. 给配置增加 `collection_evidence` 备注,明确当前 packaged script 更偏向 section schema 模板,而不是 live browser collector,避免后续调度器把它误当已完成的实时采集技能。 +5. 对 `downstream_effects` 建议增加 `implemented: false / not-directly-proven` 之类标记,以区分“场景上需要导出”与“脚本里已执行导出”。 + +## 11. 最终严谨结论 + +关于 `jinchang-business-environment-weekly-report`,当前最可靠的现状判断是:仓库已经存在一个四分区结构化周报 artifact 模板,四个 section 的名称与列 schema 已由 packaged script 直接定义,证据等级:`code-confirmed`。 + +但“已经实现真实浏览器多源采集、周期一致性校验、section 数据组装、最终导出与日志闭环”这一更强表述没有被脚本直接证明。相关行为主要由 `SKILL.md`、`collection-flow.md`、`data-quality.md` 与 scene 元数据定义目标流程和质量要求,因此应把它理解为“有明确契约和实现意图,但当前 packaged script 主要还是 schema/section stub”。此外,`region` 在输出话术中出现、却未进入 artifact schema,是本场景当前最需要在 command-center 标准配置中澄清的不严谨点。 \ No newline at end of file diff --git a/docs/多核浏览器管道API接口文档.docx b/docs/多核浏览器管道API接口文档.docx new file mode 100644 index 0000000000000000000000000000000000000000..e3e354efadcc82c7268d0a424ce93fbe00e1a109 GIT binary patch literal 85215 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