DOC23_Review_Studio_Red_Team_Adjudication_Card_v3.md
Active Working and Red Team/DOC23 Working/DOC23 Red Teaming/Review Studio Red Team Responses/DOC23_Review_Studio_Red_Team_Adjudication_Card_v3.md
ELNOR REPO READER TEXT MIRROR
Original path: Active Working and Red Team/DOC23 Working/DOC23 Red Teaming/Review Studio Red Team Responses/DOC23_Review_Studio_Red_Team_Adjudication_Card_v3.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 v3
**Target:** DOC23 Addenda B Review Studio D1
**Purpose:** Consolidated adjudication card incorporating all attached red-team reviews and the subsequent port/output-design discussion.
**Prepared for:** Will / ELNOR Specs
**Prepared by:** GPT-5.5 Pro
**Repo-write status:** Not written to repo. This is a downloadable Markdown artifact for review, revision, and later application.
**Adjudication status:** `ARCHITECT_STOP` until Tier 1 patches are applied or explicitly waived.
---
## 0. Source pack and method
### 0.1 Review files adjudicated
| Source | Role |
|---|---|
| `Pasted text.txt` | Adjudication-card creation prompt and output requirements. |
| `DOC23 Add B Review Studio RT 1.md` | Combined red-team review pack: ChatGPT, Claude, Grok, Gemini. |
| Prior conversation with Will | Follow-up design discussion, especially output ports, native Word/DOC27, staged workflows, Revisor/Task Agent distinction, and Review Studio data routing. |
### 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
Approximate normalization:
```text
~142 raw assertions across four reviews and follow-up discussion
→ 56 adjudicated issues
→ 18 Tier 1 blocking/critical items
→ 25 substantive items
→ 8 minor/polish items
→ 5 considered/deferred/declined items
```
### 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:** `ARCHITECT_STOP` for Review Studio D1 as currently framed.
**Why:** the Review Studio concept is right, but the draft still needs structural corrections before it can become operative:
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.
**Ready-after-patch condition:** Apply Tier 1 items, add owner-doc OP-A rows, and verify exact section/path anchors.
---
## 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` — OPEN_FOR_ARCHITECT_REVIEW | ~ |
| 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 — OPEN_FOR_ARCHITECT_REVIEW | ~ |
| 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 unresolved — OPEN_FOR_ARCHITECT_REVIEW | ~ |
| 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 — OPEN_FOR_ARCHITECT_REVIEW | ~ |
| RS-027 | Native tracked changes need normalized delta — OPEN_FOR_ARCHITECT_REVIEW | ~ |
| RS-028 | Word Online/Desktop Word round-trip — ACCEPT | ✓ |
| RS-029 | DOC27 Word add-in as separate spec — DEFER / OPEN_FOR_ARCHITECT_REVIEW | ~ |
| 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 | ✓ |
---
## 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 (OPEN_FOR_ARCHITECT_REVIEW)
- **Raised by:** ChatGPT, Claude
- **Type:** GAP / BETTER_IDEA
- **Severity:** blocking
- **Problem:** D1 is document-centered but Review Studio must also handle module outputs, finding sets, plans, source bundles, structured data, and native documents.
- **Disposition:** OPEN_FOR_ARCHITECT_REVIEW.
- **Fix:** Add the `ReviewableSubject` family 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 (OPEN_FOR_ARCHITECT_REVIEW)
- **Raised by:** ChatGPT, Grok, Gemini
- **Type:** ARCHITECT_STOP / GAP
- **Severity:** substantive
- **Problem:** Reviewers disagree whether to add `human_resolved` as a state or resolution kind.
- **Disposition:** OPEN_FOR_ARCHITECT_REVIEW.
- **Recommended answer:** Prefer a resolution receipt/kind unless finding lifecycle owner globally adopts `human_resolved`.
---
### 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 unresolved (OPEN_FOR_ARCHITECT_REVIEW)
- **Raised by:** ChatGPT, Claude, Grok, Gemini
- **Type:** ARCHITECT_STOP
- **Severity:** blocking
- **Disposition:** OPEN_FOR_ARCHITECT_REVIEW.
- **Recommendation:** Use Review Studio-level trigger reason `human_authored_version_created`; do not pollute Revisor-only receipt enums unless owner confirms.
---
### 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 (OPEN_FOR_ARCHITECT_REVIEW)
- **Raised by:** Claude, ChatGPT
- **Type:** ARCHITECT_STOP
- **Severity:** blocking
- **Disposition:** OPEN_FOR_ARCHITECT_REVIEW.
- **Recommended answer:** Once an artifact is materialized to DOCX for filing-grade review, the DOCX copy-on-write spine becomes authoritative for native review; internal Tiptap version spine becomes provenance / pre-materialization history.
---
### RS-027 — [tracked changes] Native tracked changes need normalized delta (OPEN_FOR_ARCHITECT_REVIEW)
- **Raised by:** ChatGPT, Claude, Gemini
- **Type:** GAP
- **Severity:** blocking for Word workflows
- **Fix:** Add `NativeRevisionDelta` 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 / OPEN_FOR_ARCHITECT_REVIEW)
- **Raised by:** ChatGPT, Claude, user
- **Type:** BETTER_IDEA
- **Disposition:** DEFER / OPEN_FOR_ARCHITECT_REVIEW.
- **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.
---
## 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
```
---
## 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. |
---
## 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 owner decision.
- 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. |
---
## 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.
---
## 11. Verdict and minimum patch list
## Verdict: `ARCHITECT_STOP`
Review Studio D1 should not be promoted until Tier 1 patches are applied or explicitly waived.
### 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.
---
## 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.
```