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 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 style_after?: Record 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. ```