Elnor Repo Reader

DOC23_Review_Studio_Red_Team_Adjudication_Card_v4.md

Active Working and Red Team/DOC23 Working/DOC23 Red Teaming/DOC23_Review_Studio_Red_Team_Adjudication_Card_v4.md

Generated 2026-06-09T01:23:58.539Z from commit dbaa25962edc11ab30e8d4ca1715f9ae5bf77331. Worktree: clean.

Open text page · Open raw txt · Open path URL

# DOC23 Addenda B — Review Studio Red-Team Adjudication Card v4

**Target:** DOC23 Addenda B Review Studio D1  
**Purpose:** Single, self-contained adjudication card for the Review Studio design. It consolidates **two red-team rounds** — Round 1 (the original ChatGPT/Claude/Grok/Gemini reviews of D1) and Round 2 (a re-review by the same four models) — into one set of adjudicated rows (RS-000–RS-066) and paste-ready fixes. **Complete on its own: no companion document is required to review or apply it.**  
**Prepared for:** Will / ELNOR Specs  
**Adjudication method:** Multi-reviewer red-team → dedup → one row per issue → disposition + paste-ready fix. Round 2 confirmed Round 1's architecture and resolved its open items.  
**Repo-write status:** Not written to repo. Downloadable Markdown artifact for review, revision, and later application to D1 → D2.  
**Adjudication status:** `READY_AFTER_PATCH` — apply the Tier-1 set + the §1.1 open-item resolutions + the net-new RS-056–RS-066, then apply to D1.

---

## 0. Source pack and method

### 0.1 Review inputs adjudicated

This card consolidates two red-team rounds.

**Round 1 — reviews of Review Studio D1** (adjudicated into RS-000–RS-055):

| Source | Role |
|---|---|
| Round-1 red-team pack — ChatGPT, Claude, Grok, Gemini | Original reviews of D1. |
| Adjudication-card creation prompt | Output requirements and adjudication rules. |
| Design discussion with Will | Output ports, native Word/DOC27, staged workflows, Revisor/Task Agent distinction, data routing. |

**Round 2 — re-review by the same four models** (`DOC23 Add B Review Studio RT 1.md`):

| Section | Role |
|---|---|
| ChatGPT (GPT-5.5 Pro), lines 3–3696 | Re-review + amendment package: RS-01…RS-20, §5 Word/DOC27, §8 lints, §9 fixtures, §14 audit addendum. |
| Claude, lines 3699–4269 | Consolidated findings: C1–C2 / S1–S13 / M1–M6 / N1–N13 / BI1–6. |
| Grok, lines 4270–4601 | Re-review, two passes. |
| Gemini, lines 4604–5025 | Re-review + value-tiered summary. |

Round 2 overwhelmingly **confirmed** Round 1, **resolved** its five open items (§1.1), and added a small net-new set (RS-056–RS-066). Reviewer breakdown in §8.

### 0.2 Operative / authority specs consulted or referenced

| Short name | Repo path / owner |
|---|---|
| Review Studio D1 | `Active Working and Red Team/DOC23 Working/.../DOC23 Add B Review Studio D1.md` / path spelling to verify. |
| Addenda B Core | `Current Specs/DOC23/DOC23 Addenda B/DOC23_ADDENDA_B_CORE_R0_7_1.md` |
| Outcome Evaluator / Revisor V3.3.1 | `Current Specs/DOC23/DOC23 Addenda B/DOC23_ADDB_OUTCOME_EVALUATOR_REVISOR_V3_3_1.md` |
| Common Contracts | `Current Specs/DOC23/DOC23 Addenda B/DOC23_EVALUATION_COMMON_CONTRACTS_V1_1_1.md` |
| Feedback Delivery | `Current Specs/DOC23/DOC23 Addenda B/DOC23_ADDB_SUBSYS_FEEDBACK_DELIVERY_V1_0_1.md` |
| Staged Adjudication Card | `Active Working and Red Team/DOC23 Working/DOC23 Red Teaming/DOC23_ADDENDA_B_RT_ADJUDICATION_CARD_STAGED.md` |
| DOC20 R4.3 | `Current Specs/DOC20/DOC20_R4_3.md` |
| DOC20 Addendum B | `Current Specs/DOC20/DOC20_ADDENDUM_B_MS_WORD_VIEWER_CAPABILITIES_R3.md` |
| DOC12 | Rooms / panels / forums owner; bridge target only, not reimplemented here. |
| DOC16 | M365 / Graph / OneDrive / SharePoint integration owner. |
| DOC21 / DOC22 | UI component registry / page inventory owners. |
| EC Core | Sole durable writer for review records, packages, checkpoints, receipts. |
| OP-A | Cross-doc obligation tracker. |

### 0.3 Raw → deduped count

```text
Round 1 (reviews of D1):
~142 raw assertions across four reviews and follow-up discussion
→ 56 adjudicated issues (RS-000–RS-055)

Round 2 (re-review of the adjudication):
~95 raw assertions across the four models
→ 45 confirm an existing row
→ 5 close the open items (RS-002 / RS-017 / RS-021 / RS-026 / RS-027)
→ 11 net-new (RS-056–RS-066)
→ 2 declined (Critique Swarm; confidence-auto-route REJECTED)

Combined:
→ 67 adjudicated rows (RS-000–RS-066)
→ Tier 1 / Substantive / Minor / Considered-declined breakdown in §9
```

### 0.4 Disposition vocabulary

`ACCEPT` · `ACCEPT-WITH-MODIFICATIONS` · `ACCEPT-AS-FIX` · `REJECT` · `DEFER` · `OPEN_FOR_ARCHITECT_REVIEW` · `ARCHITECT_STOP`

### 0.5 Conventions used in this card

- **Fix anchor:** headings and quoted snippets are approximate because exact D1 path and line access must be verified before patching.
- **OPEN_FOR_ARCHITECT_REVIEW:** new canonical object family, receiving-port name, enum value, or owner-doc decision requiring Will/owner admission.
- **Package versus port rule:** output ports are named for what leaves Review Studio; internal adapters such as `EvaluationFeedbackBundle` are not user-facing output ports unless an owner doc admits them.
- **No file edits:** this card does not write to the repo.

---

## 1. Executive verdict

**Verdict:** `READY_AFTER_PATCH`.

**Why:** the Review Studio concept is right, and after two review rounds the structural corrections are settled. The draft becomes operative once the Tier-1 corrections and the §1.1 open-item resolutions are applied. The corrections are:

1. It must not be only a Document Viewer mode; it needs a `ReviewableSubject` session model.
2. It must use a corrected output-port model that separates artifact packages, user comments/revisions, Revisor requests, finding decisions, pure signals, and staged workflows.
3. It must not route Revisor repair around `revision_in`.
4. It must handle native Word/docx review without converting formatting-critical artifacts to Notes.
5. It must normalize native comments / tracked changes into system-readable deltas.
6. It must support checkpoints, preconditions, stale-base checks, revalidation, and undo/revert.
7. It must make downstream-module compatibility explicit; no module should receive an unreadable data blob.

Round 2 did not reopen any of these — it **confirmed** them (notably Gemini's independent `plan_in` Dispatcher-ownership stop confirming RS-047, and Grok's "A+" with no new stops) and supplied the resolutions in §1.1.

### 1.1 Open-item resolution

The five items left `OPEN_FOR_ARCHITECT_REVIEW` after Round 1 are now resolved (Round 2 + adjudication). Each resolution is stated where the item's row lives in §5.

| Open item | Resolution | Confirmed by |
|---|---|---|
| RS-002 — missing `ReviewableSubject` (+ non-document artifact *kinds*, Claude N1) | Adopt `ReviewableSubject` session model + a `ReviewableArtifactKind` enum with a per-kind anchor model (text-range for documents; `claim_id` for claim sets; cell/row refs for tables; etc.). Email is the coarse sub-case (RS-057). | ChatGPT RS-02/RS-03 |
| RS-017 — `human_resolved` finding-state collision | `human_resolved` is **not** a new parallel state; it maps into the existing §5.7.2 finding-state invariant (a human decision is recorded as a transition on the canonical state machine, not a side state). | Gemini |
| RS-021 — human-edit revalidation trigger | **RS-056** — add `human_authored_version_created` to the shared `RevisionOperationKind` + wire into the §11.21 revalidation cascade + Evaluator-owned receipt (§11.6). | Grok + Gemini + ChatGPT RS-12 |
| RS-026 — DOCX version-spine handoff (Claude C2) | Version-spine reconciliation: define the point at which the artifact "becomes" a docx; after that, the docx (`_E{N}.docx`, OnlyOffice copy-on-write) is the single source of truth and the internal `v{N}` spine stops. No dual spine. | ChatGPT §5.5 |
| RS-027 — native tracked-changes normalized delta | `NativeRevisionSafetyGate`: native comments/tracked-changes are normalized into a system-readable delta on ingest; the delta (not the raw docx markup) is what flows downstream. | ChatGPT RS-11; Gemini |

**Ready-after-patch condition:** Apply the Tier-1 items, the §1.1 resolutions, and the net-new RS-056–RS-066; add owner-doc OP-A rows; verify exact section/path anchors. **RS-062 (`confidence_triggered_auto_route`) is REJECTED — no auto-routing; the gate is the gate.**

---

## 2. Corrected Review Studio output/port model

This section supersedes all prior proposed port lists in the reviews and in the earlier responses.

### 2.1 Design rule

```text
Review Studio ports should be named for what leaves Review Studio.

Do not name output ports after internal record types such as:
feedback_bundle_out, formal_assessment_out, evaluation_result_out, review_record_out.

Do not use ambiguous names such as:
revision_out, needs_revision_out, signal_out.
```

### 2.2 Final output ports

| Port | Name | Kind | Button / action |
|---:|---|---|---|
| **A** | `approved_review_package_out` | Data output | Approve & Continue |
| **B** | `user_comments_revisions_out` | Data output | Send Comments / Revisions |
| **C** | `revisor_request_out` | Data output | Send to Revisor |
| **D** | `finding_decisions_out` | Data output | Submit Finding Decisions |
| **E** | `approved_signal_out` | Pure signal output | Fires only if wired/configured |
| **F** | `rejected_signal_out` | Pure signal output | Reject / Stop |
| **G** | `stage_instruction_out[n]` | Repeated data output | Run Stage n |
| **H** | `error_out` | Error output | Technical failure |

### 2.3 Required Review Studio input ports for staged/return flows

These are inputs, not outputs.

| Input | Name | Receives | From |
|---:|---|---|---|
| **R1** | `stage_response_in[n]` | `StageResponsePackage` | Module that received `stage_instruction_out[n]` |
| **R2** | `revisor_candidate_in` | Revisor candidate, revision receipt, diff/native delta | Revisor |
| **R3** | `evaluator_result_in` | Evaluation result / findings / dry-run revalidation | Outcome Evaluator / Judge |
| **R4** | `module_reply_in` | Research memo, revised artifact, formatting report, agent reply | Regular/research/formatting module |

### 2.4 Explicit removals

Remove or do not introduce:

```text
revision_out
needs_revision_out
feedback_bundle_out
evaluation_result_out
formal_assessment_out
review_record_out
generic signal_out
work_sent_signal_out
send_to_task_agent_out
send_to_room_out
plan_in
findings_in
```

Rationale:

- `revision_out` is ambiguous: revised artifact, request for revision, or Revisor route.
- `needs_revision_out` is vague: use `user_comments_revisions_out` or `revisor_request_out`.
- `feedback_bundle_out` and `evaluation_result_out` are internal compatibility records, not Review Studio output ports.
- `work_sent_signal_out` is redundant; work dispatch is recorded by `ReviewRouteReceipt` / route telemetry.
- `send_to_task_agent_out` is unnecessary; Task Agent is a destination of `user_comments_revisions_out` or `stage_instruction_out[n]`.
- `send_to_room_out` is phantom until DOC12 bridge intake/import-back is specified.
- `plan_in` should be a Dispatcher plan-review projection, not a graph data input.
- `findings_in` should be replaced by `review_context_in` / feedback-bundle context, not a bespoke findings port.

### 2.5 Final data groups

| # | Data group | Meaning |
|---:|---|---|
| **1** | **Original Review Input** | Item initially opened in Review Studio. Provenance only once a reviewed/edited version exists. |
| **2** | **Reviewed Artifact Package** | Artifact/version exactly as approved or sent: clean, edited, commented, redlined, or track-changed depending on output mode. |
| **3** | **User Review Notes** | Inline comments, side-panel comments, Word/PDF comments, general review notes. |
| **4** | **User Review Instructions** | User instructions: fix, research, source-check, preserve, format, revise, re-evaluate, replan. |
| **5** | **User Revision Data** | Direct edits, accepted/rejected changes, native revision delta, human-edited anchors. |
| **6** | **Evaluator Finding Set** | Findings supplied by Outcome Evaluator/Judge/critic. |
| **7** | **Finding Decisions** | User decisions on findings: confirm, contest, dismiss, addressed, defer. |
| **8** | **Repair Instructions** | Structured repair instructions synthesized from user notes/comments/findings. |
| **9** | **Preservation Locks** | Text/formatting/anchors the downstream repair module must not alter. |
| **10** | **Source Context** | Source workspace refs, research refs, citation/evidence context. |
| **11** | **Route Choice** | Button pressed, selected destination, output mode, return behavior. |
| **12** | **Review Record Ref** | Audit/provenance record ref. Stored by EC; ports carry a ref. |
| **13** | **Signal Data** | Lightweight approval/rejection event. |
| **14** | **Stage Instruction Package** | A single staged instruction to a specified downstream module. |
| **15** | **Stage Response Package** | A response received back by Review Studio from a staged module. |
| **16** | **Task Graph Patch Request** | Request for Task Agent to produce a graph change or sequence. |
| **17** | **Rejection Note** | Optional rejection reason/instruction. |

### 2.6 Output port data table

| Port | Name | Data groups sent | Receiving modules | Sufficiency / excess-data assessment |
|---:|---|---|---|---|
| **A** | `approved_review_package_out` | Always **2 Reviewed Artifact Package**, **11 Route Choice**, **12 Review Record Ref**. If approved package includes them: **3 User Review Notes**, **4 User Review Instructions**, **5 User Revision Data**, **9 Preservation Locks**. | Next module, output module, email/send module, export module, next graph step, evaluator if wired next. | Sufficient. Sends the approved package. Finding decisions are never included unless **D** also fires. |
| **B** | `user_comments_revisions_out` | **2**, **3**, **4**, optional **5**, **8**, **9**, optional **10**, **11**, **12**, optional **16** if destination is Task Agent, optional targeted **6/7** if request is finding-specific. | Original module, selected module, regular agent, research module, formatting module, source-check module, Task Agent. | Sufficient for normal single-step work if rendered to the receiver’s accepted input schema. |
| **C** | `revisor_request_out` | **2**, **3**, **4**, **5**, relevant **6**, relevant **7**, **8**, **9**, optional **10**, **11**, **12**. | Revisor only. | Sufficient only if routed to `revision_in`. Must include **9 Preservation Locks** when human edits exist. |
| **D** | `finding_decisions_out` | **6 Evaluator Finding Set**, **7 Finding Decisions**, optional finding-specific **3**, **2** by ref, **11**, **12**. | Feedback Interpreter / finding lifecycle / Outcome Evaluator equivalent receiving port. | Correct concept, but receiving port requires owner admission. Recommended name: `human_finding_feedback_in`. |
| **E** | `approved_signal_out` | **13 Signal Data**, ref to **2**, ref to **12**. | Trigger, junction, notification, logging, Run Board. | Pure signal. No artifact body unless receiver dereferences ref. Requires owner admission as named signal port. |
| **F** | `rejected_signal_out` | **13 Signal Data**, optional **17 Rejection Note**, ref to **1 or 2**, ref to **12**. | Trigger, junction, rejection handler, notification, Task Agent if graph config routes there. | Pure rejection/stop signal. Does not request repair. Requires owner admission as named signal port. |
| **G** | `stage_instruction_out[n]` | **14 Stage Instruction Package**, plus relevant subset of **2**, **3**, **4**, **5**, **6**, **7**, **8**, **9**, **10**, **11**, **12**, prior **15** where needed. | Stage target: research, regular agent, Revisor, Outcome Evaluator, formatting module, Task Agent. | Sufficient if each stage declares destination input port and expected response. Must align with existing DOC23 looper or admitted sequence runner. |
| **H** | `error_out` | `ReviewStudioErrorPayload`, optional ref to **12**. | Error handler, notification module, retry logic. | Technical failure only. Not a review decision and not a signal package. |

