鼎味肉市DESIGN ATELIER
← 资料目录docs/rules/scenario-model.md阅读原文

Module Scenario Model Rule


rule_id: R-SCENARIO-MODEL-01 category: Design / Testing status: locked owner: Project Manager / Architect scope: module facts, rules, cases, stories, flows, prototypes, fixtures, Playwright specifications, and verification evidence

1. Rule

每个受影响模块只维护一套当前最正确的事实场景包。它是模块的 current truth, 不是某个 REQ、review round 或历史版本的副本。

locked business facts/rules
  → generated current cases
  → stories + flows + prototype states
  → module Playwright specs
  → round-scoped DV/QA/E2E evidence

REQ 只能出现在 source_refs 或证据追踪表中,说明规则/行为的来源;REQ 不拥有 独立的 cases、stories、flows、prototype 或 Playwright spec。

2. Module Package

受影响模块的唯一设计包路径为:

docs/design/prototypes/<module>/
├── index.html
├── stories.md
├── flows.md
├── scenario-model.json
├── cross-matrix.json
├── cases.json            (generated)
├── scenario-coverage.json (generated)
├── fixture-contract.json
└── *.html

永久 Playwright 定义位于:

web/e2e/<module>/**/*.spec.ts

上述定义文件不包含 version、generation、round、status、req_owner 或 类似历史副本字段。历史差异由 Git 保存;一次执行的 PASS/FAIL、截图、trace 和 观察结果由 round-scoped 报告保存。

3. Strict JSON Contract

第一版只接受严格 JSON,所有对象拒绝未知字段;文件必须是 UTF-8、两空格缩进、 末尾换行并按稳定 ID 排序(cross-matrix.json 与两个生成文件无此约束)。四个手写/校验 JSON 文件的顶层允许字段固定如下:

文件 顶层允许字段 权威性
scenario-model.json module, coverage_profile, facts, rules 人工锁定的规则输入
cases.json module, cases 生成器的当前输出,只读派生物
scenario-coverage.json module, coverage_profile, counts, required_branch_coverage, ratio 生成器的当前输出,只读派生物;具体 CASE/branch 映射以 cases.json 的 branch_id / id 为准
fixture-contract.json module, fixtures 人工声明的合成前置事实契约

module 必须等于父目录名并符合 lowercase-kebab。禁止把 REQ-{id}、round 或 版本拼入模块目录或永久测试定义路径。

3.1 scenario-model.json

3.2 fixture-contract.json

顶层只允许 module 和 fixtures。每个 fixture 只允许稳定 id、persona、 synthetic: true、非空 setup 和非空 cleanup。每个 required branch 必须引用 一个 fixture;未被使用的 required fixture、空 cleanup、生产数据依赖均失败。

Fixture 只能建立被测业务动作开始前本来就应存在的事实,例如 persona、权限、草稿、 字典、时钟或受控外部响应。Fixture 不得执行登录后的页面操作、填写、保存、提交、 审批、取消、重试或其他被测动作来替代浏览器路径。

3.3 Generated outputs

cases.json 与 scenario-coverage.json 只能由确定性生成器刷新,不能人工编辑一条 case 来绕过缺口。生成器按 branch witness、稳定 ID、约束和 set-cover 规则输出; 同一 scenario-model.json 与 fixture-contract.json 必须得到字节稳定的输出。

生成器不得从生产实现反推 oracle,不得调用生产服务决定 expected outcome。无法满足 的事实、未知引用、重复 ID 或规则冲突必须 fail-closed,并指向 source/ref。

4. Positive / Negative Coverage

正反比例是容量门,不替代分支门:

coverage_profile 最低 positive:negative 容量比
ordinary 1:1
rule-dense 1:2
critical 1:3

同时必须满足:

CASE 可以在低层测试中承担多个输入组合,但不同角色、拒绝原因、终态、权限结果或 恢复语义不得被合并为一个含糊的 case。browser-required CASE 必须至少有一个 required PATH;每个 PATH 必须有明确主 CASE。

5. Traceability Chain

设计验证必须能沿以下链路双向检查:

source_refs → Rule → required branch/CASE → S-NNN Story
→ F-NNN / PATH-* → web/e2e/<module>/*.spec.ts → round Evidence

stories.md、flows.md、原型 HTML、scenario JSON 和模块 spec 都表达当前模块 完整集合。任意 REQ 触及模块时,必须更新并重新核对该模块全集,并执行 full-module regression;只补本 REQ 的路径不满足规范。

6. Fail-closed Gates

7. Forbidden

Coverage semantics (S2 v4.0.1 joint review)

Shared model authority

Follow shared-model contracts. Data shape has one native authoring source; SYNC owns shared behavior, FE/BE derive responsibilities. Structural negative examples fail schema validation; business negatives remain valid data and are rejected by the business rule.