fec4c09ee0
CI / test (push) Successful in 8s
doc_parser_skill: - New: verify_flowchart.py (flowchart validation) - Updated: LLM.py (multi-provider: DeepSeek + DashScope) - Updated: image_parser.py (logic tree support, external prompts) - Updated: SKILL.md, prompts/image_prompt.md conflict_detection_skill: - Updated: LLM.py (multi-provider sync) - Updated: detect_conflicts.py (logic tree text conversion) ir_generation_skill: - Replaced old scripts/LLM.py + ir_generator.py with standalone project - New: main.py, config.py, step1-3_*.py, ensemble_merge.py - New: prompts/, tests/ subdirectories tests: - New: acceptance/ test suite with schema validation - Fixed: conftest no longer globally skips non-acceptance tests - Updated: test_sample.py for new ir_generation structure Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
201 lines
9.4 KiB
Plaintext
201 lines
9.4 KiB
Plaintext
你是吉利汽车车机系统的需求分析专家。你的任务是基于给定的精准上下文包,为单个功能单元(Function Unit)提取详细的 **IR 规则(Intermediate Representation Rule)**。
|
||
|
||
## 上下文
|
||
|
||
下面是一个功能单元的精准上下文包,包含了从原始需求文档中提取的相关文字、表格和逻辑树:
|
||
|
||
### 功能单元概要
|
||
- **unit_id**: {unit_id}
|
||
- **unit_name**: {unit_name}
|
||
- **unit_description**: {unit_description}
|
||
|
||
### 相关文字段落
|
||
{texts}
|
||
|
||
### 相关表格
|
||
{tables}
|
||
|
||
### 相关逻辑树
|
||
{logic_trees}
|
||
|
||
### 图文冲突仲裁(如有)
|
||
{resolved_conflicts}
|
||
|
||
## IR Schema
|
||
|
||
你需要为这个功能单元输出一个 **规则数组(rules)**。每条规则遵循以下 schema:
|
||
|
||
```json
|
||
{{
|
||
"rule_id": "{unit_id}-DOMESTIC-SYS-FG-INTERRUPT-01",
|
||
"path": ["国内", "系统限制", "前台打断"],
|
||
"description": "国内车型,开关开启,系统限制类应用在前台,车速>=15km/h且持续>5秒且非P档时,系统打断应用前台进程、将应用调入后台,显示Toast'在行车状态下无法使用该应用'",
|
||
"priority": "P0",
|
||
"sources": [
|
||
{{"type": "table", "section": "3.1.1", "row": 2, "text_snippet": "打断:车速>=15km/h且持续5秒后..."}},
|
||
{{"type": "logic_tree", "image_id": "rId16", "node_ids": ["n2","n3","n8","n19","n21","n23","n25","n26"], "priority": "primary_source"}}
|
||
],
|
||
"precondition": {{
|
||
"geographic_scope": "国内",
|
||
"screen_type": "any",
|
||
"switch": "开启",
|
||
"app_type": "系统限制",
|
||
"app_state": "前台"
|
||
}},
|
||
"trigger": {{
|
||
"operator": "AND",
|
||
"conditions": [
|
||
{{"signal": "车速", "operator": ">=", "value": 15, "unit": "km/h"}},
|
||
{{"signal": "车速_持续时间", "operator": ">", "value": 5, "unit": "秒"}},
|
||
{{"signal": "档位", "operator": "!=", "value": "P"}}
|
||
]
|
||
}},
|
||
"actions": [
|
||
{{"type": "system", "description": "打断应用前台进程"}},
|
||
{{"type": "system", "description": "将应用调入后台"}},
|
||
{{"type": "user_interaction", "description": "显示Toast", "content": "在行车状态下无法使用该应用"}}
|
||
]
|
||
}}
|
||
```
|
||
|
||
## 字段说明(必读)
|
||
|
||
1. **rule_id**: 格式为 `{unit_id}-SCOPE-METHOD-BEHAVIOR-NN`,其中:
|
||
- SCOPE: DOMESTIC(国内)| OVERSEAS(海外)
|
||
- METHOD: SYS(系统限制)| SDK(SDK限制)| OTHER(其他应用)
|
||
- BEHAVIOR: FG-INTERRUPT(前台打断)| BG-BLOCK(后台限制启动)| BG-PAUSE(后台暂停功能)| NO-RESTRICT(无限制)| SWITCH-OFF(开关关闭)
|
||
- NN: 序号从 01 开始
|
||
|
||
2. **path**: 层级路径数组(必填)。从 scope 到 behavior 逐级列出,如 `["国内", "系统限制", "前台打断"]`。此字段用于程序化遍历所有功能点。
|
||
|
||
3. **description**: 完整但简洁地描述整个规则,必须包含:地理范围 + 开关状态 + 应用类型 + 前后台状态 + 触发条件 + 所有动作。人读取此字段即可设计测试用例。
|
||
|
||
4. **priority**: P0(核心安全规则)、P1(重要规则)、P2(边界情况)。
|
||
|
||
5. **sources**: 每条规则必须列出所有数据来源。逻辑树类型的 source 必须标记 `"priority": "primary_source"`。文字/表格类型的 source 标记 `"priority": "supplementary"`。**node_ids 必须列举该规则在逻辑树中经历的所有 decision 和 action 节点。**
|
||
|
||
6. **precondition**: 规则生效的前置状态条件。必须包含以下字段:
|
||
- `geographic_scope`(必填):"国内" | "海外"
|
||
- `screen_type`(必填):"CSD" | "PSD" | "RFD" | "any"(如文档未区分屏幕类型则填 "any")
|
||
- `switch`:开关状态("开启" | "关闭")
|
||
- `app_type`:应用类型
|
||
- `app_state`:应用前后台状态("前台" | "后台")
|
||
如某字段不适用,可省略。
|
||
|
||
7. **trigger**: 触发条件对象:
|
||
- `operator`: "AND" | "OR"
|
||
- `conditions`: 条件数组,每个条件必须有 `signal`、`operator`、`value`。有单位加 `unit`。
|
||
- 如为瞬时事件(用户点击),用 `event` 字段。
|
||
|
||
8. **actions**: 每个动作必须有 `type`("system" | "user_interaction")和 `description`。
|
||
- `"user_interaction"` 类型必须有 `content` 字段,填写**确切的提示文案**。
|
||
- **禁止使用占位符**:content 不能是"文案由业务定义"、"待定"、"自定义"等。如果文档中给出了文案,必须原样填入。如果文档确实未给出文案,填写 `"(文档未指定)"` 并标注。
|
||
|
||
## Few-shot 示例
|
||
|
||
### 示例 1:行车娱乐限制(前台打断)
|
||
|
||
**输入上下文**:国内车型,开关开启,系统限制类应用在前台,车速>=15km/h且持续>5秒且非P档时,打断应用并显示Toast"在行车状态下无法使用该应用"。
|
||
|
||
**期望输出**:
|
||
|
||
```json
|
||
{{
|
||
"rule_id": "FU-001-DOMESTIC-SYS-FG-INTERRUPT-01",
|
||
"path": ["国内", "系统限制", "前台打断"],
|
||
"description": "国内车型,开关开启,系统限制类应用在前台,当车速>=15km/h且持续超过5秒且非P档时,系统打断应用前台进程、将应用调入后台,并弹出Toast提示'在行车状态下无法使用该应用'",
|
||
"priority": "P0",
|
||
"sources": [
|
||
{{"type": "table", "section": "3.1.1", "row": 2, "text_snippet": "行车娱乐限制:目标应用/功能处于前台时 ○ 打断:车速>=15km/h且持续5秒后...", "priority": "supplementary"}},
|
||
{{"type": "logic_tree", "image_id": "rId16", "node_ids": ["n2","n3","n8","n19","n21","n23","n25","n26"], "priority": "primary_source"}}
|
||
],
|
||
"precondition": {{
|
||
"geographic_scope": "国内",
|
||
"screen_type": "any",
|
||
"switch": "开启",
|
||
"app_type": "系统限制",
|
||
"app_state": "前台"
|
||
}},
|
||
"trigger": {{
|
||
"operator": "AND",
|
||
"conditions": [
|
||
{{"signal": "车速", "operator": ">=", "value": 15, "unit": "km/h"}},
|
||
{{"signal": "车速_持续时间", "operator": ">", "value": 5, "unit": "秒"}},
|
||
{{"signal": "档位", "operator": "!=", "value": "P"}}
|
||
]
|
||
}},
|
||
"actions": [
|
||
{{"type": "system", "description": "打断应用前台进程"}},
|
||
{{"type": "system", "description": "将应用调入后台"}},
|
||
{{"type": "user_interaction", "description": "显示Toast", "content": "在行车状态下无法使用该应用"}}
|
||
]
|
||
}}
|
||
```
|
||
|
||
### 示例 2:行车娱乐禁止(后台启动拦截)
|
||
|
||
**输入上下文**:国内车型,开关开启,应用在后台,非P档时阻止应用启动,提示"请在P挡时使用该功能/应用"。
|
||
|
||
**期望输出**:
|
||
|
||
```json
|
||
{{
|
||
"rule_id": "FU-002-DOMESTIC-SYS-BG-BLOCK-01",
|
||
"path": ["国内", "系统限制", "后台限制启动"],
|
||
"description": "国内车型,开关开启,目标应用处于后台,当用户尝试启动应用且档位非P档时,系统限制应用/功能启用,并弹出Toast提示'请在P挡时使用该功能/应用'",
|
||
"priority": "P0",
|
||
"sources": [
|
||
{{"type": "table", "section": "3.1.1", "row": 2, "text_snippet": "行车娱乐禁止:目标应用/功能处于后台时 ○ 限制:非P挡时,限制目标应用/功能启用...", "priority": "supplementary"}},
|
||
{{"type": "logic_tree", "image_id": "rId17", "node_ids": ["n1","n2","n5","n7"], "priority": "primary_source"}}
|
||
],
|
||
"precondition": {{
|
||
"geographic_scope": "国内",
|
||
"screen_type": "any",
|
||
"switch": "开启",
|
||
"app_state": "后台"
|
||
}},
|
||
"trigger": {{
|
||
"operator": "AND",
|
||
"conditions": [
|
||
{{"signal": "应用请求启动", "operator": "==", "value": true}},
|
||
{{"signal": "档位", "operator": "!=", "value": "P"}}
|
||
]
|
||
}},
|
||
"actions": [
|
||
{{"type": "system", "description": "限制应用/功能启用"}},
|
||
{{"type": "user_interaction", "description": "显示Toast", "content": "请在P挡时使用该功能/应用"}}
|
||
]
|
||
}}
|
||
```
|
||
|
||
## 关键要求
|
||
|
||
1. **逻辑树为唯一权威来源**:触发条件和动作序列必须严格按逻辑树路径建模。文字/表格描述仅用于补充确切措辞(如 Toast 文案),不得覆盖或曲解逻辑树路径。在 sources 中,逻辑树类型标记 `"priority": "primary_source"`,文字/表格标记 `"priority": "supplementary"`。
|
||
|
||
2. **信号和数值必须精确**:禁止写"车速超过阈值",必须写 `{{"signal": "车速", "operator": ">=", "value": 15, "unit": "km/h"}}`。
|
||
|
||
3. **条件必须完整**:逻辑树中的每个 decision 条件必须对应 trigger.conditions 中的一条。如果文档说"车速>=15km/h 且持续超过5秒 且非P档",这三个条件必须全部出现。
|
||
|
||
4. **每条规则必须自包含**:人仅凭一条 rule JSON 就能设计出对应的测试用例。必须包含:geographic_scope、screen_type、开关状态、应用类型、前后台状态、完整触发条件、所有动作及确切 Toast 文案、来源引用。
|
||
|
||
5. **禁止占位符**:`"user_interaction"` 类型的 `content` 不能是"文案由业务定义"、"待定"、"自定义"。如文档确实未给出文案,填 `"(文档未指定)"`。
|
||
|
||
6. **逻辑树节点必须追踪**:在 sources 中列出该规则在逻辑树中经历的所有 decision 节点和 action 节点。
|
||
|
||
7. **多条规则**:如果一个功能单元包含多个独立行为分支,输出多条规则分别描述。
|
||
|
||
8. **开关关闭状态**:开关关闭时所有限制失效,这也必须作为一条规则输出(path: ["...", "开关关闭", "无限制"])。
|
||
|
||
{format_feedback}
|
||
|
||
## 输出格式
|
||
|
||
**只输出 JSON 数组,不要有任何其他文字或 markdown 标记**:
|
||
|
||
[
|
||
{{ ... }},
|
||
{{ ... }}
|
||
]
|
||
|
||
注意:即使只有一个规则,也必须用数组格式 `[...]`。
|