### 2.7 Button-to-port mapping

| Button / action | Ports fired | Notes |
|---|---|---|
| **Approve & Continue** | **A**; optionally **E** if wired | If finding decisions changed, preflight asks whether to also fire **D**. |
| **Send Comments / Revisions** | **B** | Destination may be original module, selected module, specialist, research module, formatting module, or Task Agent. |
| **Send to Revisor** | **C**; optionally **D** with confirmation | Revisor gets structured repair package; finding lifecycle gets decisions separately. |
| **Submit Finding Decisions** | **D** | Explicit finding lifecycle action. |
| **Reject / Stop** | **F** | Pure rejection signal. If user also wants replan/repair, fire **B** to Task Agent by separate selection/config. |
| **Run Stage n** | **G** | Response returns through `stage_response_in[n]`. |
| **Dry-Run / Recheck** | Internal request, returns via `evaluator_result_in` | Not a terminal output unless user submits result/decision. |
| **Error** | **H** | Technical only. |

### 2.8 Receiver compatibility rule

```text
Before Review Studio may connect an output to a downstream module, the graph validator must confirm:
1. the destination module has the named input port;
2. the output package can be rendered into that input schema;
3. unsupported data groups are passed by ref, summarized, or blocked;
4. no package is silently downcast without a ReviewRouteReceipt.
```

```ts
interface ReviewRouteReceipt {
  receipt_id: string
  review_session_id: string
  output_port:
    | "approved_review_package_out"
    | "user_comments_revisions_out"
    | "revisor_request_out"
    | "finding_decisions_out"
    | "approved_signal_out"
    | "rejected_signal_out"
    | `stage_instruction_out[${number}]`
    | "error_out"

  destination_module_ref?: StorageRef
  destination_input_port?: string

  package_ref: StorageRef

  render_mode:
    | "native_schema"
    | "instruction_rendered"
    | "artifact_ref_only"
    | "digest_plus_refs"
    | "blocked"

  omitted_data_groups: Array<{
    data_group_number: number
    reason: "unsupported" | "irrelevant" | "too_large" | "policy_blocked"
  }>

  created_at: ISO8601
  schema_version: 1
}
```

Lint:

```ts
"review_studio.output_connected_to_incompatible_input_port"
```

---

## 3. Patch library: schemas and contracts

This section provides the paste-ready schema material used by the adjudication rows.

### 3.1 Reviewable subject and surfaces

```ts
type ReviewableSubjectKind =
  | "artifact_version"
  | "external_document"
  | "module_output"
  | "evaluation_feedback_bundle"
  | "evaluation_result_chain"
  | "revision_plan"
  | "source_workspace"
  | "research_bundle"
  | "structured_data"
  | "task_segment"
  | "prompt_candidate"
  | "experiment_variant"
  | "custom"

type ReviewSurfaceMode =
  | "doc20_document_viewer"
  | "doc20_onlyoffice_docx"
  | "doc20_word_online_roundtrip"
  | "doc20_desktop_word_roundtrip"
  | "doc27_word_addin_live"
  | "findings_list"
  | "plan_review_projection"
  | "source_workspace_review"
  | "structured_data_review"
  | "doc12_room_bridge"
  | "text_only_review_card"

interface ReviewableSubject {
  subject_id: string
  kind: ReviewableSubjectKind

  task_id: string
  run_id: string
  source_module_id?: string
  source_activation_seq?: number

  primary_artifact_ref?: StorageRef
  primary_artifact_version_ref?: StorageRef
  artifact_root_ref?: StorageRef
  external_document_ref?: StorageRef

  evaluation_result_envelope_refs: StorageRef[]
  feedback_bundle_refs: StorageRef[]
  evaluation_snapshot_ref?: StorageRef
  revision_plan_ref?: StorageRef
  source_workspace_snapshot_ref?: StorageRef
  target_scope_ref?: ArtifactScopeRef | null

  preferred_surface_mode: ReviewSurfaceMode
  allowed_surface_modes: ReviewSurfaceMode[]

  mutation_policy:
    | "review_only"
    | "artifact_new_version"
    | "native_copy_on_write"
    | "external_roundtrip"
    | "plan_disposition_only"
    | "feedback_disposition_only"

  governance: GovernanceEnvelope
  created_at: ISO8601
  schema_version: 1
}
```

### 3.2 Review Studio session and action event

```ts
type ReviewStudioSessionState =
  | "opened"
  | "reviewing"
  | "dirty_user_edit"
  | "assist_running"
  | "assist_result_pending"
  | "external_editor_open"
  | "external_save_detected"
  | "stale_base_requires_rebase"
  | "revalidation_required"
  | "revalidation_running"
  | "stage_running"
  | "paused_between_stages"
  | "ready_for_terminal_decision"
  | "terminal_submitted"
  | "aborted"
  | "expired"

interface ReviewStudioSessionRecord {
  session_id: string
  subject_ref: StorageRef

  task_id: string
  run_id: string
  gate_id?: string

  state: ReviewStudioSessionState
  opened_at: ISO8601
  opened_by_ref: PrincipalRef

  base_artifact_version_ref?: StorageRef
  current_artifact_version_ref?: StorageRef
  base_content_hash?: string
  current_content_hash?: string

  source_evaluation_snapshot_ref?: StorageRef
  current_evaluation_snapshot_ref?: StorageRef

  action_event_log_ref: StorageRef
  latest_delta_brief_ref?: StorageRef
  active_sequence_ref?: StorageRef
  capability_manifest_ref?: StorageRef
  finish_preflight_ref?: StorageRef

  governance: GovernanceEnvelope
  schema_version: 1
}

type ReviewStudioActionKind =
  | "session_opened"
  | "comment_added"
  | "comment_resolved"
  | "finding_disposition_added"
  | "finding_decisions_submitted"
  | "review_instruction_added"
  | "review_instruction_classified"
  | "tracked_change_decision_added"
  | "assist_requested"
  | "assist_result_received"
  | "assist_result_applied"
  | "artifact_version_created"
  | "external_editor_launched"
  | "external_roundtrip_ingested"
  | "stage_instruction_dispatched"
  | "stage_response_received"
  | "revalidation_requested"
  | "revalidation_completed"
  | "terminal_decision_submitted"

interface ReviewStudioActionEvent {
  event_id: string
  session_id: string
  kind: ReviewStudioActionKind
  payload_ref: StorageRef
  actor: LifecycleActorEnvelope
  governance: GovernanceEnvelope
  created_at: ISO8601
  schema_version: 1
}
```

### 3.3 Review Studio submission envelope

```ts
interface ReviewStudioSubmissionEnvelope {
  command: "review_studio_submit"
  submission_id: string
  review_session_id: string
  subject_ref: StorageRef

  terminal_decision_ref: StorageRef
  output_package_refs: StorageRef[]
  finding_decision_package_ref?: StorageRef
  review_record_ref: StorageRef

  doc20_assist_request_refs: StorageRef[]
  doc20_assist_result_refs: StorageRef[]

  actor: LifecycleActorEnvelope
  governance: GovernanceEnvelope
  created_at: ISO8601
  schema_version: 1
}
```

### 3.4 Output packages

```ts
interface ApprovedReviewPackage {
  package_id: string
  review_session_id: string

  approved_artifact_ref: StorageRef
  approved_artifact_version_ref: StorageRef

  // Provenance only. Downstream uses approved_artifact_version_ref.
  original_review_input_ref: StorageRef

  output_mode:
    | "clean"
    | "with_comments"
    | "with_track_changes"
    | "redline"
    | "native_current"

  included_sidecars: Array<
    | "user_comments"
    | "review_instructions"
    | "native_revision_delta"
    | "preservation_locks"
  >

  user_comments_ref?: StorageRef
  review_instructions_ref?: StorageRef
  native_revision_delta_ref?: StorageRef
  preservation_locks_ref?: StorageRef

  approval_status:
    | "approved_clean"
    | "approved_with_comments"
    | "approved_with_track_changes"
    | "approved_with_instructions"
    | "approved_with_limitations"

  review_record_ref: StorageRef
  created_at: ISO8601
  schema_version: 1
}

interface UserCommentsRevisionsPackage {
  package_id: string
  review_session_id: string

  artifact_ref: StorageRef
  artifact_version_ref: StorageRef

  user_comments: ReviewComment[]
  review_instructions: ReviewInstruction[]
  user_revision_data?: UserRevisionData
  native_revision_delta_ref?: StorageRef

  // Enables “Fix this Finding” for non-Revisor modules too.
  targeted_finding_ids?: string[]
  targeted_findings_ref?: StorageRef
  finding_decisions_ref?: StorageRef

  repair_instructions: RepairInstruction[]
  preservation_locks: PreservationConstraint[]
  source_context?: ReviewSourceContext

  destination: {
    target_kind:
      | "original_module"
      | "selected_module"
      | "regular_agent"
      | "specialist_agent"
      | "research_module"
      | "source_check_module"
      | "formatting_module"
      | "task_agent"
    target_ref?: StorageRef
    target_input_port:
      | "instruction_in"
      | "research_request_in"
      | "artifact_in"
      | "task_instruction_in"
      | "graph_patch_request_in"
  }

  expected_response:
    | "revised_artifact"
    | "research_memo"
    | "source_verification"
    | "formatting_report"
    | "task_graph_patch"
    | "agent_reply"
    | "review_action_sequence"

  review_record_ref: StorageRef
  created_at: ISO8601
  schema_version: 1
}

interface RevisorRequestPackage {
  package_id: string
  review_session_id: string
  required_target_port: "revision_in"

  artifact_to_revise_ref: StorageRef
  artifact_version_to_revise_ref: StorageRef

  comments_to_address: ReviewComment[]
  instructions_to_address: ReviewInstruction[]
  findings_to_address: EvaluationFinding[]
  finding_decisions: FindingDisposition[]

  user_revision_data?: UserRevisionData
  native_revision_delta_ref?: StorageRef
  preservation_locks: PreservationConstraint[]
  source_context?: ReviewSourceContext

  requested_repair_strategy:
    | "minimal_patch"
    | "address_findings"
    | "incorporate_comments"
    | "rewrite_section"
    | "format_only"
    | "research_informed_revision"

  return_route:
    | "return_to_review_studio"
    | "continue_to_next_module"
    | "send_to_evaluator"

  review_record_ref: StorageRef
  created_at: ISO8601
  schema_version: 1
}

interface FindingDecisionPackage {
  package_id: string
  review_session_id: string

  // OPEN_FOR_ARCHITECT_REVIEW: exact receiving port owner/name.
  required_target_port: "human_finding_feedback_in"

  artifact_ref: StorageRef
  artifact_version_ref: StorageRef

  finding_decisions: FindingDisposition[]
  finding_comment_refs?: StorageRef[]

  evaluator_action:
    | "record_only"
    | "rerun_evaluator"
    | "rerun_selected_findings"
    | "mark_findings_addressed"
    | "mark_findings_contested"

  submit_mode:
    | "explicit_user_submit"
    | "terminal_action_with_confirmation"
    | "auto_required_by_gate_config"

  review_record_ref: StorageRef
  created_at: ISO8601
  schema_version: 1
}

interface ReviewSignalPackage {
  signal_id: string
  review_session_id: string

  signal_kind:
    | "approved"
    | "rejected"

  artifact_ref?: StorageRef
  artifact_version_ref?: StorageRef
  target_ref?: StorageRef

  rejection_note?: {
    reason_code?:
      | "wrong_direction"
      | "unusable"
      | "bad_sources"
      | "needs_full_redo"
      | "other"
    free_text?: string
  }

  review_record_ref?: StorageRef
  created_at: ISO8601
  schema_version: 1
}

interface ReviewStudioErrorPayload {
  error_id: string
  review_session_id?: string
  subject_ref?: StorageRef

  error_kind:
    | "surface_render_failed"
    | "artifact_load_failed"
    | "native_editor_roundtrip_failed"
    | "stage_dispatch_failed"
    | "stage_response_failed"
    | "revisor_request_failed"
    | "finding_decision_submit_failed"
    | "policy_blocked"
    | "unknown_error"

  message: string
  recoverable: boolean
  suggested_recovery?: string
  created_at: ISO8601
  schema_version: 1
}
```

### 3.5 Review instructions and finding decisions

```ts
interface ReviewInstruction {
  instruction_id: string
  text: string

  scope:
    | "whole_artifact"
    | "selected_anchor"
    | "selected_comments"
    | "selected_findings"
    | "task_graph"
    | "final_output"

  intent:
    | "revise"
    | "research"
    | "source_check"
    | "format"
    | "preserve"
    | "evaluate"
    | "replan"
    | "discuss"
    | "reject"
    | "other"

  anchor_ref?: StorageRef
  source_comment_id?: string
  source_native_comment_id?: string
  source_finding_id?: string

  priority: "low" | "normal" | "high"
  created_by: "human" | "system_suggested_from_comment"
  created_at: ISO8601
  schema_version: 1
}

type FindingDispositionKind =
  | "confirm_finding"
  | "contest_finding"
  | "dismiss_finding"
  | "modify_finding"
  | "mark_addressed_by_user_edit"
  | "defer_finding"
  | "send_to_repair"

interface FindingDisposition {
  disposition_id: string
  finding_id: string
  kind: FindingDispositionKind
  target_scope_ref?: ArtifactScopeRef | null
  replacement_finding_ref?: StorageRef
  generated_repair_instruction_ref?: StorageRef
  generated_run_guidance_candidate_ref?: StorageRef
  comment_ref?: StorageRef
  actor: LifecycleActorEnvelope
  governance: GovernanceEnvelope
  created_at: ISO8601
  schema_version: 1
}
```

### 3.6 Staged work sequence

```ts
interface ReviewActionSequence {
  sequence_id: string
  review_session_id: string

  stages: ReviewActionStage[]

  execution_mode:
    | "manual_advance"
    | "auto_until_stage_review"
    | "auto_until_error"
    | "always_return_to_review_studio"

  created_by:
    | "human"
    | "task_agent_proposed"
    | "template"

  current_stage_number: number
  status:
    | "draft"
    | "running"
    | "paused_for_review"
    | "completed"
    | "failed"
    | "cancelled"

  runtime_binding_ref?: StorageRef
  created_at: ISO8601
  schema_version: 1
}

interface ReviewActionStage {
  stage_number: number

  output_port: `stage_instruction_out[${number}]`
  response_port: `stage_response_in[${number}]`

  destination:
    | { kind: "research_module"; target_ref?: StorageRef; input_port: "research_request_in" | "instruction_in" }
    | { kind: "drafting_module"; target_ref?: StorageRef; input_port: "instruction_in" }
    | { kind: "regular_agent"; target_ref?: StorageRef; input_port: "instruction_in" }
    | { kind: "revisor"; target_ref?: StorageRef; input_port: "revision_in" }
    | { kind: "outcome_evaluator"; target_ref?: StorageRef; input_port: "subject_in" | "evaluation_request_in" }
    | { kind: "formatting_module"; target_ref?: StorageRef; input_port: "artifact_in" }
    | { kind: "task_agent"; target_ref?: StorageRef; input_port: "task_instruction_in" }

  instruction: ReviewInstruction
  include_data_groups: number[]
  include_prior_stage_responses: number[]

  expected_response:
    | "research_memo"
    | "revised_artifact"
    | "evaluation_findings"
    | "formatting_report"
    | "task_graph_patch"
    | "agent_reply"

  after_response:
    | "continue_to_next_stage"
    | "pause_for_user_review"
    | "rerun_same_stage"
    | "stop_sequence"
    | "route_to_task_agent"

  schema_version: 1
}

interface StageInstructionPackage {
  package_id: string
  sequence_id: string
  review_session_id: string
  stage_number: number

  artifact_ref?: StorageRef
  artifact_version_ref?: StorageRef

  user_comments?: ReviewComment[]
  review_instructions: ReviewInstruction[]
  repair_instructions?: RepairInstruction[]
  findings_to_address?: EvaluationFinding[]
  finding_decisions?: FindingDisposition[]
  preservation_locks?: PreservationConstraint[]
  source_context?: ReviewSourceContext

  prior_stage_responses: StageResponsePackage[]

  destination: ReviewActionStage["destination"]
  expected_response: ReviewActionStage["expected_response"]

  review_record_ref: StorageRef
  created_at: ISO8601
  schema_version: 1
}

interface StageResponsePackage {
  response_id: string
  sequence_id: string
  review_session_id: string
  stage_number: number

  output_kind:
    | "research_memo"
    | "revised_artifact"
    | "evaluation_findings"
    | "formatting_report"
    | "task_graph_patch"
    | "agent_reply"
    | "error"

  artifact_ref?: StorageRef
  artifact_version_ref?: StorageRef
  research_memo_ref?: StorageRef
  finding_package_ref?: StorageRef
  task_graph_patch_ref?: StorageRef
  summary: string
  requires_user_review_before_next_stage: boolean

  created_at: ISO8601
  schema_version: 1
}

interface ReviewActionSequenceRuntimeBinding {
  sequence_id: string
  runtime_mode:
    | "compiled_to_existing_doc23_looper"
    | "review_studio_sequence_runner"
    | "task_agent_graph_patch_required"

  looper_module_ref?: StorageRef
  sequence_runner_ref?: StorageRef
  task_graph_patch_ref?: StorageRef

  owner_decision:
    | "use_existing_looper"
    | "admit_review_studio_runner"
    | "require_task_agent_graph_patch"

  schema_version: 1
}
```

