ELNOR REPO READER TEXT MIRROR Original path: Active Working and Red Team/DOC23 Working/DOC23 Red Teaming/RT-0001_DOC23_ADD_B_REVIEW_STUDIO_ADJ_CARD_V4_REVIEW/03_ADJUDICATION/CARD_v04/RT-0001_Adjudication_Card_v04.md Source repo: /Users/OpenClaw1/Elnor/Elnor Specs Git branch: main Git commit: dbaa25962edc11ab30e8d4ca1715f9ae5bf77331 Generated: 2026-06-09T01:23:58.539Z --- # DOC23 Addenda B — Review Studio Red-Team Adjudication Card v4 **Target:** DOC23 Addenda B Review Studio D1 **Purpose:** Single, self-contained adjudication card for the Review Studio design. It consolidates **two red-team rounds** — Round 1 (the original ChatGPT/Claude/Grok/Gemini reviews of D1) and Round 2 (a re-review by the same four models) — into one set of adjudicated rows (RS-000–RS-066) and paste-ready fixes. **Complete on its own: no companion document is required to review or apply it.** **Prepared for:** Will / ELNOR Specs **Adjudication method:** Multi-reviewer red-team → dedup → one row per issue → disposition + paste-ready fix. Round 2 confirmed Round 1's architecture and resolved its open items. **Repo-write status:** Not written to repo. Downloadable Markdown artifact for review, revision, and later application to D1 → D2. **Adjudication status:** `READY_AFTER_PATCH` — apply the Tier-1 set + the §1.1 open-item resolutions + the net-new RS-056–RS-066, then apply to D1. --- ## 0. Source pack and method ### 0.1 Review inputs adjudicated This card consolidates two red-team rounds. **Round 1 — reviews of Review Studio D1** (adjudicated into RS-000–RS-055): | Source | Role | |---|---| | Round-1 red-team pack — ChatGPT, Claude, Grok, Gemini | Original reviews of D1. | | Adjudication-card creation prompt | Output requirements and adjudication rules. | | Design discussion with Will | Output ports, native Word/DOC27, staged workflows, Revisor/Task Agent distinction, data routing. | **Round 2 — re-review by the same four models** (`DOC23 Add B Review Studio RT 1.md`): | Section | Role | |---|---| | ChatGPT (GPT-5.5 Pro), lines 3–3696 | Re-review + amendment package: RS-01…RS-20, §5 Word/DOC27, §8 lints, §9 fixtures, §14 audit addendum. | | Claude, lines 3699–4269 | Consolidated findings: C1–C2 / S1–S13 / M1–M6 / N1–N13 / BI1–6. | | Grok, lines 4270–4601 | Re-review, two passes. | | Gemini, lines 4604–5025 | Re-review + value-tiered summary. | Round 2 overwhelmingly **confirmed** Round 1, **resolved** its five open items (§1.1), and added a small net-new set (RS-056–RS-066). Reviewer breakdown in §8. ### 0.2 Operative / authority specs consulted or referenced | Short name | Repo path / owner | |---|---| | Review Studio D1 | `Active Working and Red Team/DOC23 Working/.../DOC23 Add B Review Studio D1.md` / path spelling to verify. | | Addenda B Core | `Current Specs/DOC23/DOC23 Addenda B/DOC23_ADDENDA_B_CORE_R0_7_1.md` | | Outcome Evaluator / Revisor V3.3.1 | `Current Specs/DOC23/DOC23 Addenda B/DOC23_ADDB_OUTCOME_EVALUATOR_REVISOR_V3_3_1.md` | | Common Contracts | `Current Specs/DOC23/DOC23 Addenda B/DOC23_EVALUATION_COMMON_CONTRACTS_V1_1_1.md` | | Feedback Delivery | `Current Specs/DOC23/DOC23 Addenda B/DOC23_ADDB_SUBSYS_FEEDBACK_DELIVERY_V1_0_1.md` | | Staged Adjudication Card | `Active Working and Red Team/DOC23 Working/DOC23 Red Teaming/DOC23_ADDENDA_B_RT_ADJUDICATION_CARD_STAGED.md` | | DOC20 R4.3 | `Current Specs/DOC20/DOC20_R4_3.md` | | DOC20 Addendum B | `Current Specs/DOC20/DOC20_ADDENDUM_B_MS_WORD_VIEWER_CAPABILITIES_R3.md` | | DOC12 | Rooms / panels / forums owner; bridge target only, not reimplemented here. | | DOC16 | M365 / Graph / OneDrive / SharePoint integration owner. | | DOC21 / DOC22 | UI component registry / page inventory owners. | | EC Core | Sole durable writer for review records, packages, checkpoints, receipts. | | OP-A | Cross-doc obligation tracker. | ### 0.3 Raw → deduped count ```text Round 1 (reviews of D1): ~142 raw assertions across four reviews and follow-up discussion → 56 adjudicated issues (RS-000–RS-055) Round 2 (re-review of the adjudication): ~95 raw assertions across the four models → 45 confirm an existing row → 5 close the open items (RS-002 / RS-017 / RS-021 / RS-026 / RS-027) → 11 net-new (RS-056–RS-066) → 2 declined (Critique Swarm; confidence-auto-route REJECTED) Combined: → 67 adjudicated rows (RS-000–RS-066) → Tier 1 / Substantive / Minor / Considered-declined breakdown in §9 ``` ### 0.4 Disposition vocabulary `ACCEPT` · `ACCEPT-WITH-MODIFICATIONS` · `ACCEPT-AS-FIX` · `REJECT` · `DEFER` · `OPEN_FOR_ARCHITECT_REVIEW` · `ARCHITECT_STOP` ### 0.5 Conventions used in this card - **Fix anchor:** headings and quoted snippets are approximate because exact D1 path and line access must be verified before patching. - **OPEN_FOR_ARCHITECT_REVIEW:** new canonical object family, receiving-port name, enum value, or owner-doc decision requiring Will/owner admission. - **Package versus port rule:** output ports are named for what leaves Review Studio; internal adapters such as `EvaluationFeedbackBundle` are not user-facing output ports unless an owner doc admits them. - **No file edits:** this card does not write to the repo. --- ## 1. Executive verdict **Verdict:** `READY_AFTER_PATCH`. **Why:** the Review Studio concept is right, and after two review rounds the structural corrections are settled. The draft becomes operative once the Tier-1 corrections and the §1.1 open-item resolutions are applied. The corrections are: 1. It must not be only a Document Viewer mode; it needs a `ReviewableSubject` session model. 2. It must use a corrected output-port model that separates artifact packages, user comments/revisions, Revisor requests, finding decisions, pure signals, and staged workflows. 3. It must not route Revisor repair around `revision_in`. 4. It must handle native Word/docx review without converting formatting-critical artifacts to Notes. 5. It must normalize native comments / tracked changes into system-readable deltas. 6. It must support checkpoints, preconditions, stale-base checks, revalidation, and undo/revert. 7. It must make downstream-module compatibility explicit; no module should receive an unreadable data blob. Round 2 did not reopen any of these — it **confirmed** them (notably Gemini's independent `plan_in` Dispatcher-ownership stop confirming RS-047, and Grok's "A+" with no new stops) and supplied the resolutions in §1.1. ### 1.1 Open-item resolution The five items left `OPEN_FOR_ARCHITECT_REVIEW` after Round 1 are now resolved (Round 2 + adjudication). Each resolution is stated where the item's row lives in §5. | Open item | Resolution | Confirmed by | |---|---|---| | RS-002 — missing `ReviewableSubject` (+ non-document artifact *kinds*, Claude N1) | Adopt `ReviewableSubject` session model + a `ReviewableArtifactKind` enum with a per-kind anchor model (text-range for documents; `claim_id` for claim sets; cell/row refs for tables; etc.). Email is the coarse sub-case (RS-057). | ChatGPT RS-02/RS-03 | | RS-017 — `human_resolved` finding-state collision | `human_resolved` is **not** a new parallel state; it maps into the existing §5.7.2 finding-state invariant (a human decision is recorded as a transition on the canonical state machine, not a side state). | Gemini | | RS-021 — human-edit revalidation trigger | **RS-056** — add `human_authored_version_created` to the shared `RevisionOperationKind` + wire into the §11.21 revalidation cascade + Evaluator-owned receipt (§11.6). | Grok + Gemini + ChatGPT RS-12 | | RS-026 — DOCX version-spine handoff (Claude C2) | Version-spine reconciliation: define the point at which the artifact "becomes" a docx; after that, the docx (`_E{N}.docx`, OnlyOffice copy-on-write) is the single source of truth and the internal `v{N}` spine stops. No dual spine. | ChatGPT §5.5 | | RS-027 — native tracked-changes normalized delta | `NativeRevisionSafetyGate`: native comments/tracked-changes are normalized into a system-readable delta on ingest; the delta (not the raw docx markup) is what flows downstream. | ChatGPT RS-11; Gemini | **Ready-after-patch condition:** Apply the Tier-1 items, the §1.1 resolutions, and the net-new RS-056–RS-066; add owner-doc OP-A rows; verify exact section/path anchors. **RS-062 (`confidence_triggered_auto_route`) is REJECTED — no auto-routing; the gate is the gate.** --- ## 2. Corrected Review Studio output/port model This section supersedes all prior proposed port lists in the reviews and in the earlier responses. ### 2.1 Design rule ```text Review Studio ports should be named for what leaves Review Studio. Do not name output ports after internal record types such as: feedback_bundle_out, formal_assessment_out, evaluation_result_out, review_record_out. Do not use ambiguous names such as: revision_out, needs_revision_out, signal_out. ``` ### 2.2 Final output ports | Port | Name | Kind | Button / action | |---:|---|---|---| | **A** | `approved_review_package_out` | Data output | Approve & Continue | | **B** | `user_comments_revisions_out` | Data output | Send Comments / Revisions | | **C** | `revisor_request_out` | Data output | Send to Revisor | | **D** | `finding_decisions_out` | Data output | Submit Finding Decisions | | **E** | `approved_signal_out` | Pure signal output | Fires only if wired/configured | | **F** | `rejected_signal_out` | Pure signal output | Reject / Stop | | **G** | `stage_instruction_out[n]` | Repeated data output | Run Stage n | | **H** | `error_out` | Error output | Technical failure | ### 2.3 Required Review Studio input ports for staged/return flows These are inputs, not outputs. | Input | Name | Receives | From | |---:|---|---|---| | **R1** | `stage_response_in[n]` | `StageResponsePackage` | Module that received `stage_instruction_out[n]` | | **R2** | `revisor_candidate_in` | Revisor candidate, revision receipt, diff/native delta | Revisor | | **R3** | `evaluator_result_in` | Evaluation result / findings / dry-run revalidation | Outcome Evaluator / Judge | | **R4** | `module_reply_in` | Research memo, revised artifact, formatting report, agent reply | Regular/research/formatting module | ### 2.4 Explicit removals Remove or do not introduce: ```text revision_out needs_revision_out feedback_bundle_out evaluation_result_out formal_assessment_out review_record_out generic signal_out work_sent_signal_out send_to_task_agent_out send_to_room_out plan_in findings_in ``` Rationale: - `revision_out` is ambiguous: revised artifact, request for revision, or Revisor route. - `needs_revision_out` is vague: use `user_comments_revisions_out` or `revisor_request_out`. - `feedback_bundle_out` and `evaluation_result_out` are internal compatibility records, not Review Studio output ports. - `work_sent_signal_out` is redundant; work dispatch is recorded by `ReviewRouteReceipt` / route telemetry. - `send_to_task_agent_out` is unnecessary; Task Agent is a destination of `user_comments_revisions_out` or `stage_instruction_out[n]`. - `send_to_room_out` is phantom until DOC12 bridge intake/import-back is specified. - `plan_in` should be a Dispatcher plan-review projection, not a graph data input. - `findings_in` should be replaced by `review_context_in` / feedback-bundle context, not a bespoke findings port. ### 2.5 Final data groups | # | Data group | Meaning | |---:|---|---| | **1** | **Original Review Input** | Item initially opened in Review Studio. Provenance only once a reviewed/edited version exists. | | **2** | **Reviewed Artifact Package** | Artifact/version exactly as approved or sent: clean, edited, commented, redlined, or track-changed depending on output mode. | | **3** | **User Review Notes** | Inline comments, side-panel comments, Word/PDF comments, general review notes. | | **4** | **User Review Instructions** | User instructions: fix, research, source-check, preserve, format, revise, re-evaluate, replan. | | **5** | **User Revision Data** | Direct edits, accepted/rejected changes, native revision delta, human-edited anchors. | | **6** | **Evaluator Finding Set** | Findings supplied by Outcome Evaluator/Judge/critic. | | **7** | **Finding Decisions** | User decisions on findings: confirm, contest, dismiss, addressed, defer. | | **8** | **Repair Instructions** | Structured repair instructions synthesized from user notes/comments/findings. | | **9** | **Preservation Locks** | Text/formatting/anchors the downstream repair module must not alter. | | **10** | **Source Context** | Source workspace refs, research refs, citation/evidence context. | | **11** | **Route Choice** | Button pressed, selected destination, output mode, return behavior. | | **12** | **Review Record Ref** | Audit/provenance record ref. Stored by EC; ports carry a ref. | | **13** | **Signal Data** | Lightweight approval/rejection event. | | **14** | **Stage Instruction Package** | A single staged instruction to a specified downstream module. | | **15** | **Stage Response Package** | A response received back by Review Studio from a staged module. | | **16** | **Task Graph Patch Request** | Request for Task Agent to produce a graph change or sequence. | | **17** | **Rejection Note** | Optional rejection reason/instruction. | ### 2.6 Output port data table | Port | Name | Data groups sent | Receiving modules | Sufficiency / excess-data assessment | |---:|---|---|---|---| | **A** | `approved_review_package_out` | Always **2 Reviewed Artifact Package**, **11 Route Choice**, **12 Review Record Ref**. If approved package includes them: **3 User Review Notes**, **4 User Review Instructions**, **5 User Revision Data**, **9 Preservation Locks**. | Next module, output module, email/send module, export module, next graph step, evaluator if wired next. | Sufficient. Sends the approved package. Finding decisions are never included unless **D** also fires. | | **B** | `user_comments_revisions_out` | **2**, **3**, **4**, optional **5**, **8**, **9**, optional **10**, **11**, **12**, optional **16** if destination is Task Agent, optional targeted **6/7** if request is finding-specific. | Original module, selected module, regular agent, research module, formatting module, source-check module, Task Agent. | Sufficient for normal single-step work if rendered to the receiver’s accepted input schema. | | **C** | `revisor_request_out` | **2**, **3**, **4**, **5**, relevant **6**, relevant **7**, **8**, **9**, optional **10**, **11**, **12**. | Revisor only. | Sufficient only if routed to `revision_in`. Must include **9 Preservation Locks** when human edits exist. | | **D** | `finding_decisions_out` | **6 Evaluator Finding Set**, **7 Finding Decisions**, optional finding-specific **3**, **2** by ref, **11**, **12**. | Feedback Interpreter / finding lifecycle / Outcome Evaluator equivalent receiving port. | Correct concept, but receiving port requires owner admission. Recommended name: `human_finding_feedback_in`. | | **E** | `approved_signal_out` | **13 Signal Data**, ref to **2**, ref to **12**. | Trigger, junction, notification, logging, Run Board. | Pure signal. No artifact body unless receiver dereferences ref. Requires owner admission as named signal port. | | **F** | `rejected_signal_out` | **13 Signal Data**, optional **17 Rejection Note**, ref to **1 or 2**, ref to **12**. | Trigger, junction, rejection handler, notification, Task Agent if graph config routes there. | Pure rejection/stop signal. Does not request repair. Requires owner admission as named signal port. | | **G** | `stage_instruction_out[n]` | **14 Stage Instruction Package**, plus relevant subset of **2**, **3**, **4**, **5**, **6**, **7**, **8**, **9**, **10**, **11**, **12**, prior **15** where needed. | Stage target: research, regular agent, Revisor, Outcome Evaluator, formatting module, Task Agent. | Sufficient if each stage declares destination input port and expected response. Must align with existing DOC23 looper or admitted sequence runner. | | **H** | `error_out` | `ReviewStudioErrorPayload`, optional ref to **12**. | Error handler, notification module, retry logic. | Technical failure only. Not a review decision and not a signal package. | ### 2.7 Button-to-port mapping | Button / action | Ports fired | Notes | |---|---|---| | **Approve & Continue** | **A**; optionally **E** if wired | If finding decisions changed, preflight asks whether to also fire **D**. | | **Send Comments / Revisions** | **B** | Destination may be original module, selected module, specialist, research module, formatting module, or Task Agent. | | **Send to Revisor** | **C**; optionally **D** with confirmation | Revisor gets structured repair package; finding lifecycle gets decisions separately. | | **Submit Finding Decisions** | **D** | Explicit finding lifecycle action. | | **Reject / Stop** | **F** | Pure rejection signal. If user also wants replan/repair, fire **B** to Task Agent by separate selection/config. | | **Run Stage n** | **G** | Response returns through `stage_response_in[n]`. | | **Dry-Run / Recheck** | Internal request, returns via `evaluator_result_in` | Not a terminal output unless user submits result/decision. | | **Error** | **H** | Technical only. | ### 2.8 Receiver compatibility rule ```text Before Review Studio may connect an output to a downstream module, the graph validator must confirm: 1. the destination module has the named input port; 2. the output package can be rendered into that input schema; 3. unsupported data groups are passed by ref, summarized, or blocked; 4. no package is silently downcast without a ReviewRouteReceipt. ``` ```ts interface ReviewRouteReceipt { receipt_id: string review_session_id: string output_port: | "approved_review_package_out" | "user_comments_revisions_out" | "revisor_request_out" | "finding_decisions_out" | "approved_signal_out" | "rejected_signal_out" | `stage_instruction_out[${number}]` | "error_out" destination_module_ref?: StorageRef destination_input_port?: string package_ref: StorageRef render_mode: | "native_schema" | "instruction_rendered" | "artifact_ref_only" | "digest_plus_refs" | "blocked" omitted_data_groups: Array<{ data_group_number: number reason: "unsupported" | "irrelevant" | "too_large" | "policy_blocked" }> created_at: ISO8601 schema_version: 1 } ``` Lint: ```ts "review_studio.output_connected_to_incompatible_input_port" ``` --- ## 3. Patch library: schemas and contracts This section provides the paste-ready schema material used by the adjudication rows. ### 3.1 Reviewable subject and surfaces ```ts type ReviewableSubjectKind = | "artifact_version" | "external_document" | "module_output" | "evaluation_feedback_bundle" | "evaluation_result_chain" | "revision_plan" | "source_workspace" | "research_bundle" | "structured_data" | "task_segment" | "prompt_candidate" | "experiment_variant" | "custom" type ReviewSurfaceMode = | "doc20_document_viewer" | "doc20_onlyoffice_docx" | "doc20_word_online_roundtrip" | "doc20_desktop_word_roundtrip" | "doc27_word_addin_live" | "findings_list" | "plan_review_projection" | "source_workspace_review" | "structured_data_review" | "doc12_room_bridge" | "text_only_review_card" interface ReviewableSubject { subject_id: string kind: ReviewableSubjectKind task_id: string run_id: string source_module_id?: string source_activation_seq?: number primary_artifact_ref?: StorageRef primary_artifact_version_ref?: StorageRef artifact_root_ref?: StorageRef external_document_ref?: StorageRef evaluation_result_envelope_refs: StorageRef[] feedback_bundle_refs: StorageRef[] evaluation_snapshot_ref?: StorageRef revision_plan_ref?: StorageRef source_workspace_snapshot_ref?: StorageRef target_scope_ref?: ArtifactScopeRef | null preferred_surface_mode: ReviewSurfaceMode allowed_surface_modes: ReviewSurfaceMode[] mutation_policy: | "review_only" | "artifact_new_version" | "native_copy_on_write" | "external_roundtrip" | "plan_disposition_only" | "feedback_disposition_only" governance: GovernanceEnvelope created_at: ISO8601 schema_version: 1 } ``` ### 3.2 Review Studio session and action event ```ts type ReviewStudioSessionState = | "opened" | "reviewing" | "dirty_user_edit" | "assist_running" | "assist_result_pending" | "external_editor_open" | "external_save_detected" | "stale_base_requires_rebase" | "revalidation_required" | "revalidation_running" | "stage_running" | "paused_between_stages" | "ready_for_terminal_decision" | "terminal_submitted" | "aborted" | "expired" interface ReviewStudioSessionRecord { session_id: string subject_ref: StorageRef task_id: string run_id: string gate_id?: string state: ReviewStudioSessionState opened_at: ISO8601 opened_by_ref: PrincipalRef base_artifact_version_ref?: StorageRef current_artifact_version_ref?: StorageRef base_content_hash?: string current_content_hash?: string source_evaluation_snapshot_ref?: StorageRef current_evaluation_snapshot_ref?: StorageRef action_event_log_ref: StorageRef latest_delta_brief_ref?: StorageRef active_sequence_ref?: StorageRef capability_manifest_ref?: StorageRef finish_preflight_ref?: StorageRef governance: GovernanceEnvelope schema_version: 1 } type ReviewStudioActionKind = | "session_opened" | "comment_added" | "comment_resolved" | "finding_disposition_added" | "finding_decisions_submitted" | "review_instruction_added" | "review_instruction_classified" | "tracked_change_decision_added" | "assist_requested" | "assist_result_received" | "assist_result_applied" | "artifact_version_created" | "external_editor_launched" | "external_roundtrip_ingested" | "stage_instruction_dispatched" | "stage_response_received" | "revalidation_requested" | "revalidation_completed" | "terminal_decision_submitted" interface ReviewStudioActionEvent { event_id: string session_id: string kind: ReviewStudioActionKind payload_ref: StorageRef actor: LifecycleActorEnvelope governance: GovernanceEnvelope created_at: ISO8601 schema_version: 1 } ``` ### 3.3 Review Studio submission envelope ```ts interface ReviewStudioSubmissionEnvelope { command: "review_studio_submit" submission_id: string review_session_id: string subject_ref: StorageRef terminal_decision_ref: StorageRef output_package_refs: StorageRef[] finding_decision_package_ref?: StorageRef review_record_ref: StorageRef doc20_assist_request_refs: StorageRef[] doc20_assist_result_refs: StorageRef[] actor: LifecycleActorEnvelope governance: GovernanceEnvelope created_at: ISO8601 schema_version: 1 } ``` ### 3.4 Output packages ```ts interface ApprovedReviewPackage { package_id: string review_session_id: string approved_artifact_ref: StorageRef approved_artifact_version_ref: StorageRef // Provenance only. Downstream uses approved_artifact_version_ref. original_review_input_ref: StorageRef output_mode: | "clean" | "with_comments" | "with_track_changes" | "redline" | "native_current" included_sidecars: Array< | "user_comments" | "review_instructions" | "native_revision_delta" | "preservation_locks" > user_comments_ref?: StorageRef review_instructions_ref?: StorageRef native_revision_delta_ref?: StorageRef preservation_locks_ref?: StorageRef approval_status: | "approved_clean" | "approved_with_comments" | "approved_with_track_changes" | "approved_with_instructions" | "approved_with_limitations" review_record_ref: StorageRef created_at: ISO8601 schema_version: 1 } interface UserCommentsRevisionsPackage { package_id: string review_session_id: string artifact_ref: StorageRef artifact_version_ref: StorageRef user_comments: ReviewComment[] review_instructions: ReviewInstruction[] user_revision_data?: UserRevisionData native_revision_delta_ref?: StorageRef // Enables “Fix this Finding” for non-Revisor modules too. targeted_finding_ids?: string[] targeted_findings_ref?: StorageRef finding_decisions_ref?: StorageRef repair_instructions: RepairInstruction[] preservation_locks: PreservationConstraint[] source_context?: ReviewSourceContext destination: { target_kind: | "original_module" | "selected_module" | "regular_agent" | "specialist_agent" | "research_module" | "source_check_module" | "formatting_module" | "task_agent" target_ref?: StorageRef target_input_port: | "instruction_in" | "research_request_in" | "artifact_in" | "task_instruction_in" | "graph_patch_request_in" } expected_response: | "revised_artifact" | "research_memo" | "source_verification" | "formatting_report" | "task_graph_patch" | "agent_reply" | "review_action_sequence" review_record_ref: StorageRef created_at: ISO8601 schema_version: 1 } interface RevisorRequestPackage { package_id: string review_session_id: string required_target_port: "revision_in" artifact_to_revise_ref: StorageRef artifact_version_to_revise_ref: StorageRef comments_to_address: ReviewComment[] instructions_to_address: ReviewInstruction[] findings_to_address: EvaluationFinding[] finding_decisions: FindingDisposition[] user_revision_data?: UserRevisionData native_revision_delta_ref?: StorageRef preservation_locks: PreservationConstraint[] source_context?: ReviewSourceContext requested_repair_strategy: | "minimal_patch" | "address_findings" | "incorporate_comments" | "rewrite_section" | "format_only" | "research_informed_revision" return_route: | "return_to_review_studio" | "continue_to_next_module" | "send_to_evaluator" review_record_ref: StorageRef created_at: ISO8601 schema_version: 1 } interface FindingDecisionPackage { package_id: string review_session_id: string // OPEN_FOR_ARCHITECT_REVIEW: exact receiving port owner/name. required_target_port: "human_finding_feedback_in" artifact_ref: StorageRef artifact_version_ref: StorageRef finding_decisions: FindingDisposition[] finding_comment_refs?: StorageRef[] evaluator_action: | "record_only" | "rerun_evaluator" | "rerun_selected_findings" | "mark_findings_addressed" | "mark_findings_contested" submit_mode: | "explicit_user_submit" | "terminal_action_with_confirmation" | "auto_required_by_gate_config" review_record_ref: StorageRef created_at: ISO8601 schema_version: 1 } interface ReviewSignalPackage { signal_id: string review_session_id: string signal_kind: | "approved" | "rejected" artifact_ref?: StorageRef artifact_version_ref?: StorageRef target_ref?: StorageRef rejection_note?: { reason_code?: | "wrong_direction" | "unusable" | "bad_sources" | "needs_full_redo" | "other" free_text?: string } review_record_ref?: StorageRef created_at: ISO8601 schema_version: 1 } interface ReviewStudioErrorPayload { error_id: string review_session_id?: string subject_ref?: StorageRef error_kind: | "surface_render_failed" | "artifact_load_failed" | "native_editor_roundtrip_failed" | "stage_dispatch_failed" | "stage_response_failed" | "revisor_request_failed" | "finding_decision_submit_failed" | "policy_blocked" | "unknown_error" message: string recoverable: boolean suggested_recovery?: string created_at: ISO8601 schema_version: 1 } ``` ### 3.5 Review instructions and finding decisions ```ts interface ReviewInstruction { instruction_id: string text: string scope: | "whole_artifact" | "selected_anchor" | "selected_comments" | "selected_findings" | "task_graph" | "final_output" intent: | "revise" | "research" | "source_check" | "format" | "preserve" | "evaluate" | "replan" | "discuss" | "reject" | "other" anchor_ref?: StorageRef source_comment_id?: string source_native_comment_id?: string source_finding_id?: string priority: "low" | "normal" | "high" created_by: "human" | "system_suggested_from_comment" created_at: ISO8601 schema_version: 1 } type FindingDispositionKind = | "confirm_finding" | "contest_finding" | "dismiss_finding" | "modify_finding" | "mark_addressed_by_user_edit" | "defer_finding" | "send_to_repair" interface FindingDisposition { disposition_id: string finding_id: string kind: FindingDispositionKind target_scope_ref?: ArtifactScopeRef | null replacement_finding_ref?: StorageRef generated_repair_instruction_ref?: StorageRef generated_run_guidance_candidate_ref?: StorageRef comment_ref?: StorageRef actor: LifecycleActorEnvelope governance: GovernanceEnvelope created_at: ISO8601 schema_version: 1 } ``` ### 3.6 Staged work sequence ```ts interface ReviewActionSequence { sequence_id: string review_session_id: string stages: ReviewActionStage[] execution_mode: | "manual_advance" | "auto_until_stage_review" | "auto_until_error" | "always_return_to_review_studio" created_by: | "human" | "task_agent_proposed" | "template" current_stage_number: number status: | "draft" | "running" | "paused_for_review" | "completed" | "failed" | "cancelled" runtime_binding_ref?: StorageRef created_at: ISO8601 schema_version: 1 } interface ReviewActionStage { stage_number: number output_port: `stage_instruction_out[${number}]` response_port: `stage_response_in[${number}]` destination: | { kind: "research_module"; target_ref?: StorageRef; input_port: "research_request_in" | "instruction_in" } | { kind: "drafting_module"; target_ref?: StorageRef; input_port: "instruction_in" } | { kind: "regular_agent"; target_ref?: StorageRef; input_port: "instruction_in" } | { kind: "revisor"; target_ref?: StorageRef; input_port: "revision_in" } | { kind: "outcome_evaluator"; target_ref?: StorageRef; input_port: "subject_in" | "evaluation_request_in" } | { kind: "formatting_module"; target_ref?: StorageRef; input_port: "artifact_in" } | { kind: "task_agent"; target_ref?: StorageRef; input_port: "task_instruction_in" } instruction: ReviewInstruction include_data_groups: number[] include_prior_stage_responses: number[] expected_response: | "research_memo" | "revised_artifact" | "evaluation_findings" | "formatting_report" | "task_graph_patch" | "agent_reply" after_response: | "continue_to_next_stage" | "pause_for_user_review" | "rerun_same_stage" | "stop_sequence" | "route_to_task_agent" schema_version: 1 } interface StageInstructionPackage { package_id: string sequence_id: string review_session_id: string stage_number: number artifact_ref?: StorageRef artifact_version_ref?: StorageRef user_comments?: ReviewComment[] review_instructions: ReviewInstruction[] repair_instructions?: RepairInstruction[] findings_to_address?: EvaluationFinding[] finding_decisions?: FindingDisposition[] preservation_locks?: PreservationConstraint[] source_context?: ReviewSourceContext prior_stage_responses: StageResponsePackage[] destination: ReviewActionStage["destination"] expected_response: ReviewActionStage["expected_response"] review_record_ref: StorageRef created_at: ISO8601 schema_version: 1 } interface StageResponsePackage { response_id: string sequence_id: string review_session_id: string stage_number: number output_kind: | "research_memo" | "revised_artifact" | "evaluation_findings" | "formatting_report" | "task_graph_patch" | "agent_reply" | "error" artifact_ref?: StorageRef artifact_version_ref?: StorageRef research_memo_ref?: StorageRef finding_package_ref?: StorageRef task_graph_patch_ref?: StorageRef summary: string requires_user_review_before_next_stage: boolean created_at: ISO8601 schema_version: 1 } interface ReviewActionSequenceRuntimeBinding { sequence_id: string runtime_mode: | "compiled_to_existing_doc23_looper" | "review_studio_sequence_runner" | "task_agent_graph_patch_required" looper_module_ref?: StorageRef sequence_runner_ref?: StorageRef task_graph_patch_ref?: StorageRef owner_decision: | "use_existing_looper" | "admit_review_studio_runner" | "require_task_agent_graph_patch" schema_version: 1 } ``` Rule: ```text ReviewActionSequence is not a new general-purpose loop engine. It must either compile to the existing DOC23 Looper / loop-controller, run under an owner-admitted narrow ReviewStudioSequenceRunner, or produce a Task Agent graph patch. ``` ### 3.7 Plan review projection ```ts interface RevisionPlanReviewResult { result_id: string review_session_id: string revision_plan_ref: StorageRef overall_decision: | "approve_plan_for_execution" | "approve_with_step_changes_requires_recompile" | "reject_plan" | "send_back_to_revisor" | "open_task_agent_process_assessment" step_dispositions: Array<{ plan_step_id: string decision: | "approve_step" | "drop_step" | "modify_step" | "defer_step" | "requires_human_judgment" | "send_step_to_specialist" modified_instruction?: string rationale?: string }> requires_recompile: boolean actor: LifecycleActorEnvelope created_at: ISO8601 schema_version: 1 } ``` Rule: ```text Review Studio may render a Revisor plan review surface when the Dispatcher pauses for human_gate. It must not declare `plan_in` as a normal graph data input. ``` ### 3.8 Comments, findings, closure, and cross-surface identity ```ts type CommentFindingLinkEffect = | "comment_only" | "propose_finding_state_change" | "confirm_finding_addressed" | "contest_finding" | "dismiss_finding" | "supersede_due_to_anchor_loss" interface CommentFindingLinkEvent { event_id: string comment_id: string finding_id: string comment_status: "open" | "resolved" | "deleted" | "orphaned" | "shifted" proposed_finding_effect: CommentFindingLinkEffect requires_review_confirmation: boolean confirmed_by_ref?: PrincipalRef created_at: ISO8601 schema_version: 1 } interface CommentClosureEntry { comment_ref: StorageRef status: "addressed" | "partially_addressed" | "not_addressed" | "superseded" | "unable_to_address" change_refs: StorageRef[] response_note?: string actor: LifecycleActorEnvelope created_at: ISO8601 schema_version: 1 } interface CommentClosureMap { closure_map_id: string review_session_id: string returned_artifact_version_ref: StorageRef entries: CommentClosureEntry[] created_at: ISO8601 schema_version: 1 } interface ReviewCommentIdentityMap { map_id: string review_session_id: string canonical_comment_id: string surface_comment_refs: Array<{ surface: | "doc20_tiptap" | "doc20_pdf" | "onlyoffice" | "word_online" | "desktop_word" | "doc27_word_addin" native_comment_id?: string anchor_ref?: StorageRef status: "open" | "resolved" | "deleted" | "orphaned" | "shifted" }> last_synced_at: ISO8601 schema_version: 1 } ``` ### 3.9 Review finish, gate policy, assignment, expiry, idempotency ```ts interface ReviewFinishPreflight { preflight_id: string review_session_id: string unresolved_user_comments: string[] unresolved_review_instructions: string[] unsubmitted_finding_decisions: string[] pending_revisor_repair_items: string[] stale_base_version: boolean revalidation_required: boolean allowed_terminal_actions: Array< | "approve_clean" | "approve_with_comments" | "approve_with_instructions" | "send_comments_revisions" | "send_to_revisor" | "submit_findings" | "reject" > requires_user_confirmation: boolean schema_version: 1 } interface ReviewGateDecisionPolicy { review_gate_id: string allowed_outputs: Array< | "approved_review_package_out" | "user_comments_revisions_out" | "revisor_request_out" | "finding_decisions_out" | "approved_signal_out" | "rejected_signal_out" | "stage_instruction_out" > default_button: | "approve_continue" | "send_comments_revisions" | "send_to_revisor" | "submit_findings" | "reject_stop" hidden_button_reasons: Record 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` (+ artifact kinds, N1) — RESOLVED | ✓ | | RS-003 | Event-sourced Review Studio session required — ACCEPT-WITH-MODIFICATIONS | ✓ | | RS-004 | `HumanReviewResult extends DocumentReviewRequest` invalid inheritance — ACCEPT-WITH-MODIFICATIONS | ✓ | ### Cluster B — Ports, outputs, routing, staged loops | ID | Finding · disposition | Apply | |---|---|---| | RS-005 | Terminal output must carry correct reviewed package — ACCEPT-WITH-MODIFICATIONS | ✓ | | RS-006 | Assist/Revisor mutation bypass risk — ARCHITECT_STOP | ✓ | | RS-007-R3 | Corrected output port model — ACCEPT-WITH-MODIFICATIONS | ✓ | | RS-008 | Magic routing values `smart` / `auto_previous` — ACCEPT | ✓ | | RS-009 | Direct Review Studio → Revisor path — ACCEPT-WITH-MODIFICATIONS | ✓ | | RS-010 | Finish preflight for unresolved comments/findings/instructions — ACCEPT | ✓ | | RS-011 | Standalone review runner missing — ACCEPT | ✓ | | RS-046 | Staged workflow loop with paired outputs/inputs — ACCEPT-WITH-MODIFICATIONS | ✓ | | RS-047 | Plan review must be Dispatcher projection, not `plan_in` — ACCEPT-WITH-MODIFICATIONS | ✓ | | RS-054 | Per-gate allowed decisions/button availability — ACCEPT | ✓ | ### Cluster C — Findings, comments, instructions, hard calls | ID | Finding · disposition | Apply | |---|---|---| | RS-012 | Comment resolution is not finding resolution — ACCEPT | ✓ | | RS-013 | Finding disposition verbs ambiguous — ACCEPT | ✓ | | RS-014 | General directives auto-promoted to criteria — ACCEPT-WITH-MODIFICATIONS | ✓ | | RS-015 | Human-review feedback adapter — ACCEPT-WITH-MODIFICATIONS | ✓ | | RS-016 | HardRevisionCall resolution missing — ACCEPT-WITH-MODIFICATIONS | ✓ | | RS-017 | `human_resolved` state collision — RESOLVED (§5.7.2 invariant) | ✓ | | RS-018 | Rationale should not be required for ordinary edits — ACCEPT | ✓ | | RS-048 | Returned revision needs per-comment closure map — ACCEPT | ✓ | | RS-052 | Unified comment identity across DOC20/Word/OnlyOffice/PDF — ACCEPT | ✓ | | RS-053 | Durable candidate / authority-basis naming cleanup — ACCEPT | ✓ | ### Cluster D — Mutation, versions, revalidation, long-running gates | ID | Finding · disposition | Apply | |---|---|---| | RS-019 | Mutation preconditions missing — ACCEPT | ✓ | | RS-020 | Checkpoints / undo / revert missing — ACCEPT-WITH-MODIFICATIONS | ✓ | | RS-021 | Human edit revalidation trigger — RESOLVED (see RS-056) | ✓ | | RS-022 | Stale review on resume — ACCEPT | ✓ | | RS-023 | Human-edited anchors need preservation locks — ACCEPT | ✓ | | RS-024 | Rejected-version lifecycle missing — ACCEPT | ✓ | | RS-050 | Expiry / idempotency / process-restart durability — ACCEPT | ✓ | | RS-051 | Dry-run revalidation from Review Studio — ACCEPT | ✓ | ### Cluster E — Native documents, Word, DOC27 | ID | Finding · disposition | Apply | |---|---|---| | RS-025 | Native-format review cannot convert to Notes — ACCEPT | ✓ | | RS-026 | DOCX version-spine handoff — RESOLVED (reconciliation) | ✓ | | RS-027 | Native tracked changes need normalized delta — RESOLVED (safety gate) | ✓ | | RS-028 | Word Online/Desktop Word round-trip — ACCEPT | ✓ | | RS-029 | DOC27 Word add-in as separate spec — DEFER (decided fast-follow) | ~ | | RS-030 | Word Online DOM automation prohibited — REJECT as implementation path | ✗ | ### Cluster F — UI / workflow | ID | Finding · disposition | Apply | |---|---|---| | RS-031 | Mode-driven UI / conditional Findings tab — ACCEPT | ✓ | | RS-032 | Comment-first pass — ACCEPT | ✓ | | RS-033 | Artifact provenance panel — ACCEPT | ✓ | | RS-034 | Review Inbox / Review Thread — DEFER with hooks | ~ | | RS-035 | Cost/latency preview — ACCEPT | ✓ | | RS-036 | Critique Swarm / parallel critiques — DEFER | ~ | | RS-037 | Partial approval with deferred revision — DEFER | ~ | | RS-049 | Reviewer assignment/signoff hooks — DEFER with schema hook | ~ | | RS-055 | Partial/section-by-section review — DEFER | ~ | ### Cluster G — Governance, lints, obligations | ID | Finding · disposition | Apply | |---|---|---| | RS-038 | Per-object governance / taint inheritance — ACCEPT | ✓ | | RS-039 | Taint clearance hook — ACCEPT-WITH-MODIFICATIONS | ✓ | | RS-040 | Privilege/matter filtering on review surface — REJECT | ✗ | | RS-041 | Teaching signals to durable patterns — DEFER / OP-A | ~ | | RS-042 | Consolidated lints and fixtures — ACCEPT-WITH-MODIFICATIONS | ✓ | | RS-043 | DOC21/DOC22/DOC20 registry obligations — ACCEPT | ✓ | | RS-044 | ModuleActivationChat/session-continuation stub — ACCEPT-WITH-MODIFICATIONS | ✓ | | RS-045 | Word add-in implementation ladder — ACCEPT as DOC27 note | ✓ | ### Cluster H — Round-2 net-new (RS-056–RS-066) | ID | Finding · disposition | Apply | |---|---|---| | RS-056 | Resolve RS-021: `human_authored_version_created` revalidation — ACCEPT-AS-FIX | ✓ | | RS-057 | Email review input-fidelity (`ReviewInputFidelity`) — ACCEPT (scope ⚠verify) | ✓ | | RS-058 | `approve_proceed` terminal action + bind `to_revisor` button — ACCEPT | ✓ | | RS-059 | `review_context_in` carries source/evidence refs — ACCEPT-WITH-MODIFICATIONS | ✓ | | RS-060 | Optional `SemanticChangelog` auto-synthesis — ACCEPT-WITH-MODIFICATIONS | ~ | | RS-061 | `LifecycleReadQuery.human_reviewed_only` filter — ACCEPT | ✓ | | RS-062 | `confidence_triggered_auto_route` — REJECT (no auto-routing) | ✗ | | RS-063 | `regenerate_only` routing flag — ACCEPT-AS-OPTION | ✓ | | RS-064 | Review attestation / chain-of-custody — ACCEPT-WITH-MODIFICATIONS (verify) | ✓ | | RS-065 | `ReviewIterationBudget` (split max_revisions by route) — ACCEPT | ✓ | | RS-066 | `ReviewExternalSurfaceBinding` (unified surface) — ACCEPT-WITH-MODIFICATIONS | ✓ | --- ## 5. Per-item adjudication rows ### RS-000 — [repo path] Path / filename mismatch (`Studio` vs `Studo`) (ACCEPT) - **Raised by:** ChatGPT / source-anchor audit - **Type:** BUG - **Severity:** minor / patch-blocking - **Problem:** Prompt and manifest path variants differ. A patch applied to the wrong path may miss the operative D1 file. - **Disposition:** ACCEPT. - **Fix:** Add a pre-application note: ```text PATH NORMALIZATION NOTE: Before applying this card, verify the canonical Review Studio D1 path and normalize `Studo` → `Studio` if approved. Do not patch a stale duplicate. ``` --- ### RS-001 — [front matter] False “no architect review outstanding” (ARCHITECT_STOP) - **Raised by:** ChatGPT, Claude, Gemini, adjudicator audit - **Type:** ARCHITECT_STOP - **Severity:** blocking - **Problem:** D1 introduces or extends canonical object families and owner-doc seams. - **Disposition:** ARCHITECT_STOP. - **Fix:** Replace any “no outstanding architect review” statement with: ```text Architect review status: DRAFT_WITH_BLOCKING_OWNER_DOC_OBLIGATIONS. This unit is not operative until owner admission is completed for: ReviewableSubject, ReviewStudioSessionRecord, ReviewStudioSubmissionEnvelope, Review Studio output packages, NativeRevisionDelta, RevisorRequestPackage, FindingDecisionPackage, ReviewActionSequence, named signal ports, DOC20/DOC27 capability bindings, and all receiving-port names introduced by this draft. ``` --- ### RS-002 — [scope] Missing `ReviewableSubject` abstraction (RESOLVED) - **Raised by:** ChatGPT, Claude (Round 2: ChatGPT RS-02/RS-03, Claude N1) - **Type:** GAP / BETTER_IDEA → **resolved** - **Severity:** was blocking - **Problem:** D1 is document-centered but Review Studio must also handle module outputs, finding sets, plans, source bundles, structured data, and native documents. Round 2 (Claude N1) sharpened this: non-document artifact *kinds* (claim sets, chronologies, privilege logs, data tables) have no review path, and each needs its own anchor model. - **Disposition:** **RESOLVED.** Adopt the `ReviewableSubject` family (§3.1) plus a `ReviewableArtifactKind` enum with a per-kind anchor model — text-range for documents, `claim_id` for claim sets, cell/row refs for tables, etc. Email is the coarse sub-case (RS-057). - **Fix:** Add the `ReviewableSubject` family + `ReviewableArtifactKind` in §3.1. --- ### RS-003 — [session] Event-sourced session required (ACCEPT-WITH-MODIFICATIONS) - **Raised by:** ChatGPT, Grok, Claude - **Type:** GAP - **Severity:** substantive - **Problem:** Review Studio supports multi-step human/agent/native edits but lacks durable session state. - **Disposition:** ACCEPT-WITH-MODIFICATIONS. - **Fix:** Add `ReviewStudioSessionRecord` and `ReviewStudioActionEvent` in §3.2. --- ### RS-004 — [submission] `HumanReviewResult extends DocumentReviewRequest` invalid inheritance (ACCEPT-WITH-MODIFICATIONS) - **Raised by:** ChatGPT; disputed by Grok/Claude - **Type:** BUG - **Severity:** substantive - **Problem:** A terminal human-review submission is not a DOC20 agent-review request. - **Disposition:** ACCEPT-WITH-MODIFICATIONS. - **Fix:** Add `ReviewStudioSubmissionEnvelope` in §3.3; reference DOC20 requests/results rather than extending them. --- ### RS-005 — [outputs] Terminal output must carry the correct reviewed package (ACCEPT-WITH-MODIFICATIONS) - **Raised by:** ChatGPT, Gemini, Claude, user follow-up - **Type:** BUG - **Severity:** blocking - **Problem:** A clean approval should not dump the review session downstream, but an approval after edits/comments/track changes must send the reviewed package as approved. - **Disposition:** ACCEPT-WITH-MODIFICATIONS. - **Fix:** Use output-specific packages in §3.4. `approved_review_package_out` carries `ApprovedReviewPackage`. - **Rule:** ```text approved_artifact_version_ref is the downstream operative artifact. original_review_input_ref is provenance only. ``` --- ### RS-006 — [Revisor safety] Assist / mutation bypass risk (ARCHITECT_STOP) - **Raised by:** Claude, ChatGPT, Gemini - **Type:** ARCHITECT_STOP - **Severity:** blocking - **Problem:** Agent-assist repair must not bypass EC mutation or Revisor `revision_in`. - **Disposition:** ARCHITECT_STOP. - **Fix:** Add: ```text RULE review_studio_no_direct_repair_bypass: Any automated repair of an artifact from Review Studio must either: 1. create an EC-managed candidate artifact/version; or 2. route through Revisor `revision_in`. A producing agent, specialist agent, DOC27 add-in, or DOC20 assist surface must not directly mutate durable task artifacts outside EC-owned mutation paths. ``` --- ### RS-007-R3 — [ports] Corrected Review Studio output model (ACCEPT-WITH-MODIFICATIONS) - **Raised by:** Grok, ChatGPT, user follow-up, adjudicator audit - **Type:** BUG / PHANTOM_FEATURE - **Severity:** blocking - **Problem:** Prior output names mixed routes, packages, signals, internal adapters, and inputs. - **Disposition:** ACCEPT-WITH-MODIFICATIONS. - **Fix:** Replace the D1 port registry with §2.2–§2.4. - **Special corrections:** ```text - stage_response_in[n] is input, not output. - work_sent_signal_out is removed. - error_out uses ReviewStudioErrorPayload, not ReviewSignalPackage. - approved_signal_out and rejected_signal_out require owner admission as named signal ports. - finding_decisions_out requires owner admission for the receiving port, recommended: human_finding_feedback_in. ``` --- ### RS-008 — [routing] Magic routing values `smart` / `auto_previous` (ACCEPT) - **Raised by:** Grok - **Type:** BUG - **Severity:** blocking - **Problem:** Non-deterministic routing values are not buildable. - **Disposition:** ACCEPT. - **Fix:** Use explicit `ReviewRouteDecision` and `ReviewRouteReceipt` (§2.8). Remove `smart` and `auto_previous`. --- ### RS-009 — [Revisor route] Direct Review Studio → Revisor path (ACCEPT-WITH-MODIFICATIONS) - **Raised by:** all reviewers - **Type:** CONFIRMED / BETTER_IDEA - **Severity:** substantive - **Problem:** Direct handoff to Revisor is valuable but must be a special package to `revision_in`. - **Disposition:** ACCEPT-WITH-MODIFICATIONS. - **Fix:** `revisor_request_out` carries `RevisorRequestPackage`; required target port is `revision_in`. --- ### RS-010 — [finish] Finish preflight for unresolved review material (ACCEPT) - **Raised by:** Gemini, ChatGPT - **Type:** BUG - **Severity:** substantive - **Problem:** User may add comments, instructions, finding decisions, or pending repair items but click approve. - **Disposition:** ACCEPT. - **Fix:** Add `ReviewFinishPreflight` in §3.9. --- ### RS-011 — [standalone] Standalone review runner missing (ACCEPT) - **Raised by:** Claude - **Type:** GAP - **Severity:** substantive - **Problem:** A Review Studio session outside a live task graph still needs a runner for assist/revalidation/staged actions. - **Disposition:** ACCEPT. - **Fix:** Add a narrow `StandaloneReviewGateRunner` or admit `ReviewStudioSequenceRunner` as part of RS-046. It must not duplicate the full Looper. --- ### RS-012 — [comments/findings] Comment resolution is not finding resolution (ACCEPT) - **Raised by:** ChatGPT, Claude - **Type:** BUG - **Severity:** substantive - **Problem:** Resolving a comment thread is not the same as semantically resolving a finding. - **Disposition:** ACCEPT. - **Fix:** Add `CommentFindingLinkEvent` in §3.8. --- ### RS-013 — [finding vocabulary] Finding disposition verbs ambiguous (ACCEPT) - **Raised by:** ChatGPT, Claude, Gemini - **Type:** GAP - **Severity:** substantive - **Problem:** `accept/reject` is ambiguous: accept finding vs accept proposed change. - **Disposition:** ACCEPT. - **Fix:** Use `FindingDispositionKind` in §3.5. --- ### RS-014 — [instructions] General directives auto-promoted to criteria (ACCEPT-WITH-MODIFICATIONS) - **Raised by:** ChatGPT, Claude, Gemini - **Type:** BUG - **Severity:** substantive - **Problem:** Free-text instructions should not silently become pass/fail criteria. - **Disposition:** ACCEPT-WITH-MODIFICATIONS. - **Fix:** Rename “directive” to `ReviewInstruction`; classify to repair/research/source-check/run-guidance/criterion only when needed. Use §3.5. --- ### RS-015 — [feedback compatibility] Human-review feedback adapter, not output port (ACCEPT-WITH-MODIFICATIONS) - **Raised by:** ChatGPT, Claude - **Type:** GAP - **Severity:** substantive - **Problem:** Feedback Delivery’s `EvaluationFeedbackBundle` is useful internally, but not a Review Studio output port. - **Disposition:** ACCEPT-WITH-MODIFICATIONS. - **Fix:** ```text Review Studio packages may be adapted into EvaluationFeedbackBundle by the Feedback Interpreter when a downstream DOC23 subsystem requires that shape. Do not expose feedback_bundle_out as a Review Studio port. ``` --- ### RS-016 — [hard calls] HardRevisionCall resolution missing (ACCEPT-WITH-MODIFICATIONS) - **Raised by:** Grok - **Type:** GAP - **Severity:** substantive - **Problem:** If Review Studio is opened for a strategic/hard-call gate, it needs a hard-call resolution payload. - **Disposition:** ACCEPT-WITH-MODIFICATIONS. - **Fix:** Add: ```ts interface ReviewHardCallResolution { resolution_id: string review_session_id: string hard_call_ref: StorageRef decision: | "accept_risk" | "rewrite_for_neutrality" | "escalate_to_human" | "send_to_revisor" | "reject_output" | "custom" selected_option_ref?: StorageRef user_note?: string generated_repair_instruction_ref?: StorageRef actor: LifecycleActorEnvelope governance: GovernanceEnvelope created_at: ISO8601 schema_version: 1 } ``` --- ### RS-017 — [finding state] `human_resolved` state collision (RESOLVED) - **Raised by:** ChatGPT, Grok, Gemini (Round 2 confirmed) - **Type:** ARCHITECT_STOP / GAP → **resolved** - **Severity:** was substantive - **Problem:** Reviewers disagreed whether to add `human_resolved` as a state or a resolution kind. - **Disposition:** **RESOLVED.** `human_resolved` is **not** a new parallel state; a human decision is recorded as a transition on the canonical finding-state machine (the §5.7.2 finding-state invariant), via a resolution receipt/kind. No side state. --- ### RS-018 — [rationale] Do not require rationale for ordinary edits (ACCEPT) - **Raised by:** ChatGPT, user follow-up - **Type:** UX guardrail - **Severity:** substantive - **Fix:** Add: ```ts type RationaleCaptureMode = | "none" | "system_inferred" | "optional_user_note" | "required_short_reason" type RationaleRequirementTrigger = | "reject_required_finding" | "override_evaluator_fail" | "approve_with_unresolved_required_findings" | "promote_feedback_to_durable_instruction" | "change_run_criterion" | "clear_taint" | "accept_high_risk_revisor_candidate" | "external_side_effect_approval" interface ReviewRationalePolicy { default_mode: "system_inferred" required_only_for: RationaleRequirementTrigger[] allow_one_click_reasons: boolean one_click_reason_options: string[] never_require_for: Array< | "ordinary_text_comment" | "minor_copyedit" | "accept_agent_tracked_change" | "reject_agent_tracked_change" | "resolve_comment" | "add_inline_instruction" > schema_version: 1 } ``` --- ### RS-019 — [mutation] Mutation preconditions missing (ACCEPT) - **Raised by:** ChatGPT, Claude, Gemini - **Type:** GAP - **Severity:** blocking - **Fix:** Add `ReviewStudioMutationPrecondition` in §3.10. --- ### RS-020 — [versioning] Checkpoints / undo / revert missing (ACCEPT-WITH-MODIFICATIONS) - **Raised by:** ChatGPT, Claude, user - **Type:** GAP - **Severity:** substantive - **Fix:** Add `ArtifactCheckpointRecord` and `ReviewRestoreAction` in §3.10. --- ### RS-021 — [revalidation] Human edit revalidation trigger (RESOLVED — see RS-056) - **Raised by:** ChatGPT, Claude, Grok, Gemini (all four; reaffirmed in Round 2) - **Type:** ARCHITECT_STOP → **resolved** - **Severity:** was blocking - **Disposition:** **RESOLVED** by **RS-056**: add `human_authored_version_created` to the shared `RevisionOperationKind` (V3.3.1 §0.4.7), wire it into the §11.21 revalidation cascade, and make the revalidation receipt Evaluator-owned (§11.6). The Round-1 caution (don't pollute Revisor-only receipt enums) is honored — Review Studio emits the event; the Evaluator writes the receipt. Full fix at RS-056. --- ### RS-022 — [resume] Stale review on resume (ACCEPT) - **Raised by:** Claude, ChatGPT - **Type:** GAP - **Severity:** substantive - **Fix:** Add `ReviewBaseVersionCheck` in §3.10. --- ### RS-023 — [preservation] Human-edited anchors need preservation locks (ACCEPT) - **Raised by:** Gemini, Claude, ChatGPT - **Type:** BUG / BETTER_IDEA - **Severity:** substantive - **Fix:** Any human-edited anchor becomes a `PreservationConstraint` when routed through `user_comments_revisions_out`, `revisor_request_out`, or `stage_instruction_out[n]`. --- ### RS-024 — [rejection lifecycle] Rejected version lifecycle missing (ACCEPT) - **Raised by:** Claude - **Type:** GAP - **Severity:** substantive - **Fix:** Mark rejected artifacts as `human_rejected` and prevent downstream consumption as approved. --- ### RS-025 — [native docs] Native-format review cannot convert to Notes (ACCEPT) - **Raised by:** ChatGPT, Claude, user - **Type:** BUG - **Severity:** blocking - **Problem:** Formatting-critical Word/PDF/Excel review cannot be done through Notes. - **Fix:** Add `ReviewStudioNativeSurfacePolicy` in §3.11. Ban note fork unless `fidelity_requirement = semantic_text_only`. --- ### RS-026 — [DOCX spine] DOCX version-spine handoff (RESOLVED) - **Raised by:** Claude, ChatGPT (Round 2: Claude C2; ChatGPT §5.5) - **Type:** ARCHITECT_STOP → **resolved** - **Severity:** was blocking - **Disposition:** **RESOLVED** (version-spine reconciliation). Define the point at which the artifact "becomes" a DOCX; after that, the DOCX copy-on-write spine (`_E{N}.docx`, OnlyOffice) is the single source of truth for native review and the internal Tiptap `v{N}` spine stops (it becomes provenance / pre-materialization history). No dual live spine. --- ### RS-027 — [tracked changes] Native tracked changes need normalized delta (RESOLVED) - **Raised by:** ChatGPT, Claude, Gemini (Round 2: ChatGPT RS-11; Gemini) - **Type:** GAP → **resolved** - **Severity:** was blocking for Word workflows - **Disposition:** **RESOLVED** (`NativeRevisionSafetyGate`). Native comments/tracked-changes are normalized into a system-readable delta on ingest; the delta — not the raw DOCX markup — flows downstream. - **Fix:** Add `NativeRevisionDelta` / `NativeRevisionSafetyGate` in §3.11. Owner split: DOC20/DOC27 extracts; DOC23 consumes. --- ### RS-028 — [Word round-trip] Word Online/Desktop Word round-trip (ACCEPT) - **Raised by:** ChatGPT, Claude, user - **Type:** CONFIRMED / GAP - **Fix:** Add `ExternalNativeEditRoundTrip` in §3.11. --- ### RS-029 — [DOC27] Word add-in as separate spec (DEFER — decided fast-follow) - **Raised by:** ChatGPT, Claude, user - **Type:** BETTER_IDEA - **Disposition:** **DEFER (decided).** DOC27 is a fast-follow, **not** a Review Studio v1 blocker. v1 ships on M365-online-in-tab + OnlyOffice + Graph round-trip; the add-in (Office.js, WordApi 1.6) is a separate spec Review Studio consumes optionally. Related: RS-066 surface binding. - **Fix:** Create DOC27 as a separate Word Add-in / Native Word Bridge spec; Review Studio consumes it optionally. --- ### RS-030 — [Word Online] DOM automation prohibited (REJECT as implementation path) - **Raised by:** ChatGPT, Claude - **Type:** BUG prevention - **Disposition:** REJECT as implementation path. - **Fix:** Use `WordAccessMode = "browser_dom_automation_prohibited"` in §3.12. --- ### RS-031 — [UI] Mode-driven UI / conditional Findings tab (ACCEPT) - **Raised by:** ChatGPT, Claude, Grok, Gemini - **Type:** BETTER_IDEA - **Fix:** Add: ```ts type ReviewStudioMode = | "quick_human_gate" | "ordinary_artifact_review" | "evaluator_finding_review" | "revisor_plan_review" | "revisor_candidate_review" | "native_format_review" | "source_verification_review" | "multi_agent_review_room" type ReviewStudioPanel = | "comments" | "agent" | "findings" | "hard_calls" | "plan" | "versions" | "context_preview" | "provenance" | "history" | "native_revisions" | "room" interface ReviewStudioLayoutPolicy { mode: ReviewStudioMode primary_surface: ReviewSurfaceMode panels: ReviewStudioPanel[] default_panel: ReviewStudioPanel allowed_pinned_panels: ReviewStudioPanel[] use_secondary_drawer: boolean show_findings_only_when_present: boolean schema_version: 1 } ``` --- ### RS-032 — [workflow] Comment-first pass (ACCEPT) - **Raised by:** ChatGPT, user - **Type:** BETTER_IDEA - **Fix:** Use `user_comments_revisions_out` for comment-first workflows. --- ### RS-033 — [provenance] Artifact provenance panel (ACCEPT) - **Raised by:** Claude, ChatGPT - **Type:** BETTER_IDEA - **Fix:** Add: ```ts interface ArtifactProvenanceView { artifact_ref: StorageRef current_version_ref: StorageRef task_run_ref?: StorageRef entries: ArtifactProvenanceEntry[] schema_version: 1 } interface ArtifactProvenanceEntry { step_ref: StorageRef actor: LifecycleActorEnvelope action_kind: | "research" | "draft" | "red_team_review" | "revise" | "evaluate" | "format" | "human_edit" | "native_editor_roundtrip" | "other" summary: string output_ref?: StorageRef produced_artifact_version_ref?: StorageRef occurred_at: ISO8601 } ``` --- ### RS-034 — [navigation] Review Inbox / Review Thread (DEFER with hooks) - **Raised by:** Claude - **Type:** GAP / SUGGESTION - **Disposition:** DEFER. - **Fix now:** Ensure `ReviewStudioSessionRecord` includes task/run/status/subject fields sufficient for future projections. --- ### RS-035 — [routing UX] Cost / latency preview (ACCEPT) - **Raised by:** Claude, Grok - **Type:** BETTER_IDEA - **Fix:** Add: ```ts interface RoutingCostEstimate { target: | "my_edit_only" | "original_module" | "other_module" | "revisor" | "evaluator_bridge" | "staged_sequence" est_model_calls: "none" | "low" | "moderate" | "high" est_latency_band: "instant" | "seconds" | "minutes" est_token_band?: "low" | "moderate" | "high" estimator_confidence?: "experimental" | "uncalibrated" | "calibrated" schema_version: 1 } ``` --- ### RS-036 — [assist] Critique Swarm / parallel critiques (DEFER) - **Raised by:** Grok - **Disposition:** DEFER. Useful but not required for v1. --- ### RS-037 — [partial approval] Partial approval with deferred revision (DEFER) - **Raised by:** Gemini - **Disposition:** DEFER. Staged workflow covers most near-term needs without graph-level concurrent partial-approval semantics. --- ### RS-038 — [governance] Per-object governance / taint inheritance (ACCEPT) - **Raised by:** ChatGPT, Gemini - **Type:** GAP - **Fix:** Add governance to materialized review objects: ```ts interface ReviewMaterializedObjectBase { object_ref: StorageRef object_kind: | "review_comment" | "finding_disposition" | "review_instruction" | "repair_instruction" | "run_guidance_candidate" | "criterion" | "native_revision_delta" | "attachment" | "delta_brief" actor: LifecycleActorEnvelope governance: GovernanceEnvelope source_policy_snapshot_ref?: StorageRef taint_inheritance_refs: StorageRef[] sanitization_node_ref?: StorageRef schema_version: 1 } ``` --- ### RS-039 — [taint] Taint clearance hook (ACCEPT-WITH-MODIFICATIONS) - **Raised by:** Gemini, Grok - **Disposition:** ACCEPT-WITH-MODIFICATIONS. - **Fix:** Add optional hook: ```ts interface ReviewTaintClearanceAuthorization { authorization_id: string review_session_id: string cleared_object_refs: StorageRef[] clearance_scope: | "current_run_only" | "current_artifact_version" | "specific_downstream_target" clearance_basis: | "human_verified_source" | "trusted_internal_work_product" | "sanitized_summary" | "other" actor: LifecycleActorEnvelope governance: GovernanceEnvelope created_at: ISO8601 schema_version: 1 } ``` --- ### RS-040 — [privilege] Privilege/matter filtering on review surface (REJECT) - **Raised/retracted by:** Claude - **Disposition:** REJECT as default Review Studio behavior. - **Reason:** Privilege/matter is egress/action governance by default; internal review should label governance rather than block the review surface. --- ### RS-041 — [learning] Teaching signals to durable patterns (DEFER / OP-A) - **Raised by:** Grok, Gemini - **Disposition:** DEFER to memory/pattern owner. - **Fix now:** OP-A row only. --- ### RS-042 — [lints / fixtures] Consolidated lints and fixtures (ACCEPT-WITH-MODIFICATIONS) - **Raised by:** all reviewers - **Disposition:** ACCEPT-WITH-MODIFICATIONS. - **Fix:** Add lint and fixture set in §6. --- ### RS-043 — [UI registry] DOC21/DOC22/DOC20 registry obligations (ACCEPT) - **Raised by:** ChatGPT - **Disposition:** ACCEPT. - **Fix:** Add cross-doc obligation rows for Review Studio panels, buttons, staged workflow UI, native document states, DOC27 surfaces. --- ### RS-044 — [session continuation] ModuleActivationChat stub (ACCEPT-WITH-MODIFICATIONS) - **Raised by:** ChatGPT, user - **Disposition:** ACCEPT-WITH-MODIFICATIONS. - **Fix:** Add: ```ts interface ModuleActivationChatRef { chat_ref: StorageRef task_id: string run_id: string module_id: string module_session_ref?: TaskModuleSessionRef activation_seq?: number chat_kind: | "review_studio_assist" | "reprompt_checkpoint" | "module_continuation" | "task_agent_followup" continuation_status: | "not_resumable" | "resumable" | "archived" | "policy_blocked" | "capability_missing" schema_version: 1 } ``` --- ### RS-045 — [DOC27] Word add-in implementation ladder (ACCEPT) - **Raised by:** ChatGPT, Claude, user - **Disposition:** ACCEPT as DOC27 note. - **Fix:** Add DOC27 build ladder: ```text T0 scaffold — manifest + task pane + ribbon command. T1 selection ask — read selection, send to Elnor, show answer. T2 insert comment — native Word comment at selection. T3 insert edit — proposal-first replace/insert. T4 standalone attach — attach current Word doc outside DOC23. T5 comment sync — manual Word <-> Elnor sync. T6 Review Studio binding — link add-in session to Review Studio/task. T7 tracked-change delta — exact/partial extraction plus OOXML fallback. ``` --- ### RS-046 — [staged workflow] Staged Review Action Sequence (ACCEPT-WITH-MODIFICATIONS) - **Raised by:** user follow-up; adjudicator added - **Type:** BETTER_IDEA / GAP - **Severity:** substantive - **Problem:** Review Studio needs structured multi-step workflows such as research → revise → evaluate without forcing everything through Task Agent. - **Disposition:** ACCEPT-WITH-MODIFICATIONS. - **Fix:** Add §3.6 staged workflow schemas and runtime binding. - **Rule:** ```text stage_instruction_out[n] is output. stage_response_in[n] is input. ReviewActionSequence must compile to existing looper, run under admitted narrow runner, or create Task Agent graph patch. ``` --- ### RS-047 — [plan review] Revisor plan review must be Dispatcher projection, not `plan_in` (ACCEPT-WITH-MODIFICATIONS) - **Raised by:** Grok, Claude - **Type:** BUG / PHANTOM_FEATURE - **Severity:** blocking if left as port - **Problem:** `plan_in` treats a Dispatcher-owned plan as graph-cabled module data. - **Disposition:** ACCEPT-WITH-MODIFICATIONS. - **Fix:** Remove `plan_in`; add `RevisionPlanReviewResult` in §3.7. --- ### RS-048 — [comments] Returned revision needs per-comment closure map (ACCEPT) - **Raised by:** Claude N9 / audit - **Type:** GAP - **Severity:** substantive - **Problem:** If user sends comments out for revision, returned artifact should say which comments were addressed. - **Disposition:** ACCEPT. - **Fix:** Add `CommentClosureMap` in §3.8. --- ### RS-049 — [review identity] Reviewer assignment/signoff hooks (DEFER with schema hook) - **Raised by:** Claude N4 / audit - **Type:** GAP - **Severity:** minor/substantive - **Disposition:** DEFER multi-user UX, but include schema hook. - **Fix:** Add `ReviewAssignment` in §3.9. --- ### RS-050 — [long-running review] Expiry, idempotency, restart durability (ACCEPT) - **Raised by:** Claude S8 / audit - **Type:** GAP - **Severity:** substantive - **Problem:** Long-lived human gates must survive restart and not replay outputs. - **Disposition:** ACCEPT. - **Fix:** Add `ReviewGateExpiryPolicy` and `ReviewResumeIdempotencyRecord` in §3.9. --- ### RS-051 — [revalidation UI] Dry-run revalidation from Review Studio (ACCEPT) - **Raised by:** Gemini, Grok / audit - **Type:** BETTER_IDEA / GAP - **Severity:** substantive - **Disposition:** ACCEPT. - **Fix:** Add `ReviewStudioDryRunEvaluationRequest` in §3.10. --- ### RS-052 — [comment identity] Unified comment identity across surfaces (ACCEPT) - **Raised by:** Claude N11 / audit - **Type:** GAP - **Severity:** substantive - **Fix:** Add `ReviewCommentIdentityMap` in §3.8. --- ### RS-053 — [naming] Durable candidate / authority-basis cleanup (ACCEPT) - **Raised by:** Claude S4/M2 - **Type:** BUG / naming cleanup - **Severity:** minor - **Fix:** ```text Replace `DirectInstructionCandidate` where the draft means durable knowledge candidate with `DurableKnowledgeCandidate`, unless the target is specifically a direct-instruction learning object. Map `human_label` to `authority_basis`, not `assurance_basis`, where the field describes human authority/source. ``` --- ### RS-054 — [gate config] Per-gate allowed decisions / button availability (ACCEPT) - **Raised by:** Claude BI1 / audit - **Type:** GAP - **Severity:** substantive - **Fix:** Add `ReviewGateDecisionPolicy` in §3.9. --- ### RS-055 — [long artifacts] Partial / section-by-section review (DEFER) - **Raised by:** Claude N13 - **Type:** SUGGESTION - **Disposition:** DEFER. - **Reason:** Useful but not required for v1. Staged workflow and changed-scope revalidation cover near-term needs. --- ### — Round-2 net-new rows (RS-056–RS-066) — _The following eleven rows are the net-new items from Round 2; everything above (RS-000–RS-055) is the Round-1 adjudication, confirmed by Round 2._ ### RS-056 — [revalidation] Resolve RS-021: `human_authored_version_created` trigger + cascade + receipt ownership - **Raised by:** Grok (BUG, two passes), Gemini (Revalidation Blindspot + Receipt-Ownership BUG), ChatGPT (RS-12). Co-raised by Claude (**S2**, which adds the reconciliation requirement below). - **Type:** ARCHITECT_STOP (resolves the v3 OPEN item). - **Severity:** blocking → **closed by this fix**. - **Problem (RS-021's Round-1 recommendation, verbatim):** *"Use Review Studio-level trigger reason `human_authored_version_created`; do not pollute Revisor-only receipt enums unless owner confirms."* — left OPEN_FOR_ARCHITECT_REVIEW. Without resolution, a human-authored version does not refresh findings or re-trigger the Evaluator/Revisor path; downstream is blind to human edits. - **Reconciliation (Claude S2):** `human_authored_version_created` must reconcile with the existing `human_gate_decision` event so a human edit does **not** produce a parallel, unreconciled event. The version event records the *artifact change*; the gate-decision event records the *review decision* — they reference the same `review_session_id` and are linked, not duplicated. - **Disposition:** **ACCEPT-AS-FIX.** The three reviewers converge on the concrete resolution and supply the missing receipt-ownership rule that was the architect's open concern. - **Anchor:** this card **§3.10** ("Mutation, checkpoints, stale-base, revalidation") and the **RS-021** row. **REPLACE** the RS-021 disposition with the following. ```ts // V3.3.1 §0.4.7 — extend the shared RevisionOperationKind (proposed value) type RevisionOperationKind = | "automated_revisor_edit" | "agent_assist_edit" // via CandidateArtifactVersion, EC-committed | "human_authored_version_created" // NEW /* …existing kinds… */; // Review Studio EMITS this; it does not write the revalidation receipt. interface HumanAuthoredVersionEvent { kind: "human_authored_version_created"; review_session_id: string; subject_ref: ReviewableSubjectRef; base_version_ref: ArtifactVersionRef; new_version_ref: ArtifactVersionRef; authored_by: LifecycleActorRef; // human actor edit_provenance: "human_direct"; taint_event_ref?: StorageRef; // ties to RS-038/039 taint (human_direct) semantic_changelog?: SemanticChangelogEntry[]; // optional, RS-060 created_at: string; } ``` - **Wiring (cross-artifact):** 1. Add `human_authored_version_created` to the **shared** `RevisionOperationKind` (V3.3.1 §0.4.7) — per Grok+Gemini, the human path must travel the same cascade as automated revisions. This satisfies the "enum placement" question RS-021 left open: the value lives in the shared enum, the **event is emitted by Review Studio**, and the **receipt is written by the revalidating authority**. 2. Include the kind in the **V3.3.1 §11.21 revalidation cascade** so a human-authored version refreshes findings and re-triggers Evaluator/Revisor exactly as an automated revision does. 3. **Receipt ownership (§11.6) — resolves Gemini's objection:** the revalidation receipt for a human-authored version is owned by the **Evaluator** (the revalidating authority), **not** Review Studio. Review Studio emits the trigger event only; it never writes the receipt. This is what keeps the value out of "Revisor-only receipt enums" while still living in the shared operation enum — the card's RS-021 caution is honored, not violated. - **Lint:** `review_studio.revalidation_trigger_without_snapshot_ref` (already in ChatGPT §8 / card RS-042) — fires when a human-authored version lacks a `base_version_ref`/`new_version_ref` pair. - **Fixture:** `GS-RS-02-human-edit-revalidation` (already in card). - **⚠verify:** exact V3.3.1 §0.4.7 enum name; §11.21 cascade hook; §11.6 receipt-ownership wording. ### RS-057 — [scope/native] Email review input-fidelity contract (`ReviewInputFidelity`) - **Raised by:** ChatGPT (RS-19). Sub-case of the `ReviewableSubject` scope question (RS-002; Claude N1). - **Type:** GAP. - **Severity:** substantive. - **Problem:** Review Studio can receive review input over channels of very different fidelity (full surface, DOC20 viewer, Word add-in, **email reply**, API). Email is coarse-only — no exact anchors, comment-only mutation, weaker identity. Without a fidelity contract the system can silently over-claim what an email reviewer could do. - **Disposition:** **ACCEPT** the contract. It is the formal expression of the already-present fixture `GS-RS-04-email-coarse-loss` and the email lints below; it attaches to the `ReviewableSubject`/surface (RS-002), not a new port. - **Anchor:** this card **§3.1** ("Reviewable subject and surfaces"). **INSERT AFTER** the surface definition: ```ts interface ReviewInputFidelity { channel: "review_studio_surface" | "doc20_document_viewer" | "doc27_word_addin" | "email_reply" | "api"; anchor_fidelity: "exact" | "approximate" | "unanchored" | "none"; mutation_capability: "none" | "comment_only" | "native_tracked_change" | "artifact_new_version" | "external_roundtrip"; identity_confidence: "authenticated_session" | "verified_email_sender" | "manual_operator_entry" | "unknown"; allowed_actions: ReviewStudioActionKind[]; degraded_reason?: string; schema_version: 1; } // email_reply pins to: anchor approximate|none, mutation comment_only, // identity verified_email_sender|unknown — and allowed_actions is narrowed accordingly. ``` - **Lints (net-new, attach to RS-042):** `review_studio.email_anchor_claim_without_full_surface`, `review_studio.email_reply_created_direct_edit`. - **⚠verify (scope):** v1 Review Studio ships **M365-online + OnlyOffice + Graph**; **email-reply** review may be Phase-II / DOC12-intake-gated. If so, keep the contract but mark the `email_reply` channel value **DEFER-until-email-intake** and ship the other channels in v1. ### RS-058 — [terminal action] `approve_proceed` action + bind `RoutingVia="to_revisor"` to a terminal button - **Raised by:** Grok (BUG/GAP, both passes). - **Type:** GAP. - **Severity:** minor. - **Problem:** v3 §2.7 has "Approve & Continue" (fires **A**) and "Send to Revisor" (fires **C**), but there is no single action that **approves the current version AND immediately routes it into the Revisor for the next pass**, and the literal `approve_proceed` is absent from the action enum even though the prose describes the behavior. `RoutingVia="to_revisor"` exists but is not bound to a terminal button. - **Disposition:** **ACCEPT** (minor) — completes the terminal action set. - **Anchor:** this card **§2.7** button-to-port table + the action-kind enum in **§3.2**. **INSERT** a row and enum value: ```ts type ReviewTerminalAction = | "approve_continue" // A (+ optional E) | "approve_proceed" // NEW: A AND RoutingVia="to_revisor" — approve + route into Revisor | "send_comments_revisions" // B | "send_to_revisor" // C (+ D w/ confirm) | "submit_finding_decisions" // D | "reject_stop"; // F ``` | Button / action | Ports fired | Notes | |---|---|---| | **Approve & Proceed** | **A**, then route approved version via `RoutingVia="to_revisor"` | Approve + immediate next Revisor pass; respects the RS-010 finish-preflight. | - **⚠verify:** the card's existing action-enum names, to avoid duplicating "Send to Revisor". ### RS-059 — [context] `review_context_in` must carry source/evidence refs ("reviewing in a vacuum") - **Raised by:** Gemini (GAP). Aligns with Claude's reviewer-context concern. - **Type:** GAP. - **Severity:** substantive. - **Problem:** v3 §2.4 replaces `findings_in` with `review_context_in`, but a reviewer (human or assist) needs to see **what the work was based on** — sources, prior drafts, the evidence the artifact was built from — not just a feedback bundle. Without it the reviewer judges in a vacuum. - **Disposition:** **ACCEPT-WITH-MODIFICATIONS** — extend `review_context_in` to carry source/upstream refs, **read-only and on-demand**. Hard constraint: sources do **not** become a review checklist. This preserves the card's rule that evaluation criteria belong to the Outcome Evaluator and surface only as finding provenance (hovercard), never as a human checklist. - **Anchor:** this card **§2.4** / the `review_context_in` definition. **INSERT** fields: ```ts interface ReviewContextIn { review_session_id: string; feedback_bundle_ref?: StorageRef; source_refs?: StorageRef[]; // NEW: evidence/sources the artifact was built from upstream_artifact_refs?: ArtifactVersionRef[]; // NEW: prior drafts / inputs criteria_provenance_refs?: StorageRef[]; // for finding hovercards only — NOT a checklist schema_version: 1; } ``` - **⚠verify:** exact `StorageRef`/`ArtifactVersionRef` names; confirm the surface renders these as read-only context, gated by the same egress/taint rules as any cross-task injection. ### RS-060 — [learning] Optional Diff-to-Finding / `SemanticChangelog` auto-synthesis - **Raised by:** Gemini (BETTER_IDEA), Grok (semantic changelog for regenerate steps). - **Type:** BETTER_IDEA. - **Severity:** substantive (optional). - **Problem:** when a human edits directly and approves, the system loses the *why*. Downstream Revisor/learning would benefit from a one-line summary of what changed without forcing the human to type a rationale. - **Disposition:** **ACCEPT-WITH-MODIFICATIONS** — **optional, non-blocking** auto-synthesis. The system MAY diff the human-authored version against base and attach a `SemanticChangelogEntry` to the outcome. - **Why it does not violate RS-018:** RS-018 rejected *requiring* a rationale for ordinary edits. This changelog is **system-synthesized, never a required human field** — the human can approve with no changelog. It complements `finding.rationale` rather than reintroducing the rationale tax. - **Anchor:** this card **§3.5** + the `HumanAuthoredVersionEvent` (RS-056). **INSERT**: ```ts interface SemanticChangelogEntry { from_version_ref: ArtifactVersionRef; to_version_ref: ArtifactVersionRef; summary: string; // e.g. "Human softened the indemnification language in §4.2" affected_anchor_refs?: AnchorRef[]; synthesized_by: "agent" | "human"; confidence?: number; schema_version: 1; } // attaches as optional semantic_changelog[] on HumanAuthoredVersionEvent / HumanReviewResult ``` - **Cross-artifact:** feeds DOC85 learning slices / DOC72 (the teaching-signal route RS-041 DEFERs). Stays out of the blocking path. - **⚠verify:** confirm it never gates the terminal decision. ### RS-061 — [inspectability] `LifecycleReadQuery.human_reviewed_only` filter - **Raised by:** Grok (BETTER_IDEA/SUGGESTION, both passes). - **Type:** SUGGESTION. - **Severity:** minor. - **Problem:** no first-class way to query "only lifecycle entries that carry a human review decision" — needed for audit / chain-of-custody inspection of human decisions (securities-litigation defensibility). - **Disposition:** **ACCEPT** (minor). - **Anchor:** **V3.3.1 §9.2 `LifecycleReadQuery`** (operative). **INSERT** field: ```ts interface LifecycleReadQuery { /* …existing filters… */ human_reviewed_only?: boolean; // NEW } ``` - **⚠verify:** confirm §9.2 `LifecycleReadQuery` is the right operative interface. ### RS-062 — [routing/policy] `confidence_triggered_auto_route` — auto-route past the human gate - **Raised by:** Grok (BETTER_IDEA, both passes). - **Type:** BETTER_IDEA. - **Severity:** substantive — **policy fork (now decided)**. - **Problem:** Grok proposes auto-routing an approved/high-confidence revision straight to the Revisor when evaluator confidence ≥ threshold (unless a HardCall is raised), to save a human round-trip. - **Disposition:** **REJECT.** Architect decision (Will): *the gate is the gate.* Auto-routing past the human gate — even gated behind a toggle — cuts against the entire purpose of Review Studio, which exists to put a deliberate human control point in the loop. A confidence score is not a substitute for the human decision the gate represents. **Do not introduce `confidence_triggered_auto_route`, a `GateAutoRoutePolicy`, or any equivalent.** High confidence may *surface a recommendation* in the UI (e.g., pre-select the "Send to Revisor" action), but the human still presses the button. - **Note:** the legitimate efficiency Grok is reaching for is served by **RS-063** (`regenerate_only`, a human-chosen lightweight route) and **RS-035** (cost/latency preview, so the human picks the lightest sufficient path) — both keep the human in control. ### RS-063 — [routing] `regenerate_only` routing flag - **Raised by:** Grok (BETTER_IDEA, second pass). - **Type:** BETTER_IDEA. - **Severity:** minor. - **Problem:** sometimes the human wants the Revisor to **rewrite without a full evaluation cycle** (a straight redo in drafting loops) — currently every Revisor route implies the full cycle. - **Disposition:** **ACCEPT-AS-OPTION** — fits the established cheap→expensive routing spectrum (my-edit-only → comment → another module → Revisor → evaluator-bridge). It is an option on the routing decision, not a new port. - **Anchor:** this card routing / `ReviewRoutingDecision`, alongside RS-009. **INSERT** field: ```ts interface ReviewRoutingDecision { /* …existing… */ regenerate_only?: boolean; // NEW: Revisor rewrite without full evaluation cycle } ``` - **⚠verify:** a `regenerate_only` route still respects the RS-010 terminal-vs-pending-mods preflight. ### RS-064 — [defensibility] Review attestation / chain-of-custody record - **Raised by:** Claude (N3), Grok (ReviewSessionEnvelope "legal defensibility / chain-of-custody"). - **Type:** GAP / BETTER_IDEA. - **Severity:** substantive (for a securities-litigation user, work-product defensibility is high-value). - **Problem:** §5's session durability (RS-050), comment identity (RS-052), and authority-basis cleanup (RS-053) do not clearly produce an **immutable, content-sealed record of who reviewed which version, what was shown, what was decided, and when** — the artifact a Rule-11 / work-product challenge would need. - **Disposition:** **ACCEPT-WITH-MODIFICATIONS — verify first.** If RS-050/RS-053 already content-seal the review record + decision, this collapses into a CONFIRM. Otherwise add the distinct immutable `ReviewAttestation` below (EC sole writer; serialized-durable). ```ts interface ReviewAttestation { attestation_id: string; review_session_id: string; reviewer: LifecycleActorRef; // who reviewed_version_ref: ArtifactVersionRef; // which version shown_summary_ref?: StorageRef; // what was shown (surface state / diff view) terminal_decision: ReviewTerminalAction; // what was decided finding_decisions_ref?: StorageRef; decided_at: string; content_hash: string; // seal over the above; EC-written schema_version: 1; } ``` - **Lint:** `review_studio.terminal_decision_without_attestation`. - **Fixture:** `GS-RS-35-terminal-decision-attestation` (named to avoid the existing `GS-RS-23-task-agent-graph-patch`). --- ### RS-065 — [budget] `ReviewIterationBudget` — split `max_revisions` by route - **Raised by:** ChatGPT (§14.3). - **Type:** GAP. - **Severity:** substantive. - **Problem:** v3 has the `GS-RS-22-budget-split` fixture but (per ⚠verify #8) may lack the schema. Advise-only chat, mutating assist, Revisor dispatch, and external Word round-trips should not draw down the same budget — otherwise a few advise turns can exhaust the revision allowance. - **Disposition:** **ACCEPT** — adopt ChatGPT's per-route budget. Anchor: this card **§3.9** (finish/gate policy) or **§3.6** (staged sequence); attaches to the `review_session_id`. ```ts interface ReviewIterationBudget { budget_id: string; review_session_id: string; max_advise_turns?: number | "unlimited"; max_mutating_assist_rounds: number; max_external_roundtrips: number; max_revisor_dispatches: number; max_direct_user_edit_checkpoints_before_revalidation_prompt: number; used_advise_turns: number; used_mutating_assist_rounds: number; used_external_roundtrips: number; used_revisor_dispatches: number; direct_user_edit_checkpoints_since_revalidation: number; on_budget_exceeded: "block" | "warn_and_allow" | "require_task_agent_assessment"; } ``` - **Fixture:** `GS-RS-22-budget-split` (already in card). **⚠verify** whether the interface already exists in v3. ### RS-066 — [native/surface] `ReviewExternalSurfaceBinding` — unified surface binding layer - **Raised by:** ChatGPT (§14.7). - **Type:** GAP. - **Severity:** substantive. - **Problem:** Review Studio drives several editing surfaces (DOC20 viewer, DOC20 OnlyOffice, M365 Word-online round-trip, Desktop Word, DOC27 add-in, PDF viewer, xlsx native). Without one binding layer, surface wiring is scattered across the native-doc rows. - **Disposition:** **ACCEPT-WITH-MODIFICATIONS** — adopt the binding, but **reconcile with RS-057 `ReviewInputFidelity`** so the two are complementary, not duplicative: the **binding** says *which surface/provider* is in use; the **fidelity** says *what that channel can do* (anchors, mutation, identity). Anchor: this card **§3.11** (native documents and Word/DOC27 bridge). ```ts interface ReviewExternalSurfaceBinding { binding_id: string; review_session_id: string; provider: | "doc20_document_viewer" | "doc20_onlyoffice" | "m365_word_online_roundtrip" | "desktop_word_roundtrip" | "doc27_word_addin" | "doc20_pdf_viewer" | "doc20_xlsx_native" | "external_native_app"; fidelity_ref?: StorageRef; // → the ReviewInputFidelity for this channel (RS-057) // …provider-specific handles (round-trip version identity, add-in bridge status)… schema_version: 1; } ``` - **Cross-artifact:** the DOC27 provider values are **fast-follow** (Word add-in), not a v1 blocker. **⚠verify** the provider value-set against the card's native-doc cluster. --- ## 6. Lints and fixtures ### 6.1 Port and routing lints ```ts type ReviewStudioPortLint = | "review_studio.output_port_named_after_internal_record" | "review_studio.stage_response_declared_as_output" | "review_studio.approved_output_missing_current_artifact_version" | "review_studio.approved_output_includes_unsubmitted_finding_decisions" | "review_studio.finding_decisions_auto_submitted_without_user_confirmation" | "review_studio.revisor_request_not_routed_to_revision_in" | "review_studio.human_edited_anchor_without_preservation_lock" | "review_studio.work_sent_signal_output_declared" | "review_studio.rejected_signal_contains_repair_payload" | "review_studio.generic_signal_out_declared" | "review_studio.named_signal_port_missing_owner_admission" | "review_studio.error_out_uses_review_signal_package" | "review_studio.output_connected_to_incompatible_input_port" | "review_studio.sequence_runner_duplicates_existing_looper" ``` ### 6.2 Findings/comments/instructions lints ```ts type ReviewStudioFindingCommentLint = | "review_studio.comment_resolve_treated_as_finding_resolution" | "review_studio.finding_disposition_ambiguous_accept_reject" | "review_studio.general_directive_auto_promoted_to_criterion_without_confirmation" | "review_studio.run_criterion_missing_required_criterion_fields" | "review_studio.directive_materialization_kind_unconfirmed" | "review_studio.fix_this_finding_request_missing_targeted_finding_id" | "review_studio.returned_revision_without_comment_closure_map" | "review_studio.cross_surface_comment_without_identity_map" ``` ### 6.3 Mutation/version/native lints ```ts type ReviewStudioMutationNativeLint = | "review_studio.assist_mutation_without_precondition" | "review_studio.direct_edit_without_precondition" | "review_studio.finished_with_stale_evaluation_snapshot" | "review_studio.revalidation_trigger_without_snapshot_ref" | "review_studio.dry_run_result_mutated_finding_lifecycle_without_user_submit" | "review_studio.paused_gate_without_expiry_policy" | "review_studio.resume_replayed_already_dispatched_output" | "review_studio.stage_replayed_after_process_restart" | "validation.native_format_review_requested_but_note_fork_used" | "validation.tracked_changes_present_but_unextracted" | "validation.native_revision_delta_partial_without_warning" | "validation.word_online_dom_automation_claimed_as_canonical" ``` ### 6.4 Required fixtures ```text GS-RS-01-basic-approve-no-edit GS-RS-02-human-edit-revalidation GS-RS-03-finding-to-revisor GS-RS-04-email-coarse-loss GS-RS-05-pdf-read-only GS-RS-06-docx-copy-on-write GS-RS-07-plan-review-disposition GS-RS-08-downstream-context-receipt GS-RS-09-taint-policy-block GS-RS-10-stale-assist-result GS-RS-11-data-in-non-artifact-subject GS-RS-12-approve-carries-delta-brief GS-RS-13-comment-resolved-not-finding-resolved GS-RS-14-directive-classifier GS-RS-15-assist-stale-base-conflict GS-RS-16-plan-step-modify-requires-recompile GS-RS-17-native-word-delta-to-context GS-RS-18-doc27-unavailable-fallback GS-RS-19-consumption-receipt-required GS-RS-20-approve-with-limitations GS-RS-21-rationale-policy GS-RS-22-budget-split GS-RS-23-task-agent-graph-patch GS-RS-24-doc12-room-import-back GS-RS-25-module-activation-chat-availability GS-RS-26-approved-output-edited-version GS-RS-27-finding-decisions-explicit-submit GS-RS-28-rejected-signal-no-repair-payload GS-RS-29-stage-output-input-loop GS-RS-30-route-receipt-downcast GS-RS-31-comment-closure-map GS-RS-32-review-expiry-idempotency GS-RS-33-dry-run-revalidation-no-mutation GS-RS-34-comment-identity-cross-surface WORD-RS-01-onlyoffice-comment-and-track-change WORD-RS-02-word-online-roundtrip WORD-RS-03-desktop-word-roundtrip WORD-RS-04-word-addin-selection-question WORD-RS-05-word-addin-comment-sync WORD-RS-06-word-addin-standalone-document WORD-RS-07-partial-revision-extraction-warning WORD-RS-08-private-sideload WORD-RS-09-desktop-word-onedrive-backed ``` --- ### 6.5 Round-2 lints and fixtures ```ts type ReviewStudioRound2Lint = | "review_studio.email_anchor_claim_without_full_surface" // RS-057 | "review_studio.email_reply_created_direct_edit" // RS-057 | "review_studio.terminal_decision_without_attestation"; // RS-064 ``` Round-2 fixtures: `GS-RS-35-terminal-decision-attestation` (RS-064); `WORD-RS-08-private-sideload`, `WORD-RS-09-desktop-word-onedrive-backed` (DOC27 fast-follow). `GS-RS-02-human-edit-revalidation` (RS-056) and `GS-RS-22-budget-split` (RS-065) already exist in §6.4. --- ## 7. End-to-end traces ### Trace 1 — Clean approval to email module ```text Review Studio approved_review_package_out → Email/Output Module artifact_in Package: ApprovedReviewPackage.output_mode = clean approved_artifact_version_ref = current approved version Optional: approved_signal_out → Trigger signal_in ``` No comments, findings, instructions, or source context are sent unless the approved output mode includes them. ### Trace 2 — Approve edited Word doc with comments/track changes ```text Review Studio approved_review_package_out → Output Module artifact_in Package: approved_artifact_version_ref = edited Word version output_mode = with_track_changes included_sidecars = [user_comments, native_revision_delta] ``` Downstream sends/uses the edited reviewed Word package, not the original review subject. ### Trace 3 — Send user comments back to original drafting module ```text Review Studio user_comments_revisions_out → Drafting Module data_in + instruction_in Package: current artifact user comments review instructions repair instructions preservation locks if any ``` Drafting module returns through its normal output or `module_reply_in` if Review Studio is waiting. ### Trace 4 — Fix this finding with a normal agent ```text User clicks: Fix with Agent on Finding 4 Target: Legal Research Agent Review Studio user_comments_revisions_out → Legal Research Agent instruction_in + context_in Package: targeted_finding_ids = [Finding 4] review_instruction = "Research/fix the source gap for this finding." source_context = available sources ``` No Revisor required unless user chooses Send to Revisor. ### Trace 5 — Finding decisions only ```text Review Studio finding_decisions_out → Feedback Interpreter / finding lifecycle human_finding_feedback_in Package: finding decisions evaluator_action = rerun_selected_findings ``` No artifact repair occurs. ### Trace 6 — Mixed findings + Revisor repair ```text Review Studio revisor_request_out → Revisor revision_in Review Studio finding_decisions_out → Feedback Interpreter / finding lifecycle human_finding_feedback_in ``` This is valid because: ```text revisor_request_out = repair artifact finding_decisions_out = update finding lifecycle ``` ### Trace 7 — Reject only ```text Review Studio rejected_signal_out → Rejection Handler reject_signal_in Package: signal_kind = rejected optional rejection note artifact ref review record ref ``` No repair data is sent. ### Trace 8 — Reject and ask Task Agent to replan ```text Review Studio rejected_signal_out → Rejection Handler reject_signal_in Review Studio user_comments_revisions_out → Task Agent task_instruction_in Task Agent returns: TaskGraphPatchCandidate or ReviewActionSequence ``` The graph patch is reviewed before application. ### Trace 9 — Research → revise → evaluate staged loop ```text Stage 1: Review Studio stage_instruction_out[1] → Legal Research Module research_request_in Legal Research Module research_result_out → Review Studio stage_response_in[1] Review Studio pauses or continues. Stage 2: Review Studio stage_instruction_out[2] → Revisor revision_in includes StageResponsePackage[1] Revisor candidate_out → Review Studio stage_response_in[2] Review Studio pauses or continues. Stage 3: Review Studio stage_instruction_out[3] → Outcome Evaluator subject_in / evaluation_request_in includes revised artifact from StageResponsePackage[2] Outcome Evaluator evaluation_result_out → Review Studio stage_response_in[3] ``` This is a human-review-aware loop, not a replacement for the general DOC23 Looper unless the owner admits `ReviewStudioSequenceRunner`. --- ## 8. Reviewer-by-reviewer coverage table | Reviewer | Accepted | Modified | Rejected | Deferred | Unique catches | Over-claims / misses | |---|---:|---:|---:|---:|---|---| | ChatGPT | High | High | Low | Medium | `ReviewableSubject`, terminal context, native Word/DOC27, source anchors, lints/fixtures, port model cleanup after user critique. | Early output names were too abstract; now replaced. | | Claude | High | High | Low | Medium | Criteria/evaluator distinction, routing spectrum, provenance panel, native Word spine, privilege egress reframe, comment closure, review expiry. | Claimed `HumanReviewResult extends DocumentReviewRequest` was acceptable; rejected here. | | Grok | Medium | Medium | Medium | Medium | Port teardown, `plan_in`, magic routing, hard calls, context/source split. | “A+ ship as-is/no phantom” rejected; `feedback_bundle_out`/`evaluation_result_out` as ports rejected. | | Gemini | Medium | Medium | Low | Low | Preservation locks, ghost revision, finding-specific fix, terminal deadlock, dry-run evaluator. | Partial approval deferred; best handled by staged workflow or later graph semantics. | --- ### 8.1 Round-2 coverage (re-review of the adjudication) The same four models re-reviewed the adjudication. **Coverage audit: all 20 ChatGPT findings (RS-01–RS-20) and all 40 Claude findings (C1–C2 / S1–S13 / M1–M6 / N1–N13 / BI1–6) are captured.** Grok and Gemini largely re-reviewed the spec and confirmed. | Reviewer (Round 2) | Confirmed | Net-new accepted | Declined / rejected | Best contribution | |---|---|---|---|---| | ChatGPT (GPT-5.5 Pro) | 17 of 20 map to existing rows | 3 — RS-057 email fidelity, RS-065 budget, RS-066 surface binding | — | §14 audit addendum carried the net-new contracts. | | Gemini | ~13, incl. 5 stop-level | 2 — RS-059 context, RS-060 changelog | 1 defer (partial approval) | Independent `plan_in` Dispatcher stop — best confirmation. | | Grok | ~6 | 5 — drove RS-056; RS-058, RS-061, RS-063, RS-064 angle | 1 decline (Critique Swarm), 1 reject (RS-062) | Drove the RS-021 resolution; routing flags; chain-of-custody. | | Claude | all 40 map to rows | co-raised RS-056/057/059/060/064; S9–S11 anchor unification | self-recorded N2/N8/N12/BI2 dispositions | Minimal-architecture advocate; `ReviewAttestation`; non-document artifact kinds (N1). | Round-2 conclusion: the architecture stands; one open item resolved by this round (RS-056), four resolved by adjudication and confirmed (§1.1), eleven net-new rows added (RS-056–RS-066). --- ## 9. Value-tier roll-up ### Tier 1 — Critical / blocking - RS-001 — Owner admission / status correction. - RS-002 — `ReviewableSubject` decision. - RS-006 — Preserve Revisor `revision_in` chokepoint. - RS-007-R3 — Correct output port model. - RS-019 — Mutation preconditions. - RS-021 — Human edit revalidation — **RESOLVED** by RS-056 (no longer open). - RS-025 — Native-format review cannot use Notes. - RS-026 — DOCX version-spine decision. - RS-027 — Native tracked-change delta. - RS-038 — Per-object governance. - RS-046 — Staged workflow loop model. - RS-047 — Remove `plan_in`; plan review as Dispatcher projection. ### Tier 2 — Substantive - RS-003 — Event-sourced session. - RS-004 — Submission envelope. - RS-005 — Output-specific packages. - RS-009 — Direct Revisor request. - RS-010 — Finish preflight. - RS-012 — Comment/finding split. - RS-014 — ReviewInstruction classifier. - RS-020 — Checkpoints/undo/revert. - RS-022 — Stale review. - RS-023 — Preservation locks. - RS-028 — Word round-trip. - RS-031 — Mode-driven UI. - RS-032 — Comment-first pass. - RS-033 — Provenance panel. - RS-048 — Comment closure map. - RS-050 — Expiry/idempotency/restart. - RS-051 — Dry-run revalidation. - RS-052 — Cross-surface comment identity. ### Tier 3 — Minor / polish - RS-000 — Filename cleanup. - RS-018 — Rationale policy. - RS-035 — Cost/latency preview. - RS-043 — UI registry rows. - RS-045 — DOC27 implementation ladder. - RS-049 — Assignment/signoff schema hook. - RS-053 — Naming cleanup. - RS-055 — Section-by-section review defer. ### Tier 4 — Considered / declined / deferred | Item | Reason | |---|---| | `feedback_bundle_out` as output port | Internal adapter shape; not a Review Studio output. | | `evaluation_result_out` as output port | Internal compatibility record; not user-facing Review Studio route. | | `formal_assessment_out` | Confusing internal audit term; use `ReviewRecordRef` and internal adapters. | | `revision_out` | Ambiguous: revised artifact, revision request, Revisor route. | | `needs_revision_out` | Too vague; use `user_comments_revisions_out` or `revisor_request_out`. | | `work_sent_signal_out` | Redundant; use `ReviewRouteReceipt` / telemetry. | | generic `signal_out` | Phantom; replaced by owner-admitted named signals. | | `send_to_task_agent_out` | Task Agent is a destination, not a unique port. | | `send_to_room_out` | Deferred until DOC12 bridge intake/import-back contract exists. | | Word Online DOM automation | Prohibited as canonical integration path. | | Critique Swarm | Useful, but v1-deferred. | | Partial approval with deferred revision | Deferred; staged workflow covers most immediate needs. | --- ### Round-2 additions (RS-056–RS-066) **Tier 1 — Critical / blocking** - RS-056 — resolve RS-021 (the only blocking Round-2 item). **Tier 2 — Substantive** - RS-057 email input-fidelity · RS-059 reviewer source-context · RS-064 attestation (verify) · RS-065 iteration budget · RS-066 surface binding · RS-060 optional semantic changelog. **Tier 3 — Minor / polish** - RS-058 `approve_proceed` · RS-061 `human_reviewed_only` filter · RS-063 `regenerate_only`. **Considered / declined** - RS-062 `confidence_triggered_auto_route` — **REJECT** (no auto-routing; load-bearing decline). · Critique Swarm — **DECLINE** (v1). · Partial approval — **DEFER**. --- ## 10. Cross-artifact implications ### DOC23 Addenda B / Review Studio - Add `ReviewableSubject`. - Add `ReviewStudioSessionRecord` and `ReviewStudioActionEvent`. - Replace output ports with corrected port model. - Add package schemas. - Add staged workflow sequence. - Add finish preflight and gate decision policy. - Add ReviewRouteReceipt / receiver compatibility rule. - Add finding-decision submission rules. ### V3.3.1 Outcome Evaluator / Revisor - Confirm `revision_in` handoff. - Confirm revalidation trigger for human/native edits. - Confirm preservation constraints. - Confirm whether plan review remains Dispatcher human-gate projection. ### Feedback Delivery - Decide owner/name for `human_finding_feedback_in`. - Keep `EvaluationFeedbackBundle` as internal adapter, not a Review Studio output port. - Add consumption receipt / downstream context obligations if not already covered. ### Common Contracts - Owner-admit any shared types that become cross-family primitives. - Confirm anchor types for non-document/structured review subjects. ### DOC20 - Add Review Studio surface modes and degraded states. - Add output mode support: clean, with comments, with track changes, redline, native current. - Add native revision sidecar rendering. - Add stage-pause Review Studio return states. - Add cross-surface comment identity map support. ### DOC20 Addendum B / DOC16 - Add native Word round-trip state and Graph/file-version detection. - Clarify DOCX copy-on-write version spine. - Add OnlyOffice/Word Online/Desktop Word ingest states. ### DOC27 - Create new Word Add-in / Native Word Bridge spec. - Include Word-hosted Elnor session, agent/model selector, comment sync, tracked-change sync, standalone Word document sessions. ### DOC12 - Defer room output until room bridge contract exists. - Later specify room intake, participants, pinned review context, and import-back policy. ### DOC21 / DOC22 - Register UI controls: - Approve & Continue - Send Comments / Revisions - Send to Revisor - Submit Finding Decisions - Reject / Stop - Approved Signal / Rejected Signal wiring display - Add Stage / Run Stage - Stage response pause state - Native-document output modes - Finding-specific Fix with Agent button ### EC Core - EC remains sole durable writer for: - review sessions - action events - review records - output packages - route receipts - checkpoints - staged sequence state - finding decisions - native revision deltas - comment identity maps ### OP-A - Add obligation rows for every cross-doc owner item. --- ### Round-2 cross-artifact additions | Target | Obligation | Source | |---|---|---| | V3.3.1 §0.4.7 | Add `human_authored_version_created` to shared `RevisionOperationKind` | RS-056 | | V3.3.1 §11.21 | Add the human-authored kind to the revalidation cascade | RS-056 | | V3.3.1 §11.6 | Revalidation receipt for human-authored version owned by Evaluator | RS-056 | | V3.3.1 §9.1 | Add `review_session_id` to `LifecycleActorEnvelope` | Grok | | V3.3.1 §9.2 | Add `human_reviewed_only` to `LifecycleReadQuery` | RS-061 | | DOC11 / OpenClaw | Paused long-latency review run survives a process restart | Claude S8 | | DOC85 / DOC72 | Semantic-changelog + teaching-signal route as learning input | RS-060, RS-041 | | DOC27 | `WORD-RS-08/09` fixtures; surface-binding provider values — fast-follow | RS-066 | | EC Core | `ReviewAttestation` EC-written, content-hash-sealed (if RS-064 added) | RS-064 | --- ## 11. Verdict and minimum patch list ## Verdict: `READY_AFTER_PATCH` Review Studio D1 becomes operative once the Tier-1 patches, the §1.1 open-item resolutions, and the net-new RS-056–RS-066 are applied. Round 2 confirmed the architecture (notably Gemini's independent `plan_in` Dispatcher-ownership stop confirming RS-047, and Grok's "A+" with no new stops) and resolved all five Round-1 open items; no new `ARCHITECT_STOP` was raised. **`RS-062` (confidence-triggered auto-routing) is REJECTED — the gate is the gate.** The minimum patch list below is the Round-1 set; the **Round-2 additions** subsection follows it. ### Minimum patch list 1. Replace the port model with: ```text Outputs: approved_review_package_out user_comments_revisions_out revisor_request_out finding_decisions_out approved_signal_out rejected_signal_out stage_instruction_out[n] error_out Inputs: subject_in context_in review_context_in stage_response_in[n] revisor_candidate_in evaluator_result_in module_reply_in ``` 2. Remove: ```text revision_out needs_revision_out feedback_bundle_out evaluation_result_out formal_assessment_out review_record_out generic signal_out work_sent_signal_out send_to_task_agent_out send_to_room_out plan_in findings_in ``` 3. Add output packages: ```text ApprovedReviewPackage UserCommentsRevisionsPackage RevisorRequestPackage FindingDecisionPackage ReviewSignalPackage ReviewStudioErrorPayload StageInstructionPackage StageResponsePackage ``` 4. Add Review Studio loop/stage model: ```text ReviewActionSequence ReviewActionStage ReviewActionSequenceRuntimeBinding ``` 5. Add receiver compatibility: ```text ReviewRouteReceipt receiver_port_contract_check rule ``` 6. Add finding/comment/instruction fixes: ```text CommentFindingLinkEvent FindingDispositionKind ReviewInstruction CommentClosureMap ReviewCommentIdentityMap ``` 7. Add native document contracts: ```text ReviewStudioNativeSurfacePolicy NativeRevisionDelta ExternalNativeEditRoundTrip ``` 8. Add version/revalidation safety: ```text ReviewStudioMutationPrecondition ArtifactCheckpointRecord ReviewBaseVersionCheck ReviewRevalidationRequest ReviewStudioDryRunEvaluationRequest ``` 9. Add long-gate reliability: ```text ReviewGateExpiryPolicy ReviewResumeIdempotencyRecord ``` 10. Add OP-A rows and UI registry obligations. ### Ranked top 10 fixes 1. Correct output port model. 2. Add staged workflow with paired output/input ports and Looper alignment. 3. Preserve Revisor `revision_in` chokepoint. 4. Separate finding decisions from approval and repair outputs. 5. Make approval send the actual reviewed/edited package. 6. Remove redundant/ambiguous internal-record ports. 7. Add receiver-port compatibility receipts. 8. Add preservation locks for human edits. 9. Add native document output modes and deltas. 10. Defer DOC12 room output until bridge exists. --- ### Round-2 additions to the patch list After the Round-1 patch list above, also: 1. Apply the **§1.1 open-item resolutions** — RS-002 (`ReviewableSubject` + `ReviewableArtifactKind`), RS-017 (`human_resolved` → §5.7.2 invariant), RS-026 (version-spine reconciliation), RS-027 (`NativeRevisionSafetyGate`). 2. Apply **RS-056** (the RS-021 fix): `human_authored_version_created` → shared `RevisionOperationKind` + §11.21 cascade + §11.6 Evaluator-owned receipt. *Blocking.* 3. Apply net-new **RS-057, RS-059, RS-064, RS-065, RS-066** (substantive) and **RS-058, RS-061, RS-063** (minor). 4. **RS-060** optional (non-blocking semantic changelog). 5. **Do not** implement **RS-062** — auto-routing is REJECTED. 6. Add the **Round-2 cross-artifact obligations** (§10) and the OP-A rows. --- ## 12. Final synthesis The corrected Review Studio design is: ```text Review Studio is a review/edit/decision surface over ReviewableSubject. It outputs concrete packages, not internal abstractions. Approval sends the reviewed package as approved. User comments/revisions go through their own package. Revisor gets a Revisor-specific request through revision_in. Finding decisions go to finding lifecycle / Feedback Interpreter. Approval/rejection signals are pure named signals, owner-admitted. Staged workflows are paired output/input loops and must align with the existing DOC23 looper. Native document workflows use native formats, not Notes. DOC27 is an optional future Word bridge, not a Review Studio v1 dependency. ``` --- **Round-2 close:** the second pass (ChatGPT, Claude, Grok, Gemini re-reviewing the adjudication) confirmed the architecture above, resolved all five Round-1 open items (§1.1), added the net-new RS-056–RS-066, and rejected confidence-triggered auto-routing (the gate is the gate). This card is self-contained: RS-000–RS-066 with paste-ready fixes, no external companion required.