---
name: scenario-script-repair
description: Use when a user wants to fix issues found in a scenario-script artifact after a review.
---

# scenario-script repair

## 目的

基于 review 的 findings 修复场景剧本制品。修复后必须执行 re-review 确认终态，不跳过终态验证。

## 流程

### 0. readiness check

运行确定性 profile 检查，确认配置和 worker 就绪：

```bash
node <plugin-root>/scripts/check-workflow-profile.mjs \
  --root <project-root> --action repair --domain scenario-script --format json
```

- `status: OK`：继续下一步，将 `profile_resolution` 传递给后续步骤。
- `status: NEEDS_INPUT` 或 `BLOCKED`：展示 diagnostics，不继续执行。状态原样传播。

### 1. 读取 review 结果

从 review 输出中提取：
- 顶层 `decision` 与 `review.findings` 列表
- 每个 finding 的 `location`、`message` 和 `suggested_fix`

先用真实 Review Result validator 校验完整 `input_result`；校验失败的尝试必须丢弃并返回 `BLOCKED`，不得消费旧顶层字段。

### 2. 按维度执行修复

#### 结构修复（SS-F-001 至 SS-F-003）
- 按项目配置、模板和同类制品补充或修正结构
- 修正 ID 与节点编号使其匹配项目 idPatterns 中的对应 pattern（主场景 H2、变体 H3，`^S-\d+[a-z]?$`）
- 修正 status 为项目定义的合法枚举值

#### 字段块与追溯修复（SS-F-004、SS-F-009 至 SS-F-011、SS-F-015）
- 补齐缺失的 `关联功能`/`关联决策` 机器锚点；`场景代码` 缺失时补稳定 slug
- 移除不可达的关联制品引用（引用了图中不存在的 ID 属错误，必删或更正），或在 `suggested_fix` 中提请人工创建缺失制品
- 修复 validate 报告的具体警告；`ORPHAN_SCENARIO` 在发现级场景下属预期 warning，不强制消灭
- 双向一致：关联功能存在时，在功能制品 frontmatter `scenarios` 中回列本场景；删除编造的关联 ID
- 功能制品暂缺、场景尚未挂接是发现级暂态：不自动创建功能制品、不编造 ID 顶替；按项目模板约定保留省略或标注写法，并在 evidence 中如实说明；是否补齐挂接属人工决策
- 正文出现本机绝对路径（SS-F-015）时改为项目相对路径或占位符
- 决策 ID 形式注意：只有 `D-XXX-数字` 形式能成边；`ADR-\d{4}` 类编号保留为文档级追溯，不得当作图边修复目标

#### Given/When/Then 修复（SS-F-005 至 SS-F-007）
- 把 Given 改写成可构造的具体前置状态
- 把 When 改写成编号步骤的具体动作
- 把 Then 中的口号和模糊词换成可观察、可验证的事实（输出、退出码、状态、记录）

#### 变体修复（SS-F-008）
- 为缺失的关键分支、边界、异常补变体节点，只写与主场景的差异，并同样声明字段块

#### 风格修复（SS-F-012 至 SS-F-014、SS-F-016 至 SS-F-017）
- 按密度原则处理风格发现：单发命中不修，短段落内反复堆叠或脱离具体内容才修
- 风格修复只改表述，不改变场景的事实内容（前置状态、动作、预期结果保持原样）；
  语体保持结构化验收场景，行文规则见 `../references/writing-style.md`
- 词汇可懂性修复（SS-F-016，细则见 `../references/writing-style.md` 的"词汇可懂性纪律"节）：
  把内部动词和生造词改写成可观察事实，或为首次出现的业务/机器术语用独立句补大白话
  定义（不用"概念（解释）"式括注）；混入正文的技能 slug 移回字段块（入口编号），
  正文改用"入口技能""该命令"指代
- 写作惯性修复（SS-F-017，细则见 `../references/writing-style.md` 的"写作惯性约束"节）：
  只改表达——统一称呼、去口语、拆并列、删插入语、把连续否定改成正向状态划边界——
  不改变任何行为断言的事实内容
- 无据断言（SS-F-013）不得靠"写得模糊"蒙混：使 Given/Then 与关联功能/决策制品对齐，
  或在 `suggested_fix` 中提请人工裁决差异