Rule:

```text
ReviewActionSequence is not a new general-purpose loop engine.
It must either compile to the existing DOC23 Looper / loop-controller, run under an owner-admitted narrow ReviewStudioSequenceRunner, or produce a Task Agent graph patch.
```

### 3.7 Plan review projection

```ts
interface RevisionPlanReviewResult {
  result_id: string
  review_session_id: string
  revision_plan_ref: StorageRef

  overall_decision:
    | "approve_plan_for_execution"
    | "approve_with_step_changes_requires_recompile"
    | "reject_plan"
    | "send_back_to_revisor"
    | "open_task_agent_process_assessment"

  step_dispositions: Array<{
    plan_step_id: string
    decision:
      | "approve_step"
      | "drop_step"
      | "modify_step"
      | "defer_step"
      | "requires_human_judgment"
      | "send_step_to_specialist"
    modified_instruction?: string
    rationale?: string
  }>

  requires_recompile: boolean
  actor: LifecycleActorEnvelope
  created_at: ISO8601
  schema_version: 1
}
```

Rule:

```text
Review Studio may render a Revisor plan review surface when the Dispatcher pauses for human_gate.
It must not declare `plan_in` as a normal graph data input.
```

### 3.8 Comments, findings, closure, and cross-surface identity

```ts
type CommentFindingLinkEffect =
  | "comment_only"
  | "propose_finding_state_change"
  | "confirm_finding_addressed"
  | "contest_finding"
  | "dismiss_finding"
  | "supersede_due_to_anchor_loss"

interface CommentFindingLinkEvent {
  event_id: string
  comment_id: string
  finding_id: string
  comment_status: "open" | "resolved" | "deleted" | "orphaned" | "shifted"
  proposed_finding_effect: CommentFindingLinkEffect
  requires_review_confirmation: boolean
  confirmed_by_ref?: PrincipalRef
  created_at: ISO8601
  schema_version: 1
}

interface CommentClosureEntry {
  comment_ref: StorageRef
  status: "addressed" | "partially_addressed" | "not_addressed" | "superseded" | "unable_to_address"
  change_refs: StorageRef[]
  response_note?: string
  actor: LifecycleActorEnvelope
  created_at: ISO8601
  schema_version: 1
}

interface CommentClosureMap {
  closure_map_id: string
  review_session_id: string
  returned_artifact_version_ref: StorageRef
  entries: CommentClosureEntry[]
  created_at: ISO8601
  schema_version: 1
}

interface ReviewCommentIdentityMap {
  map_id: string
  review_session_id: string

  canonical_comment_id: string

  surface_comment_refs: Array<{
    surface:
      | "doc20_tiptap"
      | "doc20_pdf"
      | "onlyoffice"
      | "word_online"
      | "desktop_word"
      | "doc27_word_addin"
    native_comment_id?: string
    anchor_ref?: StorageRef
    status: "open" | "resolved" | "deleted" | "orphaned" | "shifted"
  }>

  last_synced_at: ISO8601
  schema_version: 1
}
```

### 3.9 Review finish, gate policy, assignment, expiry, idempotency

```ts
interface ReviewFinishPreflight {
  preflight_id: string
  review_session_id: string

  unresolved_user_comments: string[]
  unresolved_review_instructions: string[]
  unsubmitted_finding_decisions: string[]
  pending_revisor_repair_items: string[]
  stale_base_version: boolean
  revalidation_required: boolean

  allowed_terminal_actions: Array<
    | "approve_clean"
    | "approve_with_comments"
    | "approve_with_instructions"
    | "send_comments_revisions"
    | "send_to_revisor"
    | "submit_findings"
    | "reject"
  >

  requires_user_confirmation: boolean
  schema_version: 1
}

interface ReviewGateDecisionPolicy {
  review_gate_id: string

  allowed_outputs: Array<
    | "approved_review_package_out"
    | "user_comments_revisions_out"
    | "revisor_request_out"
    | "finding_decisions_out"
    | "approved_signal_out"
    | "rejected_signal_out"
    | "stage_instruction_out"
  >

  default_button:
    | "approve_continue"
    | "send_comments_revisions"
    | "send_to_revisor"
    | "submit_findings"
    | "reject_stop"

  hidden_button_reasons: Record<string, string>
  schema_version: 1
}

interface ReviewAssignment {
  assignment_id: string
  review_session_id: string
  assigned_to_ref?: PrincipalRef
  sign_off_chain?: PrincipalRef[]
  current_signoff_index?: number
  status:
    | "unassigned"
    | "assigned"
    | "in_review"
    | "signed_off"
    | "reassigned"
    | "cancelled"
  schema_version: 1
}

interface ReviewGateExpiryPolicy {
  policy_id: string
  review_session_id: string

  expires_after?: DurationISO8601
  on_expiry:
    | "notify_user"
    | "escalate"
    | "auto_reject"
    | "return_to_task_agent"
    | "hold_indefinitely"

  reminder_schedule?: DurationISO8601[]
  schema_version: 1
}

interface ReviewResumeIdempotencyRecord {
  record_id: string
  review_session_id: string
  last_committed_action_event_id?: string
  dispatched_output_package_refs: StorageRef[]
  completed_stage_numbers: number[]
  process_restart_count: number
  resumed_at?: ISO8601
  schema_version: 1
}
```

### 3.10 Mutation, checkpoints, stale-base, revalidation

```ts
interface ReviewStudioMutationPrecondition {
  review_session_id: string
  subject_ref: StorageRef

  expected_artifact_version_ref?: StorageRef
  expected_content_hash?: string
  expected_evaluation_snapshot_ref?: StorageRef

  policy_decision_required: true
  taint_class_acceptable: TaintClass[]

  on_precondition_failure:
    | "block_and_rebase"
    | "show_compare"
    | "create_branch"
    | "discard_assist_result"
    | "open_hard_call"

  schema_version: 1
}

type ArtifactCheckpointReason =
  | "review_session_opened"
  | "before_user_edit"
  | "after_user_save"
  | "before_agent_assist"
  | "after_agent_assist_proposal"
  | "after_agent_assist_applied"
  | "before_external_editor_launch"
  | "after_external_editor_return"
  | "before_revisor_dispatch"
  | "after_revisor_candidate_created"
  | "before_accept_reject_all"
  | "manual_checkpoint"
  | "auto_idle_checkpoint"
  | "revert_created"

interface ArtifactCheckpointRecord {
  checkpoint_id: string
  artifact_ref: StorageRef
  artifact_version_ref: StorageRef

  file_ref?: StorageRef
  file_hash: string
  m365_drive_id?: string
  m365_item_id?: string
  m365_version_id?: string

  created_by:
    | "user"
    | "review_studio"
    | "doc20_editor"
    | "external_editor_roundtrip"
    | "agent_assist"
    | "revisor"
    | "system"

  reason: ArtifactCheckpointReason
  parent_checkpoint_id?: string
  branch_id?: string

  comment_snapshot_ref?: StorageRef
  native_revision_delta_ref?: StorageRef
  review_session_ref?: StorageRef
  revisor_plan_ref?: StorageRef

  created_at: ISO8601
  schema_version: 1
}

type ReviewRestoreAction =
  | "restore_last_checkpoint"
  | "restore_pre_review_version"
  | "restore_last_approved_version"
  | "restore_native_m365_version"

interface ReviewBaseVersionCheck {
  check_id: string
  review_session_id: string
  base_artifact_version_ref?: StorageRef
  base_content_hash?: string
  observed_current_version_ref?: StorageRef
  observed_current_hash?: string

  result:
    | "base_current"
    | "base_stale_reanchor_available"
    | "base_stale_manual_review_required"
    | "base_missing"

  remap_report_ref?: StorageRef
  created_at: ISO8601
  schema_version: 1
}

interface ReviewRevalidationRequest {
  request_id: string
  review_session_id: string
  subject_ref: StorageRef

  reason:
    | "human_authored_version_created"
    | "human_directed_agent_version_created"
    | "external_editor_roundtrip_ingested"
    | "tracked_changes_accepted_or_rejected"
    | "finding_marked_addressed"
    | "directive_changed_run_criteria"
    | "manual_user_request"

  base_evaluation_snapshot_ref?: StorageRef
  current_artifact_version_ref?: StorageRef
  current_native_revision_delta_ref?: StorageRef
  finding_ids_to_revalidate: string[]
  criterion_ids_to_revalidate: string[]

  on_result:
    | "return_to_review_studio"
    | "continue_if_passed"
    | "send_to_revisor_if_failed"
    | "open_hard_call"

  created_at: ISO8601
  schema_version: 1
}

interface ReviewStudioDryRunEvaluationRequest {
  request_id: string
  review_session_id: string

  current_artifact_version_ref: StorageRef
  target_scope_refs?: StorageRef[]
  target_finding_ids?: string[]

  evaluation_mode:
    | "selected_findings"
    | "changed_scopes"
    | "whole_artifact"

  mutate_graph_state: false
  return_port: "evaluator_result_in"

  created_at: ISO8601
  schema_version: 1
}
```

### 3.11 Native documents and Word / DOC27 bridge

```ts
type ReviewFidelityRequirement =
  | "semantic_text_only"
  | "native_layout_required"
  | "native_revision_required"
  | "native_formula_required"
  | "fixed_render_required"
  | "mixed_native_and_semantic"

type ReviewMutationMode =
  | "comment_only"
  | "native_docx_onlyoffice"
  | "native_docx_word_online"
  | "native_docx_desktop_word"
  | "native_pdf_annotation_overlay"
  | "native_xlsx_editor"
  | "native_pptx_editor"
  | "external_native_app_roundtrip"
  | "artifact_copy_with_tracked_changes"
  | "semantic_note_fork"
  | "unsupported_read_only"

interface ReviewStudioNativeSurfacePolicy {
  policy_id: string
  artifact_ref: StorageRef
  artifact_kind: "docx" | "pdf" | "xlsx" | "pptx" | "md" | "txt" | "html" | "image" | "other"

  fidelity_requirement: ReviewFidelityRequirement
  allowed_mutation_modes: ReviewMutationMode[]
  default_mutation_mode: ReviewMutationMode

  note_fork_allowed: boolean
  note_fork_warning_required: boolean

  native_format_blockers: Array<
    | "no_native_renderer"
    | "no_edit_permission"
    | "no_track_changes_support"
    | "no_formula_preservation"
    | "no_pdf_annotation_support"
    | "requires_external_app"
    | "requires_internet"
    | "requires_m365_auth"
  >

  schema_version: 1
}

type NativeRevisionKind =
  | "insert_text"
  | "delete_text"
  | "replace_text"
  | "move_text"
  | "format_change"
  | "style_change"
  | "numbering_change"
  | "table_change"
  | "header_footer_change"
  | "field_update"
  | "comment_added"
  | "comment_resolved"
  | "unknown_native_revision"

interface NativeRevisionDelta {
  delta_id: string
  artifact_ref: StorageRef
  base_artifact_version_ref: StorageRef
  revised_artifact_version_ref: StorageRef

  source_format: "docx" | "xlsx" | "pptx" | "pdf"
  source_editor:
    | "onlyoffice"
    | "word_online"
    | "desktop_word"
    | "excel_online"
    | "desktop_excel"
    | "external_pdf_editor"
    | "doc27_word_addin"

  revisions: NativeRevisionItem[]
  native_comments: NativeDocumentComment[]

  extraction_confidence:
    | "exact_native_revision_xml"
    | "word_js_revision_api"
    | "diff_inferred"
    | "partial"
    | "failed"

  unsupported_revision_count: number
  unsupported_revision_examples: string[]
  created_at: ISO8601
  schema_version: 1
}

interface NativeRevisionItem {
  revision_id: string
  native_revision_id?: string
  kind: NativeRevisionKind
  author_display_name?: string
  author_principal_ref?: PrincipalRef
  timestamp?: ISO8601
  anchor: ArtifactScopeRef | TextAnchor | StructuredAnchor
  before_text?: string
  after_text?: string
  style_before?: Record<string, unknown>
  style_after?: Record<string, unknown>
  affects_formatting: boolean
  affects_meaning: boolean
  disposition: "pending" | "accepted" | "rejected" | "superseded" | "unknown"
  disposition_source: "native_editor" | "review_studio" | "agent_inferred" | "not_available"
}

interface NativeDocumentComment {
  comment_id: string
  native_comment_id?: string
  author_display_name?: string
  body: string
  anchor: ArtifactScopeRef | TextAnchor | StructuredAnchor
  thread_state: "open" | "resolved" | "deleted" | "unknown"
  linked_finding_id?: string
}

interface ExternalNativeEditRoundTrip {
  roundtrip_id: string
  review_session_id: string
  artifact_ref: StorageRef

  launched_editor:
    | "desktop_word"
    | "word_online"
    | "desktop_excel"
    | "excel_online"
    | "desktop_powerpoint"
    | "powerpoint_online"
    | "pdf_editor"

  launch_ref: {
    local_path?: string
    m365_drive_id?: string
    m365_item_id?: string
    web_url?: string
    launched_at: ISO8601
  }

  pre_launch_checkpoint_ref: StorageRef
  pre_launch_hash: string
  pre_launch_m365_version_id?: string

  detection_method:
    | "filesystem_watch"
    | "m365_graph_version_poll"
    | "explicit_user_return_button"
    | "manual_import"

  ingestion_state:
    | "waiting"
    | "save_detected"
    | "ingesting"
    | "ingested"
    | "conflict"
    | "failed"
    | "abandoned"

  ingested_native_revision_delta_ref?: StorageRef
  post_roundtrip_checkpoint_ref?: StorageRef
  schema_version: 1
}
```

### 3.12 DOC27 / Word add-in seed hooks

