feat: add generated scene skill platform hardening
This commit is contained in:
@@ -0,0 +1,236 @@
|
||||
# Generated Scene Rectification Design
|
||||
|
||||
> **Status:** Draft
|
||||
> **Date:** 2026-04-17
|
||||
> **Author:** Codex
|
||||
|
||||
## Problem Statement
|
||||
|
||||
当前自动场景转 skill 流程虽然已经引入了 `Scene IR`、`workflowArchetype` 和 readiness 分级,但对营销类复杂报表场景仍存在三类致命偏差:
|
||||
|
||||
1. `sceneId` 会从中文场景名退化成低信息量标识,例如 `营销2.0零度户报表数据生成 -> 2-0`。
|
||||
2. bootstrap 会被 `localhost` 导出或辅助服务污染,导致内网入口域名解析错误。
|
||||
3. workflow 会在证据不完整时提前归类,导致 `paginated_enrichment` 场景缺失 `paginate`、`secondary_request` 等关键步骤证据。
|
||||
|
||||
这三个问题叠加后,会出现“结构上看似已生成 skill,实际上放到内网一定跑不通”的假阳性结果。现有生成器仍然偏向“模板填充”,没有形成一条对内网场景足够保守、可审计、可拒绝错误输出的整改链路。
|
||||
|
||||
## Rectification Goal
|
||||
|
||||
本次整改目标不是继续提升“生成成功率”,而是把生成器收敛成一个更稳的 `scene skill rectifier`,做到:
|
||||
|
||||
1. 不再产出 `2-0` 这类无业务语义的 `sceneId`。
|
||||
2. 不再让 `localhost`、静态资源地址、模板噪声参与 bootstrap 竞争。
|
||||
3. 不再在工作流证据缺失时冒然输出 `paginated_enrichment` 或其它高复杂 archetype。
|
||||
4. 不再把低可信生成结果伪装成“可直接内网试跑”的 skill。
|
||||
5. 为后续 mini 版 `skill-creator` 打下可复用的整改底座。
|
||||
|
||||
## Non-Goals
|
||||
|
||||
1. 不在本轮整改中解决全部历史场景兼容性。
|
||||
2. 不要求本轮整改覆盖登录态恢复、复杂鉴权、宿主浏览器差异。
|
||||
3. 不要求 LLM 单独完成中文场景语义恢复,整改仍以确定性证据优先。
|
||||
4. 不要求一步到位生成所有 browser workflow 细节;允许在 readiness 门禁前失败关闭。
|
||||
|
||||
## Current Failure Reconstruction
|
||||
|
||||
以 `营销2.0零度户报表数据生成` 为例,当前错误链路大致如下:
|
||||
|
||||
1. 目录名 fallback 经过仅保留 `[a-z0-9]` 的 slug 规则后,中文主体被剥离,只剩 `2-0`。
|
||||
2. URL 候选集合没有分层,`http://localhost:13313/...` 与 `http://yx.gs.sgcc.com.cn`、`http://yxgateway.gs.sgcc.com.cn/...` 被放在同一个 bootstrap 竞争池。
|
||||
3. 工作流分类优先命中通用的“多模式字段”信号,导致 archetype 判定先偏向 `multi_mode_request`。
|
||||
4. endpoint 集合又被 `${apiUrl}`、静态模板串、localhost 导出地址等噪声稀释,最终 workflow step 构造无法稳定提取“分页主请求 -> 逐户补数 -> 过滤 -> 导出”的完整证据。
|
||||
5. 生成器仍然给出可输出 skill,造成用户误以为该 skill 具备内网可运行性。
|
||||
|
||||
所以整改不能只修某一个 if 分支,而是必须同时修正命名链、bootstrap 链、workflow 链和 readiness 链。
|
||||
|
||||
## Rectification Principles
|
||||
|
||||
### 1. Fail Closed 优先于 Fail Open
|
||||
|
||||
当 `sceneId`、bootstrap、workflow 任一关键链路证据不足时,生成器必须降级、阻断或明确标红,而不是继续生成一个“看起来完整”的 skill。
|
||||
|
||||
### 2. 先判定证据类别,再消费证据
|
||||
|
||||
URL、函数名、分页变量、过滤条件、导出调用,必须先完成“证据分层”与“噪声剔除”,再参与 archetype 分类和模板编译。
|
||||
|
||||
### 3. Bootstrap 与 Export 必须解耦
|
||||
|
||||
内网业务入口域名与本地导出服务是两类完全不同的运行时概念。`localhost` 可以作为 export/downstream evidence,但绝不能作为 bootstrap candidate。
|
||||
|
||||
### 4. 命名必须具备业务可读性
|
||||
|
||||
`sceneId` 不是目录技术标识,而是 skill 的业务身份。任何低熵、数字化、占位式 id 都必须被视为无效结果。
|
||||
|
||||
### 5. Archetype 输出必须受完整工作流约束
|
||||
|
||||
`paginated_enrichment` 不是“有分页字段”就能输出,而必须同时满足主列表请求、分页证据、二次请求证据和聚合/过滤/导出链路中的最低组合。
|
||||
|
||||
## Target Architecture
|
||||
|
||||
```text
|
||||
source scene
|
||||
-> source scan
|
||||
-> evidence stratification
|
||||
-> naming chain
|
||||
-> bootstrap chain
|
||||
-> workflow chain
|
||||
-> archetype gating
|
||||
-> readiness grading
|
||||
-> skill generation or fail-closed report
|
||||
```
|
||||
|
||||
整改后的核心不是新增一个大模型步骤,而是在现有 `Scene IR` 前后补齐四道约束:
|
||||
|
||||
1. 命名约束
|
||||
2. bootstrap 约束
|
||||
3. workflow 约束
|
||||
4. readiness 约束
|
||||
|
||||
## Rectification Design
|
||||
|
||||
### Naming Chain Rectification
|
||||
|
||||
`sceneId` 整改的目标是让“中文目录名 -> 业务可读 sceneId”成为一条受控链路,而不是任由 fallback 退化。
|
||||
|
||||
整改方案如下:
|
||||
|
||||
1. `sceneId` 候选来源按优先级分层:
|
||||
- LLM 明确返回的业务语义 id
|
||||
- 确定性抽取出的英文业务关键词组合
|
||||
- 基于中文场景名的受控 transliteration / alias 规则
|
||||
- 最终 fallback 仅可作为 `invalid_candidate`,不可直接落盘
|
||||
2. 新增 `sceneId` 有效性校验:
|
||||
- 不能是纯数字或数字主导
|
||||
- 不能短于业务最小可读长度
|
||||
- 不能只由版本号或通用词组成
|
||||
- 不能与 `sceneName` 语义完全脱钩
|
||||
3. 对 `2-0`、`1-0`、`report`、`scene` 这类低熵 id 统一判为 `invalid_scene_id`。
|
||||
4. 一旦命中无效 id,生成器只能输出整改报告或要求人工确认,不允许直接生成正式 skill 目录。
|
||||
|
||||
这条链路的结果是:`sceneId` 从“字符串清洗结果”升级为“业务标识产物”。
|
||||
|
||||
### Bootstrap Chain Rectification
|
||||
|
||||
bootstrap 整改的目标是把 URL 候选集拆成不同证据层,彻底消除 `localhost` 污染。
|
||||
|
||||
整改方案如下:
|
||||
|
||||
1. 对 URL 候选先做角色分层:
|
||||
- `business_entry`
|
||||
- `business_api`
|
||||
- `gateway_api`
|
||||
- `export_service`
|
||||
- `local_helper`
|
||||
- `static_asset`
|
||||
- `template_noise`
|
||||
2. 角色识别规则要求:
|
||||
- `localhost`、`127.0.0.1`、`SurfaceServices`、`ReportServices` 默认归入 `export_service` 或 `local_helper`
|
||||
- `.js`、`.css`、模板占位 URL、字符串格式化残片归入 `static_asset` 或 `template_noise`
|
||||
- 页面常量中的 `sourceUrl`、首页入口地址、业务网关前缀优先归入 `business_entry` 或 `business_api`
|
||||
3. bootstrap 决策只允许消费:
|
||||
- `business_entry`
|
||||
- `business_api`
|
||||
- `gateway_api`
|
||||
4. 当 `business_entry` 与 `gateway_api` 并存时:
|
||||
- `expectedDomain` 取业务主域
|
||||
- API 前缀保留在 request evidence 中,不直接覆盖 target page
|
||||
5. 当只识别到 `localhost` 或噪声地址时,bootstrap 必须判为 `unresolved_bootstrap`,生成器直接降级。
|
||||
|
||||
这条链路的结果是:`localhost` 仍可保留为“导出依赖证据”,但永远不再有资格被提升成业务入口域名。
|
||||
|
||||
### Workflow Chain Rectification
|
||||
|
||||
workflow 整改的目标是从“字段特征分类”转为“请求链重建分类”。
|
||||
|
||||
整改方案如下:
|
||||
|
||||
1. 在 `Scene IR` 中把 workflow 证据拆成四层:
|
||||
- request evidence
|
||||
- pagination evidence
|
||||
- secondary request evidence
|
||||
- post-process evidence
|
||||
2. archetype 分类不再优先依赖泛化字段名如 `type/tab/mode/status`,而是优先依赖:
|
||||
- 是否存在主列表请求
|
||||
- 是否存在稳定分页变量组合
|
||||
- 是否存在逐项或逐批二次请求
|
||||
- 是否存在过滤、聚合或导出动作
|
||||
3. endpoint 进入工作流前必须经过归一化:
|
||||
- 去掉 `${apiUrl}`、格式化占位串、日志文本、异常字符串
|
||||
- 去掉 `localhost` export endpoint 对 archetype 的干扰
|
||||
- 合并同一业务 API 的不同拼接形态
|
||||
4. `paginated_enrichment` 的最小证据门槛改为:
|
||||
- 至少一个主列表请求
|
||||
- 至少一组分页变量
|
||||
- 至少一个二次请求入口或明确定义的逐户补数函数
|
||||
- 至少一个后处理动作:`filter`、`transform`、`export` 之一
|
||||
5. 如果只满足部分证据:
|
||||
- 可保留为 `candidate_paginated_enrichment`
|
||||
- 但不得进入正式 `paginated_enrichment` 编译路径
|
||||
6. `multi_mode_request` 只在“模式切换显著改变请求体、列定义或响应路径”时成立,不能仅凭通用字段名命中。
|
||||
|
||||
这条链路的结果是:营销类场景只有在真正重建出“分页 + 补数 + 后处理”证据后,才会进入对应编译器。
|
||||
|
||||
### Readiness Chain Rectification
|
||||
|
||||
readiness 整改的目标是把“能否生成”与“能否内网试跑”明确分开。
|
||||
|
||||
整改方案如下:
|
||||
|
||||
1. 新增关键门禁:
|
||||
- `scene_id_valid`
|
||||
- `bootstrap_resolved`
|
||||
- `workflow_complete_for_archetype`
|
||||
- `runtime_contract_compatible`
|
||||
2. 只有全部通过时,结果才可标为 `A` 或 `B`。
|
||||
3. 任一关键门禁失败时:
|
||||
- 结果只能是 `C`
|
||||
- UI 与报告中必须显式展示缺失项
|
||||
- 允许输出分析报告,但不应默认输出可运行 skill
|
||||
4. 对 `marketing-zero-consumer-report` 这类参考场景,readiness 最低通过条件应明确写死为:
|
||||
- 非退化 `sceneId`
|
||||
- bootstrap 指向 `yx.gs.sgcc.com.cn` 体系
|
||||
- workflow 含 `paginate`
|
||||
- workflow 含 `secondary_request`
|
||||
- workflow 含 `filter` 或 `export`
|
||||
|
||||
这条链路的结果是:生成器从“只要能写文件就算成功”切换为“只有通过门禁才算可试跑”。
|
||||
|
||||
## Superpowers Landing Strategy
|
||||
|
||||
本整改必须通过 `superpowers` 的 spec -> plan -> execution 三段式落地,不接受直接跳到零散修补。
|
||||
|
||||
落地顺序应为:
|
||||
|
||||
1. 先基于本设计补一份对应的 `docs/superpowers/plans` 执行计划。
|
||||
2. 再按计划拆解到 naming、bootstrap、workflow、readiness 四个任务包。
|
||||
3. 实施过程中严格以计划边界为准,不额外扩展到登录、鉴权、宿主接入等非本轮范围。
|
||||
|
||||
## File Impact
|
||||
|
||||
本设计预期主要影响以下区域:
|
||||
|
||||
| File | Responsibility |
|
||||
|------|----------------|
|
||||
| `frontend/scene-generator/generator-runner.js` | 命名 fallback、URL 分层、workflow 证据重建、门禁前分析 |
|
||||
| `frontend/scene-generator/llm-client.js` | sceneId 语义补全约束、证据摘要输入、低熵输出拦截 |
|
||||
| `frontend/scene-generator/server.js` | readiness 汇总、整改风险输出、生成阻断策略 |
|
||||
| `frontend/scene-generator/sg_scene_generator.html` | 显示 invalid sceneId、bootstrap 角色、workflow 缺证和 readiness 风险 |
|
||||
| `src/generated_scene/analyzer.rs` | 证据分类、endpoint 去噪、archetype 前置判断 |
|
||||
| `src/generated_scene/ir.rs` | 承载分层 evidence、candidate archetype、门禁状态 |
|
||||
| `src/generated_scene/generator.rs` | 按门禁决定是否允许进入编译器和正式输出 |
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
满足以下条件时,视为本整改设计达成目标:
|
||||
|
||||
1. 中文场景目录不再退化生成 `2-0`、`1-0` 等低熵 `sceneId`。
|
||||
2. `localhost`、`127.0.0.1`、导出服务地址不再进入 bootstrap 竞争链。
|
||||
3. `marketing-zero-consumer-report` 只有在具备 `paginate + secondary_request + post-process` 证据时才会进入 `paginated_enrichment` 编译路径。
|
||||
4. 证据不足时,系统输出整改报告和 readiness 风险,而不是默认生成可运行 skill。
|
||||
5. 生成器对外定位从“自动模板生成器”收敛为“带门禁的通用场景 skill 转化器”。
|
||||
|
||||
## Open Questions
|
||||
|
||||
1. `sceneId` 的中文转英文策略是引入固定 alias 词表,还是允许 LLM 先给候选再由规则校验收敛。
|
||||
2. `gateway_api` 与 `business_entry` 并存时,是否需要在 `Scene IR` 中同时保留 `entryDomain` 与 `apiDomain`。
|
||||
3. readiness 阻断后,默认是否仍允许用户手工确认并强制生成一个 `draft` skill 包。
|
||||
Reference in New Issue
Block a user