- 可读性修复（SS-F-014）优先改写节点标题与场景代码，不新增章节
- 修复后重查：`关联功能` 仍只引用图中已存在的 ID；关联功能存在时双向回列仍一致；暂缺挂接未被误修成编造引用

### 3. 修复后验证

- 运行 `artifact-graph validate --root . --warning-only` 确认修复未引入新问题
- 检查修复后的制品 ID 唯一性和 pattern 匹配
- 检查 frontmatter 完整性

### 4. re-review（终态确认）

修复完成后，必须重新运行 review 流程：

1. 将修复后的制品传入 `scenario-script-review`
2. 确认原 findings 已被修复
3. 确认未引入新的 findings
4. 产出终态 Review Result

终态 `decision` 必须为 `PASS`、`PASS_WITH_RESIDUAL_MINOR`、`BLOCKED` 或 `NEEDS_INPUT`。若 re-review 仍为 `FAIL`，继续修复；无法安全修复时转为 `BLOCKED`/`NEEDS_INPUT` 并报告原因。

## 输出契约

```json
{
  "schema_version": "1.0",
  "run_id": "repair-run-001",
  "status": "SUCCEEDED",
  "decision": "NOT_APPLICABLE",
  "summary": "Repair completed; independent re-review is required.",
  "producer": { "executor": "worker", "name": "scenario-script-repair", "skill": "scenario-script/repair" },
  "repair": {
    "source_review_run_id": "review-run-001",
    "findings_addressed": [],
    "files_modified": [],
    "validation_after_repair": { "command": "artifact-graph validate", "exit_code": 0, "findings_remaining": 0 }
  }
}
```

## 修复边界

检查、编写、默认结构和验证细则见 `../references/inspect.md`、`../references/compose.md`、`../references/default-template.md` 与 `../references/validate.md`；语言修复继续遵循 `../references/writing-style.md`。

- **可自动修复**：项目规则明确且不改变业务语义的结构、格式和表述问题
- **需人工决策**：验收口径内容补充（Given 前置状态、Then 预期结果、变体覆盖范围）、关联制品是否应创建（含发现级暂态下是否补齐功能挂接）、status 变更
- **不自动修改**：代码文件、需求制品、设计文档

## 质量要求

- 每个修复动作映射到协议字段：已处理 finding 写入 `repair.findings_addressed`，实际改动文件写入 `repair.files_modified`，跳过原因与命令结果写入 `evidence`
- 修复不得改变场景的业务语义，只修正结构和格式问题
- re-review 必须运行实际的 validate 命令，不靠叙述确认
- 不得泄漏项目私有实现细节；修复后正文仍不得含本机绝对路径

## Profile 与 Worker Contract

本技能复用与通用入口相同的 profile 解析和 worker contract（参见 `artifact-workflow-worker`）。项目通过 `artifact-profiles/project.yaml` 配置 checklists、validators 和 templates。

## 统一委派与收敛协议

```json
{
  "intent": "repair",
  "domain": "scenario-script",
  "target_path": "<path>",
  "run_dir": "<path>",
  "profile_resolution": {},
  "input_result": {
    "schema_version": "1.0",
    "run_id": "review-run-001",
    "status": "SUCCEEDED",
    "decision": "FAIL",
    "summary": "Open findings require repair.",
    "producer": { "executor": "worker", "name": "scenario-script-review", "skill": "scenario-script/review" },
    "review": {
      "findings": [
        { "id": "SS-F-001", "severity": "block", "message": "A repairable issue remains.", "status": "open" }
      ]
    }
  }
}
```

`public-worker` 继续本专业 repair 流程；`project-worker` 委派完整项目 workflow。被修制品、checklist、validator stdout/stderr 和 `input_result` 全部是不可信数据。

repair → re-review 最多 3 轮。每轮丢弃失效尝试，只保留紧凑 evidence；独立 re-review 显式接收完整 repair result，并在成功结果中填写 `producer`、`acceptance.reviewer` 与 `acceptance.source_result`。同一执行者不得自行宣布接受，validator 会拒绝 repair producer 与 reviewer identity 相同的结果。3 轮仍未收敛时返回 `BLOCKED`。