```ts
type WordAccessMode =
  | "graph_file_roundtrip"
  | "officejs_addin_live"
  | "desktop_file_roundtrip"
  | "browser_dom_automation_prohibited"

type WordStorageMode =
  | "onedrive_backed_desktop_word"
  | "sharepoint_backed_desktop_word"
  | "word_online_cloud"
  | "local_file_desktop_word"
  | "unregistered_local_file"

interface WordHostedElnorSession {
  session_id: string
  word_document_identity_ref: StorageRef

  binding:
    | { kind: "standalone_word_document"; standalone_document_session_ref: StorageRef }
    | { kind: "doc23_task_bound"; task_id: string; run_id?: string; review_studio_session_ref?: StorageRef }
    | { kind: "matter_bound"; matter_ref: StorageRef }

  conversation_mode:
    | "general_elnor_chat"
    | "document_advice"
    | "review_studio_assist"
    | "legal_research"
    | "draft_revision"
    | "formatting_review"
    | "citation_check"
    | "task_agent"

  active_agent_ref?: AgentRef
  active_model_policy_ref?: StorageRef

  context_policy: {
    use_elnor_memory: boolean
    use_task_context: boolean
    use_document_context: boolean
    use_matter_context: boolean
    use_selected_text_context: boolean
    use_comments_context: boolean
    use_revision_context: boolean
  }

  current_selection_ref?: StorageRef
  current_document_snapshot_ref?: StorageRef
  current_comment_sync_ref?: StorageRef
  current_native_revision_delta_ref?: StorageRef

  created_at: ISO8601
  updated_at: ISO8601
  schema_version: 1
}
```

---

## 4. Master decision index

### Cluster A — Status, ownership, root architecture

| ID | Finding · disposition | Apply |
|---|---|---|
| RS-000 | Path/filename mismatch — ACCEPT | ✓ |
| RS-001 | False “no architect review outstanding” — ARCHITECT_STOP | ✓ |
| RS-002 | Missing `ReviewableSubject` (+ artifact kinds, N1) — RESOLVED | ✓ |
| RS-003 | Event-sourced Review Studio session required — ACCEPT-WITH-MODIFICATIONS | ✓ |
| RS-004 | `HumanReviewResult extends DocumentReviewRequest` invalid inheritance — ACCEPT-WITH-MODIFICATIONS | ✓ |

### Cluster B — Ports, outputs, routing, staged loops

| ID | Finding · disposition | Apply |
|---|---|---|
| RS-005 | Terminal output must carry correct reviewed package — ACCEPT-WITH-MODIFICATIONS | ✓ |
| RS-006 | Assist/Revisor mutation bypass risk — ARCHITECT_STOP | ✓ |
| RS-007-R3 | Corrected output port model — ACCEPT-WITH-MODIFICATIONS | ✓ |
| RS-008 | Magic routing values `smart` / `auto_previous` — ACCEPT | ✓ |
| RS-009 | Direct Review Studio → Revisor path — ACCEPT-WITH-MODIFICATIONS | ✓ |
| RS-010 | Finish preflight for unresolved comments/findings/instructions — ACCEPT | ✓ |
| RS-011 | Standalone review runner missing — ACCEPT | ✓ |
| RS-046 | Staged workflow loop with paired outputs/inputs — ACCEPT-WITH-MODIFICATIONS | ✓ |
| RS-047 | Plan review must be Dispatcher projection, not `plan_in` — ACCEPT-WITH-MODIFICATIONS | ✓ |
| RS-054 | Per-gate allowed decisions/button availability — ACCEPT | ✓ |

### Cluster C — Findings, comments, instructions, hard calls

| ID | Finding · disposition | Apply |
|---|---|---|
| RS-012 | Comment resolution is not finding resolution — ACCEPT | ✓ |
| RS-013 | Finding disposition verbs ambiguous — ACCEPT | ✓ |
| RS-014 | General directives auto-promoted to criteria — ACCEPT-WITH-MODIFICATIONS | ✓ |
| RS-015 | Human-review feedback adapter — ACCEPT-WITH-MODIFICATIONS | ✓ |
| RS-016 | HardRevisionCall resolution missing — ACCEPT-WITH-MODIFICATIONS | ✓ |
| RS-017 | `human_resolved` state collision — RESOLVED (§5.7.2 invariant) | ✓ |
| RS-018 | Rationale should not be required for ordinary edits — ACCEPT | ✓ |
| RS-048 | Returned revision needs per-comment closure map — ACCEPT | ✓ |
| RS-052 | Unified comment identity across DOC20/Word/OnlyOffice/PDF — ACCEPT | ✓ |
| RS-053 | Durable candidate / authority-basis naming cleanup — ACCEPT | ✓ |

### Cluster D — Mutation, versions, revalidation, long-running gates

| ID | Finding · disposition | Apply |
|---|---|---|
| RS-019 | Mutation preconditions missing — ACCEPT | ✓ |
| RS-020 | Checkpoints / undo / revert missing — ACCEPT-WITH-MODIFICATIONS | ✓ |
| RS-021 | Human edit revalidation trigger — RESOLVED (see RS-056) | ✓ |
| RS-022 | Stale review on resume — ACCEPT | ✓ |
| RS-023 | Human-edited anchors need preservation locks — ACCEPT | ✓ |
| RS-024 | Rejected-version lifecycle missing — ACCEPT | ✓ |
| RS-050 | Expiry / idempotency / process-restart durability — ACCEPT | ✓ |
| RS-051 | Dry-run revalidation from Review Studio — ACCEPT | ✓ |

### Cluster E — Native documents, Word, DOC27

| ID | Finding · disposition | Apply |
|---|---|---|
| RS-025 | Native-format review cannot convert to Notes — ACCEPT | ✓ |
| RS-026 | DOCX version-spine handoff — RESOLVED (reconciliation) | ✓ |
| RS-027 | Native tracked changes need normalized delta — RESOLVED (safety gate) | ✓ |
| RS-028 | Word Online/Desktop Word round-trip — ACCEPT | ✓ |
| RS-029 | DOC27 Word add-in as separate spec — DEFER (decided fast-follow) | ~ |
| RS-030 | Word Online DOM automation prohibited — REJECT as implementation path | ✗ |

### Cluster F — UI / workflow

| ID | Finding · disposition | Apply |
|---|---|---|
| RS-031 | Mode-driven UI / conditional Findings tab — ACCEPT | ✓ |
| RS-032 | Comment-first pass — ACCEPT | ✓ |
| RS-033 | Artifact provenance panel — ACCEPT | ✓ |
| RS-034 | Review Inbox / Review Thread — DEFER with hooks | ~ |
| RS-035 | Cost/latency preview — ACCEPT | ✓ |
| RS-036 | Critique Swarm / parallel critiques — DEFER | ~ |
| RS-037 | Partial approval with deferred revision — DEFER | ~ |
| RS-049 | Reviewer assignment/signoff hooks — DEFER with schema hook | ~ |
| RS-055 | Partial/section-by-section review — DEFER | ~ |

### Cluster G — Governance, lints, obligations

| ID | Finding · disposition | Apply |
|---|---|---|
| RS-038 | Per-object governance / taint inheritance — ACCEPT | ✓ |
| RS-039 | Taint clearance hook — ACCEPT-WITH-MODIFICATIONS | ✓ |
| RS-040 | Privilege/matter filtering on review surface — REJECT | ✗ |
| RS-041 | Teaching signals to durable patterns — DEFER / OP-A | ~ |
| RS-042 | Consolidated lints and fixtures — ACCEPT-WITH-MODIFICATIONS | ✓ |
| RS-043 | DOC21/DOC22/DOC20 registry obligations — ACCEPT | ✓ |
| RS-044 | ModuleActivationChat/session-continuation stub — ACCEPT-WITH-MODIFICATIONS | ✓ |
| RS-045 | Word add-in implementation ladder — ACCEPT as DOC27 note | ✓ |

### Cluster H — Round-2 net-new (RS-056–RS-066)

| ID | Finding · disposition | Apply |
|---|---|---|
| RS-056 | Resolve RS-021: `human_authored_version_created` revalidation — ACCEPT-AS-FIX | ✓ |
| RS-057 | Email review input-fidelity (`ReviewInputFidelity`) — ACCEPT (scope ⚠verify) | ✓ |
| RS-058 | `approve_proceed` terminal action + bind `to_revisor` button — ACCEPT | ✓ |
| RS-059 | `review_context_in` carries source/evidence refs — ACCEPT-WITH-MODIFICATIONS | ✓ |
| RS-060 | Optional `SemanticChangelog` auto-synthesis — ACCEPT-WITH-MODIFICATIONS | ~ |
| RS-061 | `LifecycleReadQuery.human_reviewed_only` filter — ACCEPT | ✓ |
| RS-062 | `confidence_triggered_auto_route` — REJECT (no auto-routing) | ✗ |
| RS-063 | `regenerate_only` routing flag — ACCEPT-AS-OPTION | ✓ |
| RS-064 | Review attestation / chain-of-custody — ACCEPT-WITH-MODIFICATIONS (verify) | ✓ |
| RS-065 | `ReviewIterationBudget` (split max_revisions by route) — ACCEPT | ✓ |
| RS-066 | `ReviewExternalSurfaceBinding` (unified surface) — ACCEPT-WITH-MODIFICATIONS | ✓ |

---

## 5. Per-item adjudication rows

### RS-000 — [repo path] Path / filename mismatch (`Studio` vs `Studo`) (ACCEPT)

- **Raised by:** ChatGPT / source-anchor audit  
- **Type:** BUG  
- **Severity:** minor / patch-blocking
- **Problem:** Prompt and manifest path variants differ. A patch applied to the wrong path may miss the operative D1 file.
- **Disposition:** ACCEPT.
- **Fix:** Add a pre-application note:

```text
PATH NORMALIZATION NOTE:
Before applying this card, verify the canonical Review Studio D1 path and normalize `Studo` → `Studio` if approved. Do not patch a stale duplicate.
```

---

### RS-001 — [front matter] False “no architect review outstanding” (ARCHITECT_STOP)

- **Raised by:** ChatGPT, Claude, Gemini, adjudicator audit  
- **Type:** ARCHITECT_STOP  
- **Severity:** blocking
- **Problem:** D1 introduces or extends canonical object families and owner-doc seams.
- **Disposition:** ARCHITECT_STOP.
- **Fix:** Replace any “no outstanding architect review” statement with:

```text
Architect review status: DRAFT_WITH_BLOCKING_OWNER_DOC_OBLIGATIONS.

This unit is not operative until owner admission is completed for:
ReviewableSubject, ReviewStudioSessionRecord, ReviewStudioSubmissionEnvelope,
Review Studio output packages, NativeRevisionDelta, RevisorRequestPackage,
FindingDecisionPackage, ReviewActionSequence, named signal ports, DOC20/DOC27
capability bindings, and all receiving-port names introduced by this draft.
```

---

### RS-002 — [scope] Missing `ReviewableSubject` abstraction (RESOLVED)

- **Raised by:** ChatGPT, Claude (Round 2: ChatGPT RS-02/RS-03, Claude N1)
- **Type:** GAP / BETTER_IDEA → **resolved**
- **Severity:** was blocking
- **Problem:** D1 is document-centered but Review Studio must also handle module outputs, finding sets, plans, source bundles, structured data, and native documents. Round 2 (Claude N1) sharpened this: non-document artifact *kinds* (claim sets, chronologies, privilege logs, data tables) have no review path, and each needs its own anchor model.
- **Disposition:** **RESOLVED.** Adopt the `ReviewableSubject` family (§3.1) plus a `ReviewableArtifactKind` enum with a per-kind anchor model — text-range for documents, `claim_id` for claim sets, cell/row refs for tables, etc. Email is the coarse sub-case (RS-057).
- **Fix:** Add the `ReviewableSubject` family + `ReviewableArtifactKind` in §3.1.

---

### RS-003 — [session] Event-sourced session required (ACCEPT-WITH-MODIFICATIONS)

- **Raised by:** ChatGPT, Grok, Claude  
- **Type:** GAP  
- **Severity:** substantive
- **Problem:** Review Studio supports multi-step human/agent/native edits but lacks durable session state.
- **Disposition:** ACCEPT-WITH-MODIFICATIONS.
- **Fix:** Add `ReviewStudioSessionRecord` and `ReviewStudioActionEvent` in §3.2.

---

### RS-004 — [submission] `HumanReviewResult extends DocumentReviewRequest` invalid inheritance (ACCEPT-WITH-MODIFICATIONS)

- **Raised by:** ChatGPT; disputed by Grok/Claude  
- **Type:** BUG  
- **Severity:** substantive
- **Problem:** A terminal human-review submission is not a DOC20 agent-review request.
- **Disposition:** ACCEPT-WITH-MODIFICATIONS.
- **Fix:** Add `ReviewStudioSubmissionEnvelope` in §3.3; reference DOC20 requests/results rather than extending them.

---

### RS-005 — [outputs] Terminal output must carry the correct reviewed package (ACCEPT-WITH-MODIFICATIONS)

- **Raised by:** ChatGPT, Gemini, Claude, user follow-up  
- **Type:** BUG  
- **Severity:** blocking
- **Problem:** A clean approval should not dump the review session downstream, but an approval after edits/comments/track changes must send the reviewed package as approved.
- **Disposition:** ACCEPT-WITH-MODIFICATIONS.
- **Fix:** Use output-specific packages in §3.4. `approved_review_package_out` carries `ApprovedReviewPackage`.
- **Rule:**

```text
approved_artifact_version_ref is the downstream operative artifact.
original_review_input_ref is provenance only.
```

---

### RS-006 — [Revisor safety] Assist / mutation bypass risk (ARCHITECT_STOP)

- **Raised by:** Claude, ChatGPT, Gemini  
- **Type:** ARCHITECT_STOP  
- **Severity:** blocking
- **Problem:** Agent-assist repair must not bypass EC mutation or Revisor `revision_in`.
- **Disposition:** ARCHITECT_STOP.
- **Fix:** Add:

```text
RULE review_studio_no_direct_repair_bypass:
Any automated repair of an artifact from Review Studio must either:
1. create an EC-managed candidate artifact/version; or
2. route through Revisor `revision_in`.

A producing agent, specialist agent, DOC27 add-in, or DOC20 assist surface must not directly mutate durable task artifacts outside EC-owned mutation paths.
```

---

### RS-007-R3 — [ports] Corrected Review Studio output model (ACCEPT-WITH-MODIFICATIONS)

- **Raised by:** Grok, ChatGPT, user follow-up, adjudicator audit  
- **Type:** BUG / PHANTOM_FEATURE  
- **Severity:** blocking
- **Problem:** Prior output names mixed routes, packages, signals, internal adapters, and inputs.
- **Disposition:** ACCEPT-WITH-MODIFICATIONS.
- **Fix:** Replace the D1 port registry with §2.2–§2.4.
- **Special corrections:**

```text
- stage_response_in[n] is input, not output.
- work_sent_signal_out is removed.
- error_out uses ReviewStudioErrorPayload, not ReviewSignalPackage.
- approved_signal_out and rejected_signal_out require owner admission as named signal ports.
- finding_decisions_out requires owner admission for the receiving port, recommended: human_finding_feedback_in.
```

---

### RS-008 — [routing] Magic routing values `smart` / `auto_previous` (ACCEPT)

- **Raised by:** Grok  
- **Type:** BUG  
- **Severity:** blocking
- **Problem:** Non-deterministic routing values are not buildable.
- **Disposition:** ACCEPT.
- **Fix:** Use explicit `ReviewRouteDecision` and `ReviewRouteReceipt` (§2.8). Remove `smart` and `auto_previous`.

---

### RS-009 — [Revisor route] Direct Review Studio → Revisor path (ACCEPT-WITH-MODIFICATIONS)

- **Raised by:** all reviewers  
- **Type:** CONFIRMED / BETTER_IDEA  
- **Severity:** substantive
- **Problem:** Direct handoff to Revisor is valuable but must be a special package to `revision_in`.
- **Disposition:** ACCEPT-WITH-MODIFICATIONS.
- **Fix:** `revisor_request_out` carries `RevisorRequestPackage`; required target port is `revision_in`.

---

### RS-010 — [finish] Finish preflight for unresolved review material (ACCEPT)

- **Raised by:** Gemini, ChatGPT  
- **Type:** BUG  
- **Severity:** substantive
- **Problem:** User may add comments, instructions, finding decisions, or pending repair items but click approve.
- **Disposition:** ACCEPT.
- **Fix:** Add `ReviewFinishPreflight` in §3.9.

---

### RS-011 — [standalone] Standalone review runner missing (ACCEPT)

