Skip to content

fix(organization): bind hierarchy-review issuance semantic validator #286

Description

@seonghobae

Finding

Fresh review of canonical Organization hierarchy-review owner #96 found a distinct issuance-time integrity capability after #285 hardened post-issuance export. _build_packet_runtime().post_init() still resolved the module-global _validate_issuance_snapshot binding dynamically immediately before sealing. An ordinary same-interpreter consumer could replace that top-level semantic validator with a no-op and construct evidence that violates the mandatory requester/reviewer separation invariant. The later private creation seal faithfully preserved the invalid packet because the semantic gate itself had been bypassed.

This is separate from #279 export snapshot integrity, #280 checked-versus-used issuance snapshots, #281 same-object issuance lifecycle, #282 authoritative clock provenance, #283 private issuance state, #284 digest-verifier binding, and #285 post-issuance export-helper binding. PR #96 remains the single writer.

Reality RED → causal repair

Test-only ordinary-forward commit a0e616c68d5e194ecdb06089c6d83d8074fad833 added test_issuance_does_not_trust_mutable_module_validator_binding. Exact hosted Foundation 34395501352, job 102614084636, checked out that SHA, passed compilation, foundation validation, dependency hygiene, package setup and the reviewed test toolchain, then failed specifically in the installed-artifact hierarchy-review contract: 1 failed, 66 passed, Failed: DID NOT RAISE ValueError. Production statement and branch coverage remained 100.00%, so this is a semantic RED rather than a coverage artifact.

Minimal causal repair b48df4d71121387240ab23b9d475b0cce2b1f15e captures the top-level _validate_issuance_snapshot function when _build_packet_runtime() constructs the packet runtime and invokes that captured binding during issuance. Ordinary later replacement of the module name therefore cannot remove the mandatory issuance semantic gate.

Boundary

The repair is intentionally narrow. It does not claim a general anti-monkeypatch sandbox, freeze every transitive validation helper, prevent deliberate function-closure/global-dictionary introspection, or defend against arbitrary same-process/native code execution. Existing deterministic time/helper seams remain outside this finding unless a separate reality RED proves they can cross a trust boundary. Durable uniqueness, distributed authorization, authoritative transaction time, hierarchy concurrency and immutable audit/outbox persistence remain owned by #119 and authoritative HRIS persistence.

Acceptance

Keep this issue open until #96 or a verified successor carries the hosted RED, causal repair, code-current ADR/TRACEABILITY/README/CHANGELOG, exact-head 100% owned coverage, all required workflow evidence and a qualifying independent review, then integrates normally into protected develop. Do not simple-Close because branch-local source exists; do not replace exact-head evidence with predecessor checks or a gate-name-only success.

Refs #96 #119 #100 #279 #280 #281 #282 #283 #284 #285.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions