Add Railiance WP-0025 custody adapter

Implement src/whitehat_security/platform_custody.py and focused tests
against the four custody schemas. Live admission still fails closed
without a value-safe projection receipt. No new engagement or traffic.

Assistant: grok
Assistant-Session: 01a02670-3345-76f2-a014-70fde8e2a2bb
This commit is contained in:
tegwick 2026-08-22 22:02:41 +02:00
parent 5d2c9592e8
commit 1a38080cdd
5 changed files with 527 additions and 3 deletions

View file

@ -13,7 +13,8 @@ from .e3 import CADENCE, PROBES, e3_calibration
from .engagement import AuthorizationError, Engagement
from .fixtures import FixtureService, probe_suite
from .model import RunReport, utc_now
from .plane import KillSwitch, ReceiptBroker, admit, default_broker, retired_ids
from .plane import KillSwitch, admit, default_broker, retired_ids
from .platform_custody import broker_from_receipt
from .reporting import queue_risk_nexus, risk_nexus_message
from .targets import load_catalog, load_registration
@ -91,6 +92,7 @@ def main(argv: list[str] | None = None) -> None:
admit_plane.add_argument("engagement")
admit_plane.add_argument("registration")
admit_plane.add_argument("--receipt", help="value-safe custody projection receipt")
admit_plane.add_argument("--contract", help="WP-0025 projection contract bound to the receipt")
commands.add_parser("kill-switch")
deliver = commands.add_parser("deliver")
deliver.add_argument("report")
@ -140,7 +142,8 @@ def main(argv: list[str] | None = None) -> None:
record = Engagement.load(args.engagement)
registration = load_registration(args.registration)
broker = (
ReceiptBroker.load(args.receipt) if args.receipt else default_broker(record)
broker_from_receipt(args.receipt, contract_path=args.contract)
if args.receipt else default_broker(record)
)
lease = admit(engagement=record, registration=registration,
broker=broker, kill_switch=KillSwitch(),