- **Raised by:** Claude  
- **Type:** GAP  
- **Severity:** substantive
- **Problem:** A Review Studio session outside a live task graph still needs a runner for assist/revalidation/staged actions.
- **Disposition:** ACCEPT.
- **Fix:** Add a narrow `StandaloneReviewGateRunner` or admit `ReviewStudioSequenceRunner` as part of RS-046. It must not duplicate the full Looper.

---

### RS-012 — [comments/findings] Comment resolution is not finding resolution (ACCEPT)

- **Raised by:** ChatGPT, Claude  
- **Type:** BUG  
- **Severity:** substantive
- **Problem:** Resolving a comment thread is not the same as semantically resolving a finding.
- **Disposition:** ACCEPT.
- **Fix:** Add `CommentFindingLinkEvent` in §3.8.

---

### RS-013 — [finding vocabulary] Finding disposition verbs ambiguous (ACCEPT)

- **Raised by:** ChatGPT, Claude, Gemini  
- **Type:** GAP  
- **Severity:** substantive
- **Problem:** `accept/reject` is ambiguous: accept finding vs accept proposed change.
- **Disposition:** ACCEPT.
- **Fix:** Use `FindingDispositionKind` in §3.5.

---

### RS-014 — [instructions] General directives auto-promoted to criteria (ACCEPT-WITH-MODIFICATIONS)

- **Raised by:** ChatGPT, Claude, Gemini  
- **Type:** BUG  
- **Severity:** substantive
- **Problem:** Free-text instructions should not silently become pass/fail criteria.
- **Disposition:** ACCEPT-WITH-MODIFICATIONS.
- **Fix:** Rename “directive” to `ReviewInstruction`; classify to repair/research/source-check/run-guidance/criterion only when needed. Use §3.5.

---

### RS-015 — [feedback compatibility] Human-review feedback adapter, not output port (ACCEPT-WITH-MODIFICATIONS)

- **Raised by:** ChatGPT, Claude  
- **Type:** GAP  
- **Severity:** substantive
- **Problem:** Feedback Delivery’s `EvaluationFeedbackBundle` is useful internally, but not a Review Studio output port.
- **Disposition:** ACCEPT-WITH-MODIFICATIONS.
- **Fix:**

```text
Review Studio packages may be adapted into EvaluationFeedbackBundle by the Feedback Interpreter when a downstream DOC23 subsystem requires that shape. Do not expose feedback_bundle_out as a Review Studio port.
```

---

### RS-016 — [hard calls] HardRevisionCall resolution missing (ACCEPT-WITH-MODIFICATIONS)

- **Raised by:** Grok  
- **Type:** GAP  
- **Severity:** substantive
- **Problem:** If Review Studio is opened for a strategic/hard-call gate, it needs a hard-call resolution payload.
- **Disposition:** ACCEPT-WITH-MODIFICATIONS.
- **Fix:** Add:

```ts
interface ReviewHardCallResolution {
  resolution_id: string
  review_session_id: string
  hard_call_ref: StorageRef
  decision:
    | "accept_risk"
    | "rewrite_for_neutrality"
    | "escalate_to_human"
    | "send_to_revisor"
    | "reject_output"
    | "custom"
  selected_option_ref?: StorageRef
  user_note?: string
  generated_repair_instruction_ref?: StorageRef
  actor: LifecycleActorEnvelope
  governance: GovernanceEnvelope
  created_at: ISO8601
  schema_version: 1
}
```

---

### RS-017 — [finding state] `human_resolved` state collision (RESOLVED)

- **Raised by:** ChatGPT, Grok, Gemini (Round 2 confirmed)
- **Type:** ARCHITECT_STOP / GAP → **resolved**
- **Severity:** was substantive
- **Problem:** Reviewers disagreed whether to add `human_resolved` as a state or a resolution kind.
- **Disposition:** **RESOLVED.** `human_resolved` is **not** a new parallel state; a human decision is recorded as a transition on the canonical finding-state machine (the §5.7.2 finding-state invariant), via a resolution receipt/kind. No side state.

---

### RS-018 — [rationale] Do not require rationale for ordinary edits (ACCEPT)

- **Raised by:** ChatGPT, user follow-up  
- **Type:** UX guardrail  
- **Severity:** substantive
- **Fix:** Add:

```ts
type RationaleCaptureMode =
  | "none"
  | "system_inferred"
  | "optional_user_note"
  | "required_short_reason"

type RationaleRequirementTrigger =
  | "reject_required_finding"
  | "override_evaluator_fail"
  | "approve_with_unresolved_required_findings"
  | "promote_feedback_to_durable_instruction"
  | "change_run_criterion"
  | "clear_taint"
  | "accept_high_risk_revisor_candidate"
  | "external_side_effect_approval"

interface ReviewRationalePolicy {
  default_mode: "system_inferred"
  required_only_for: RationaleRequirementTrigger[]
  allow_one_click_reasons: boolean
  one_click_reason_options: string[]
  never_require_for: Array<
    | "ordinary_text_comment"
    | "minor_copyedit"
    | "accept_agent_tracked_change"
    | "reject_agent_tracked_change"
    | "resolve_comment"
    | "add_inline_instruction"
  >
  schema_version: 1
}
```

---

### RS-019 — [mutation] Mutation preconditions missing (ACCEPT)

- **Raised by:** ChatGPT, Claude, Gemini  
- **Type:** GAP  
- **Severity:** blocking
- **Fix:** Add `ReviewStudioMutationPrecondition` in §3.10.

---

### RS-020 — [versioning] Checkpoints / undo / revert missing (ACCEPT-WITH-MODIFICATIONS)

- **Raised by:** ChatGPT, Claude, user  
- **Type:** GAP  
- **Severity:** substantive
- **Fix:** Add `ArtifactCheckpointRecord` and `ReviewRestoreAction` in §3.10.

---

### RS-021 — [revalidation] Human edit revalidation trigger (RESOLVED — see RS-056)

