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
ELNOR REPO READER TEXT MIRROR
Original path: Active Working and Red Team/DOC23 Working/DOC23 Red Teaming/DOC23_Review_Studio_Red_Team_Adjudication_Card_v4.md
Source repo: /Users/OpenClaw1/Elnor/Elnor Specs
Git branch: main
Git commit: dbaa25962edc11ab30e8d4ca1715f9ae5bf77331
Generated: 2026-06-09T01:23:58.539Z
---
# 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.