WS-ARCH-001-02D: expose ART preparation public boundary - #322
Conversation
|
Warning Review limit reached
Next review available in: 21 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (3)
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (3)
🚧 Files skipped from review as they are similar to previous changes (3)
📝 WalkthroughWalkthroughThe change completes the ART submission-preparation boundary. It adds public preparation contracts, moves the hidden route, wires TASK, PROJECT, and CHECKER adapters, narrows authorization handles, validates execution facts, relocks evidence context, and updates boundary tracking. ChangesART submission preparation boundary
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant Client
participant ArtifactSubmissionsRoute
participant SubmissionBundlePreparationCommand
participant TaskAndProjectContexts
participant CheckerExecutionAdapter
participant PreSubmitEvidenceService
Client->>ArtifactSubmissionsRoute: Submit streamed bundle and metadata
ArtifactSubmissionsRoute->>SubmissionBundlePreparationCommand: prepare(SubmissionBundlePreparationRequest)
SubmissionBundlePreparationCommand->>TaskAndProjectContexts: Lock task and project facts
SubmissionBundlePreparationCommand->>CheckerExecutionAdapter: Build checker processor
CheckerExecutionAdapter-->>SubmissionBundlePreparationCommand: PreSubmissionExecutionFacts
SubmissionBundlePreparationCommand->>PreSubmitEvidenceService: Relock context and persist evidence
PreSubmitEvidenceService-->>SubmissionBundlePreparationCommand: Admission and replay result
SubmissionBundlePreparationCommand-->>ArtifactSubmissionsRoute: SubmissionBundlePreparationResult
ArtifactSubmissionsRoute-->>Client: HTTP 202 response
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 6
🧹 Nitpick comments (7)
backend/app/adapters/checkers/__init__.py (1)
18-26: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winConsider typing the adapter surface instead of
Any.
_ExecutionRequestdeclares every field asAny, andarchive_inspectorisAny. The adapter then forwards these values intoDefaultPreSubmissionExecutionInput, so a field-type mismatch is only detected at runtime. The concrete types already exist inapp.modules.checkers.api(EffectivePreSubmissionExecutionPlan,SubmissionPacketView) and in the ART request type. Typing the protocol members restores static checking at the composition root without changing behavior.Also applies to: 50-52
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@backend/app/adapters/checkers/__init__.py` around lines 18 - 26, The _ExecutionRequest protocol and archive_inspector adapter surface are overly broad; replace their Any annotations with the existing concrete types from app.modules.checkers.api and the ART request type, including the appropriate types for each forwarded field and storage_scheme. Preserve the existing DefaultPreSubmissionExecutionInput composition and runtime behavior while enabling static type checking.backend/tests/test_effective_pre_submit_execution.py (1)
96-125: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd the remaining
validate_predecessor_lineagebranches.This test covers only the version-mismatch branch. The helper has two other rejection paths that are now public API and are untested here:
- Presence mismatch:
task_context.predecessoris set butpredecessor_submission_idisNone, and the reverse.- Identifier mismatch:
predecessor.submission_iddiffers frompredecessor_submission_id.A passing case with a matching id and version is also worth asserting, because the helper must not raise on the normal path.
The coding guidelines require at least 90% test coverage for new or materially changed backend subsystems, and this helper is part of the new ART preparation boundary. As per coding guidelines: "New or materially changed backend subsystems must maintain at least 90% test coverage".
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@backend/tests/test_effective_pre_submit_execution.py` around lines 96 - 125, Expand test_post_byte_relock_rejects_advanced_predecessor_version with cases for both predecessor presence mismatches and an identifier mismatch, asserting each raises PreSubmitEvidenceConflict with the appropriate reason. Add a matching predecessor ID/version case that completes without raising, covering all validate_predecessor_lineage branches.Source: Coding guidelines
backend/tests/test_pre_submit_evidence_relock.py (1)
26-38: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd the project-context drift case.
PreSubmitEvidenceService.persistcatchesTaskSubmissionContextUnavailableandProjectLockedPolicyContextUnavailablein oneexceptclause and maps both topre_submit_locked_context_changed. This test exercises only the task-side failure. Add a second test wherelock_submission_contextsucceeds andlock_locked_policy_contextraisesProjectLockedPolicyContextUnavailable. Assert the same conflict, that_repository.persistis not awaited, and that_live_pass_bindingsstays empty.That case also covers the PROJECT half of the relock guard, which the file name claims to prove.
The coding guidelines require at least 90% test coverage for new or materially changed backend subsystems. As per coding guidelines: "New or materially changed backend subsystems must maintain at least 90% test coverage".
Also applies to: 60-69
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@backend/tests/test_pre_submit_evidence_relock.py` around lines 26 - 38, Add a second test alongside the existing task-context failure test for PreSubmitEvidenceService.persist, making lock_submission_context succeed and lock_locked_policy_context raise ProjectLockedPolicyContextUnavailable. Assert the same pre_submit_locked_context_changed conflict, verify _repository.persist is not awaited, and confirm _live_pass_bindings remains empty; ensure the added coverage contributes to the required 90% coverage for the relock guard.Source: Coding guidelines
backend/app/modules/artifacts/pre_submit_evidence.py (1)
430-439: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueRemove unused context ports from
_PreSubmitEvidenceRepository. The repository stores_task_contextsand_project_contextsbut never reads them. Remove these constructor parameters and the corresponding arguments at the service call site.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@backend/app/modules/artifacts/pre_submit_evidence.py` around lines 430 - 439, Remove the unused task_contexts and project_contexts parameters and assignments from _PreSubmitEvidenceRepository.__init__. Update the repository construction call site to stop passing those arguments, while preserving the session dependency and all other behavior..agent-loop/initiatives/WS-ARCH-001-modular-monolith-boundaries/chunks/WS-ARCH-001-02D-art-preparation-public-api.md (1)
69-71: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winRemove the duplicate allowed-file entry.
.agent-loop/initiatives/WS-AUTH-003-module-boundary-recovery/TEST_STRUCTURE_DEBT.jsonappears twice in the allowed-file list. Keep one entry so exact chunk scope remains unambiguous.Remove the duplicate path
.ci/behavior-ownership/** .agent-loop/initiatives/WS-AUTH-003-module-boundary-recovery/TEST_STRUCTURE_DEBT.json -.agent-loop/initiatives/WS-AUTH-003-module-boundary-recovery/TEST_STRUCTURE_DEBT.json .agent-loop/initiatives/WS-ARCH-001-modular-monolith-boundaries/chunks/WS-ARCH-001-02D-art-preparation-public-api.md🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.agent-loop/initiatives/WS-ARCH-001-modular-monolith-boundaries/chunks/WS-ARCH-001-02D-art-preparation-public-api.md around lines 69 - 71, Remove the duplicate `.agent-loop/initiatives/WS-AUTH-003-module-boundary-recovery/TEST_STRUCTURE_DEBT.json` entry from the allowed-file list, keeping exactly one occurrence alongside the existing `.ci/behavior-ownership/**` entry..agent-loop/initiatives/WS-ARCH-001-modular-monolith-boundaries/CHUNK_MAP.md (1)
11-12: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winUse ART-specific lifecycle state names.
The
Statecolumn usesComplete; production remains deny-onlyandNext durable boundary. Use explicit values such asART-02D hidden-preparation boundary complete; production deny-onlyandART-02E ready-admission boundary next. This prevents confusion between planning state and product activation.As per coding guidelines, use subsystem- or actor-specific names for workflow states and lifecycle names instead of vague labels.
Proposed state labels
-| `WS-ARCH-001-02D` | ART hidden preparation public API and private-edge migration | L1 | Complete; production remains deny-only | -| `WS-ARCH-001-02E` | ART ready-admission consumption and binding public capability | L1 | Next durable boundary | +| `WS-ARCH-001-02D` | ART hidden preparation public API and private-edge migration | L1 | ART-02D hidden-preparation boundary complete; production deny-only | +| `WS-ARCH-001-02E` | ART ready-admission consumption and binding public capability | L1 | ART-02E ready-admission boundary next |🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.agent-loop/initiatives/WS-ARCH-001-modular-monolith-boundaries/CHUNK_MAP.md around lines 11 - 12, Update the State entries for WS-ARCH-001-02D and WS-ARCH-001-02E in the chunk map to use explicit ART-specific lifecycle names: identify 02D as the hidden-preparation boundary being complete while production remains deny-only, and 02E as the ready-admission boundary being next. Replace the vague existing labels without changing the milestone descriptions or ordering.Source: Coding guidelines
backend/tests/architecture/test_module_boundaries.py (1)
111-130: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winAdd a nested-adapter negative case.
The test covers
backend/app/adapters/tasks/worker.py, but notbackend/app/adapters/tasks/nested/__init__.py. The scanner grants the exception only when the adapter path has exactly two components afterbackend/app/adapters/. Add the nested__init__.pyfixture and assert that its same-owner private dependency remains visible.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@backend/tests/architecture/test_module_boundaries.py` around lines 111 - 130, The test test_non_root_adapter_keeps_same_owner_private_debt_visible currently covers only a two-component adapter path. Add a nested backend/app/adapters/tasks/nested/__init__.py fixture importing TaskRepository, then include the corresponding boundary.PrivateEdge in the private assertion so same-owner private debt remains visible for nested adapters.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@backend/app/adapters/checkers/__init__.py`:
- Around line 38-44: Update process_blocking to catch the private base execution
error, DefaultPreSubmissionExecutionError, rather than only
PreSubmissionInfrastructureUnavailable, and translate it to the public
PreSubmissionInfrastructureUnavailableError while preserving exception chaining.
In `@backend/app/modules/artifacts/api/submission_preparation.py`:
- Around line 39-45: Replace the generic status: str field in
SubmissionBundlePreparationResult with an ART-specific
submission_bundle_preparation_status field backed by a closed type enumerating
the permitted preparation states. Update all construction and consumption sites,
including the route response, to use the renamed field and type, and revise the
corresponding API documentation to expose the ART-specific enum contract.
In `@backend/app/modules/artifacts/pre_submit_evidence.py`:
- Around line 318-319: The exception handler in _validate_execution should
preserve the original PreSubmissionInfrastructureUnavailableError by chaining it
when raising PreSubmitEvidenceConflict. Bind the caught exception and use
explicit exception chaining, matching the existing chained error handling in
_validate_execution and persist.
In `@backend/app/modules/artifacts/submission_materialization.py`:
- Around line 77-84: Update the PreSubmitCheckerProcessor protocol to expose an
awaitable processor operation instead of process_blocking, and revise its
documentation to describe asynchronous CHECKER execution. Keep any synchronous
or blocking work encapsulated within the CHECKER adapter rather than the ART
boundary.
In `@backend/scripts/module_boundaries.py`:
- Around line 125-133: Align module_boundaries.scan() with
authorization_boundary.scan_edges() for exact adapter composition roots
identified by _source_owner_adapter, including imports from
backend/app/adapters/authorization/__init__.py. Add a fixture covering that
import and update the boundary-scanning logic so both scanners return identical
edge sets without changing unrelated adapter paths.
In `@docs/spec_artifact_storage_service.md`:
- Around line 388-392: Update the description of
PreparedBundleMaterializationRequest to include its effective plan, inspection,
manifest, change gate, and packet alongside the existing fields, or remove the
exclusive “only” wording. Preserve the statements that the request is internal,
process-local, opaque, and prohibited from crossing public boundaries.
---
Nitpick comments:
In
@.agent-loop/initiatives/WS-ARCH-001-modular-monolith-boundaries/CHUNK_MAP.md:
- Around line 11-12: Update the State entries for WS-ARCH-001-02D and
WS-ARCH-001-02E in the chunk map to use explicit ART-specific lifecycle names:
identify 02D as the hidden-preparation boundary being complete while production
remains deny-only, and 02E as the ready-admission boundary being next. Replace
the vague existing labels without changing the milestone descriptions or
ordering.
In
@.agent-loop/initiatives/WS-ARCH-001-modular-monolith-boundaries/chunks/WS-ARCH-001-02D-art-preparation-public-api.md:
- Around line 69-71: Remove the duplicate
`.agent-loop/initiatives/WS-AUTH-003-module-boundary-recovery/TEST_STRUCTURE_DEBT.json`
entry from the allowed-file list, keeping exactly one occurrence alongside the
existing `.ci/behavior-ownership/**` entry.
In `@backend/app/adapters/checkers/__init__.py`:
- Around line 18-26: The _ExecutionRequest protocol and archive_inspector
adapter surface are overly broad; replace their Any annotations with the
existing concrete types from app.modules.checkers.api and the ART request type,
including the appropriate types for each forwarded field and storage_scheme.
Preserve the existing DefaultPreSubmissionExecutionInput composition and runtime
behavior while enabling static type checking.
In `@backend/app/modules/artifacts/pre_submit_evidence.py`:
- Around line 430-439: Remove the unused task_contexts and project_contexts
parameters and assignments from _PreSubmitEvidenceRepository.__init__. Update
the repository construction call site to stop passing those arguments, while
preserving the session dependency and all other behavior.
In `@backend/tests/architecture/test_module_boundaries.py`:
- Around line 111-130: The test
test_non_root_adapter_keeps_same_owner_private_debt_visible currently covers
only a two-component adapter path. Add a nested
backend/app/adapters/tasks/nested/__init__.py fixture importing TaskRepository,
then include the corresponding boundary.PrivateEdge in the private assertion so
same-owner private debt remains visible for nested adapters.
In `@backend/tests/test_effective_pre_submit_execution.py`:
- Around line 96-125: Expand
test_post_byte_relock_rejects_advanced_predecessor_version with cases for both
predecessor presence mismatches and an identifier mismatch, asserting each
raises PreSubmitEvidenceConflict with the appropriate reason. Add a matching
predecessor ID/version case that completes without raising, covering all
validate_predecessor_lineage branches.
In `@backend/tests/test_pre_submit_evidence_relock.py`:
- Around line 26-38: Add a second test alongside the existing task-context
failure test for PreSubmitEvidenceService.persist, making
lock_submission_context succeed and lock_locked_policy_context raise
ProjectLockedPolicyContextUnavailable. Assert the same
pre_submit_locked_context_changed conflict, verify _repository.persist is not
awaited, and confirm _live_pass_bindings remains empty; ensure the added
coverage contributes to the required 90% coverage for the relock guard.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: e76a56a6-0f72-453e-a8d5-2827c43087a8
📒 Files selected for processing (43)
.agent-loop/CURRENT_STATE.md.agent-loop/initiatives/WS-ARCH-001-modular-monolith-boundaries/CHUNK_MAP.md.agent-loop/initiatives/WS-ARCH-001-modular-monolith-boundaries/INTENT.md.agent-loop/initiatives/WS-ARCH-001-modular-monolith-boundaries/PLAN.md.agent-loop/initiatives/WS-ARCH-001-modular-monolith-boundaries/STATUS.md.agent-loop/initiatives/WS-ARCH-001-modular-monolith-boundaries/chunks/WS-ARCH-001-02D-art-preparation-public-api.md.agent-loop/initiatives/WS-ARCH-001-modular-monolith-boundaries/evidence/WS-ARCH-001-02D-resource-manifest.md.agent-loop/initiatives/WS-AUTH-003-module-boundary-recovery/IMPORT_LEDGER.md.agent-loop/initiatives/WS-AUTH-003-module-boundary-recovery/TEST_STRUCTURE_DEBT.json.agent-loop/policies/architecture-boundaries.md.ci/module-boundaries/private-edge-debt.v1.jsonbackend/app/adapters/README.mdbackend/app/adapters/artifacts/__init__.pybackend/app/adapters/checkers/__init__.pybackend/app/adapters/projects/__init__.pybackend/app/adapters/tasks/__init__.pybackend/app/api/deps/authorization.pybackend/app/api/router.pybackend/app/api/routes/artifact_submissions.pybackend/app/interfaces/artifact_operations.pybackend/app/modules/artifacts/api/__init__.pybackend/app/modules/artifacts/api/submission_preparation.pybackend/app/modules/artifacts/authorization.pybackend/app/modules/artifacts/pre_submit_evidence.pybackend/app/modules/artifacts/submission_admission.pybackend/app/modules/artifacts/submission_authorization.pybackend/app/modules/artifacts/submission_materialization.pybackend/app/modules/checkers/api/__init__.pybackend/app/modules/checkers/api/pre_submit.pybackend/app/modules/checkers/pre_submit_execution.pybackend/app/modules/tasks/router.pybackend/scripts/module_boundaries.pybackend/tests/architecture/test_module_boundaries.pybackend/tests/pre_submit_test_helpers.pybackend/tests/test_artifact_architecture.pybackend/tests/test_authorization.pybackend/tests/test_default_pre_submit_execution.pybackend/tests/test_effective_pre_submit_execution.pybackend/tests/test_pre_submit_evidence_relock.pybackend/tests/test_submission_bundle_admission.pydocs/architecture_lockdown.mddocs/operations_backend_testing.mddocs/spec_artifact_storage_service.md
💤 Files with no reviewable changes (4)
- .ci/module-boundaries/private-edge-debt.v1.json
- backend/tests/test_authorization.py
- .agent-loop/initiatives/WS-AUTH-003-module-boundary-recovery/IMPORT_LEDGER.md
- backend/app/interfaces/artifact_operations.py
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@backend/app/modules/checkers/pre_submit_execution.py`:
- Around line 589-599: Validate result.metadata entries before the metadata_keys
comprehension in the PreSubmissionResult validation block: require a tuple
containing exactly two-item tuples whose keys are str and values are int,
rejecting malformed entries through the existing
PreSubmissionInfrastructureUnavailable path. Only derive metadata_keys and
perform duplicate/allowed-key checks after structural validation, while
preserving the existing non-negative value validation.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 38c6c9dc-0893-400b-819a-6bf70c846598
📒 Files selected for processing (22)
.agent-loop/CURRENT_STATE.md.agent-loop/initiatives/WS-ARCH-001-modular-monolith-boundaries/chunks/WS-ARCH-001-02D-art-preparation-public-api.md.agent-loop/initiatives/WS-AUTH-003-module-boundary-recovery/TEST_STRUCTURE_DEBT.json.ci/behavior-ownership/partition.v1.jsonbackend/app/adapters/checkers/__init__.pybackend/app/api/routes/artifact_submissions.pybackend/app/modules/artifacts/api/__init__.pybackend/app/modules/artifacts/api/submission_preparation.pybackend/app/modules/artifacts/pre_submit_evidence.pybackend/app/modules/artifacts/preparation.pybackend/app/modules/artifacts/submission_admission.pybackend/app/modules/artifacts/submission_materialization.pybackend/app/modules/checkers/pre_submit_execution.pybackend/scripts/behavior_ownership.pybackend/scripts/module_boundaries.pybackend/scripts/run_test_lanes.pybackend/tests/architecture/test_module_boundaries.pybackend/tests/test_behavior_ownership.pybackend/tests/test_default_pre_submit_execution.pybackend/tests/test_effective_pre_submit_execution.pybackend/tests/test_submission_bundle_admission.pydocs/spec_artifact_storage_service.md
🚧 Files skipped from review as they are similar to previous changes (13)
- backend/app/modules/artifacts/api/init.py
- backend/scripts/module_boundaries.py
- backend/tests/architecture/test_module_boundaries.py
- .agent-loop/initiatives/WS-AUTH-003-module-boundary-recovery/TEST_STRUCTURE_DEBT.json
- .agent-loop/CURRENT_STATE.md
- docs/spec_artifact_storage_service.md
- backend/tests/test_effective_pre_submit_execution.py
- .agent-loop/initiatives/WS-ARCH-001-modular-monolith-boundaries/chunks/WS-ARCH-001-02D-art-preparation-public-api.md
- backend/app/adapters/checkers/init.py
- backend/tests/test_submission_bundle_admission.py
- backend/tests/test_default_pre_submit_execution.py
- backend/app/modules/artifacts/pre_submit_evidence.py
- backend/app/modules/artifacts/submission_admission.py
This reverts commit 47a2246.
Chunk
WS-ARCH-001-02D — ART hidden preparation public API migration.
Goal and approved intent
Make the complete hidden submission-bundle preparation command consume only AUTH, TASKS, PROJECTS, and CHECKERS public capabilities while preserving deny-only availability and exact ART custody. No action is activated by this PR.
What changed
Scope and product behavior
The route remains hidden and artifact.submission_bundle.prepare remains planned/unavailable. This PR creates no Submission, activates no action, performs no successful production materialization, and adds no migration, provider semantic change, compatibility path, or serialized handle.
Acceptance proof
Tests and checks
Test delta and CI integrity
No test or coverage gate was weakened, skipped, or removed. New regressions cover concealment before semantics, post-byte AUTH ordering, predecessor-version advancement, stale relock zero effects, conflict mapping, and exact adapter-root enforcement. CI integrity passed after unchanged debt was restored and the exception narrowed.
Internal reviewer results
Architecture, security/auth, product/ops, QA, senior engineering, CI integrity, docs, reuse/dedup, and test-delta reviews all passed after their valid findings were fixed.
Remaining risks and follow-up
The CHECKER adapter retains a temporary broadly typed bridge and existing CHECKER-to-ART executor debt; WS-ARCH-001-04 owns that split. WS-ARCH-001-02E is next but is not started here.
Human review focus
Review authorization ordering, exact resource/lineage binding, the owner-adapter-root exception, and proof that production availability remains deny-only.
Human merge ownership
This PR must not be merged without the repository owners explicit approval.
Summary by CodeRabbit
New Features
Bug Fixes
Documentation