diff --git a/docs/reviews/2026-10-11-key39-node-route-v7-platform-review.json b/docs/reviews/2026-10-11-key39-node-route-v7-platform-review.json new file mode 100644 index 0000000..b7ae960 --- /dev/null +++ b/docs/reviews/2026-10-11-key39-node-route-v7-platform-review.json @@ -0,0 +1,63 @@ +{ + "completed_same_owner_refinement_precedes_formal_review": true, + "decision": "changes_requested", + "findings": [ + { + "counterexample": "Actual main after mocked source validation/public-health with a synthetic20ms original window and partial JSON pipe without EOF remained blocked after100ms. sys.stdin.read has no byte cap or elapsed/EOF bound. Child was terminated by test parent; no credential/native operation occurred.", + "location": "sso-mfa/k8s/keycape/openbao-negative-session.py:755", + "required_change": "Read private JSON through a strict byte cap and EOF requirement within the original unrenewed monotonic and wall execution window. Expiry/oversize/no-EOF must fail with fixed value-free receipt before protected/native effects. Independently review new immutable source; no custody completion based on v7.", + "severity": "blocking_before_private_producer_admission" + } + ], + "input_unchanged": true, + "intent_basis": "Platform INTENT stable shared interfaces, secure custody and observable recovery: exact provider route prerequisites and fail-closed guarded native preparation without publichealth becoming authority.", + "mandatory_native_prerequisites": [ + "Publichealth clusterhash is unauthenticated: independently verify founder/node/Service/cluster/provider route identity, current admitted route/estate and exact source/runtime pins; no arbitrary workstation diagnostic proves node placement.", + "Actual installed OpenBao JWT plugin/version, role/config/effective-policy source equality and raw/effective expiration_leeway, clock_skew_leeway and not_before_leeway interaction. Helm2.5.4/tag and raw0=>150 model are not native facts; semantic expiry proof remains mandatory.", + "Establish issuer actual readiness_state and Argo ownership through authoritative source/owner receipt. No keycape declaration/current deployment adoption established in inspected sources; absence is not nonproduction. Unmapped production-tier rules apply. If adopted/production-approved, transient directCAS needs explicit reviewed one-use maintenanceexception, close-down entry and reconciliation before nativego.", + "Fresh authenticated scoped founder decision covers exact route, source, issuer mutation/window and finite abort/revoke/restoration/recovery obligations. Helper labels/sourceacknowledgments cannot authenticate approval or waive gates.", + "Admitted private founder human/coding-agent token producer/client/callback/custody handoff remains unimplemented. No credential request/read/reuse authorized.", + "Native correct role/claim permutation/expiry/refusal/revoke, baseline restoration/client removal/temporaryobject absence and all unknown outcome resolution. MASON and Secrets native/full-adoption obligations stay separate." + ], + "not_approved": [ + "route setup, native preflight/login/Secret access or production mutation", + "privileged authority/helperapproval authentication or default flip", + "current provider identity/plugin/leeway/readiness/Argo facts", + "private producer or whole KEY39/RPF35T02/SecretsT06 native acceptance" + ], + "platform_source_pins": { + "helm/openbao-ui-overlay-k8s.yaml": "7b345359906bf1ecc4cb8e61de7a9f1a121068a66bd919e606190a9217a82daf", + "helm/openbao-ui-overlay/nginx.conf": "464f7f5cecc69ea343c1e2acc5932e832b2a9c0e6a5099113634a12abc80ccb3", + "helm/openbao-values.yaml": "a10239851277889dd69dacb8636109dddd095551d85b46ca4ed2c141944e8d1e" + }, + "previous_review_retained_sha256": "159c784cce600ef5ce21db98244782c73a997c209082c064a1b0ce93625c4715", + "review_scope": "v7 source/public-health and fail-before-native gate only; private input custody incomplete", + "reviewed_entries": { + "sso-mfa/k8s/keycape/openbao-negative-node-route.md": "ff3604380a616dfaa86cd9aaa1f131136ee4fc751397a1ebda3a8d737e3c5346", + "sso-mfa/k8s/keycape/openbao-negative-session.py": "4c90edb541b5ea2ff131c3e674c80197c358c2f81140187028e57de0ac8dbf81", + "sso-mfa/k8s/keycape/test_openbao_negative_session.py": "01e23f2b4fc77824a161a57acb3a52d19aad846b3b6c0fd3abd81afa1dc2985c", + "sso-mfa/k8s/keycape/test_openbao_node_route.py": "02a715dcc028d0cacbf3b0ffdf705758438717f064e290b283f8e773540dd2d7" + }, + "reviewed_manifest": "/tmp/keycape-jwt-node-route-v7-stage/manifest.json", + "reviewed_manifest_sha256": "90aabec336008d7d51e37c04b5ff96ba8ed6630821cca1a4c333d803367247f7", + "reviewer": "railiance-platform-owner (agent railiance-platform, codex)", + "same_trial": true, + "schema": "owner-source-review/v1", + "validation": { + "commands": [ + "PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s /tmp/keycape-jwt-node-route-v7-stage/net-kingdom/sso-mfa/k8s/keycape -p test_openbao*.py -q", + "PYTHONDONTWRITEBYTECODE=1 /home/worsch/secrets-engine/.venv/bin/python -m pytest -q -p no:cacheprovider /tmp/platform-key39-node-route-v7-review-stage/tests/test_platform_route_v7.py" + ], + "independent_checks": 9, + "result": "passed offline checks including expected v7 unbounded-input counterexample", + "supplied_lifecycle_and_route": 58, + "total_fresh_checks": 67 + }, + "verified": [ + "SourceService openbao/openbao-ui-gateway8080 routes to nginx /v1 proxy for OpenBao8200; proposed dedicated node-loopback Service port-forward avoids node PodDNS assumption and shared workstation tunnel alteration. No portforward/bridge/native route executed.", + "Actual main source validation and public-health pin precede private stdin; source failure never reads private input or begins health/native work.", + "Preinput start establishes original wall/monotonic window; execute window_started=True does not renew it and expired window refuses before runner.", + "Existing public-health/no-auth and fail-before-native gates remain qualified source agreement only." + ], + "work_item": "RPF-WP-0035-T13" +} diff --git a/docs/reviews/2026-10-11-key39-node-route-v8-platform-review.json b/docs/reviews/2026-10-11-key39-node-route-v8-platform-review.json new file mode 100644 index 0000000..43165d6 --- /dev/null +++ b/docs/reviews/2026-10-11-key39-node-route-v8-platform-review.json @@ -0,0 +1,60 @@ +{ + "completed_same_owner_refinement_precedes_formal_review": true, + "decision": "approved", + "input_unchanged": true, + "intent_basis": "Platform INTENT stable shared interfaces, secure custody and observable recovery: exact provider route prerequisites and fail-closed guarded native preparation without publichealth becoming authority.", + "mandatory_native_prerequisites": [ + "Publichealth clusterhash is unauthenticated: independently verify founder/node/Service/cluster/provider route identity, current admitted route/estate and exact source/runtime pins; no arbitrary workstation diagnostic proves node placement.", + "Actual installed OpenBao JWT plugin/version, role/config/effective-policy source equality and raw/effective expiration_leeway, clock_skew_leeway and not_before_leeway interaction. Helm2.5.4/tag and raw0=>150 model are not native facts; semantic expiry proof remains mandatory.", + "Establish issuer actual readiness_state and Argo ownership through authoritative source/owner receipt. No keycape declaration/current deployment adoption established in inspected sources; absence is not nonproduction. Unmapped production-tier rules apply. If adopted/production-approved, transient directCAS needs explicit reviewed one-use maintenanceexception, close-down entry and reconciliation before nativego.", + "Fresh authenticated scoped founder decision covers exact route, source, issuer mutation/window and finite abort/revoke/restoration/recovery obligations. Helper labels/sourceacknowledgments cannot authenticate approval or waive gates.", + "Admitted private founder human/coding-agent token producer/client/callback/custody handoff remains unimplemented. No credential request/read/reuse authorized.", + "Native correct role/claim permutation/expiry/refusal/revoke, baseline restoration/client removal/temporaryobject absence and all unknown outcome resolution. MASON and Secrets native/full-adoption obligations stay separate.", + "Before private token production/transfer, implement and independently review authenticated/validated child-ready acknowledgment bound to exact pipe session and original window; no current handshake exists and eager piping is prohibited. Bounded child read does not admit producer custody." + ], + "not_approved": [ + "route setup, native preflight/login/Secret access or production mutation", + "privileged authority/helperapproval authentication or default flip", + "current provider identity/plugin/leeway/readiness/Argo facts", + "private producer or whole KEY39/RPF35T02/SecretsT06 native acceptance", + "Parent-ready handshake, eager producer piping, launcher/session/window custody admission or protected token production." + ], + "platform_source_pins": { + "helm/openbao-ui-overlay-k8s.yaml": "7b345359906bf1ecc4cb8e61de7a9f1a121068a66bd919e606190a9217a82daf", + "helm/openbao-ui-overlay/nginx.conf": "464f7f5cecc69ea343c1e2acc5932e832b2a9c0e6a5099113634a12abc80ccb3", + "helm/openbao-values.yaml": "a10239851277889dd69dacb8636109dddd095551d85b46ca4ed2c141944e8d1e" + }, + "previous_review_retained_sha256": "a319e5acb5af2aac242cf1f217af5abc3305ace8df80e646c995dff5a11ac039", + "review_scope": "child-side bounded private JSON receive and retained source/public-health fail-before-native gates only; no producer/custody admission", + "reviewed_entries": { + "sso-mfa/k8s/keycape/openbao-negative-node-route.md": "a04c94512efec7a524b15a3eec61d86de5a41df872e59a3114093063a11e75a0", + "sso-mfa/k8s/keycape/openbao-negative-session.py": "da4e0ab767e0c3bebb48bcf5ab578b50845d9fa7211a6771661a0e1baa4314ab", + "sso-mfa/k8s/keycape/test_openbao_negative_session.py": "01e23f2b4fc77824a161a57acb3a52d19aad846b3b6c0fd3abd81afa1dc2985c", + "sso-mfa/k8s/keycape/test_openbao_node_route.py": "9f3d8d4297c5ef68f6c6bf7ca21e981e37d7eceb836a60bc254d33b0f5129047", + "sso-mfa/k8s/keycape/test_openbao_private_input.py": "a59c2cd4ec895c1718d52fd12f64666f1be45ae423fde476755b6d77a89280c2" + }, + "reviewed_manifest": "/tmp/keycape-jwt-node-route-v8-stage/manifest.json", + "reviewed_manifest_sha256": "316fd6005cc4cb7fe14ea69a5fd408aed13e6122afef60afd13d97952b27cf4a", + "reviewer": "railiance-platform-owner (agent railiance-platform, codex)", + "same_trial": true, + "schema": "owner-source-review/v1", + "validation": { + "commands": [ + "PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s /tmp/keycape-jwt-node-route-v8-stage/net-kingdom/sso-mfa/k8s/keycape -p test_openbao*.py -q", + "PYTHONDONTWRITEBYTECODE=1 /home/worsch/secrets-engine/.venv/bin/python -m pytest -q -p no:cacheprovider /tmp/platform-key39-node-route-v8-review-stage/tests/test_platform_route_v8.py" + ], + "independent_checks": 12, + "result": "passed synthetic/offline checks; native/custody admission false", + "supplied_lifecycle_route_private_input": 65, + "total_fresh_checks": 77 + }, + "verified": [ + "SourceService openbao/openbao-ui-gateway8080 routes to nginx /v1 proxy for OpenBao8200; proposed dedicated node-loopback Service port-forward avoids node PodDNS assumption and shared workstation tunnel alteration. No portforward/bridge/native route executed.", + "Actual main source validation and public-health pin precede private stdin; source failure never reads private input or begins health/native work.", + "Preinput start establishes original wall/monotonic window; execute window_started=True does not renew it and expired window refuses before runner.", + "Existing public-health/no-auth and fail-before-native gates remain qualified source agreement only.", + "Private binary JSON input is limited to64KiB, each token16KiB UTF8, exact two-field object and complete EOF; one hard15s maximum timer is clipped to the original remaining wall/monotonic window, with postreceive/decode deadline checks. Stalled/noEOF/oversize/malformed/expired input refuses before protected effects; alarm timer/handler restored.", + "V7 actual unbounded-input finding corrected; standard buffered pipe with completeJSON/noEOF now interrupts within original window." + ], + "work_item": "RPF-WP-0035-T13" +} diff --git a/docs/reviews/2026-10-11-task-execution-journal-v4-platform-review.json b/docs/reviews/2026-10-11-task-execution-journal-v4-platform-review.json new file mode 100644 index 0000000..2938488 --- /dev/null +++ b/docs/reviews/2026-10-11-task-execution-journal-v4-platform-review.json @@ -0,0 +1,56 @@ +{ + "completed_record_precedes_review": true, + "contract_source_pins": { + "access-engine/pkg/api/canonical.go": "21e754617c2b82d673cef31b7075f8d177e4367782b63b20b37125587bf9e300", + "approval-engine/approval_engine/binding.py": "737081b11040233f3460c32d4a9a1ecf57b5a80961f8a39b07cf879a0fa4263b", + "secrets-engine/src/secrets_engine/approval_consume.py": "2c528667d017e0d3ba18d3fc24a7856585c532b40e3c7e9364646cb629b99274", + "secrets-engine/src/secrets_engine/authorization.py": "0ec4c3f7304d68abd06a0d08dc459e4f1f7269da0e4258549662be9e57b39fd3" + }, + "correction": "Exact served PDP/Approval sha256:<64 lowercase hex> request_digest preserved and required; bare request digests refused. Plan/call/evidence content hashes stay strict bare64hex. V3 source was unintegrated/native-unused; no live journal migration accepted.", + "decision": "approved", + "implementation_gates": [ + "Authenticate actual caller/representation and PDP/claim/consume; source methods do not authorize transitions.", + "Independent owner plan compiler pins exact ordinal/method/target/body hashes; call hashes alone prove no method/body scope.", + "Restricted native adapter, TTL/uses/deadline and owner-held grant/cleanup enforcement.", + "Owner-private cleanup/recovery after unknown remains unwired: business dispatch must not resume; cleanup needs a separately admitted bounded owner recovery interface.", + "Runtime private directory/credential isolation and actual native crash/refusal/revoke/readback proofs; source modes alone do not establish enforcement." + ], + "intent_basis": "Platform INTENT stable interfaces, secure custody and recovery: durable one-operation admission and truthful pending outcomes without a prototype becoming authority.", + "not_approved": [ + "native grants, production execution or source application", + "complete mediator/whole execution contract acceptance", + "RPF35-T12 or SecretsT06 closure or default migration" + ], + "prior_changes_requested_retained": true, + "prior_review": "docs/reviews/2026-10-11-task-execution-journal-v3-platform-review.json", + "prior_review_sha256": "b9001798bdc09cad3da5a18ba7aab6a048c962ed6b4fe68fb62a78c8ef3d721b", + "review_scope": "unintegrated durable admission journal primitive source only", + "reviewed_files": { + "scripts/task_execution_journal.py": "dc9bbb4a153ce8c466f39fde1fd0104f2dd37af9ff765399dfb9415ca607e767", + "tests/test_task_execution_journal.py": "189f99ce05383b53e37cf652a9664f0e8e7eeef7199ebee97b0d55399dfe4201" + }, + "reviewed_input_unchanged": true, + "reviewed_manifest": "/tmp/platform-execution-journal-stage-v4/manifest.json", + "reviewed_manifest_sha256": "22c6d225d393b994ab7b44a43904ced1b6d7f74e0e2bebf71ffe99f87191ef4c", + "reviewer": "railiance-platform-owner (agent railiance-platform, codex)", + "same_trial": true, + "schema": "owner-source-review/v1", + "validated_properties": [ + "Actual4process race admits one operation only.", + "Real child-process abrupt exit after fsynced reservation/pending intent survives reopen as unknown/nonresumable.", + "Exclusive invocation, approval/operation uniqueness, immutable binding, exact call intent/confirmation and no terminal replay.", + "Private owner directory/SQLite/lock modes and no symlink/hardlink files; FULL SQLite commits and directory sync.", + "Exact canonical prefix persists byte-for-byte through reopen; bare/uppercase/double prefix/wrong length/whitespace refused before durable admission. Prefixed plan/call/evidence content digests refused, pending unknown preserved." + ], + "validation": { + "commands": [ + "PYTHONDONTWRITEBYTECODE=1 /home/worsch/secrets-engine/.venv/bin/python -m pytest -q -p no:cacheprovider /tmp/platform-execution-journal-stage-v4/tests/test_task_execution_journal.py", + "PYTHONDONTWRITEBYTECODE=1 /home/worsch/secrets-engine/.venv/bin/python -m pytest -q -p no:cacheprovider /tmp/platform-journal-owner-review-stage/revision-v4/tests/test_independent_journal_v4.py" + ], + "independent_regressions": 15, + "result": "passed synthetic/local source checks including actual4process race and separate abrupt child crash; no native/credential action", + "supplied_tests": 15, + "total": 30 + }, + "work_item": "RPF-WP-0035-T11" +} diff --git a/scripts/task_execution_journal.py b/scripts/task_execution_journal.py index b20975f..4bff83c 100644 --- a/scripts/task_execution_journal.py +++ b/scripts/task_execution_journal.py @@ -33,9 +33,11 @@ class Binding: raise Refused("binding fields must be strings") if not re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9_-]{0,127}", self.approval_id): raise Refused("invalid approval identifier") - for digest in (self.request_digest, self.plan_digest): - if not re.fullmatch(r"[0-9a-f]{64}", digest): - raise Refused("invalid digest") + # Preserve the exact served PDP/Approval value; never silently strip it. + if not re.fullmatch(r"sha256:[0-9a-f]{64}", self.request_digest): + raise Refused("invalid canonical request digest") + if not re.fullmatch(r"[0-9a-f]{64}", self.plan_digest): + raise Refused("invalid owner plan content digest") try: if str(uuid.UUID(self.operation_id)) != self.operation_id: raise ValueError() diff --git a/tests/test_task_execution_journal.py b/tests/test_task_execution_journal.py index 18318a1..cb9874d 100644 --- a/tests/test_task_execution_journal.py +++ b/tests/test_task_execution_journal.py @@ -32,7 +32,7 @@ class Tests(unittest.TestCase): self.tmp = tempfile.TemporaryDirectory() self.addCleanup(self.tmp.cleanup) self.path = Path(self.tmp.name) - self.binding = Binding('approval-1', 'a'*64, str(uuid.uuid4()), 'b'*64) + self.binding = Binding('approval-1', 'sha256:'+'a'*64, str(uuid.uuid4()), 'b'*64) self.journal = Journal(self.path) self.addCleanup(self.journal.close) @@ -61,7 +61,7 @@ class Tests(unittest.TestCase): def test_same_approval_different_digest_refused(self): with self.journal.locked(): self.journal.reserve(self.binding) - changed = Binding('approval-1','c'*64,str(uuid.uuid4()),'b'*64) + changed = Binding('approval-1','sha256:'+'c'*64,str(uuid.uuid4()),'b'*64) with self.journal.locked(): with self.assertRaises(Refused): self.journal.reserve(changed) with self.assertRaises(Refused): self.journal.observe(changed) @@ -69,7 +69,7 @@ class Tests(unittest.TestCase): def test_same_operation_different_approval_refused(self): with self.journal.locked(): self.journal.reserve(self.binding) with self.journal.locked(): - with self.assertRaises(Refused): self.journal.reserve(Binding('approval-2','a'*64,self.binding.operation_id,'b'*64)) + with self.assertRaises(Refused): self.journal.reserve(Binding('approval-2','sha256:'+'a'*64,self.binding.operation_id,'b'*64)) def test_full_path_cleanup_and_terminal_replay(self): states=['reserved','consume-confirmed','authenticating','grant-issuing','grant-issued','applying','readback','verified','cleanup-confirmed'] @@ -118,8 +118,8 @@ class Tests(unittest.TestCase): def test_binding_rejects_unbounded_or_malformed_metadata(self): for value in ['token'+ 'x'*200, '../approval', 'approval\n1']: - with self.assertRaises(Refused): Binding(value,'a'*64,self.binding.operation_id,'b'*64).validate() - for value in ['a'*63,'A'*64,'not-a-digest']: + with self.assertRaises(Refused): Binding(value,'sha256:'+'a'*64,self.binding.operation_id,'b'*64).validate() + for value in ['a'*64,'sha256:'+'a'*63,'sha256:'+'A'*64,'not-a-digest']: with self.assertRaises(Refused): Binding('a',value,self.binding.operation_id,'b'*64).validate() def test_pending_external_call_blocks_next_and_survives_reopen(self): @@ -146,7 +146,7 @@ class Tests(unittest.TestCase): self.journal.before_call(self.binding,1,'e'*64) def test_nonstring_binding_and_boolean_ordinal_refused(self): - with self.assertRaises(Refused): Binding(True,'a'*64,self.binding.operation_id,'b'*64).validate() + with self.assertRaises(Refused): Binding(True,'sha256:'+'a'*64,self.binding.operation_id,'b'*64).validate() with self.journal.locked(): self.journal.reserve(self.binding) with self.assertRaises(Refused): self.journal.before_call(self.binding,False,'d'*64) diff --git a/workplans/RPF-WP-0035-credential-lane-implementation.md b/workplans/RPF-WP-0035-credential-lane-implementation.md index d3bb5bb..2fb156a 100644 --- a/workplans/RPF-WP-0035-credential-lane-implementation.md +++ b/workplans/RPF-WP-0035-credential-lane-implementation.md @@ -1078,3 +1078,54 @@ CAS requires an explicit reviewed one-use maintenance exception and close-down entry, plus reconciliation, before native go. No helper/source acknowledgment waives that gate. Private token producer/callback/client/custody admission and actual native negative/revoke/restoration/cleanup remain prerequisites. + + +2026-10-11 T13 v7 node-route preparation refinement (same trial): exact frozen +manifest `90aabec336008d7d51e37c04b5ff96ba8ed6630821cca1a4c333d803367247f7` +and all entries verified.58 supplied lifecycle/route checks plus9 independent +checks pass offline. Actual main now verifies source/public health before private +stdin; execute preserves the original wall/monotonic window rather than renewing +it. Actual child-process partial-pipe counterexample shows unbounded stdin.read +remains blocked beyond a synthetic20ms original window (still alive after100ms +without EOF). No credential/native/provider access is involved. Before private +producer admission, require byte-capped, deadline-bounded JSON input and EOF within +the original window, with fail-closed fixed receipt and no protected effects. +This completed ownT13 preparation precedes formal v7 source changes-requested +review. Retain v6 qualified health-gate agreement and all prior reviews; neither +v7 health ordering nor any source acknowledgment establishes custody completion, +actual route/plugin/leeway/readiness/Argo identity or founder/runtime authority. +Native and private-producer gates remain open; no owner checkout write occurred. + + +2026-10-11 T13 v8 bounded-input correction preparation (same trial): exact +frozen manifest `316fd6005cc4cb7fe14ea69a5fd408aed13e6122afef60afd13d97952b27cf4a` +and all entry hashes verified.65 supplied tests plus12 fresh independent checks +pass offline, including a standard buffered stdin pipe with complete JSON/noEOF +interrupted within original20ms window and restored SIGALRM state; exact64KiB +JSON/EOF accepted and extra byte refused, UTF8 token bytecap enforced, original +wall deadline clips longer monotonic budget. Original preinput window is retained. +Completed ownT13 preparation precedes fresh exact source review; v7 refusal and +v6 qualified agreement/prior reviews retained. This accepts child bounded-input +source only. No parent-ready handshake exists: producer must not eagerly pipe +private inputs, and producer/session/window readiness protocol remains an +unimplemented admission gate. No custody/native completion, sourcepacket approval +authentication, route/plugin/leeway/readiness/Argo observation or inherited grant. +Native prerequisites and producer handoff remain open; no owner checkout changed. + + +2026-10-11 T11 journal v4 canonical-format preparation refinement (same trial): +exact frozen manifest `22c6d225d393b994ab7b44a43904ced1b6d7f74e0e2bebf71ffe99f87191ef4c` +and entry hashes verified. Actual access-engine pkg/api/canonical.go RequestDigest/ +CanonicalDigest, Approval binding.py and Secrets authorization/approval_consume +all use sha256:<64 lowercase hex> request digests. V4 now preserves this exact +request value without prefix stripping; plan/call/evidence content hashes remain +explicit bare64hex.15 supplied checks plus15 fresh independent checks pass, +including malformed prefix/bare/uppercase/trailing whitespace refusal before +reservation, exact persistent value/reopen/mismatch replay, private-file mode, +real child crash after pending intent, ill-typed confirmations and pending-unknown +refusal. Completed ownT11 preparation precedes formal v4 source review; prior v2 +refusal/v3 approval and T13 v7 refusal/v8 source acknowledgment retained. +Acceptance is unintegrated primitive source only; no data migration/native use +of v3 journal has occurred. RPF35-T12 caller/PDP/consume validation, independent +owner plan compiler/restricted adapter, private runtime custody, bounded execution +and owner-private unknown cleanup recovery remain open. No checkout/native writes.