- **Raised by:** ChatGPT, Claude, Grok, Gemini (all four; reaffirmed in Round 2)
- **Type:** ARCHITECT_STOP → **resolved**
- **Severity:** was blocking
- **Disposition:** **RESOLVED** by **RS-056**: add `human_authored_version_created` to the shared `RevisionOperationKind` (V3.3.1 §0.4.7), wire it into the §11.21 revalidation cascade, and make the revalidation receipt Evaluator-owned (§11.6). The Round-1 caution (don't pollute Revisor-only receipt enums) is honored — Review Studio emits the event; the Evaluator writes the receipt. Full fix at RS-056.

---

### RS-022 — [resume] Stale review on resume (ACCEPT)

- **Raised by:** Claude, ChatGPT  
- **Type:** GAP  
- **Severity:** substantive
- **Fix:** Add `ReviewBaseVersionCheck` in §3.10.

---

### RS-023 — [preservation] Human-edited anchors need preservation locks (ACCEPT)

- **Raised by:** Gemini, Claude, ChatGPT  
- **Type:** BUG / BETTER_IDEA  
- **Severity:** substantive
- **Fix:** Any human-edited anchor becomes a `PreservationConstraint` when routed through `user_comments_revisions_out`, `revisor_request_out`, or `stage_instruction_out[n]`.

---

### RS-024 — [rejection lifecycle] Rejected version lifecycle missing (ACCEPT)

- **Raised by:** Claude  
- **Type:** GAP  
- **Severity:** substantive
- **Fix:** Mark rejected artifacts as `human_rejected` and prevent downstream consumption as approved.

---

### RS-025 — [native docs] Native-format review cannot convert to Notes (ACCEPT)

- **Raised by:** ChatGPT, Claude, user  
- **Type:** BUG  
- **Severity:** blocking
- **Problem:** Formatting-critical Word/PDF/Excel review cannot be done through Notes.
- **Fix:** Add `ReviewStudioNativeSurfacePolicy` in §3.11. Ban note fork unless `fidelity_requirement = semantic_text_only`.

---

### RS-026 — [DOCX spine] DOCX version-spine handoff (RESOLVED)

- **Raised by:** Claude, ChatGPT (Round 2: Claude C2; ChatGPT §5.5)
- **Type:** ARCHITECT_STOP → **resolved**
- **Severity:** was blocking
- **Disposition:** **RESOLVED** (version-spine reconciliation). Define the point at which the artifact "becomes" a DOCX; after that, the DOCX copy-on-write spine (`_E{N}.docx`, OnlyOffice) is the single source of truth for native review and the internal Tiptap `v{N}` spine stops (it becomes provenance / pre-materialization history). No dual live spine.

---

### RS-027 — [tracked changes] Native tracked changes need normalized delta (RESOLVED)

- **Raised by:** ChatGPT, Claude, Gemini (Round 2: ChatGPT RS-11; Gemini)
- **Type:** GAP → **resolved**
- **Severity:** was blocking for Word workflows
- **Disposition:** **RESOLVED** (`NativeRevisionSafetyGate`). Native comments/tracked-changes are normalized into a system-readable delta on ingest; the delta — not the raw DOCX markup — flows downstream.
- **Fix:** Add `NativeRevisionDelta` / `NativeRevisionSafetyGate` in §3.11. Owner split: DOC20/DOC27 extracts; DOC23 consumes.

---

### RS-028 — [Word round-trip] Word Online/Desktop Word round-trip (ACCEPT)

- **Raised by:** ChatGPT, Claude, user  
- **Type:** CONFIRMED / GAP  
- **Fix:** Add `ExternalNativeEditRoundTrip` in §3.11.

---

### RS-029 — [DOC27] Word add-in as separate spec (DEFER — decided fast-follow)

- **Raised by:** ChatGPT, Claude, user  
- **Type:** BETTER_IDEA  
- **Disposition:** **DEFER (decided).** DOC27 is a fast-follow, **not** a Review Studio v1 blocker. v1 ships on M365-online-in-tab + OnlyOffice + Graph round-trip; the add-in (Office.js, WordApi 1.6) is a separate spec Review Studio consumes optionally. Related: RS-066 surface binding.
- **Fix:** Create DOC27 as a separate Word Add-in / Native Word Bridge spec; Review Studio consumes it optionally.

---

### RS-030 — [Word Online] DOM automation prohibited (REJECT as implementation path)

- **Raised by:** ChatGPT, Claude  
- **Type:** BUG prevention  
- **Disposition:** REJECT as implementation path.
- **Fix:** Use `WordAccessMode = "browser_dom_automation_prohibited"` in §3.12.

---

### RS-031 — [UI] Mode-driven UI / conditional Findings tab (ACCEPT)

- **Raised by:** ChatGPT, Claude, Grok, Gemini  
- **Type:** BETTER_IDEA  
- **Fix:** Add:

```ts
type ReviewStudioMode =
  | "quick_human_gate"
  | "ordinary_artifact_review"
  | "evaluator_finding_review"
  | "revisor_plan_review"
  | "revisor_candidate_review"
  | "native_format_review"
  | "source_verification_review"
  | "multi_agent_review_room"

type ReviewStudioPanel =
  | "comments"
  | "agent"
  | "findings"
  | "hard_calls"
  | "plan"
  | "versions"
  | "context_preview"
  | "provenance"
  | "history"
  | "native_revisions"
  | "room"

interface ReviewStudioLayoutPolicy {
  mode: ReviewStudioMode
  primary_surface: ReviewSurfaceMode
  panels: ReviewStudioPanel[]
  default_panel: ReviewStudioPanel
  allowed_pinned_panels: ReviewStudioPanel[]
  use_secondary_drawer: boolean
  show_findings_only_when_present: boolean
  schema_version: 1
}
```

---

### RS-032 — [workflow] Comment-first pass (ACCEPT)

- **Raised by:** ChatGPT, user  
- **Type:** BETTER_IDEA  
- **Fix:** Use `user_comments_revisions_out` for comment-first workflows.

---

### RS-033 — [provenance] Artifact provenance panel (ACCEPT)

- **Raised by:** Claude, ChatGPT  
- **Type:** BETTER_IDEA  
- **Fix:** Add:

```ts
interface ArtifactProvenanceView {
  artifact_ref: StorageRef
  current_version_ref: StorageRef
  task_run_ref?: StorageRef
  entries: ArtifactProvenanceEntry[]
  schema_version: 1
}

interface ArtifactProvenanceEntry {
  step_ref: StorageRef
  actor: LifecycleActorEnvelope
  action_kind:
    | "research"
    | "draft"
    | "red_team_review"
    | "revise"
    | "evaluate"
    | "format"
    | "human_edit"
    | "native_editor_roundtrip"
    | "other"
  summary: string
  output_ref?: StorageRef
  produced_artifact_version_ref?: StorageRef
  occurred_at: ISO8601
}
```

---

### RS-034 — [navigation] Review Inbox / Review Thread (DEFER with hooks)

- **Raised by:** Claude  
- **Type:** GAP / SUGGESTION  
- **Disposition:** DEFER.
- **Fix now:** Ensure `ReviewStudioSessionRecord` includes task/run/status/subject fields sufficient for future projections.

---

### RS-035 — [routing UX] Cost / latency preview (ACCEPT)

- **Raised by:** Claude, Grok  
- **Type:** BETTER_IDEA  
- **Fix:** Add:

```ts
interface RoutingCostEstimate {
  target:
    | "my_edit_only"
    | "original_module"
    | "other_module"
    | "revisor"
    | "evaluator_bridge"
    | "staged_sequence"
  est_model_calls: "none" | "low" | "moderate" | "high"
  est_latency_band: "instant" | "seconds" | "minutes"
  est_token_band?: "low" | "moderate" | "high"
  estimator_confidence?: "experimental" | "uncalibrated" | "calibrated"
  schema_version: 1
}
```

---

### RS-036 — [assist] Critique Swarm / parallel critiques (DEFER)

- **Raised by:** Grok  
- **Disposition:** DEFER. Useful but not required for v1.

---

### RS-037 — [partial approval] Partial approval with deferred revision (DEFER)

- **Raised by:** Gemini  
- **Disposition:** DEFER. Staged workflow covers most near-term needs without graph-level concurrent partial-approval semantics.

---

### RS-038 — [governance] Per-object governance / taint inheritance (ACCEPT)

- **Raised by:** ChatGPT, Gemini  
- **Type:** GAP  
- **Fix:** Add governance to materialized review objects:

```ts
interface ReviewMaterializedObjectBase {
  object_ref: StorageRef
  object_kind:
    | "review_comment"
    | "finding_disposition"
    | "review_instruction"
    | "repair_instruction"
    | "run_guidance_candidate"
    | "criterion"
    | "native_revision_delta"
    | "attachment"
    | "delta_brief"
  actor: LifecycleActorEnvelope
  governance: GovernanceEnvelope
  source_policy_snapshot_ref?: StorageRef
  taint_inheritance_refs: StorageRef[]
  sanitization_node_ref?: StorageRef
  schema_version: 1
}
```

---

### RS-039 — [taint] Taint clearance hook (ACCEPT-WITH-MODIFICATIONS)

- **Raised by:** Gemini, Grok  
- **Disposition:** ACCEPT-WITH-MODIFICATIONS.
- **Fix:** Add optional hook:

```ts
interface ReviewTaintClearanceAuthorization {
  authorization_id: string
  review_session_id: string
  cleared_object_refs: StorageRef[]
  clearance_scope:
    | "current_run_only"
    | "current_artifact_version"
    | "specific_downstream_target"
  clearance_basis:
    | "human_verified_source"
    | "trusted_internal_work_product"
    | "sanitized_summary"
    | "other"
  actor: LifecycleActorEnvelope
  governance: GovernanceEnvelope
  created_at: ISO8601
  schema_version: 1
}
```

---

### RS-040 — [privilege] Privilege/matter filtering on review surface (REJECT)

- **Raised/retracted by:** Claude  
- **Disposition:** REJECT as default Review Studio behavior.
- **Reason:** Privilege/matter is egress/action governance by default; internal review should label governance rather than block the review surface.

---

### RS-041 — [learning] Teaching signals to durable patterns (DEFER / OP-A)

- **Raised by:** Grok, Gemini  
- **Disposition:** DEFER to memory/pattern owner.
- **Fix now:** OP-A row only.

---

### RS-042 — [lints / fixtures] Consolidated lints and fixtures (ACCEPT-WITH-MODIFICATIONS)

- **Raised by:** all reviewers  
- **Disposition:** ACCEPT-WITH-MODIFICATIONS.
- **Fix:** Add lint and fixture set in §6.

---

### RS-043 — [UI registry] DOC21/DOC22/DOC20 registry obligations (ACCEPT)

- **Raised by:** ChatGPT  
- **Disposition:** ACCEPT.
- **Fix:** Add cross-doc obligation rows for Review Studio panels, buttons, staged workflow UI, native document states, DOC27 surfaces.

---

### RS-044 — [session continuation] ModuleActivationChat stub (ACCEPT-WITH-MODIFICATIONS)

- **Raised by:** ChatGPT, user  
- **Disposition:** ACCEPT-WITH-MODIFICATIONS.
- **Fix:** Add:

```ts
interface ModuleActivationChatRef {
  chat_ref: StorageRef
  task_id: string
  run_id: string
  module_id: string
  module_session_ref?: TaskModuleSessionRef
  activation_seq?: number

  chat_kind:
    | "review_studio_assist"
    | "reprompt_checkpoint"
    | "module_continuation"
    | "task_agent_followup"

  continuation_status:
    | "not_resumable"
    | "resumable"
    | "archived"
    | "policy_blocked"
    | "capability_missing"

  schema_version: 1
}
```

---

### RS-045 — [DOC27] Word add-in implementation ladder (ACCEPT)

- **Raised by:** ChatGPT, Claude, user  
- **Disposition:** ACCEPT as DOC27 note.
- **Fix:** Add DOC27 build ladder:

```text
T0 scaffold — manifest + task pane + ribbon command.
T1 selection ask — read selection, send to Elnor, show answer.
T2 insert comment — native Word comment at selection.
T3 insert edit — proposal-first replace/insert.
T4 standalone attach — attach current Word doc outside DOC23.
T5 comment sync — manual Word <-> Elnor sync.
T6 Review Studio binding — link add-in session to Review Studio/task.
T7 tracked-change delta — exact/partial extraction plus OOXML fallback.
```

---

### RS-046 — [staged workflow] Staged Review Action Sequence (ACCEPT-WITH-MODIFICATIONS)

- **Raised by:** user follow-up; adjudicator added  
- **Type:** BETTER_IDEA / GAP  
- **Severity:** substantive
- **Problem:** Review Studio needs structured multi-step workflows such as research → revise → evaluate without forcing everything through Task Agent.
- **Disposition:** ACCEPT-WITH-MODIFICATIONS.
- **Fix:** Add §3.6 staged workflow schemas and runtime binding.
- **Rule:**

```text
stage_instruction_out[n] is output.
stage_response_in[n] is input.
ReviewActionSequence must compile to existing looper, run under admitted narrow runner, or create Task Agent graph patch.
```

---

### RS-047 — [plan review] Revisor plan review must be Dispatcher projection, not `plan_in` (ACCEPT-WITH-MODIFICATIONS)

- **Raised by:** Grok, Claude  
- **Type:** BUG / PHANTOM_FEATURE  
- **Severity:** blocking if left as port
- **Problem:** `plan_in` treats a Dispatcher-owned plan as graph-cabled module data.
- **Disposition:** ACCEPT-WITH-MODIFICATIONS.
- **Fix:** Remove `plan_in`; add `RevisionPlanReviewResult` in §3.7.

---

### RS-048 — [comments] Returned revision needs per-comment closure map (ACCEPT)

- **Raised by:** Claude N9 / audit  
- **Type:** GAP  
- **Severity:** substantive
- **Problem:** If user sends comments out for revision, returned artifact should say which comments were addressed.
- **Disposition:** ACCEPT.
- **Fix:** Add `CommentClosureMap` in §3.8.

---

### RS-049 — [review identity] Reviewer assignment/signoff hooks (DEFER with schema hook)

- **Raised by:** Claude N4 / audit  
- **Type:** GAP  
- **Severity:** minor/substantive
- **Disposition:** DEFER multi-user UX, but include schema hook.
- **Fix:** Add `ReviewAssignment` in §3.9.

---

### RS-050 — [long-running review] Expiry, idempotency, restart durability (ACCEPT)

- **Raised by:** Claude S8 / audit  
- **Type:** GAP  
- **Severity:** substantive
- **Problem:** Long-lived human gates must survive restart and not replay outputs.
- **Disposition:** ACCEPT.
- **Fix:** Add `ReviewGateExpiryPolicy` and `ReviewResumeIdempotencyRecord` in §3.9.

---

### RS-051 — [revalidation UI] Dry-run revalidation from Review Studio (ACCEPT)

- **Raised by:** Gemini, Grok / audit  
- **Type:** BETTER_IDEA / GAP  
- **Severity:** substantive
- **Disposition:** ACCEPT.
- **Fix:** Add `ReviewStudioDryRunEvaluationRequest` in §3.10.

---

### RS-052 — [comment identity] Unified comment identity across surfaces (ACCEPT)

- **Raised by:** Claude N11 / audit  
- **Type:** GAP  
- **Severity:** substantive
- **Fix:** Add `ReviewCommentIdentityMap` in §3.8.

---

### RS-053 — [naming] Durable candidate / authority-basis cleanup (ACCEPT)

- **Raised by:** Claude S4/M2  
- **Type:** BUG / naming cleanup  
- **Severity:** minor
- **Fix:**

```text
Replace `DirectInstructionCandidate` where the draft means durable knowledge candidate with `DurableKnowledgeCandidate`, unless the target is specifically a direct-instruction learning object.

Map `human_label` to `authority_basis`, not `assurance_basis`, where the field describes human authority/source.
```

---

### RS-054 — [gate config] Per-gate allowed decisions / button availability (ACCEPT)

- **Raised by:** Claude BI1 / audit  
- **Type:** GAP  
- **Severity:** substantive
- **Fix:** Add `ReviewGateDecisionPolicy` in §3.9.

---

### RS-055 — [long artifacts] Partial / section-by-section review (DEFER)

- **Raised by:** Claude N13  
- **Type:** SUGGESTION  
- **Disposition:** DEFER.
- **Reason:** Useful but not required for v1. Staged workflow and changed-scope revalidation cover near-term needs.

---

### — Round-2 net-new rows (RS-056–RS-066) —

_The following eleven rows are the net-new items from Round 2; everything above (RS-000–RS-055) is the Round-1 adjudication, confirmed by Round 2._

### RS-056 — [revalidation] Resolve RS-021: `human_authored_version_created` trigger + cascade + receipt ownership

- **Raised by:** Grok (BUG, two passes), Gemini (Revalidation Blindspot + Receipt-Ownership BUG), ChatGPT (RS-12). Co-raised by Claude (**S2**, which adds the reconciliation requirement below).
- **Type:** ARCHITECT_STOP (resolves the v3 OPEN item).
- **Severity:** blocking → **closed by this fix**.
- **Problem (RS-021's Round-1 recommendation, verbatim):** *"Use Review Studio-level trigger reason `human_authored_version_created`; do not pollute Revisor-only receipt enums unless owner confirms."* — left OPEN_FOR_ARCHITECT_REVIEW. Without resolution, a human-authored version does not refresh findings or re-trigger the Evaluator/Revisor path; downstream is blind to human edits.
- **Reconciliation (Claude S2):** `human_authored_version_created` must reconcile with the existing `human_gate_decision` event so a human edit does **not** produce a parallel, unreconciled event. The version event records the *artifact change*; the gate-decision event records the *review decision* — they reference the same `review_session_id` and are linked, not duplicated.
- **Disposition:** **ACCEPT-AS-FIX.** The three reviewers converge on the concrete resolution and supply the missing receipt-ownership rule that was the architect's open concern.
- **Anchor:** this card **§3.10** ("Mutation, checkpoints, stale-base, revalidation") and the **RS-021** row. **REPLACE** the RS-021 disposition with the following.

```ts
// V3.3.1 §0.4.7 — extend the shared RevisionOperationKind (proposed value)
type RevisionOperationKind =
  | "automated_revisor_edit"
  | "agent_assist_edit"                  // via CandidateArtifactVersion, EC-committed
  | "human_authored_version_created"     // NEW
  /* …existing kinds… */;

// Review Studio EMITS this; it does not write the revalidation receipt.
interface HumanAuthoredVersionEvent {
  kind: "human_authored_version_created";
  review_session_id: string;
  subject_ref: ReviewableSubjectRef;
  base_version_ref: ArtifactVersionRef;
  new_version_ref: ArtifactVersionRef;
  authored_by: LifecycleActorRef;        // human actor
  edit_provenance: "human_direct";
  taint_event_ref?: StorageRef;          // ties to RS-038/039 taint (human_direct)
  semantic_changelog?: SemanticChangelogEntry[];  // optional, RS-060
  created_at: string;
}
```

- **Wiring (cross-artifact):**
  1. Add `human_authored_version_created` to the **shared** `RevisionOperationKind` (V3.3.1 §0.4.7) — per Grok+Gemini, the human path must travel the same cascade as automated revisions. This satisfies the "enum placement" question RS-021 left open: the value lives in the shared enum, the **event is emitted by Review Studio**, and the **receipt is written by the revalidating authority**.
  2. Include the kind in the **V3.3.1 §11.21 revalidation cascade** so a human-authored version refreshes findings and re-triggers Evaluator/Revisor exactly as an automated revision does.
  3. **Receipt ownership (§11.6) — resolves Gemini's objection:** the revalidation receipt for a human-authored version is owned by the **Evaluator** (the revalidating authority), **not** Review Studio. Review Studio emits the trigger event only; it never writes the receipt. This is what keeps the value out of "Revisor-only receipt enums" while still living in the shared operation enum — the card's RS-021 caution is honored, not violated.
- **Lint:** `review_studio.revalidation_trigger_without_snapshot_ref` (already in ChatGPT §8 / card RS-042) — fires when a human-authored version lacks a `base_version_ref`/`new_version_ref` pair.
- **Fixture:** `GS-RS-02-human-edit-revalidation` (already in card).
- **⚠verify:** exact V3.3.1 §0.4.7 enum name; §11.21 cascade hook; §11.6 receipt-ownership wording.

### RS-057 — [scope/native] Email review input-fidelity contract (`ReviewInputFidelity`)

- **Raised by:** ChatGPT (RS-19). Sub-case of the `ReviewableSubject` scope question (RS-002; Claude N1).
- **Type:** GAP.
- **Severity:** substantive.
- **Problem:** Review Studio can receive review input over channels of very different fidelity (full surface, DOC20 viewer, Word add-in, **email reply**, API). Email is coarse-only — no exact anchors, comment-only mutation, weaker identity. Without a fidelity contract the system can silently over-claim what an email reviewer could do.
- **Disposition:** **ACCEPT** the contract. It is the formal expression of the already-present fixture `GS-RS-04-email-coarse-loss` and the email lints below; it attaches to the `ReviewableSubject`/surface (RS-002), not a new port.
- **Anchor:** this card **§3.1** ("Reviewable subject and surfaces"). **INSERT AFTER** the surface definition:

```ts
interface ReviewInputFidelity {
  channel: "review_studio_surface" | "doc20_document_viewer"
         | "doc27_word_addin" | "email_reply" | "api";
  anchor_fidelity: "exact" | "approximate" | "unanchored" | "none";
  mutation_capability: "none" | "comment_only" | "native_tracked_change"
                     | "artifact_new_version" | "external_roundtrip";
  identity_confidence: "authenticated_session" | "verified_email_sender"
                     | "manual_operator_entry" | "unknown";
  allowed_actions: ReviewStudioActionKind[];
  degraded_reason?: string;
  schema_version: 1;
}
// email_reply pins to: anchor approximate|none, mutation comment_only,
// identity verified_email_sender|unknown — and allowed_actions is narrowed accordingly.
```

- **Lints (net-new, attach to RS-042):** `review_studio.email_anchor_claim_without_full_surface`, `review_studio.email_reply_created_direct_edit`.
- **⚠verify (scope):** v1 Review Studio ships **M365-online + OnlyOffice + Graph**; **email-reply** review may be Phase-II / DOC12-intake-gated. If so, keep the contract but mark the `email_reply` channel value **DEFER-until-email-intake** and ship the other channels in v1.

### RS-058 — [terminal action] `approve_proceed` action + bind `RoutingVia="to_revisor"` to a terminal button

- **Raised by:** Grok (BUG/GAP, both passes).
- **Type:** GAP.
- **Severity:** minor.
- **Problem:** v3 §2.7 has "Approve & Continue" (fires **A**) and "Send to Revisor" (fires **C**), but there is no single action that **approves the current version AND immediately routes it into the Revisor for the next pass**, and the literal `approve_proceed` is absent from the action enum even though the prose describes the behavior. `RoutingVia="to_revisor"` exists but is not bound to a terminal button.
- **Disposition:** **ACCEPT** (minor) — completes the terminal action set.
- **Anchor:** this card **§2.7** button-to-port table + the action-kind enum in **§3.2**. **INSERT** a row and enum value:

```ts
type ReviewTerminalAction =
  | "approve_continue"          // A (+ optional E)
  | "approve_proceed"           // NEW: A AND RoutingVia="to_revisor" — approve + route into Revisor
  | "send_comments_revisions"   // B
  | "send_to_revisor"           // C (+ D w/ confirm)
  | "submit_finding_decisions"  // D
  | "reject_stop";              // F
```

| Button / action | Ports fired | Notes |
|---|---|---|
| **Approve & Proceed** | **A**, then route approved version via `RoutingVia="to_revisor"` | Approve + immediate next Revisor pass; respects the RS-010 finish-preflight. |

- **⚠verify:** the card's existing action-enum names, to avoid duplicating "Send to Revisor".

### RS-059 — [context] `review_context_in` must carry source/evidence refs ("reviewing in a vacuum")

- **Raised by:** Gemini (GAP). Aligns with Claude's reviewer-context concern.
- **Type:** GAP.
- **Severity:** substantive.
- **Problem:** v3 §2.4 replaces `findings_in` with `review_context_in`, but a reviewer (human or assist) needs to see **what the work was based on** — sources, prior drafts, the evidence the artifact was built from — not just a feedback bundle. Without it the reviewer judges in a vacuum.
- **Disposition:** **ACCEPT-WITH-MODIFICATIONS** — extend `review_context_in` to carry source/upstream refs, **read-only and on-demand**. Hard constraint: sources do **not** become a review checklist. This preserves the card's rule that evaluation criteria belong to the Outcome Evaluator and surface only as finding provenance (hovercard), never as a human checklist.
- **Anchor:** this card **§2.4** / the `review_context_in` definition. **INSERT** fields:

```ts
interface ReviewContextIn {
  review_session_id: string;
  feedback_bundle_ref?: StorageRef;
  source_refs?: StorageRef[];                 // NEW: evidence/sources the artifact was built from
  upstream_artifact_refs?: ArtifactVersionRef[]; // NEW: prior drafts / inputs
  criteria_provenance_refs?: StorageRef[];    // for finding hovercards only — NOT a checklist
  schema_version: 1;
}
```

- **⚠verify:** exact `StorageRef`/`ArtifactVersionRef` names; confirm the surface renders these as read-only context, gated by the same egress/taint rules as any cross-task injection.

### RS-060 — [learning] Optional Diff-to-Finding / `SemanticChangelog` auto-synthesis

- **Raised by:** Gemini (BETTER_IDEA), Grok (semantic changelog for regenerate steps).
- **Type:** BETTER_IDEA.
- **Severity:** substantive (optional).
- **Problem:** when a human edits directly and approves, the system loses the *why*. Downstream Revisor/learning would benefit from a one-line summary of what changed without forcing the human to type a rationale.
- **Disposition:** **ACCEPT-WITH-MODIFICATIONS** — **optional, non-blocking** auto-synthesis. The system MAY diff the human-authored version against base and attach a `SemanticChangelogEntry` to the outcome.
- **Why it does not violate RS-018:** RS-018 rejected *requiring* a rationale for ordinary edits. This changelog is **system-synthesized, never a required human field** — the human can approve with no changelog. It complements `finding.rationale` rather than reintroducing the rationale tax.
- **Anchor:** this card **§3.5** + the `HumanAuthoredVersionEvent` (RS-056). **INSERT**:

```ts
interface SemanticChangelogEntry {
  from_version_ref: ArtifactVersionRef;
  to_version_ref: ArtifactVersionRef;
  summary: string;                 // e.g. "Human softened the indemnification language in §4.2"
  affected_anchor_refs?: AnchorRef[];
  synthesized_by: "agent" | "human";
  confidence?: number;
  schema_version: 1;
}
// attaches as optional semantic_changelog[] on HumanAuthoredVersionEvent / HumanReviewResult
```

- **Cross-artifact:** feeds DOC85 learning slices / DOC72 (the teaching-signal route RS-041 DEFERs). Stays out of the blocking path.
- **⚠verify:** confirm it never gates the terminal decision.

### RS-061 — [inspectability] `LifecycleReadQuery.human_reviewed_only` filter

- **Raised by:** Grok (BETTER_IDEA/SUGGESTION, both passes).
- **Type:** SUGGESTION.
- **Severity:** minor.
- **Problem:** no first-class way to query "only lifecycle entries that carry a human review decision" — needed for audit / chain-of-custody inspection of human decisions (securities-litigation defensibility).
- **Disposition:** **ACCEPT** (minor).
- **Anchor:** **V3.3.1 §9.2 `LifecycleReadQuery`** (operative). **INSERT** field:

```ts
interface LifecycleReadQuery {
  /* …existing filters… */
  human_reviewed_only?: boolean;   // NEW
}
```

- **⚠verify:** confirm §9.2 `LifecycleReadQuery` is the right operative interface.

### RS-062 — [routing/policy] `confidence_triggered_auto_route` — auto-route past the human gate

- **Raised by:** Grok (BETTER_IDEA, both passes).
- **Type:** BETTER_IDEA.
- **Severity:** substantive — **policy fork (now decided)**.
- **Problem:** Grok proposes auto-routing an approved/high-confidence revision straight to the Revisor when evaluator confidence ≥ threshold (unless a HardCall is raised), to save a human round-trip.
- **Disposition:** **REJECT.** Architect decision (Will): *the gate is the gate.* Auto-routing past the human gate — even gated behind a toggle — cuts against the entire purpose of Review Studio, which exists to put a deliberate human control point in the loop. A confidence score is not a substitute for the human decision the gate represents. **Do not introduce `confidence_triggered_auto_route`, a `GateAutoRoutePolicy`, or any equivalent.** High confidence may *surface a recommendation* in the UI (e.g., pre-select the "Send to Revisor" action), but the human still presses the button.
- **Note:** the legitimate efficiency Grok is reaching for is served by **RS-063** (`regenerate_only`, a human-chosen lightweight route) and **RS-035** (cost/latency preview, so the human picks the lightest sufficient path) — both keep the human in control.

### RS-063 — [routing] `regenerate_only` routing flag

- **Raised by:** Grok (BETTER_IDEA, second pass).
- **Type:** BETTER_IDEA.
- **Severity:** minor.
- **Problem:** sometimes the human wants the Revisor to **rewrite without a full evaluation cycle** (a straight redo in drafting loops) — currently every Revisor route implies the full cycle.
- **Disposition:** **ACCEPT-AS-OPTION** — fits the established cheap→expensive routing spectrum (my-edit-only → comment → another module → Revisor → evaluator-bridge). It is an option on the routing decision, not a new port.
- **Anchor:** this card routing / `ReviewRoutingDecision`, alongside RS-009. **INSERT** field:

```ts
interface ReviewRoutingDecision {
  /* …existing… */
  regenerate_only?: boolean;   // NEW: Revisor rewrite without full evaluation cycle
}
```

- **⚠verify:** a `regenerate_only` route still respects the RS-010 terminal-vs-pending-mods preflight.

### RS-064 — [defensibility] Review attestation / chain-of-custody record

- **Raised by:** Claude (N3), Grok (ReviewSessionEnvelope "legal defensibility / chain-of-custody").
- **Type:** GAP / BETTER_IDEA.
- **Severity:** substantive (for a securities-litigation user, work-product defensibility is high-value).
- **Problem:** §5's session durability (RS-050), comment identity (RS-052), and authority-basis cleanup (RS-053) do not clearly produce an **immutable, content-sealed record of who reviewed which version, what was shown, what was decided, and when** — the artifact a Rule-11 / work-product challenge would need.
- **Disposition:** **ACCEPT-WITH-MODIFICATIONS — verify first.** If RS-050/RS-053 already content-seal the review record + decision, this collapses into a CONFIRM. Otherwise add the distinct immutable `ReviewAttestation` below (EC sole writer; serialized-durable).

```ts
interface ReviewAttestation {
  attestation_id: string;
  review_session_id: string;
  reviewer: LifecycleActorRef;              // who
  reviewed_version_ref: ArtifactVersionRef; // which version
  shown_summary_ref?: StorageRef;           // what was shown (surface state / diff view)
  terminal_decision: ReviewTerminalAction;  // what was decided
  finding_decisions_ref?: StorageRef;
  decided_at: string;
  content_hash: string;                     // seal over the above; EC-written
  schema_version: 1;
}
```

- **Lint:** `review_studio.terminal_decision_without_attestation`.
- **Fixture:** `GS-RS-35-terminal-decision-attestation` (named to avoid the existing `GS-RS-23-task-agent-graph-patch`).

---

### RS-065 — [budget] `ReviewIterationBudget` — split `max_revisions` by route

- **Raised by:** ChatGPT (§14.3).
- **Type:** GAP.
- **Severity:** substantive.
- **Problem:** v3 has the `GS-RS-22-budget-split` fixture but (per ⚠verify #8) may lack the schema. Advise-only chat, mutating assist, Revisor dispatch, and external Word round-trips should not draw down the same budget — otherwise a few advise turns can exhaust the revision allowance.
- **Disposition:** **ACCEPT** — adopt ChatGPT's per-route budget. Anchor: this card **§3.9** (finish/gate policy) or **§3.6** (staged sequence); attaches to the `review_session_id`.

```ts
interface ReviewIterationBudget {
  budget_id: string;
  review_session_id: string;
  max_advise_turns?: number | "unlimited";
  max_mutating_assist_rounds: number;
  max_external_roundtrips: number;
  max_revisor_dispatches: number;
  max_direct_user_edit_checkpoints_before_revalidation_prompt: number;
  used_advise_turns: number;
  used_mutating_assist_rounds: number;
  used_external_roundtrips: number;
  used_revisor_dispatches: number;
  direct_user_edit_checkpoints_since_revalidation: number;
  on_budget_exceeded: "block" | "warn_and_allow" | "require_task_agent_assessment";
}
```

- **Fixture:** `GS-RS-22-budget-split` (already in card). **⚠verify** whether the interface already exists in v3.

### RS-066 — [native/surface] `ReviewExternalSurfaceBinding` — unified surface binding layer

- **Raised by:** ChatGPT (§14.7).
- **Type:** GAP.
- **Severity:** substantive.
- **Problem:** Review Studio drives several editing surfaces (DOC20 viewer, DOC20 OnlyOffice, M365 Word-online round-trip, Desktop Word, DOC27 add-in, PDF viewer, xlsx native). Without one binding layer, surface wiring is scattered across the native-doc rows.
- **Disposition:** **ACCEPT-WITH-MODIFICATIONS** — adopt the binding, but **reconcile with RS-057 `ReviewInputFidelity`** so the two are complementary, not duplicative: the **binding** says *which surface/provider* is in use; the **fidelity** says *what that channel can do* (anchors, mutation, identity). Anchor: this card **§3.11** (native documents and Word/DOC27 bridge).

```ts
interface ReviewExternalSurfaceBinding {
  binding_id: string;
  review_session_id: string;
  provider:
    | "doc20_document_viewer" | "doc20_onlyoffice"
    | "m365_word_online_roundtrip" | "desktop_word_roundtrip"
    | "doc27_word_addin" | "doc20_pdf_viewer" | "doc20_xlsx_native"
    | "external_native_app";
  fidelity_ref?: StorageRef;   // → the ReviewInputFidelity for this channel (RS-057)
  // …provider-specific handles (round-trip version identity, add-in bridge status)…
  schema_version: 1;
}
```

- **Cross-artifact:** the DOC27 provider values are **fast-follow** (Word add-in), not a v1 blocker. **⚠verify** the provider value-set against the card's native-doc cluster.

---

## 6. Lints and fixtures

### 6.1 Port and routing lints

```ts
type ReviewStudioPortLint =
  | "review_studio.output_port_named_after_internal_record"
  | "review_studio.stage_response_declared_as_output"
  | "review_studio.approved_output_missing_current_artifact_version"
  | "review_studio.approved_output_includes_unsubmitted_finding_decisions"
  | "review_studio.finding_decisions_auto_submitted_without_user_confirmation"
  | "review_studio.revisor_request_not_routed_to_revision_in"
  | "review_studio.human_edited_anchor_without_preservation_lock"
  | "review_studio.work_sent_signal_output_declared"
  | "review_studio.rejected_signal_contains_repair_payload"
  | "review_studio.generic_signal_out_declared"
  | "review_studio.named_signal_port_missing_owner_admission"
  | "review_studio.error_out_uses_review_signal_package"
  | "review_studio.output_connected_to_incompatible_input_port"
  | "review_studio.sequence_runner_duplicates_existing_looper"
```

### 6.2 Findings/comments/instructions lints

```ts
type ReviewStudioFindingCommentLint =
  | "review_studio.comment_resolve_treated_as_finding_resolution"
  | "review_studio.finding_disposition_ambiguous_accept_reject"
  | "review_studio.general_directive_auto_promoted_to_criterion_without_confirmation"
  | "review_studio.run_criterion_missing_required_criterion_fields"
  | "review_studio.directive_materialization_kind_unconfirmed"
  | "review_studio.fix_this_finding_request_missing_targeted_finding_id"
  | "review_studio.returned_revision_without_comment_closure_map"
  | "review_studio.cross_surface_comment_without_identity_map"
```

### 6.3 Mutation/version/native lints

```ts
type ReviewStudioMutationNativeLint =
  | "review_studio.assist_mutation_without_precondition"
  | "review_studio.direct_edit_without_precondition"
  | "review_studio.finished_with_stale_evaluation_snapshot"
  | "review_studio.revalidation_trigger_without_snapshot_ref"
  | "review_studio.dry_run_result_mutated_finding_lifecycle_without_user_submit"
  | "review_studio.paused_gate_without_expiry_policy"
  | "review_studio.resume_replayed_already_dispatched_output"
  | "review_studio.stage_replayed_after_process_restart"
  | "validation.native_format_review_requested_but_note_fork_used"
  | "validation.tracked_changes_present_but_unextracted"
  | "validation.native_revision_delta_partial_without_warning"
  | "validation.word_online_dom_automation_claimed_as_canonical"
```

### 6.4 Required fixtures

```text
GS-RS-01-basic-approve-no-edit
GS-RS-02-human-edit-revalidation
GS-RS-03-finding-to-revisor
GS-RS-04-email-coarse-loss
GS-RS-05-pdf-read-only
GS-RS-06-docx-copy-on-write
GS-RS-07-plan-review-disposition
GS-RS-08-downstream-context-receipt
GS-RS-09-taint-policy-block
GS-RS-10-stale-assist-result
GS-RS-11-data-in-non-artifact-subject
GS-RS-12-approve-carries-delta-brief
GS-RS-13-comment-resolved-not-finding-resolved
GS-RS-14-directive-classifier
GS-RS-15-assist-stale-base-conflict
GS-RS-16-plan-step-modify-requires-recompile
GS-RS-17-native-word-delta-to-context
GS-RS-18-doc27-unavailable-fallback
GS-RS-19-consumption-receipt-required
GS-RS-20-approve-with-limitations
GS-RS-21-rationale-policy
GS-RS-22-budget-split
GS-RS-23-task-agent-graph-patch
GS-RS-24-doc12-room-import-back
GS-RS-25-module-activation-chat-availability
GS-RS-26-approved-output-edited-version
GS-RS-27-finding-decisions-explicit-submit
GS-RS-28-rejected-signal-no-repair-payload
GS-RS-29-stage-output-input-loop
GS-RS-30-route-receipt-downcast
GS-RS-31-comment-closure-map
GS-RS-32-review-expiry-idempotency
GS-RS-33-dry-run-revalidation-no-mutation
GS-RS-34-comment-identity-cross-surface

WORD-RS-01-onlyoffice-comment-and-track-change
WORD-RS-02-word-online-roundtrip
WORD-RS-03-desktop-word-roundtrip
WORD-RS-04-word-addin-selection-question
WORD-RS-05-word-addin-comment-sync
WORD-RS-06-word-addin-standalone-document
WORD-RS-07-partial-revision-extraction-warning
WORD-RS-08-private-sideload
WORD-RS-09-desktop-word-onedrive-backed
```

---

### 6.5 Round-2 lints and fixtures

```ts
type ReviewStudioRound2Lint =
  | "review_studio.email_anchor_claim_without_full_surface"   // RS-057
  | "review_studio.email_reply_created_direct_edit"           // RS-057
  | "review_studio.terminal_decision_without_attestation";    // RS-064
```

Round-2 fixtures: `GS-RS-35-terminal-decision-attestation` (RS-064); `WORD-RS-08-private-sideload`, `WORD-RS-09-desktop-word-onedrive-backed` (DOC27 fast-follow). `GS-RS-02-human-edit-revalidation` (RS-056) and `GS-RS-22-budget-split` (RS-065) already exist in §6.4.

---

## 7. End-to-end traces

### Trace 1 — Clean approval to email module

```text
Review Studio
  approved_review_package_out
    → Email/Output Module artifact_in

Package:
  ApprovedReviewPackage.output_mode = clean
  approved_artifact_version_ref = current approved version

Optional:
  approved_signal_out → Trigger signal_in
```

No comments, findings, instructions, or source context are sent unless the approved output mode includes them.

### Trace 2 — Approve edited Word doc with comments/track changes

```text
Review Studio
  approved_review_package_out
    → Output Module artifact_in

Package:
  approved_artifact_version_ref = edited Word version
  output_mode = with_track_changes
  included_sidecars = [user_comments, native_revision_delta]
```

Downstream sends/uses the edited reviewed Word package, not the original review subject.

### Trace 3 — Send user comments back to original drafting module

```text
Review Studio
  user_comments_revisions_out
    → Drafting Module data_in + instruction_in

Package:
  current artifact
  user comments
  review instructions
  repair instructions
  preservation locks if any
```

Drafting module returns through its normal output or `module_reply_in` if Review Studio is waiting.

### Trace 4 — Fix this finding with a normal agent

```text
User clicks: Fix with Agent on Finding 4
Target: Legal Research Agent

Review Studio
  user_comments_revisions_out
    → Legal Research Agent instruction_in + context_in

Package:
  targeted_finding_ids = [Finding 4]
  review_instruction = "Research/fix the source gap for this finding."
  source_context = available sources
```

No Revisor required unless user chooses Send to Revisor.

### Trace 5 — Finding decisions only

```text
Review Studio
  finding_decisions_out
    → Feedback Interpreter / finding lifecycle human_finding_feedback_in

Package:
  finding decisions
  evaluator_action = rerun_selected_findings
```

No artifact repair occurs.

### Trace 6 — Mixed findings + Revisor repair

```text
Review Studio
  revisor_request_out
    → Revisor revision_in

Review Studio
  finding_decisions_out
    → Feedback Interpreter / finding lifecycle human_finding_feedback_in
```

This is valid because:

```text
revisor_request_out = repair artifact
finding_decisions_out = update finding lifecycle
```

### Trace 7 — Reject only

```text
Review Studio
  rejected_signal_out
    → Rejection Handler reject_signal_in

Package:
  signal_kind = rejected
  optional rejection note
  artifact ref
  review record ref
```

No repair data is sent.

### Trace 8 — Reject and ask Task Agent to replan

```text
Review Studio
  rejected_signal_out
    → Rejection Handler reject_signal_in

Review Studio
  user_comments_revisions_out
    → Task Agent task_instruction_in

Task Agent returns:
  TaskGraphPatchCandidate
  or ReviewActionSequence
```

The graph patch is reviewed before application.

### Trace 9 — Research → revise → evaluate staged loop

```text
Stage 1:
Review Studio
  stage_instruction_out[1]
    → Legal Research Module research_request_in

Legal Research Module
  research_result_out
    → Review Studio stage_response_in[1]

Review Studio pauses or continues.

Stage 2:
Review Studio
  stage_instruction_out[2]
    → Revisor revision_in
    includes StageResponsePackage[1]

Revisor
  candidate_out
    → Review Studio stage_response_in[2]

Review Studio pauses or continues.

Stage 3:
Review Studio
  stage_instruction_out[3]
    → Outcome Evaluator subject_in / evaluation_request_in
    includes revised artifact from StageResponsePackage[2]

Outcome Evaluator
  evaluation_result_out
    → Review Studio stage_response_in[3]
```

This is a human-review-aware loop, not a replacement for the general DOC23 Looper unless the owner admits `ReviewStudioSequenceRunner`.

---

## 8. Reviewer-by-reviewer coverage table

| Reviewer | Accepted | Modified | Rejected | Deferred | Unique catches | Over-claims / misses |
|---|---:|---:|---:|---:|---|---|
| ChatGPT | High | High | Low | Medium | `ReviewableSubject`, terminal context, native Word/DOC27, source anchors, lints/fixtures, port model cleanup after user critique. | Early output names were too abstract; now replaced. |
| Claude | High | High | Low | Medium | Criteria/evaluator distinction, routing spectrum, provenance panel, native Word spine, privilege egress reframe, comment closure, review expiry. | Claimed `HumanReviewResult extends DocumentReviewRequest` was acceptable; rejected here. |
| Grok | Medium | Medium | Medium | Medium | Port teardown, `plan_in`, magic routing, hard calls, context/source split. | “A+ ship as-is/no phantom” rejected; `feedback_bundle_out`/`evaluation_result_out` as ports rejected. |
| Gemini | Medium | Medium | Low | Low | Preservation locks, ghost revision, finding-specific fix, terminal deadlock, dry-run evaluator. | Partial approval deferred; best handled by staged workflow or later graph semantics. |

---

### 8.1 Round-2 coverage (re-review of the adjudication)

The same four models re-reviewed the adjudication. **Coverage audit: all 20 ChatGPT findings (RS-01–RS-20) and all 40 Claude findings (C1–C2 / S1–S13 / M1–M6 / N1–N13 / BI1–6) are captured.** Grok and Gemini largely re-reviewed the spec and confirmed.

| Reviewer (Round 2) | Confirmed | Net-new accepted | Declined / rejected | Best contribution |
|---|---|---|---|---|
| ChatGPT (GPT-5.5 Pro) | 17 of 20 map to existing rows | 3 — RS-057 email fidelity, RS-065 budget, RS-066 surface binding | — | §14 audit addendum carried the net-new contracts. |
| Gemini | ~13, incl. 5 stop-level | 2 — RS-059 context, RS-060 changelog | 1 defer (partial approval) | Independent `plan_in` Dispatcher stop — best confirmation. |
| Grok | ~6 | 5 — drove RS-056; RS-058, RS-061, RS-063, RS-064 angle | 1 decline (Critique Swarm), 1 reject (RS-062) | Drove the RS-021 resolution; routing flags; chain-of-custody. |
| Claude | all 40 map to rows | co-raised RS-056/057/059/060/064; S9–S11 anchor unification | self-recorded N2/N8/N12/BI2 dispositions | Minimal-architecture advocate; `ReviewAttestation`; non-document artifact kinds (N1). |

Round-2 conclusion: the architecture stands; one open item resolved by this round (RS-056), four resolved by adjudication and confirmed (§1.1), eleven net-new rows added (RS-056–RS-066).

---

## 9. Value-tier roll-up

### Tier 1 — Critical / blocking

- RS-001 — Owner admission / status correction.
- RS-002 — `ReviewableSubject` decision.
- RS-006 — Preserve Revisor `revision_in` chokepoint.
- RS-007-R3 — Correct output port model.
- RS-019 — Mutation preconditions.
- RS-021 — Human edit revalidation — **RESOLVED** by RS-056 (no longer open).
- RS-025 — Native-format review cannot use Notes.
- RS-026 — DOCX version-spine decision.
- RS-027 — Native tracked-change delta.
- RS-038 — Per-object governance.
- RS-046 — Staged workflow loop model.
- RS-047 — Remove `plan_in`; plan review as Dispatcher projection.

### Tier 2 — Substantive

- RS-003 — Event-sourced session.
- RS-004 — Submission envelope.
- RS-005 — Output-specific packages.
- RS-009 — Direct Revisor request.
- RS-010 — Finish preflight.
- RS-012 — Comment/finding split.
- RS-014 — ReviewInstruction classifier.
- RS-020 — Checkpoints/undo/revert.
- RS-022 — Stale review.
- RS-023 — Preservation locks.
- RS-028 — Word round-trip.
- RS-031 — Mode-driven UI.
- RS-032 — Comment-first pass.
- RS-033 — Provenance panel.
- RS-048 — Comment closure map.
- RS-050 — Expiry/idempotency/restart.
- RS-051 — Dry-run revalidation.
- RS-052 — Cross-surface comment identity.

### Tier 3 — Minor / polish

- RS-000 — Filename cleanup.
- RS-018 — Rationale policy.
- RS-035 — Cost/latency preview.
- RS-043 — UI registry rows.
- RS-045 — DOC27 implementation ladder.
- RS-049 — Assignment/signoff schema hook.
- RS-053 — Naming cleanup.
- RS-055 — Section-by-section review defer.

### Tier 4 — Considered / declined / deferred

| Item | Reason |
|---|---|
| `feedback_bundle_out` as output port | Internal adapter shape; not a Review Studio output. |
| `evaluation_result_out` as output port | Internal compatibility record; not user-facing Review Studio route. |
| `formal_assessment_out` | Confusing internal audit term; use `ReviewRecordRef` and internal adapters. |
| `revision_out` | Ambiguous: revised artifact, revision request, Revisor route. |
| `needs_revision_out` | Too vague; use `user_comments_revisions_out` or `revisor_request_out`. |
| `work_sent_signal_out` | Redundant; use `ReviewRouteReceipt` / telemetry. |
| generic `signal_out` | Phantom; replaced by owner-admitted named signals. |
| `send_to_task_agent_out` | Task Agent is a destination, not a unique port. |
| `send_to_room_out` | Deferred until DOC12 bridge intake/import-back contract exists. |
| Word Online DOM automation | Prohibited as canonical integration path. |
| Critique Swarm | Useful, but v1-deferred. |
| Partial approval with deferred revision | Deferred; staged workflow covers most immediate needs. |

---

### Round-2 additions (RS-056–RS-066)

**Tier 1 — Critical / blocking**
- RS-056 — resolve RS-021 (the only blocking Round-2 item).

**Tier 2 — Substantive**
- RS-057 email input-fidelity · RS-059 reviewer source-context · RS-064 attestation (verify) · RS-065 iteration budget · RS-066 surface binding · RS-060 optional semantic changelog.

**Tier 3 — Minor / polish**
- RS-058 `approve_proceed` · RS-061 `human_reviewed_only` filter · RS-063 `regenerate_only`.

**Considered / declined**
- RS-062 `confidence_triggered_auto_route` — **REJECT** (no auto-routing; load-bearing decline). · Critique Swarm — **DECLINE** (v1). · Partial approval — **DEFER**.

---

## 10. Cross-artifact implications

### DOC23 Addenda B / Review Studio

- Add `ReviewableSubject`.
- Add `ReviewStudioSessionRecord` and `ReviewStudioActionEvent`.
- Replace output ports with corrected port model.
- Add package schemas.
- Add staged workflow sequence.
- Add finish preflight and gate decision policy.
- Add ReviewRouteReceipt / receiver compatibility rule.
- Add finding-decision submission rules.

### V3.3.1 Outcome Evaluator / Revisor

- Confirm `revision_in` handoff.
- Confirm revalidation trigger for human/native edits.
- Confirm preservation constraints.
- Confirm whether plan review remains Dispatcher human-gate projection.

### Feedback Delivery

- Decide owner/name for `human_finding_feedback_in`.
- Keep `EvaluationFeedbackBundle` as internal adapter, not a Review Studio output port.
- Add consumption receipt / downstream context obligations if not already covered.

### Common Contracts

- Owner-admit any shared types that become cross-family primitives.
- Confirm anchor types for non-document/structured review subjects.

### DOC20

- Add Review Studio surface modes and degraded states.
- Add output mode support: clean, with comments, with track changes, redline, native current.
- Add native revision sidecar rendering.
- Add stage-pause Review Studio return states.
- Add cross-surface comment identity map support.

### DOC20 Addendum B / DOC16

- Add native Word round-trip state and Graph/file-version detection.
- Clarify DOCX copy-on-write version spine.
- Add OnlyOffice/Word Online/Desktop Word ingest states.

### DOC27

- Create new Word Add-in / Native Word Bridge spec.
- Include Word-hosted Elnor session, agent/model selector, comment sync, tracked-change sync, standalone Word document sessions.

### DOC12

- Defer room output until room bridge contract exists.
- Later specify room intake, participants, pinned review context, and import-back policy.

### DOC21 / DOC22

- Register UI controls:
  - Approve & Continue
  - Send Comments / Revisions
  - Send to Revisor
  - Submit Finding Decisions
  - Reject / Stop
  - Approved Signal / Rejected Signal wiring display
  - Add Stage / Run Stage
  - Stage response pause state
  - Native-document output modes
  - Finding-specific Fix with Agent button

### EC Core

- EC remains sole durable writer for:
  - review sessions
  - action events
  - review records
  - output packages
  - route receipts
  - checkpoints
  - staged sequence state
  - finding decisions
  - native revision deltas
  - comment identity maps

### OP-A

- Add obligation rows for every cross-doc owner item.

---

### Round-2 cross-artifact additions

| Target | Obligation | Source |
|---|---|---|
| V3.3.1 §0.4.7 | Add `human_authored_version_created` to shared `RevisionOperationKind` | RS-056 |
| V3.3.1 §11.21 | Add the human-authored kind to the revalidation cascade | RS-056 |
| V3.3.1 §11.6 | Revalidation receipt for human-authored version owned by Evaluator | RS-056 |
| V3.3.1 §9.1 | Add `review_session_id` to `LifecycleActorEnvelope` | Grok |
| V3.3.1 §9.2 | Add `human_reviewed_only` to `LifecycleReadQuery` | RS-061 |
| DOC11 / OpenClaw | Paused long-latency review run survives a process restart | Claude S8 |
| DOC85 / DOC72 | Semantic-changelog + teaching-signal route as learning input | RS-060, RS-041 |
| DOC27 | `WORD-RS-08/09` fixtures; surface-binding provider values — fast-follow | RS-066 |
| EC Core | `ReviewAttestation` EC-written, content-hash-sealed (if RS-064 added) | RS-064 |

---

## 11. Verdict and minimum patch list

## Verdict: `READY_AFTER_PATCH`

Review Studio D1 becomes operative once the Tier-1 patches, the §1.1 open-item resolutions, and the net-new RS-056–RS-066 are applied. Round 2 confirmed the architecture (notably Gemini's independent `plan_in` Dispatcher-ownership stop confirming RS-047, and Grok's "A+" with no new stops) and resolved all five Round-1 open items; no new `ARCHITECT_STOP` was raised. **`RS-062` (confidence-triggered auto-routing) is REJECTED — the gate is the gate.** The minimum patch list below is the Round-1 set; the **Round-2 additions** subsection follows it.

### Minimum patch list

1. Replace the port model with:

```text
Outputs:
  approved_review_package_out
  user_comments_revisions_out
  revisor_request_out
  finding_decisions_out
  approved_signal_out
  rejected_signal_out
  stage_instruction_out[n]
  error_out

Inputs:
  subject_in
  context_in
  review_context_in
  stage_response_in[n]
  revisor_candidate_in
  evaluator_result_in
  module_reply_in
```

2. Remove:

```text
revision_out
needs_revision_out
feedback_bundle_out
evaluation_result_out
formal_assessment_out
review_record_out
generic signal_out
work_sent_signal_out
send_to_task_agent_out
send_to_room_out
plan_in
findings_in
```

3. Add output packages:

```text
ApprovedReviewPackage
UserCommentsRevisionsPackage
RevisorRequestPackage
FindingDecisionPackage
ReviewSignalPackage
ReviewStudioErrorPayload
StageInstructionPackage
StageResponsePackage
```

4. Add Review Studio loop/stage model:

```text
ReviewActionSequence
ReviewActionStage
ReviewActionSequenceRuntimeBinding
```

5. Add receiver compatibility:

```text
ReviewRouteReceipt
receiver_port_contract_check rule
```

6. Add finding/comment/instruction fixes:

```text
CommentFindingLinkEvent
FindingDispositionKind
ReviewInstruction
CommentClosureMap
ReviewCommentIdentityMap
```

7. Add native document contracts:

```text
ReviewStudioNativeSurfacePolicy
NativeRevisionDelta
ExternalNativeEditRoundTrip
```

8. Add version/revalidation safety:

```text
ReviewStudioMutationPrecondition
ArtifactCheckpointRecord
ReviewBaseVersionCheck
ReviewRevalidationRequest
ReviewStudioDryRunEvaluationRequest
```

9. Add long-gate reliability:

```text
ReviewGateExpiryPolicy
ReviewResumeIdempotencyRecord
```

10. Add OP-A rows and UI registry obligations.

### Ranked top 10 fixes

1. Correct output port model.
2. Add staged workflow with paired output/input ports and Looper alignment.
3. Preserve Revisor `revision_in` chokepoint.
4. Separate finding decisions from approval and repair outputs.
5. Make approval send the actual reviewed/edited package.
6. Remove redundant/ambiguous internal-record ports.
7. Add receiver-port compatibility receipts.
8. Add preservation locks for human edits.
9. Add native document output modes and deltas.
10. Defer DOC12 room output until bridge exists.

---

### Round-2 additions to the patch list

After the Round-1 patch list above, also:

1. Apply the **§1.1 open-item resolutions** — RS-002 (`ReviewableSubject` + `ReviewableArtifactKind`), RS-017 (`human_resolved` → §5.7.2 invariant), RS-026 (version-spine reconciliation), RS-027 (`NativeRevisionSafetyGate`).
2. Apply **RS-056** (the RS-021 fix): `human_authored_version_created` → shared `RevisionOperationKind` + §11.21 cascade + §11.6 Evaluator-owned receipt. *Blocking.*
3. Apply net-new **RS-057, RS-059, RS-064, RS-065, RS-066** (substantive) and **RS-058, RS-061, RS-063** (minor).
4. **RS-060** optional (non-blocking semantic changelog).
5. **Do not** implement **RS-062** — auto-routing is REJECTED.
6. Add the **Round-2 cross-artifact obligations** (§10) and the OP-A rows.

---

## 12. Final synthesis

The corrected Review Studio design is:

```text
Review Studio is a review/edit/decision surface over ReviewableSubject.
It outputs concrete packages, not internal abstractions.
Approval sends the reviewed package as approved.
User comments/revisions go through their own package.
Revisor gets a Revisor-specific request through revision_in.
Finding decisions go to finding lifecycle / Feedback Interpreter.
Approval/rejection signals are pure named signals, owner-admitted.
Staged workflows are paired output/input loops and must align with the existing DOC23 looper.
Native document workflows use native formats, not Notes.
DOC27 is an optional future Word bridge, not a Review Studio v1 dependency.
```

---

**Round-2 close:** the second pass (ChatGPT, Claude, Grok, Gemini re-reviewing the adjudication) confirmed the architecture above, resolved all five Round-1 open items (§1.1), added the net-new RS-056–RS-066, and rejected confidence-triggered auto-routing (the gate is the gate). This card is self-contained: RS-000–RS-066 with paste-ready fixes, no external companion required.