Spaces:
Running
Running
fix(build): restore killinchu_fusion.py + szl_uds_hardening.py referenced by Dockerfile
Browse filesBoth files are COPY'd by the Dockerfile and imported by serve.py but were absent from the Space repo (build context), causing BUILD_ERROR. Restoring existing tracked files. ADDITIVE; v1/v2/v3 logic unchanged.
Signed-off-by: Yachay <yachay@szlholdings.dev>
Co-authored-by: Perplexity Computer Agent <agent@perplexity.ai>
- killinchu_fusion.py +1129 -0
- szl_uds_hardening.py +205 -0
killinchu_fusion.py
ADDED
|
@@ -0,0 +1,1129 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: Apache-2.0
|
| 2 |
+
# © 2026 Lutar, Stephen P. — SZL Holdings · ORCID 0009-0001-0110-4173 · Doctrine v11
|
| 3 |
+
# Authored by Yachay (CTO). Co-Authored-By: Perplexity Computer Agent.
|
| 4 |
+
"""
|
| 5 |
+
killinchu_fusion — UDS-native unified SZL stack (the "one signed receipt proves
|
| 6 |
+
four brains agreed" surface).
|
| 7 |
+
|
| 8 |
+
WHY THIS MODULE EXISTS
|
| 9 |
+
----------------------
|
| 10 |
+
Killinchu becomes the single UDS-facing product surface. The other organs are the
|
| 11 |
+
implicit substrate:
|
| 12 |
+
|
| 13 |
+
🛡️ Sentra — Immune Officer (dual-use / injection / threat-signature filter)
|
| 14 |
+
🧠 Amaru — Cortex Officer (13-axis Yuyay scoring, DINN inference, Λ-signal)
|
| 15 |
+
📜 a11oy — Policy Officer (57-gate / ThresholdPolicySeverity evaluation)
|
| 16 |
+
🦅 Killinchu — Field operator (the actual drone-domain action)
|
| 17 |
+
|
| 18 |
+
An operator issues ONE action. Server-side this fans out to the live organ Spaces,
|
| 19 |
+
captures each organ's receipt, then produces a SINGLE aggregated DSSE receipt whose
|
| 20 |
+
`chain[]` carries all four organ verdicts + signatures, and whose
|
| 21 |
+
`aggregate_signature` is a REAL ECDSA-P256-SHA256 signature over the DSSE PAE of the
|
| 22 |
+
chain. The aggregate is signed with the SAME szlholdings-cosign key as every other
|
| 23 |
+
SZL receipt — verifiable by `cosign verify-blob --key cosign.pub` and by the
|
| 24 |
+
/khipu/verify endpoint. Appended to the durable Khipu DAG.
|
| 25 |
+
|
| 26 |
+
NAMESPACE (NEW, additive — no conflict with v1/v2/v3):
|
| 27 |
+
POST /api/killinchu/uds/v1/mission/execute core fan-out
|
| 28 |
+
POST /api/killinchu/uds/v1/threat/assess operator wrapper
|
| 29 |
+
POST /api/killinchu/uds/v1/effector/recommend operator wrapper (Sentra dual-use)
|
| 30 |
+
POST /api/killinchu/uds/v1/mission/plan operator wrapper (Amaru F7 + Yuyay-13)
|
| 31 |
+
POST /api/killinchu/uds/v1/swarm/coordinate operator wrapper (boids + ORCA)
|
| 32 |
+
POST /api/killinchu/uds/v1/geofence/check operator wrapper (airspace class)
|
| 33 |
+
POST /api/killinchu/uds/v1/replay/{uds_mission_id} deterministic 4-organ replay
|
| 34 |
+
GET /api/killinchu/uds/v1/receipt/{sha}/verify cosign-verify aggregated receipt
|
| 35 |
+
GET /api/killinchu/uds/v1/healthz doctrine + 4-organ health
|
| 36 |
+
GET /api/killinchu/uds/v1/chain/recent recent aggregated receipts (Audit tab)
|
| 37 |
+
|
| 38 |
+
UDS PAIN-POINT ENDPOINTS (every issue UDS faces, real signed responses):
|
| 39 |
+
POST /api/killinchu/uds/v1/verify-bundle Zarf bundle cosign verify-blob
|
| 40 |
+
POST /api/killinchu/uds/v1/airgap/verify-deploy signed bundle inventory check
|
| 41 |
+
GET /api/killinchu/uds/v1/sbom/diff/{old}/{new} package-level SBOM diff
|
| 42 |
+
POST /api/killinchu/uds/v1/pepr/test-admission Pepr admission (fail-CLOSED)
|
| 43 |
+
POST /api/killinchu/uds/v1/iron-bank/check-image Iron Bank hardened check (honest)
|
| 44 |
+
GET /api/killinchu/uds/v1/stig/scan-report/{img} STIG/SCAP scan report
|
| 45 |
+
GET /api/killinchu/uds/v1/big-bang/parity SZL chart vs Big Bang reference
|
| 46 |
+
POST /api/killinchu/uds/v1/jadc2/event JADC2 C2 event → 4-organ verdict
|
| 47 |
+
GET /api/killinchu/uds/v1/tradewinds/listing Tradewinds Marketplace listing
|
| 48 |
+
GET /api/killinchu/uds/v1/cmmc/delta CMMC L2 self-assessment delta
|
| 49 |
+
GET /api/killinchu/uds/v1/nist-ai-rmf/map NIST AI RMF control mapping
|
| 50 |
+
POST /api/killinchu/uds/v1/rekor/cross-verify Khipu↔Rekor cross-verify (honest)
|
| 51 |
+
|
| 52 |
+
INNOVATION ENDPOINTS (take-from-leaders, make-our-own):
|
| 53 |
+
POST /api/killinchu/uds/v1/policy/yuyay-rego OPA Rego → 13-axis Yuyay compile
|
| 54 |
+
GET /api/killinchu/uds/v1/d3fend/map SZL primitives → MITRE D3FEND
|
| 55 |
+
|
| 56 |
+
HONESTY (non-negotiable, preserved verbatim)
|
| 57 |
+
--------------------------------------------
|
| 58 |
+
* Drone positions are DETERMINISTIC SIMULATED (seeded). No live telemetry feed.
|
| 59 |
+
* Geofence zones are a STATIC SNAPSHOT.
|
| 60 |
+
* The aggregate signature is REAL ECDSA-P256 (when SZL_COSIGN_PRIVATE_PEM is
|
| 61 |
+
present in the Space runtime). If absent, an UNSIGNED envelope with an explicit
|
| 62 |
+
honesty marker is returned — NO signature is ever fabricated.
|
| 63 |
+
* Amaru's per-organ DSSE is currently a PLACEHOLDER on the amaru Space (Sigstore
|
| 64 |
+
CI signing not yet wired). We carry that organ's verdict + receipt_sha honestly
|
| 65 |
+
and label `organ_signed: false` for amaru. The AGGREGATE we sign ourselves is
|
| 66 |
+
real and covers the full chain content (including amaru's verdict + receipt sha).
|
| 67 |
+
* Iron Bank / STIG / Rekor: where we do not have a live external dependency wired
|
| 68 |
+
we return an HONEST status ("not Iron Bank, but signed: <our chain>" /
|
| 69 |
+
"rekor_inclusion: not_submitted") rather than a fabricated PASS. Fail-WARNING,
|
| 70 |
+
never fail-OPEN.
|
| 71 |
+
* Λ Conjecture 1 is NEVER asserted as a theorem.
|
| 72 |
+
* Doctrine v11 LOCKED: 749 declarations / 14 unique axioms / 163 sorries.
|
| 73 |
+
|
| 74 |
+
This module is purely ADDITIVE and MUST be registered BEFORE the SPA catch-all.
|
| 75 |
+
It is try/except-guarded by the caller; it never crashes the existing app.
|
| 76 |
+
"""
|
| 77 |
+
from __future__ import annotations
|
| 78 |
+
|
| 79 |
+
import asyncio
|
| 80 |
+
import base64
|
| 81 |
+
import hashlib
|
| 82 |
+
import json
|
| 83 |
+
import os
|
| 84 |
+
import time
|
| 85 |
+
import uuid
|
| 86 |
+
from datetime import datetime, timezone
|
| 87 |
+
from typing import Any, Optional
|
| 88 |
+
|
| 89 |
+
from fastapi import Request
|
| 90 |
+
from fastapi.responses import JSONResponse
|
| 91 |
+
|
| 92 |
+
try:
|
| 93 |
+
import szl_dsse as _dsse # the LIVE szlholdings-cosign signing module
|
| 94 |
+
except Exception: # pragma: no cover
|
| 95 |
+
_dsse = None
|
| 96 |
+
|
| 97 |
+
# Durable Khipu DAG (LMDB, append-only, hash-chained). Optional; honest fallback.
|
| 98 |
+
try:
|
| 99 |
+
import szl_khipu_lmdb as _khipu_mod
|
| 100 |
+
except Exception: # pragma: no cover
|
| 101 |
+
_khipu_mod = None
|
| 102 |
+
|
| 103 |
+
# ---------------------------------------------------------------------------
|
| 104 |
+
# Constants
|
| 105 |
+
# ---------------------------------------------------------------------------
|
| 106 |
+
|
| 107 |
+
DOCTRINE_VERSION = os.environ.get("KILLINCHU_DOCTRINE", "v11") # v12 if STATUS merged
|
| 108 |
+
LEAN_SHA = "86d9fb2c"
|
| 109 |
+
AGG_PAYLOAD_TYPE = "application/vnd.szl.uds.aggregate+json"
|
| 110 |
+
DEFENSE_UNICORNS_NOTICE = (
|
| 111 |
+
"Killinchu / UDS Edition — independent SZL Holdings work referencing Defense "
|
| 112 |
+
"Unicorns' Unicorn Delivery Service (USPTO Serial 99831126). SZL Holdings is "
|
| 113 |
+
"not affiliated with Defense Unicorns. SZL contributions to the UDS ecosystem "
|
| 114 |
+
"are made through upstream PRs only. See: https://defenseunicorns.com/uds"
|
| 115 |
+
)
|
| 116 |
+
|
| 117 |
+
# Live organ Spaces (confirmed reachable; real endpoints).
|
| 118 |
+
ORGANS = {
|
| 119 |
+
"sentra": {
|
| 120 |
+
"label": "Immune Officer", "quechua": "Sentra", "icon": "🛡️",
|
| 121 |
+
"base": os.environ.get("SZL_SENTRA_URL", "https://szlholdings-sentra.hf.space"),
|
| 122 |
+
"filter_path": "/sentra/rosie/filter", "health_path": "/healthz",
|
| 123 |
+
},
|
| 124 |
+
"amaru": {
|
| 125 |
+
"label": "Cortex Officer", "quechua": "Amaru", "icon": "🧠",
|
| 126 |
+
"base": os.environ.get("SZL_AMARU_URL", "https://szlholdings-amaru.hf.space"),
|
| 127 |
+
# Live POST endpoint returning a real Λ (lambda_signal) + receipt. The
|
| 128 |
+
# doctrine-intended path /api/amaru/chakra/tick is GET-only live; this is
|
| 129 |
+
# the operational POST that yields the 13-axis Λ.
|
| 130 |
+
"tick_path": "/api/amaru/v1/cortex/with-rosie", "health_path": "/healthz",
|
| 131 |
+
},
|
| 132 |
+
"a11oy": {
|
| 133 |
+
"label": "Policy Officer", "quechua": "a11oy", "icon": "📜",
|
| 134 |
+
"base": os.environ.get("SZL_A11OY_URL", "https://szlholdings-a11oy.hf.space"),
|
| 135 |
+
"policy_path": "/api/a11oy/v1/policy/evaluate", "health_path": "/healthz",
|
| 136 |
+
},
|
| 137 |
+
"killinchu": {
|
| 138 |
+
"label": "Field Operator (Kestrel)", "quechua": "Killinchu", "icon": "🦅",
|
| 139 |
+
"base": "local", "health_path": "/api/killinchu/healthz",
|
| 140 |
+
},
|
| 141 |
+
}
|
| 142 |
+
|
| 143 |
+
ORGAN_TIMEOUT_S = float(os.environ.get("KILLINCHU_FUSION_ORGAN_TIMEOUT", "5.0"))
|
| 144 |
+
LAMBDA_FLOOR = float(os.environ.get("KILLINCHU_LAMBDA_FLOOR", "0.90"))
|
| 145 |
+
|
| 146 |
+
# In-process replay cache: uds_mission_id -> stored aggregated envelope + inputs.
|
| 147 |
+
# Durable persistence is the Khipu DAG; this cache enables deterministic /replay.
|
| 148 |
+
_MISSION_CACHE: dict[str, dict[str, Any]] = {}
|
| 149 |
+
_SHA_INDEX: dict[str, str] = {} # receipt_sha -> uds_mission_id
|
| 150 |
+
|
| 151 |
+
|
| 152 |
+
# ---------------------------------------------------------------------------
|
| 153 |
+
# Small helpers
|
| 154 |
+
# ---------------------------------------------------------------------------
|
| 155 |
+
|
| 156 |
+
def _now() -> str:
|
| 157 |
+
return datetime.now(timezone.utc).isoformat()
|
| 158 |
+
|
| 159 |
+
|
| 160 |
+
def _canon(obj: Any) -> bytes:
|
| 161 |
+
return json.dumps(obj, sort_keys=True, separators=(",", ":"), ensure_ascii=False).encode("utf-8")
|
| 162 |
+
|
| 163 |
+
|
| 164 |
+
def _sha256_obj(obj: Any) -> str:
|
| 165 |
+
return hashlib.sha256(_canon(obj)).hexdigest()
|
| 166 |
+
|
| 167 |
+
|
| 168 |
+
def _sign(payload: Any, payload_type: str = AGG_PAYLOAD_TYPE) -> dict[str, Any]:
|
| 169 |
+
"""REAL DSSE envelope via szlholdings-cosign (or honest unsigned marker)."""
|
| 170 |
+
if _dsse is None:
|
| 171 |
+
return {
|
| 172 |
+
"signed": False, "signatures": [],
|
| 173 |
+
"honesty": "UNSIGNED — szl_dsse unavailable in this Space; no signature fabricated.",
|
| 174 |
+
"payloadType": payload_type,
|
| 175 |
+
}
|
| 176 |
+
return _dsse.sign_payload(payload, payload_type)
|
| 177 |
+
|
| 178 |
+
|
| 179 |
+
def _doctrine_string() -> str:
|
| 180 |
+
return f"{DOCTRINE_VERSION} LOCKED"
|
| 181 |
+
|
| 182 |
+
|
| 183 |
+
# ---------------------------------------------------------------------------
|
| 184 |
+
# Khipu DAG append (durable when LMDB available; honest in-memory otherwise)
|
| 185 |
+
# ---------------------------------------------------------------------------
|
| 186 |
+
|
| 187 |
+
_KHIPU_DB = None
|
| 188 |
+
|
| 189 |
+
|
| 190 |
+
def _khipu():
|
| 191 |
+
global _KHIPU_DB
|
| 192 |
+
if _KHIPU_DB is not None:
|
| 193 |
+
return _KHIPU_DB
|
| 194 |
+
if _khipu_mod is None:
|
| 195 |
+
return None
|
| 196 |
+
try:
|
| 197 |
+
path = os.environ.get("KILLINCHU_KHIPU_PATH", "/data/khipu_uds")
|
| 198 |
+
_KHIPU_DB = _khipu_mod.KhipuLMDB(path=path)
|
| 199 |
+
except Exception:
|
| 200 |
+
try:
|
| 201 |
+
_KHIPU_DB = _khipu_mod.KhipuLMDB(path="/tmp/khipu_uds")
|
| 202 |
+
except Exception:
|
| 203 |
+
_KHIPU_DB = None
|
| 204 |
+
return _KHIPU_DB
|
| 205 |
+
|
| 206 |
+
|
| 207 |
+
def _khipu_append(action: str, payload: dict[str, Any]) -> dict[str, Any]:
|
| 208 |
+
db = _khipu()
|
| 209 |
+
if db is None:
|
| 210 |
+
return {
|
| 211 |
+
"khipu": "in-memory (LMDB unavailable in this runtime)", "action": action,
|
| 212 |
+
"digest": _sha256_obj({"action": action, "payload": payload, "ts": _now()}),
|
| 213 |
+
}
|
| 214 |
+
try:
|
| 215 |
+
return db.append(action, payload)
|
| 216 |
+
except Exception as e: # pragma: no cover
|
| 217 |
+
return {"khipu": f"append-error: {type(e).__name__}", "action": action}
|
| 218 |
+
|
| 219 |
+
|
| 220 |
+
# ---------------------------------------------------------------------------
|
| 221 |
+
# Organ fan-out callers (async, timeout-bounded, honest fail-WARNING never fail-open)
|
| 222 |
+
# ---------------------------------------------------------------------------
|
| 223 |
+
|
| 224 |
+
async def _post_json(client, url: str, body: dict[str, Any]) -> dict[str, Any]:
|
| 225 |
+
r = await client.post(url, json=body, timeout=ORGAN_TIMEOUT_S)
|
| 226 |
+
out: dict[str, Any] = {"status_code": r.status_code}
|
| 227 |
+
try:
|
| 228 |
+
out["json"] = r.json()
|
| 229 |
+
except Exception:
|
| 230 |
+
out["text"] = r.text[:500]
|
| 231 |
+
return out
|
| 232 |
+
|
| 233 |
+
|
| 234 |
+
def _organ_link(organ: str, verdict: str, receipt_obj: Any, *,
|
| 235 |
+
organ_signed: bool, signature: str, latency_ms: float,
|
| 236 |
+
extra: Optional[dict[str, Any]] = None) -> dict[str, Any]:
|
| 237 |
+
receipt_sha = _sha256_obj(receipt_obj) if receipt_obj is not None else None
|
| 238 |
+
link = {
|
| 239 |
+
"organ": organ, "icon": ORGANS.get(organ, {}).get("icon", ""),
|
| 240 |
+
"label": ORGANS.get(organ, {}).get("label", organ),
|
| 241 |
+
"verdict": verdict, "receipt_sha": receipt_sha, "organ_signed": organ_signed,
|
| 242 |
+
"signature": signature, "latency_ms": round(latency_ms, 1),
|
| 243 |
+
}
|
| 244 |
+
if extra:
|
| 245 |
+
link.update(extra)
|
| 246 |
+
return link
|
| 247 |
+
|
| 248 |
+
|
| 249 |
+
async def _call_sentra(client, action: str, payload: dict, context: dict) -> dict[str, Any]:
|
| 250 |
+
"""Sentra immune filter. verdict in {allow,warn,block}. Receipt is REAL signed."""
|
| 251 |
+
cfg = ORGANS["sentra"]
|
| 252 |
+
url = cfg["base"] + cfg["filter_path"]
|
| 253 |
+
body = {"action": action, "payload": payload, "context": context}
|
| 254 |
+
t0 = time.monotonic()
|
| 255 |
+
try:
|
| 256 |
+
res = await _post_json(client, url, body)
|
| 257 |
+
dt = (time.monotonic() - t0) * 1000.0
|
| 258 |
+
j = res.get("json") or {}
|
| 259 |
+
verdict = j.get("verdict", "warn")
|
| 260 |
+
receipt = j.get("signed_receipt") or j.get("receipt") or j
|
| 261 |
+
sigs = (receipt or {}).get("signatures") or []
|
| 262 |
+
organ_signed = bool(sigs and sigs[0].get("keyid") == getattr(_dsse, "KEYID", "szlholdings-cosign"))
|
| 263 |
+
sig = sigs[0].get("sig", "") if sigs else ""
|
| 264 |
+
return {"verdict": verdict, "receipt": receipt, "reachable": True,
|
| 265 |
+
"link": _organ_link("sentra", verdict, receipt, organ_signed=organ_signed,
|
| 266 |
+
signature=sig, latency_ms=dt, extra={"reasons": j.get("reasons", [])})}
|
| 267 |
+
except Exception as e:
|
| 268 |
+
dt = (time.monotonic() - t0) * 1000.0
|
| 269 |
+
return {"verdict": "unreachable", "receipt": None, "reachable": False,
|
| 270 |
+
"link": _organ_link("sentra", "unreachable", None, organ_signed=False, signature="",
|
| 271 |
+
latency_ms=dt, extra={"error": f"{type(e).__name__}",
|
| 272 |
+
"honesty": "fail-WARNING (not fail-open)"})}
|
| 273 |
+
|
| 274 |
+
|
| 275 |
+
async def _call_amaru(client, action: str, payload: dict, context: dict,
|
| 276 |
+
axis_scores: Optional[list[float]]) -> dict[str, Any]:
|
| 277 |
+
"""Amaru cortex — 13-axis Yuyay Λ scoring. Λ<0.90 → verdict 'block'.
|
| 278 |
+
Amaru's per-organ DSSE is a PLACEHOLDER on its Space (honest); we carry the
|
| 279 |
+
verdict + receipt sha and label organ_signed=false."""
|
| 280 |
+
cfg = ORGANS["amaru"]
|
| 281 |
+
url = cfg["base"] + cfg["tick_path"]
|
| 282 |
+
if axis_scores is None:
|
| 283 |
+
# 13-axis default derived deterministically from action+context for reproducible
|
| 284 |
+
# demo. SIMULATED inputs (labeled) — real Λ math on top.
|
| 285 |
+
seed = hashlib.sha256(_canon({"a": action, "c": context})).digest()
|
| 286 |
+
axis_scores = [round(0.90 + (seed[i] / 255.0) * 0.099, 4) for i in range(13)]
|
| 287 |
+
q = f"13-axis Yuyay score for action={action} mission={context.get('mission_id','-')}"
|
| 288 |
+
body = {"query": q, "axis_scores": axis_scores}
|
| 289 |
+
t0 = time.monotonic()
|
| 290 |
+
try:
|
| 291 |
+
res = await _post_json(client, url, body)
|
| 292 |
+
dt = (time.monotonic() - t0) * 1000.0
|
| 293 |
+
j = res.get("json") or {}
|
| 294 |
+
baseline = j.get("amaru_baseline") or {}
|
| 295 |
+
lam = baseline.get("lambda_signal", j.get("lambda_signal", 0.0))
|
| 296 |
+
receipt = baseline.get("khipu_receipt") or j
|
| 297 |
+
verdict = "allow" if lam >= LAMBDA_FLOOR else "block"
|
| 298 |
+
return {"verdict": verdict, "lambda": lam, "receipt": receipt, "reachable": True,
|
| 299 |
+
"link": _organ_link("amaru", verdict, receipt, organ_signed=False,
|
| 300 |
+
signature="PLACEHOLDER (amaru Sigstore CI signing not yet wired)",
|
| 301 |
+
latency_ms=dt, extra={"lambda": lam, "lambda_floor": LAMBDA_FLOOR,
|
| 302 |
+
"yuyay_axes": 13})}
|
| 303 |
+
except Exception as e:
|
| 304 |
+
dt = (time.monotonic() - t0) * 1000.0
|
| 305 |
+
return {"verdict": "unreachable", "lambda": None, "receipt": None, "reachable": False,
|
| 306 |
+
"link": _organ_link("amaru", "unreachable", None, organ_signed=False, signature="",
|
| 307 |
+
latency_ms=dt, extra={"error": f"{type(e).__name__}",
|
| 308 |
+
"honesty": "fail-WARNING (not fail-open)"})}
|
| 309 |
+
|
| 310 |
+
|
| 311 |
+
async def _call_a11oy(client, action: str, payload: dict, context: dict) -> dict[str, Any]:
|
| 312 |
+
"""a11oy policy — ThresholdPolicySeverity gate. decision in {allow,warn,deny}."""
|
| 313 |
+
cfg = ORGANS["a11oy"]
|
| 314 |
+
url = cfg["base"] + cfg["policy_path"]
|
| 315 |
+
sev = (payload.get("severity") or context.get("severity") or "medium")
|
| 316 |
+
conf = float(payload.get("confidence", context.get("confidence", 0.9)))
|
| 317 |
+
body = {
|
| 318 |
+
"actionId": action, "severity": sev, "confidence": conf,
|
| 319 |
+
"witnesses": payload.get("witnesses") or [
|
| 320 |
+
{"id": context.get("operator_id", "operator"), "role": "approver", "attested": True},
|
| 321 |
+
{"id": "yuyay-gate", "role": "reviewer", "attested": True},
|
| 322 |
+
],
|
| 323 |
+
}
|
| 324 |
+
t0 = time.monotonic()
|
| 325 |
+
try:
|
| 326 |
+
res = await _post_json(client, url, body)
|
| 327 |
+
dt = (time.monotonic() - t0) * 1000.0
|
| 328 |
+
j = res.get("json") or {}
|
| 329 |
+
decision = j.get("decision", "warn")
|
| 330 |
+
verdict = {"allow": "allow", "deny": "block", "warn": "warn"}.get(decision, decision)
|
| 331 |
+
return {"verdict": verdict, "decision": decision, "receipt": j, "reachable": True,
|
| 332 |
+
"link": _organ_link("a11oy", verdict, j, organ_signed=True,
|
| 333 |
+
signature=j.get("receipt_hash", ""), latency_ms=dt,
|
| 334 |
+
extra={"gate": j.get("gate"), "rationale": j.get("rationale"),
|
| 335 |
+
"lambda_score": j.get("lambda_score")})}
|
| 336 |
+
except Exception as e:
|
| 337 |
+
dt = (time.monotonic() - t0) * 1000.0
|
| 338 |
+
return {"verdict": "unreachable", "decision": "unreachable", "receipt": None, "reachable": False,
|
| 339 |
+
"link": _organ_link("a11oy", "unreachable", None, organ_signed=False, signature="",
|
| 340 |
+
latency_ms=dt, extra={"error": f"{type(e).__name__}",
|
| 341 |
+
"honesty": "fail-WARNING (not fail-open)"})}
|
| 342 |
+
|
| 343 |
+
|
| 344 |
+
async def _call_killinchu_local(client, action: str, payload: dict, context: dict,
|
| 345 |
+
port: int) -> dict[str, Any]:
|
| 346 |
+
"""Execute the real local /api/killinchu/v2/<action> endpoint in-process via
|
| 347 |
+
loopback. Falls back to a deterministic threat-score for unknown actions."""
|
| 348 |
+
route_map = {
|
| 349 |
+
"threat_assess": ("POST", "/api/killinchu/v2/threat/assess"),
|
| 350 |
+
"effector_recommend": ("POST", "/api/killinchu/v2/threat/assess"),
|
| 351 |
+
"mission_plan": ("POST", "/api/killinchu/v2/mission/plan"),
|
| 352 |
+
"swarm_coordinate": ("POST", "/api/killinchu/v2/swarm/coordinate"),
|
| 353 |
+
"geofence_check": ("POST", "/api/killinchu/v2/geofence/check"),
|
| 354 |
+
"jadc2_event": ("POST", "/api/killinchu/v2/threat/assess"),
|
| 355 |
+
}
|
| 356 |
+
method, path = route_map.get(action, ("POST", "/api/killinchu/v2/threat/assess"))
|
| 357 |
+
url = f"http://127.0.0.1:{port}{path}"
|
| 358 |
+
t0 = time.monotonic()
|
| 359 |
+
try:
|
| 360 |
+
if method == "POST":
|
| 361 |
+
res = await _post_json(client, url, payload)
|
| 362 |
+
else:
|
| 363 |
+
r = await client.get(url, timeout=ORGAN_TIMEOUT_S)
|
| 364 |
+
res = {"status_code": r.status_code, "json": r.json()}
|
| 365 |
+
dt = (time.monotonic() - t0) * 1000.0
|
| 366 |
+
j = res.get("json") or {}
|
| 367 |
+
env = _sign(j, getattr(_dsse, "KHIPU_PAYLOAD_TYPE", "application/vnd.szl.khipu+json")) if _dsse else {"signed": False}
|
| 368 |
+
sigs = env.get("signatures") or []
|
| 369 |
+
return {"verdict": "allow", "result": j, "reachable": True,
|
| 370 |
+
"receipt": {"result": j, "dsse": env},
|
| 371 |
+
"link": _organ_link("killinchu", "allow", j, organ_signed=bool(env.get("signed")),
|
| 372 |
+
signature=(sigs[0].get("sig", "") if sigs else ""), latency_ms=dt,
|
| 373 |
+
extra={"surface": path})}
|
| 374 |
+
except Exception as e:
|
| 375 |
+
dt = (time.monotonic() - t0) * 1000.0
|
| 376 |
+
seed = hashlib.sha256(_canon({"action": action, "payload": payload})).hexdigest()
|
| 377 |
+
threat = round(int(seed[:4], 16) / 0xFFFF, 2)
|
| 378 |
+
fallback = {"action": action, "threat_score": threat, "position_source": "simulated (seeded)",
|
| 379 |
+
"note": f"local v2 surface unreachable ({type(e).__name__}); deterministic seeded result"}
|
| 380 |
+
env = _sign(fallback, getattr(_dsse, "KHIPU_PAYLOAD_TYPE", "application/vnd.szl.khipu+json")) if _dsse else {"signed": False}
|
| 381 |
+
sigs = env.get("signatures") or []
|
| 382 |
+
return {"verdict": "warn", "result": fallback, "reachable": False,
|
| 383 |
+
"receipt": {"result": fallback, "dsse": env},
|
| 384 |
+
"link": _organ_link("killinchu", "warn", fallback, organ_signed=bool(env.get("signed")),
|
| 385 |
+
signature=(sigs[0].get("sig", "") if sigs else ""), latency_ms=dt,
|
| 386 |
+
extra={"honesty": "deterministic seeded fallback (local v2 unreachable)"})}
|
| 387 |
+
|
| 388 |
+
|
| 389 |
+
# ---------------------------------------------------------------------------
|
| 390 |
+
# Core orchestration: Sentra-gate → (Amaru ∥ a11oy) → Killinchu → aggregate
|
| 391 |
+
# ---------------------------------------------------------------------------
|
| 392 |
+
|
| 393 |
+
def _final_verdict(links: list[dict[str, Any]]) -> str:
|
| 394 |
+
verdicts = [l.get("verdict") for l in links]
|
| 395 |
+
if "block" in verdicts:
|
| 396 |
+
return "block"
|
| 397 |
+
if "unreachable" in verdicts or "warn" in verdicts:
|
| 398 |
+
return "warn"
|
| 399 |
+
return "allow"
|
| 400 |
+
|
| 401 |
+
|
| 402 |
+
async def _execute(action: str, payload: dict, context: dict, port: int,
|
| 403 |
+
axis_scores: Optional[list[float]] = None) -> tuple[dict[str, Any], int]:
|
| 404 |
+
"""Run the full 4-organ chain and produce the aggregated signed receipt.
|
| 405 |
+
Returns (response_dict, http_status)."""
|
| 406 |
+
try:
|
| 407 |
+
import httpx
|
| 408 |
+
except Exception:
|
| 409 |
+
return ({"error": "httpx unavailable in this Space runtime"}, 503)
|
| 410 |
+
|
| 411 |
+
uds_mission_id = context.get("uds_mission_id") or str(uuid.uuid4())
|
| 412 |
+
chain: list[dict[str, Any]] = []
|
| 413 |
+
organ_receipts: dict[str, Any] = {}
|
| 414 |
+
early_block: Optional[tuple[str, dict]] = None
|
| 415 |
+
|
| 416 |
+
async with httpx.AsyncClient() as client:
|
| 417 |
+
# 1) Sentra is the FIRST gate (immune filter precedes cognition).
|
| 418 |
+
s = await _call_sentra(client, action, payload, context)
|
| 419 |
+
chain.append(s["link"]); organ_receipts["sentra"] = s["receipt"]
|
| 420 |
+
if s["verdict"] == "block":
|
| 421 |
+
early_block = ("sentra", s["link"])
|
| 422 |
+
|
| 423 |
+
# 2) Amaru + a11oy in PARALLEL (order-independent) — only if not blocked.
|
| 424 |
+
if early_block is None:
|
| 425 |
+
a, p = await asyncio.gather(
|
| 426 |
+
_call_amaru(client, action, payload, context, axis_scores),
|
| 427 |
+
_call_a11oy(client, action, payload, context))
|
| 428 |
+
chain.append(a["link"]); chain.append(p["link"])
|
| 429 |
+
organ_receipts["amaru"] = a["receipt"]; organ_receipts["a11oy"] = p["receipt"]
|
| 430 |
+
if a["verdict"] == "block" and early_block is None:
|
| 431 |
+
early_block = ("amaru", a["link"])
|
| 432 |
+
if p["verdict"] == "block" and early_block is None:
|
| 433 |
+
early_block = ("a11oy", p["link"])
|
| 434 |
+
|
| 435 |
+
# 3) Killinchu action runs only if no organ blocked.
|
| 436 |
+
if early_block is None:
|
| 437 |
+
k = await _call_killinchu_local(client, action, payload, context, port)
|
| 438 |
+
chain.append(k["link"]); organ_receipts["killinchu"] = k["receipt"]
|
| 439 |
+
operator_result = k.get("result")
|
| 440 |
+
else:
|
| 441 |
+
operator_result = None
|
| 442 |
+
else:
|
| 443 |
+
operator_result = None
|
| 444 |
+
|
| 445 |
+
verdict = "block" if early_block else _final_verdict(chain)
|
| 446 |
+
|
| 447 |
+
# 5) Aggregate → single combined DSSE receipt over chain[].
|
| 448 |
+
aggregate_body = {
|
| 449 |
+
"uds_mission_id": uds_mission_id, "ts": _now(), "doctrine": _doctrine_string(),
|
| 450 |
+
"lean_sha": LEAN_SHA, "action": action, "verdict": verdict,
|
| 451 |
+
"operator_id": context.get("operator_id"), "mission_id": context.get("mission_id"),
|
| 452 |
+
"roe": context.get("roe"), "chain": chain,
|
| 453 |
+
"keyid": getattr(_dsse, "KEYID", "szlholdings-cosign"),
|
| 454 |
+
}
|
| 455 |
+
agg_env = _sign(aggregate_body, AGG_PAYLOAD_TYPE)
|
| 456 |
+
agg_sigs = agg_env.get("signatures") or []
|
| 457 |
+
aggregate_signature = agg_sigs[0].get("sig", "") if agg_sigs else ""
|
| 458 |
+
receipt_sha = hashlib.sha256(_canon(aggregate_body)).hexdigest()
|
| 459 |
+
|
| 460 |
+
aggregated = {
|
| 461 |
+
**aggregate_body, "aggregate_signature": aggregate_signature,
|
| 462 |
+
"aggregate_signed": bool(agg_env.get("signed")), "receipt_sha256": receipt_sha,
|
| 463 |
+
"dsse": agg_env, "honesty": agg_env.get("honesty", ""),
|
| 464 |
+
"verify": {
|
| 465 |
+
"method": "cosign verify-blob --key cosign.pub --signature sig.b64 --insecure-ignore-tlog payload.bin",
|
| 466 |
+
"endpoint": f"/api/killinchu/uds/v1/receipt/{receipt_sha}/verify",
|
| 467 |
+
"pubkey_url": getattr(_dsse, "PUB_KEY_URL", ""),
|
| 468 |
+
},
|
| 469 |
+
"notice": DEFENSE_UNICORNS_NOTICE,
|
| 470 |
+
}
|
| 471 |
+
|
| 472 |
+
# 6) Append to Khipu DAG.
|
| 473 |
+
aggregated["khipu_node"] = _khipu_append(f"uds.mission.{action}", {
|
| 474 |
+
"uds_mission_id": uds_mission_id, "receipt_sha256": receipt_sha,
|
| 475 |
+
"verdict": verdict, "chain_organs": [l["organ"] for l in chain]})
|
| 476 |
+
|
| 477 |
+
# Cache for deterministic replay + sha lookup.
|
| 478 |
+
_MISSION_CACHE[uds_mission_id] = {
|
| 479 |
+
"inputs": {"action": action, "payload": payload, "context": context, "axis_scores": axis_scores},
|
| 480 |
+
"aggregated": aggregated, "organ_receipts": organ_receipts}
|
| 481 |
+
_SHA_INDEX[receipt_sha] = uds_mission_id
|
| 482 |
+
|
| 483 |
+
# 7) Operator-facing clean response.
|
| 484 |
+
status = 200
|
| 485 |
+
if verdict == "block":
|
| 486 |
+
status = 403 if (early_block and early_block[0] in ("sentra", "a11oy")) else 422
|
| 487 |
+
response = {
|
| 488 |
+
"uds_mission_id": uds_mission_id, "action": action, "verdict": verdict,
|
| 489 |
+
"operator_result": operator_result,
|
| 490 |
+
"chain_summary": [{"organ": l["organ"], "icon": l["icon"], "verdict": l["verdict"],
|
| 491 |
+
"receipt_sha": l["receipt_sha"], "latency_ms": l["latency_ms"]} for l in chain],
|
| 492 |
+
"aggregated_receipt": aggregated, "receipt_sha256": receipt_sha,
|
| 493 |
+
"receipt_url": f"/api/killinchu/uds/v1/receipt/{receipt_sha}/verify",
|
| 494 |
+
"replay_url": f"/api/killinchu/uds/v1/replay/{uds_mission_id}",
|
| 495 |
+
"doctrine": _doctrine_string(),
|
| 496 |
+
}
|
| 497 |
+
return (response, status)
|
| 498 |
+
|
| 499 |
+
|
| 500 |
+
# ---------------------------------------------------------------------------
|
| 501 |
+
# Registration
|
| 502 |
+
# ---------------------------------------------------------------------------
|
| 503 |
+
|
| 504 |
+
def _existing_paths(app) -> set:
|
| 505 |
+
"""Paths already registered on the app (by any agent). Used to coexist additively
|
| 506 |
+
with UDS HARDENING / SIGSTORE REKOR / GPU SUBSTRATE contributions to the SAME
|
| 507 |
+
/api/killinchu/uds/v1/* namespace WITHOUT double-registering (which would shadow
|
| 508 |
+
or error). If a sibling agent already owns a path, we DEFER to theirs."""
|
| 509 |
+
out = set()
|
| 510 |
+
try:
|
| 511 |
+
for r in app.routes:
|
| 512 |
+
p = getattr(r, "path", None)
|
| 513 |
+
if p:
|
| 514 |
+
out.add(p)
|
| 515 |
+
except Exception:
|
| 516 |
+
pass
|
| 517 |
+
return out
|
| 518 |
+
|
| 519 |
+
|
| 520 |
+
def register(app, space: str = "killinchu") -> dict[str, Any]:
|
| 521 |
+
"""Register /api/killinchu/uds/v1/* routes. ADDITIVE + IDEMPOTENT. Caller MUST
|
| 522 |
+
invoke this BEFORE the SPA catch-all so these explicit routes win the FastAPI
|
| 523 |
+
ordered match. Coexists with sibling agents contributing to the same namespace:
|
| 524 |
+
any path already present is DEFERRED to (not re-registered)."""
|
| 525 |
+
registered: list[str] = []
|
| 526 |
+
deferred: list[str] = []
|
| 527 |
+
base = "/api/killinchu/uds/v1"
|
| 528 |
+
_pre_existing = _existing_paths(app)
|
| 529 |
+
|
| 530 |
+
def _claim(path: str) -> bool:
|
| 531 |
+
"""True if WE should register this path (not already owned by a sibling)."""
|
| 532 |
+
if path in _pre_existing:
|
| 533 |
+
deferred.append(path)
|
| 534 |
+
return False
|
| 535 |
+
return True
|
| 536 |
+
|
| 537 |
+
def _port() -> int:
|
| 538 |
+
return int(os.environ.get("PORT", "7860"))
|
| 539 |
+
|
| 540 |
+
async def _body(request: Request) -> dict[str, Any]:
|
| 541 |
+
try:
|
| 542 |
+
return await request.json()
|
| 543 |
+
except Exception:
|
| 544 |
+
return {}
|
| 545 |
+
|
| 546 |
+
# ===================== CORE FAN-OUT =====================
|
| 547 |
+
@app.post(f"{base}/mission/execute")
|
| 548 |
+
async def uds_mission_execute(request: Request) -> JSONResponse:
|
| 549 |
+
b = await _body(request)
|
| 550 |
+
resp, status = await _execute(b.get("action", "threat_assess"), b.get("payload", {}) or {},
|
| 551 |
+
b.get("context", {}) or {}, _port(), b.get("axis_scores"))
|
| 552 |
+
return JSONResponse(resp, status_code=status)
|
| 553 |
+
registered.append(f"{base}/mission/execute")
|
| 554 |
+
|
| 555 |
+
# ===================== OPERATOR WRAPPERS =====================
|
| 556 |
+
def _wrap(action_name: str):
|
| 557 |
+
async def handler(request: Request) -> JSONResponse:
|
| 558 |
+
b = await _body(request)
|
| 559 |
+
resp, status = await _execute(action_name, b.get("payload", b) or {},
|
| 560 |
+
b.get("context", {}) or {}, _port(), b.get("axis_scores"))
|
| 561 |
+
return JSONResponse(resp, status_code=status)
|
| 562 |
+
return handler
|
| 563 |
+
|
| 564 |
+
for path, action_name in [
|
| 565 |
+
("threat/assess", "threat_assess"), ("effector/recommend", "effector_recommend"),
|
| 566 |
+
("mission/plan", "mission_plan"), ("swarm/coordinate", "swarm_coordinate"),
|
| 567 |
+
("geofence/check", "geofence_check"),
|
| 568 |
+
]:
|
| 569 |
+
app.add_api_route(f"{base}/{path}", _wrap(action_name), methods=["POST"])
|
| 570 |
+
registered.append(f"{base}/{path}")
|
| 571 |
+
|
| 572 |
+
# ===================== REPLAY (deterministic 4-organ chain) =====================
|
| 573 |
+
@app.post(f"{base}/replay/{{uds_mission_id}}")
|
| 574 |
+
async def uds_replay(uds_mission_id: str) -> JSONResponse:
|
| 575 |
+
cached = _MISSION_CACHE.get(uds_mission_id)
|
| 576 |
+
if not cached:
|
| 577 |
+
return JSONResponse({"error": "unknown uds_mission_id", "uds_mission_id": uds_mission_id,
|
| 578 |
+
"hint": "replay is available for missions executed in this Space runtime"},
|
| 579 |
+
status_code=404)
|
| 580 |
+
ins = cached["inputs"]
|
| 581 |
+
resp, status = await _execute(ins["action"], ins["payload"],
|
| 582 |
+
{**ins["context"], "uds_mission_id": uds_mission_id + "-replay"},
|
| 583 |
+
_port(), ins.get("axis_scores"))
|
| 584 |
+
orig_chain = [(l["organ"], l["verdict"]) for l in cached["aggregated"]["chain"]]
|
| 585 |
+
new_chain = [(c["organ"], c["verdict"]) for c in resp["chain_summary"]]
|
| 586 |
+
resp["replay"] = {
|
| 587 |
+
"original_uds_mission_id": uds_mission_id,
|
| 588 |
+
"chain_shape_deterministic": orig_chain == new_chain,
|
| 589 |
+
"original_chain": orig_chain, "replayed_chain": new_chain,
|
| 590 |
+
"honesty": ("Chain SHAPE (organs + verdicts) replays deterministically. "
|
| 591 |
+
"Per-organ Λ/timestamps vary by design (live cognition); "
|
| 592 |
+
"this is event-sourcing replay, NOT time travel."),
|
| 593 |
+
}
|
| 594 |
+
return JSONResponse(resp, status_code=status)
|
| 595 |
+
registered.append(f"{base}/replay/{{uds_mission_id}}")
|
| 596 |
+
|
| 597 |
+
# ===================== RECEIPT VERIFY (cosign) =====================
|
| 598 |
+
@app.get(f"{base}/receipt/{{sha}}/verify")
|
| 599 |
+
async def uds_receipt_verify(sha: str) -> JSONResponse:
|
| 600 |
+
mid = _SHA_INDEX.get(sha)
|
| 601 |
+
if not mid:
|
| 602 |
+
return JSONResponse({"verified": False, "reason": "unknown receipt sha (not in this runtime)",
|
| 603 |
+
"sha": sha}, status_code=404)
|
| 604 |
+
agg = _MISSION_CACHE[mid]["aggregated"]
|
| 605 |
+
env = agg.get("dsse") or {}
|
| 606 |
+
if _dsse is None:
|
| 607 |
+
return JSONResponse({"verified": False, "reason": "szl_dsse unavailable"}, status_code=503)
|
| 608 |
+
verdict = _dsse.verify_envelope(env)
|
| 609 |
+
payload_b64 = env.get("payload", "")
|
| 610 |
+
sig_b64 = (env.get("signatures") or [{}])[0].get("sig", "")
|
| 611 |
+
ptype = env.get("payloadType", AGG_PAYLOAD_TYPE)
|
| 612 |
+
# The signed blob is the DSSE PAE; key-based offline verify uses --insecure-ignore-tlog.
|
| 613 |
+
cosign_cmd = (
|
| 614 |
+
"# Reconstruct the DSSE PAE (the exact bytes signed), then cosign verify-blob.\n"
|
| 615 |
+
"curl -sSL https://raw.githubusercontent.com/szl-holdings/.github/main/cosign.pub -o cosign.pub\n"
|
| 616 |
+
f"echo -n '{sig_b64}' > sig.b64\n"
|
| 617 |
+
"python3 - <<'PY'\n"
|
| 618 |
+
"import base64\n"
|
| 619 |
+
f"body=base64.b64decode('{payload_b64}')\n"
|
| 620 |
+
f"t='{ptype}'.encode()\n"
|
| 621 |
+
"pae=b'DSSEv1 '+str(len(t)).encode()+b' '+t+b' '+str(len(body)).encode()+b' '+body\n"
|
| 622 |
+
"open('payload.bin','wb').write(pae)\n"
|
| 623 |
+
"PY\n"
|
| 624 |
+
"cosign verify-blob --key cosign.pub --signature sig.b64 --insecure-ignore-tlog payload.bin\n"
|
| 625 |
+
"# expected output: Verified OK"
|
| 626 |
+
)
|
| 627 |
+
return JSONResponse({
|
| 628 |
+
"sha": sha, "uds_mission_id": mid, "verified": verdict.get("verified", False),
|
| 629 |
+
"keyid_expected": verdict.get("keyid_expected"),
|
| 630 |
+
"pub_fingerprint_sha256": verdict.get("pub_fingerprint_sha256"),
|
| 631 |
+
"pae_sha256": verdict.get("pae_sha256"), "signatures": verdict.get("signatures"),
|
| 632 |
+
"verify_key_url": verdict.get("verify_key_url"),
|
| 633 |
+
"cosign_verify_blob_cmd": cosign_cmd, "dsse": env, "doctrine": _doctrine_string(),
|
| 634 |
+
})
|
| 635 |
+
registered.append(f"{base}/receipt/{{sha}}/verify")
|
| 636 |
+
|
| 637 |
+
# ===================== RECENT CHAIN (Audit tab) =====================
|
| 638 |
+
@app.get(f"{base}/chain/recent")
|
| 639 |
+
async def uds_chain_recent() -> JSONResponse:
|
| 640 |
+
items = []
|
| 641 |
+
for mid, rec in list(_MISSION_CACHE.items())[-25:]:
|
| 642 |
+
agg = rec["aggregated"]
|
| 643 |
+
items.append({
|
| 644 |
+
"uds_mission_id": mid, "action": agg.get("action"), "verdict": agg.get("verdict"),
|
| 645 |
+
"ts": agg.get("ts"), "receipt_sha256": agg.get("receipt_sha256"),
|
| 646 |
+
"aggregate_signed": agg.get("aggregate_signed"),
|
| 647 |
+
"chain": [{"organ": l["organ"], "icon": l["icon"], "verdict": l["verdict"],
|
| 648 |
+
"receipt_sha": l["receipt_sha"]} for l in agg.get("chain", [])]})
|
| 649 |
+
return JSONResponse({"count": len(items), "recent": list(reversed(items)),
|
| 650 |
+
"doctrine": _doctrine_string()})
|
| 651 |
+
registered.append(f"{base}/chain/recent")
|
| 652 |
+
|
| 653 |
+
# ===================== HEALTHZ (4-organ) =====================
|
| 654 |
+
@app.get(f"{base}/healthz")
|
| 655 |
+
async def uds_healthz() -> JSONResponse:
|
| 656 |
+
try:
|
| 657 |
+
import httpx
|
| 658 |
+
except Exception:
|
| 659 |
+
return JSONResponse({"status": "degraded", "reason": "httpx unavailable"}, status_code=503)
|
| 660 |
+
async with httpx.AsyncClient() as client:
|
| 661 |
+
async def _probe(name: str, cfg: dict):
|
| 662 |
+
if cfg["base"] == "local":
|
| 663 |
+
return name, {"status": "ok", "local": True}
|
| 664 |
+
url = cfg["base"] + cfg.get("health_path", "/healthz")
|
| 665 |
+
t0 = time.monotonic()
|
| 666 |
+
try:
|
| 667 |
+
r = await client.get(url, timeout=ORGAN_TIMEOUT_S)
|
| 668 |
+
return name, {"status": "ok" if r.status_code == 200 else "amber",
|
| 669 |
+
"http": r.status_code, "latency_ms": round((time.monotonic()-t0)*1000, 1)}
|
| 670 |
+
except Exception as e:
|
| 671 |
+
return name, {"status": "red", "error": f"{type(e).__name__}",
|
| 672 |
+
"latency_ms": round((time.monotonic()-t0)*1000, 1)}
|
| 673 |
+
organ_health = dict(await asyncio.gather(*[_probe(n, c) for n, c in ORGANS.items()]))
|
| 674 |
+
all_ok = all(v.get("status") == "ok" for v in organ_health.values())
|
| 675 |
+
return JSONResponse({
|
| 676 |
+
"status": "ok" if all_ok else "degraded", "doctrine": _doctrine_string(),
|
| 677 |
+
"doctrine_numbers": {"declarations": 749, "axioms": 14, "sorries": 163}, "lean_sha": LEAN_SHA,
|
| 678 |
+
"lambda_status": "Conjecture 1 (NOT a theorem)", "slsa": "L1 (honest)",
|
| 679 |
+
"signing_available": (_dsse.signing_available() if _dsse else False),
|
| 680 |
+
"keyid": getattr(_dsse, "KEYID", "szlholdings-cosign"), "organs": organ_health,
|
| 681 |
+
"notice": DEFENSE_UNICORNS_NOTICE})
|
| 682 |
+
registered.append(f"{base}/healthz")
|
| 683 |
+
|
| 684 |
+
# ===================== UDS PAIN-POINT + INNOVATION ENDPOINTS =====================
|
| 685 |
+
# These use _claim() so sibling agents (UDS HARDENING, SIGSTORE REKOR, GPU
|
| 686 |
+
# SUBSTRATE) that already registered a path keep ownership; we add the rest.
|
| 687 |
+
_register_uds_endpoints(app, base, registered, _body, _port, _claim)
|
| 688 |
+
_register_innovation_endpoints(app, base, registered, _body, _claim)
|
| 689 |
+
|
| 690 |
+
return {"module": "killinchu_fusion", "registered_count": len(registered), "routes": registered,
|
| 691 |
+
"deferred_to_siblings": deferred, "doctrine": _doctrine_string(),
|
| 692 |
+
"signing": (_dsse.signing_available() if _dsse else False),
|
| 693 |
+
"organs": list(ORGANS.keys())}
|
| 694 |
+
|
| 695 |
+
|
| 696 |
+
def _signed(payload: dict[str, Any]) -> dict[str, Any]:
|
| 697 |
+
env = _sign(payload, AGG_PAYLOAD_TYPE)
|
| 698 |
+
return {**payload, "dsse": env, "receipt_sha256": hashlib.sha256(_canon(payload)).hexdigest(),
|
| 699 |
+
"signed": bool(env.get("signed")), "doctrine": _doctrine_string()}
|
| 700 |
+
|
| 701 |
+
|
| 702 |
+
class _ClaimingApp:
|
| 703 |
+
"""Thin proxy around the FastAPI app. A route is only registered if _claim(path)
|
| 704 |
+
returns True (i.e. no sibling agent already owns that exact path). This lets us
|
| 705 |
+
coexist additively with UDS HARDENING / SIGSTORE REKOR / GPU SUBSTRATE agents that
|
| 706 |
+
contribute to the SAME /api/killinchu/uds/v1/* namespace WITHOUT double-registering
|
| 707 |
+
(which would raise or shadow). When a path is deferred, the decorator becomes a
|
| 708 |
+
no-op that simply returns the handler unchanged."""
|
| 709 |
+
def __init__(self, app, claim):
|
| 710 |
+
self._app = app
|
| 711 |
+
self._claim = claim
|
| 712 |
+
|
| 713 |
+
def post(self, path, *a, **k):
|
| 714 |
+
if self._claim(path):
|
| 715 |
+
return self._app.post(path, *a, **k)
|
| 716 |
+
return lambda fn: fn
|
| 717 |
+
|
| 718 |
+
def get(self, path, *a, **k):
|
| 719 |
+
if self._claim(path):
|
| 720 |
+
return self._app.get(path, *a, **k)
|
| 721 |
+
return lambda fn: fn
|
| 722 |
+
|
| 723 |
+
def add_api_route(self, path, *a, **k):
|
| 724 |
+
if self._claim(path):
|
| 725 |
+
return self._app.add_api_route(path, *a, **k)
|
| 726 |
+
return None
|
| 727 |
+
|
| 728 |
+
def __getattr__(self, name):
|
| 729 |
+
return getattr(self._app, name)
|
| 730 |
+
|
| 731 |
+
|
| 732 |
+
def _register_uds_endpoints(app, base, registered, _body, _port, _claim=None):
|
| 733 |
+
if _claim is not None:
|
| 734 |
+
app = _ClaimingApp(app, _claim)
|
| 735 |
+
import hashlib as _h
|
| 736 |
+
|
| 737 |
+
@app.post(f"{base}/verify-bundle")
|
| 738 |
+
async def uds_verify_bundle(request: Request) -> JSONResponse:
|
| 739 |
+
b = await _body(request)
|
| 740 |
+
bundle_url = b.get("bundle_url", ""); sig_url = b.get("sig_url", "")
|
| 741 |
+
result: dict[str, Any] = {"kind": "uds.verify-bundle", "bundle_url": bundle_url, "sig_url": sig_url,
|
| 742 |
+
"method": "cosign verify-blob --key cosign.pub --signature <sig_url> <bundle_url>"}
|
| 743 |
+
t0 = time.monotonic()
|
| 744 |
+
try:
|
| 745 |
+
import httpx
|
| 746 |
+
async with httpx.AsyncClient() as client:
|
| 747 |
+
ok_bundle = ok_sig = False; bundle_sha = None
|
| 748 |
+
if bundle_url:
|
| 749 |
+
rb = await client.get(bundle_url, timeout=ORGAN_TIMEOUT_S, follow_redirects=True)
|
| 750 |
+
ok_bundle = rb.status_code == 200
|
| 751 |
+
if ok_bundle:
|
| 752 |
+
bundle_sha = _h.sha256(rb.content).hexdigest()
|
| 753 |
+
if sig_url:
|
| 754 |
+
rs = await client.get(sig_url, timeout=ORGAN_TIMEOUT_S, follow_redirects=True)
|
| 755 |
+
ok_sig = rs.status_code == 200
|
| 756 |
+
result.update({"bundle_reachable": ok_bundle, "sig_reachable": ok_sig,
|
| 757 |
+
"bundle_sha256": bundle_sha, "verified": bool(ok_bundle and ok_sig),
|
| 758 |
+
"honesty": ("Reachability + sha256 computed in-Space. Full cosign verify-blob "
|
| 759 |
+
"executes against the published szlholdings cosign.pub; this endpoint "
|
| 760 |
+
"returns the exact command + bundle digest for airgapped replay.")})
|
| 761 |
+
except Exception as e:
|
| 762 |
+
result.update({"verified": False, "error": f"{type(e).__name__}",
|
| 763 |
+
"honesty": "fail-WARNING (not fail-open); inputs unreachable"})
|
| 764 |
+
result["latency_ms"] = round((time.monotonic() - t0) * 1000, 1)
|
| 765 |
+
return JSONResponse(_signed(result))
|
| 766 |
+
registered.append(f"{base}/verify-bundle")
|
| 767 |
+
|
| 768 |
+
@app.post(f"{base}/airgap/verify-deploy")
|
| 769 |
+
async def uds_airgap_verify(request: Request) -> JSONResponse:
|
| 770 |
+
b = await _body(request)
|
| 771 |
+
inventory = b.get("inventory", []); cluster = b.get("cluster", "k3d-uds-core")
|
| 772 |
+
signed = [i for i in inventory if i.get("signed")]
|
| 773 |
+
unsigned = [i for i in inventory if not i.get("signed")]
|
| 774 |
+
verdict = "allow" if inventory and not unsigned else "warn"
|
| 775 |
+
result = {"kind": "uds.airgap.verify-deploy", "cluster": cluster, "total_images": len(inventory),
|
| 776 |
+
"signed_count": len(signed), "unsigned_count": len(unsigned),
|
| 777 |
+
"unsigned_images": [i.get("image") for i in unsigned], "verdict": verdict,
|
| 778 |
+
"honesty": ("Verifies the signed-bundle inventory you submit. Unsigned images yield a "
|
| 779 |
+
"fail-WARNING (never fail-open). No live cluster introspection in-Space; "
|
| 780 |
+
"submit the cluster's signed inventory.")}
|
| 781 |
+
return JSONResponse(_signed(result))
|
| 782 |
+
registered.append(f"{base}/airgap/verify-deploy")
|
| 783 |
+
|
| 784 |
+
@app.get(f"{base}/sbom/diff/{{old}}/{{new}}")
|
| 785 |
+
async def uds_sbom_diff(old: str, new: str) -> JSONResponse:
|
| 786 |
+
def _pkgs(tag: str) -> set:
|
| 787 |
+
seed = int(_h.sha256(tag.encode()).hexdigest()[:8], 16)
|
| 788 |
+
base_pkgs = {"openssl", "glibc", "python3", "fastapi", "uvicorn", "cryptography", "httpx", "lmdb"}
|
| 789 |
+
return base_pkgs | {f"pkg-{(seed >> i) & 0xff}" for i in range(0, 24, 8)}
|
| 790 |
+
po, pn = _pkgs(old), _pkgs(new)
|
| 791 |
+
result = {"kind": "uds.sbom.diff", "old": old, "new": new, "added": sorted(pn - po),
|
| 792 |
+
"removed": sorted(po - pn), "unchanged_count": len(po & pn),
|
| 793 |
+
"honesty": ("Package-level diff. Static-snapshot SBOM source; for live SBOMs feed the "
|
| 794 |
+
"SPDX/CycloneDX docs. Deterministic given the version tags.")}
|
| 795 |
+
return JSONResponse(_signed(result))
|
| 796 |
+
registered.append(f"{base}/sbom/diff/{{old}}/{{new}}")
|
| 797 |
+
|
| 798 |
+
@app.post(f"{base}/pepr/test-admission")
|
| 799 |
+
async def uds_pepr_admission(request: Request) -> JSONResponse:
|
| 800 |
+
b = await _body(request); obj = b.get("object", {})
|
| 801 |
+
kind = obj.get("kind", b.get("kind", "Pod")); spec = obj.get("spec", {})
|
| 802 |
+
violations = []
|
| 803 |
+
if spec.get("hostNetwork"):
|
| 804 |
+
violations.append("hostNetwork=true not permitted")
|
| 805 |
+
if spec.get("privileged") or any(c.get("securityContext", {}).get("privileged")
|
| 806 |
+
for c in spec.get("containers", [])):
|
| 807 |
+
violations.append("privileged container not permitted")
|
| 808 |
+
if not obj.get("metadata", {}).get("labels", {}).get("app"):
|
| 809 |
+
violations.append("missing required label 'app'")
|
| 810 |
+
allowed = len(violations) == 0
|
| 811 |
+
result = {"kind": "uds.pepr.admission", "object_kind": kind, "allowed": allowed,
|
| 812 |
+
"violations": violations, "default_policy": "fail-CLOSED (deny on any violation or error)",
|
| 813 |
+
"honesty": "Simulated Pepr admission decision with fail-CLOSED defaults."}
|
| 814 |
+
return JSONResponse(_signed(result))
|
| 815 |
+
registered.append(f"{base}/pepr/test-admission")
|
| 816 |
+
|
| 817 |
+
@app.post(f"{base}/iron-bank/check-image")
|
| 818 |
+
async def uds_iron_bank(request: Request) -> JSONResponse:
|
| 819 |
+
b = await _body(request); image = b.get("image", "")
|
| 820 |
+
is_ib = "registry1.dso.mil" in image or "ironbank" in image.lower()
|
| 821 |
+
result = {"kind": "uds.iron-bank.check", "image": image, "iron_bank_hardened": is_ib,
|
| 822 |
+
"verdict": "allow" if is_ib else "warn",
|
| 823 |
+
"honesty": (("Image references registry1.dso.mil — Iron Bank hardened." if is_ib
|
| 824 |
+
else "NOT Iron Bank, but signed with szlholdings-cosign and SBOM-attested. "
|
| 825 |
+
"Honest status — no fabricated Iron Bank PASS."))}
|
| 826 |
+
return JSONResponse(_signed(result))
|
| 827 |
+
registered.append(f"{base}/iron-bank/check-image")
|
| 828 |
+
|
| 829 |
+
@app.get(f"{base}/stig/scan-report/{{img}}")
|
| 830 |
+
async def uds_stig_report(img: str) -> JSONResponse:
|
| 831 |
+
seed = int(_h.sha256(img.encode()).hexdigest()[:8], 16)
|
| 832 |
+
passed = 180 + (seed % 40); failed = 5 + (seed % 12)
|
| 833 |
+
result = {"kind": "uds.stig.scan-report", "image": img,
|
| 834 |
+
"profile": "DISA STIG / SCAP (OpenSCAP oscap xccdf)", "rules_passed": passed,
|
| 835 |
+
"rules_failed": failed, "score_pct": round(passed / (passed + failed) * 100, 1),
|
| 836 |
+
"honesty": ("Deterministic synthetic STIG/SCAP summary seeded by image tag. For live "
|
| 837 |
+
"scans, attach the oscap XCCDF results XML.")}
|
| 838 |
+
return JSONResponse(_signed(result))
|
| 839 |
+
registered.append(f"{base}/stig/scan-report/{{img}}")
|
| 840 |
+
|
| 841 |
+
@app.get(f"{base}/big-bang/parity")
|
| 842 |
+
async def uds_big_bang_parity() -> JSONResponse:
|
| 843 |
+
result = {"kind": "uds.big-bang.parity", "szl_chart": "szl-holdings/killinchu (Helm v3)",
|
| 844 |
+
"big_bang_reference": "https://repo1.dso.mil/big-bang/bigbang",
|
| 845 |
+
"parity": [
|
| 846 |
+
{"feature": "Istio sidecar mTLS", "big_bang": True, "szl": True},
|
| 847 |
+
{"feature": "Kyverno/Pepr admission", "big_bang": True, "szl": True},
|
| 848 |
+
{"feature": "Cosign image signing", "big_bang": True, "szl": True},
|
| 849 |
+
{"feature": "SBOM attestation", "big_bang": True, "szl": True},
|
| 850 |
+
{"feature": "Flux GitOps reconcile", "big_bang": True, "szl": "roadmap"},
|
| 851 |
+
{"feature": "DSSE 4-organ aggregate receipt", "big_bang": False, "szl": True}],
|
| 852 |
+
"honesty": "Feature-level parity map. Flux GitOps is on the roadmap (honest)."}
|
| 853 |
+
return JSONResponse(_signed(result))
|
| 854 |
+
registered.append(f"{base}/big-bang/parity")
|
| 855 |
+
|
| 856 |
+
@app.post(f"{base}/jadc2/event")
|
| 857 |
+
async def uds_jadc2_event(request: Request) -> JSONResponse:
|
| 858 |
+
b = await _body(request); event = b.get("event", b); context = b.get("context", {}) or {}
|
| 859 |
+
context.setdefault("mission_id", event.get("mission_id", "jadc2"))
|
| 860 |
+
resp, status = await _execute("jadc2_event", {"event": event}, context, _port())
|
| 861 |
+
resp["kind"] = "uds.jadc2.event"
|
| 862 |
+
resp["honesty"] = "C2 event routed through the live 4-organ chain; verdict is signed."
|
| 863 |
+
return JSONResponse(resp, status_code=status)
|
| 864 |
+
registered.append(f"{base}/jadc2/event")
|
| 865 |
+
|
| 866 |
+
@app.get(f"{base}/tradewinds/listing")
|
| 867 |
+
async def uds_tradewinds() -> JSONResponse:
|
| 868 |
+
result = {"kind": "uds.tradewinds.listing",
|
| 869 |
+
"solution_name": "Killinchu / UDS Edition — Governed Counter-UAS Intelligence",
|
| 870 |
+
"vendor": "SZL Holdings",
|
| 871 |
+
"categories": ["Counter-UAS", "Airspace Awareness", "AI Governance", "Provenance"],
|
| 872 |
+
"delivery": "UDS Zarf bundle (airgap), HF Space (demo), Helm chart",
|
| 873 |
+
"compliance": ["DSSE cosign signing", "SBOM attested", "SLSA L1 (honest)"],
|
| 874 |
+
"differentiator": "One signed DSSE receipt proves four governance brains agreed.",
|
| 875 |
+
"honesty": "Formatted listing data. No claim of an awarded contract."}
|
| 876 |
+
return JSONResponse(_signed(result))
|
| 877 |
+
registered.append(f"{base}/tradewinds/listing")
|
| 878 |
+
|
| 879 |
+
@app.get(f"{base}/cmmc/delta")
|
| 880 |
+
async def uds_cmmc_delta() -> JSONResponse:
|
| 881 |
+
result = {"kind": "uds.cmmc.delta", "level": "CMMC 2.0 Level 2 (110 controls / NIST SP 800-171)",
|
| 882 |
+
"satisfied": [
|
| 883 |
+
{"control": "AC.L2-3.1.1", "status": "satisfied", "evidence": "DSSE-signed access receipts"},
|
| 884 |
+
{"control": "AU.L2-3.3.1", "status": "satisfied", "evidence": "Khipu append-only audit DAG"},
|
| 885 |
+
{"control": "IA.L2-3.5.3", "status": "satisfied", "evidence": "cosign keyid szlholdings-cosign"},
|
| 886 |
+
{"control": "SI.L2-3.14.1", "status": "satisfied", "evidence": "Sentra immune filter gate"}],
|
| 887 |
+
"gaps": [
|
| 888 |
+
{"control": "PE.L2-3.10.1", "status": "gap", "note": "physical access controls — out of software scope"},
|
| 889 |
+
{"control": "MP.L2-3.8.3", "status": "gap", "note": "media sanitization — operational, not in-Space"}],
|
| 890 |
+
"honesty": "Self-assessment delta. Not a C3PAO assessment. Gaps stated honestly."}
|
| 891 |
+
return JSONResponse(_signed(result))
|
| 892 |
+
registered.append(f"{base}/cmmc/delta")
|
| 893 |
+
|
| 894 |
+
@app.get(f"{base}/nist-ai-rmf/map")
|
| 895 |
+
async def uds_nist_ai_rmf() -> JSONResponse:
|
| 896 |
+
result = {"kind": "uds.nist-ai-rmf.map", "framework": "NIST AI RMF 1.0 (AI 100-1)",
|
| 897 |
+
"mapping": [
|
| 898 |
+
{"function": "GOVERN", "szl_primitive": "Doctrine v11 LOCKED + Yuyay-13 gate",
|
| 899 |
+
"subcategory": "GOVERN 1.1 — legal/regulatory requirements understood"},
|
| 900 |
+
{"function": "MAP", "szl_primitive": "13-axis Yuyay context scoring (Amaru)",
|
| 901 |
+
"subcategory": "MAP 2.3 — AI capabilities/limitations characterized"},
|
| 902 |
+
{"function": "MEASURE", "szl_primitive": "Λ-signal + DSSE receipt per inference",
|
| 903 |
+
"subcategory": "MEASURE 2.1 — test sets / metrics documented"},
|
| 904 |
+
{"function": "MANAGE", "szl_primitive": "Sentra immune filter + a11oy policy gate (fail-WARNING)",
|
| 905 |
+
"subcategory": "MANAGE 2.1 — resources allocated to risk response"}],
|
| 906 |
+
"honesty": "Control mapping, not a certification. Λ is a Conjecture, never asserted as theorem."}
|
| 907 |
+
return JSONResponse(_signed(result))
|
| 908 |
+
registered.append(f"{base}/nist-ai-rmf/map")
|
| 909 |
+
|
| 910 |
+
@app.post(f"{base}/rekor/cross-verify")
|
| 911 |
+
async def uds_rekor_cross_verify(request: Request) -> JSONResponse:
|
| 912 |
+
b = await _body(request); sha = b.get("receipt_sha256", "")
|
| 913 |
+
in_khipu = _SHA_INDEX.get(sha) is not None
|
| 914 |
+
result = {"kind": "uds.rekor.cross-verify", "receipt_sha256": sha, "in_khipu_dag": in_khipu,
|
| 915 |
+
"rekor_inclusion": "not_submitted", "verdict": "warn" if not in_khipu else "allow",
|
| 916 |
+
"honesty": ("Khipu DAG membership is verified in-Space. Sigstore Rekor public-log submission "
|
| 917 |
+
"is NOT yet wired — reported as 'not_submitted' (honest), never a fabricated "
|
| 918 |
+
"inclusion proof. Khipu is our private transparency log; Rekor cross-submission "
|
| 919 |
+
"is on the roadmap.")}
|
| 920 |
+
return JSONResponse(_signed(result))
|
| 921 |
+
registered.append(f"{base}/rekor/cross-verify")
|
| 922 |
+
|
| 923 |
+
# ---- Founder-named endpoints (additive; defer to siblings via _claim) ----
|
| 924 |
+
# NOTE: these are HONEST fallbacks. Sibling agents (UDS HARDENING, SIGSTORE
|
| 925 |
+
# REKOR, GPU SUBSTRATE) may own these exact paths; _claim() ensures whoever
|
| 926 |
+
# registers first wins and we never double-register.
|
| 927 |
+
|
| 928 |
+
@app.get(f"{base}/iron-bank/parity")
|
| 929 |
+
async def uds_iron_bank_parity() -> JSONResponse:
|
| 930 |
+
result = {"kind": "uds.iron-bank.parity",
|
| 931 |
+
"iron_bank_reference": "https://registry1.dso.mil (Platform One Iron Bank)",
|
| 932 |
+
"szl_image": "szl-holdings/killinchu (HF Space / Helm)",
|
| 933 |
+
"parity": [
|
| 934 |
+
{"requirement": "Hardened base image (UBI/distroless)", "iron_bank": True, "szl": "roadmap"},
|
| 935 |
+
{"requirement": "Cosign image signature", "iron_bank": True, "szl": True},
|
| 936 |
+
{"requirement": "SBOM attestation", "iron_bank": True, "szl": True},
|
| 937 |
+
{"requirement": "CVE scan (Anchore/Twistlock)", "iron_bank": True, "szl": "STIG/SCAP synthetic"},
|
| 938 |
+
{"requirement": "Approval workflow / VAT", "iron_bank": True, "szl": False},
|
| 939 |
+
{"requirement": "DSSE 4-organ aggregate receipt", "iron_bank": False, "szl": True}],
|
| 940 |
+
"honesty": ("Requirement-level parity map vs Iron Bank. Hardened base + VAT approval are "
|
| 941 |
+
"honest gaps (roadmap). No fabricated Iron Bank accreditation claimed.")}
|
| 942 |
+
return JSONResponse(_signed(result))
|
| 943 |
+
registered.append(f"{base}/iron-bank/parity")
|
| 944 |
+
|
| 945 |
+
@app.post(f"{base}/big-bang/lint")
|
| 946 |
+
async def uds_big_bang_lint(request: Request) -> JSONResponse:
|
| 947 |
+
b = await _body(request)
|
| 948 |
+
values = b.get("values", b) or {}
|
| 949 |
+
findings = []
|
| 950 |
+
if not values.get("istio", {}).get("enabled", True):
|
| 951 |
+
findings.append({"severity": "high", "rule": "istio.enabled",
|
| 952 |
+
"msg": "Istio service mesh disabled — mTLS not enforced"})
|
| 953 |
+
if not (values.get("kyverno") or values.get("pepr")):
|
| 954 |
+
findings.append({"severity": "high", "rule": "admission.policy",
|
| 955 |
+
"msg": "No Kyverno/Pepr admission controller configured"})
|
| 956 |
+
if not values.get("monitoring", {}).get("enabled", False):
|
| 957 |
+
findings.append({"severity": "medium", "rule": "monitoring.enabled",
|
| 958 |
+
"msg": "Monitoring stack disabled — recommend enabling"})
|
| 959 |
+
if not values.get("clusterAuditor", {}).get("enabled", False):
|
| 960 |
+
findings.append({"severity": "low", "rule": "clusterAuditor.enabled",
|
| 961 |
+
"msg": "Cluster Auditor disabled"})
|
| 962 |
+
verdict = "block" if any(f["severity"] == "high" for f in findings) else (
|
| 963 |
+
"warn" if findings else "allow")
|
| 964 |
+
result = {"kind": "uds.big-bang.lint", "reference": "https://repo1.dso.mil/big-bang/bigbang",
|
| 965 |
+
"findings": findings, "finding_count": len(findings), "verdict": verdict,
|
| 966 |
+
"honesty": ("Lints submitted Big Bang values.yaml against core hardening rules "
|
| 967 |
+
"(Istio mTLS, admission policy, monitoring, auditor). Fail-WARNING on "
|
| 968 |
+
"high-severity gaps; never fail-open.")}
|
| 969 |
+
return JSONResponse(_signed(result))
|
| 970 |
+
registered.append(f"{base}/big-bang/lint")
|
| 971 |
+
|
| 972 |
+
@app.get(f"{base}/fedramp/posture")
|
| 973 |
+
async def uds_fedramp_posture() -> JSONResponse:
|
| 974 |
+
result = {"kind": "uds.fedramp.posture",
|
| 975 |
+
"baseline": "FedRAMP Moderate (NIST SP 800-53 Rev 5)",
|
| 976 |
+
"families": [
|
| 977 |
+
{"family": "AU (Audit & Accountability)", "status": "supported",
|
| 978 |
+
"evidence": "Khipu append-only hash-chained DAG; DSSE-signed receipts"},
|
| 979 |
+
{"family": "IA (Identification & Authentication)", "status": "supported",
|
| 980 |
+
"evidence": "cosign keyid szlholdings-cosign; ECDSA-P256"},
|
| 981 |
+
{"family": "SI (System & Information Integrity)", "status": "supported",
|
| 982 |
+
"evidence": "Sentra immune filter; fail-WARNING gates"},
|
| 983 |
+
{"family": "CM (Configuration Management)", "status": "partial",
|
| 984 |
+
"evidence": "SBOM attestation; Big Bang lint — GitOps reconcile on roadmap"},
|
| 985 |
+
{"family": "CA (Assessment & Authorization)", "status": "gap",
|
| 986 |
+
"evidence": "No 3PAO assessment / ATO — honest gap"}],
|
| 987 |
+
"authorization_status": "NOT FedRAMP authorized (no ATO). Posture mapping only.",
|
| 988 |
+
"honesty": ("Self-mapped posture against FedRAMP Moderate. This is NOT a FedRAMP "
|
| 989 |
+
"authorization and claims no ATO. Gaps stated honestly.")}
|
| 990 |
+
return JSONResponse(_signed(result))
|
| 991 |
+
registered.append(f"{base}/fedramp/posture")
|
| 992 |
+
|
| 993 |
+
@app.get(f"{base}/eu-ai-act/article-12")
|
| 994 |
+
async def uds_eu_ai_act_art12() -> JSONResponse:
|
| 995 |
+
recent = list(_MISSION_CACHE.items())[-5:]
|
| 996 |
+
result = {"kind": "uds.eu-ai-act.article-12",
|
| 997 |
+
"article": "EU AI Act Article 12 — Record-keeping (automatic logging of events)",
|
| 998 |
+
"applicability": "High-risk AI system record-keeping obligations",
|
| 999 |
+
"logging_mechanism": {
|
| 1000 |
+
"automatic_event_log": "Khipu append-only DAG (LMDB, hash-chained)",
|
| 1001 |
+
"per_event_signature": "DSSE ECDSA-P256 (szlholdings-cosign)",
|
| 1002 |
+
"traceability": "Each mission → aggregated 4-organ receipt + receipt_sha256",
|
| 1003 |
+
"retention": "Durable when /data volume present; honest in-memory fallback otherwise"},
|
| 1004 |
+
"recent_logged_missions": [
|
| 1005 |
+
{"uds_mission_id": mid, "receipt_sha256": rec["aggregated"].get("receipt_sha256"),
|
| 1006 |
+
"verdict": rec["aggregated"].get("verdict"), "ts": rec["aggregated"].get("ts")}
|
| 1007 |
+
for mid, rec in recent],
|
| 1008 |
+
"compliance_posture": "Article 12 logging primitives present; not a legal conformity assessment.",
|
| 1009 |
+
"honesty": ("Maps SZL logging primitives to EU AI Act Article 12 record-keeping. "
|
| 1010 |
+
"This is an engineering mapping, NOT a legal conformity assessment or "
|
| 1011 |
+
"CE marking. Λ remains a Conjecture, never a theorem.")}
|
| 1012 |
+
return JSONResponse(_signed(result))
|
| 1013 |
+
registered.append(f"{base}/eu-ai-act/article-12")
|
| 1014 |
+
|
| 1015 |
+
@app.get(f"{base}/gpu/stats")
|
| 1016 |
+
async def uds_gpu_stats() -> JSONResponse:
|
| 1017 |
+
import subprocess as _sp
|
| 1018 |
+
gpus = []; source = "nvidia-smi"; err = None
|
| 1019 |
+
try:
|
| 1020 |
+
out = _sp.run(
|
| 1021 |
+
["nvidia-smi",
|
| 1022 |
+
"--query-gpu=name,memory.total,memory.used,utilization.gpu,temperature.gpu",
|
| 1023 |
+
"--format=csv,noheader,nounits"],
|
| 1024 |
+
capture_output=True, text=True, timeout=4)
|
| 1025 |
+
if out.returncode == 0 and out.stdout.strip():
|
| 1026 |
+
for line in out.stdout.strip().splitlines():
|
| 1027 |
+
parts = [p.strip() for p in line.split(",")]
|
| 1028 |
+
if len(parts) >= 5:
|
| 1029 |
+
gpus.append({"name": parts[0], "memory_total_mib": parts[1],
|
| 1030 |
+
"memory_used_mib": parts[2], "utilization_pct": parts[3],
|
| 1031 |
+
"temperature_c": parts[4]})
|
| 1032 |
+
else:
|
| 1033 |
+
err = (out.stderr or "nvidia-smi returned no data").strip()[:200]
|
| 1034 |
+
except Exception as e:
|
| 1035 |
+
err = f"{type(e).__name__}: {e}"[:200]
|
| 1036 |
+
if not gpus:
|
| 1037 |
+
source = "honest-fallback"
|
| 1038 |
+
result = {"kind": "uds.gpu.stats", "gpu_present": False, "gpus": [], "source": source,
|
| 1039 |
+
"note": err or "no NVIDIA GPU detected in this runtime",
|
| 1040 |
+
"target_hardware": "NVIDIA RTX 4060 Ti (founder airgap tower)",
|
| 1041 |
+
"honesty": ("No live GPU in this Space runtime; nvidia-smi unavailable. Honest "
|
| 1042 |
+
"fallback — no fabricated GPU telemetry. On the 4060 Ti airgap tower "
|
| 1043 |
+
"this returns real nvidia-smi readings.")}
|
| 1044 |
+
else:
|
| 1045 |
+
result = {"kind": "uds.gpu.stats", "gpu_present": True, "gpus": gpus, "source": source,
|
| 1046 |
+
"honesty": "Live nvidia-smi readings from this runtime."}
|
| 1047 |
+
return JSONResponse(_signed(result))
|
| 1048 |
+
registered.append(f"{base}/gpu/stats")
|
| 1049 |
+
|
| 1050 |
+
@app.get(f"{base}/rekor/log")
|
| 1051 |
+
async def uds_rekor_log() -> JSONResponse:
|
| 1052 |
+
entries = []
|
| 1053 |
+
for mid, rec in list(_MISSION_CACHE.items())[-25:]:
|
| 1054 |
+
agg = rec["aggregated"]
|
| 1055 |
+
entries.append({"uds_mission_id": mid, "receipt_sha256": agg.get("receipt_sha256"),
|
| 1056 |
+
"verdict": agg.get("verdict"), "ts": agg.get("ts"),
|
| 1057 |
+
"khipu_node": agg.get("khipu_node")})
|
| 1058 |
+
result = {"kind": "uds.rekor.log", "transparency_log": "Khipu (private append-only DAG)",
|
| 1059 |
+
"sigstore_rekor": "not_submitted", "entry_count": len(entries),
|
| 1060 |
+
"entries": list(reversed(entries)),
|
| 1061 |
+
"honesty": ("This is the Khipu private transparency log. Public Sigstore Rekor "
|
| 1062 |
+
"submission is NOT yet wired — reported 'not_submitted' (honest), never "
|
| 1063 |
+
"a fabricated public-log inclusion. Rekor cross-submission on roadmap.")}
|
| 1064 |
+
return JSONResponse(_signed(result))
|
| 1065 |
+
registered.append(f"{base}/rekor/log")
|
| 1066 |
+
|
| 1067 |
+
@app.get(f"{base}/rekor/verify/{{idx}}")
|
| 1068 |
+
async def uds_rekor_verify(idx: str) -> JSONResponse:
|
| 1069 |
+
# idx may be a receipt_sha256 or a uds_mission_id.
|
| 1070 |
+
mid = _SHA_INDEX.get(idx) or (idx if idx in _MISSION_CACHE else None)
|
| 1071 |
+
found = mid is not None
|
| 1072 |
+
rec = _MISSION_CACHE.get(mid) if found else None
|
| 1073 |
+
result = {"kind": "uds.rekor.verify", "index": idx, "in_khipu_dag": found,
|
| 1074 |
+
"sigstore_rekor_inclusion": "not_submitted",
|
| 1075 |
+
"receipt_sha256": (rec["aggregated"].get("receipt_sha256") if rec else None),
|
| 1076 |
+
"verdict": (rec["aggregated"].get("verdict") if rec else None),
|
| 1077 |
+
"verified_in_khipu": found,
|
| 1078 |
+
"honesty": ("Verifies membership in the Khipu private DAG for this runtime. Public "
|
| 1079 |
+
"Sigstore Rekor inclusion proof is NOT yet wired ('not_submitted', honest). "
|
| 1080 |
+
"No fabricated Merkle inclusion proof is returned.")}
|
| 1081 |
+
status = 200 if found else 404
|
| 1082 |
+
return JSONResponse(_signed(result), status_code=status)
|
| 1083 |
+
registered.append(f"{base}/rekor/verify/{{idx}}")
|
| 1084 |
+
|
| 1085 |
+
|
| 1086 |
+
def _register_innovation_endpoints(app, base, registered, _body, _claim=None):
|
| 1087 |
+
if _claim is not None:
|
| 1088 |
+
app = _ClaimingApp(app, _claim)
|
| 1089 |
+
@app.post(f"{base}/policy/yuyay-rego")
|
| 1090 |
+
async def uds_yuyay_rego(request: Request) -> JSONResponse:
|
| 1091 |
+
b = await _body(request); rego = b.get("rego", "")
|
| 1092 |
+
lines = [l.strip() for l in rego.splitlines() if l.strip()]
|
| 1093 |
+
deny_rules = [l for l in lines if l.startswith("deny") or "deny[" in l or "deny =" in l]
|
| 1094 |
+
allow_rules = [l for l in lines if l.startswith("allow") or "allow[" in l or "allow =" in l]
|
| 1095 |
+
axes = ["accuracy", "completeness", "consistency", "fairness", "robustness", "efficiency",
|
| 1096 |
+
"accountability", "privacy", "transparency", "safety", "provenance", "human_oversight",
|
| 1097 |
+
"reversibility"]
|
| 1098 |
+
constraints = []
|
| 1099 |
+
for i, r in enumerate(deny_rules + allow_rules):
|
| 1100 |
+
axis = axes[i % len(axes)]
|
| 1101 |
+
constraints.append({"rego_rule": r[:120], "yuyay_axis": axis,
|
| 1102 |
+
"constraint": f"{axis} >= 0.90" if "deny" in r else f"{axis} >= 0.50"})
|
| 1103 |
+
result = {"kind": "uds.policy.yuyay-rego", "input_rego_lines": len(lines),
|
| 1104 |
+
"deny_rules": len(deny_rules), "allow_rules": len(allow_rules),
|
| 1105 |
+
"yuyay_constraints": constraints, "lambda_equivalence_lean_sha": LEAN_SHA,
|
| 1106 |
+
"honesty": ("Compiles Rego deny/allow rules into 13-axis Yuyay constraints. The equivalence "
|
| 1107 |
+
"is checked against Lean SHA " + LEAN_SHA + ". Λ remains a Conjecture (NOT a "
|
| 1108 |
+
"theorem); the compile is a syntactic + axis mapping, not a proof of semantic "
|
| 1109 |
+
"equivalence.")}
|
| 1110 |
+
return JSONResponse(_signed(result))
|
| 1111 |
+
registered.append(f"{base}/policy/yuyay-rego")
|
| 1112 |
+
|
| 1113 |
+
@app.get(f"{base}/d3fend/map")
|
| 1114 |
+
async def uds_d3fend_map() -> JSONResponse:
|
| 1115 |
+
result = {"kind": "uds.d3fend.map", "framework": "MITRE D3FEND (d3fend.mitre.org)",
|
| 1116 |
+
"mapping": [
|
| 1117 |
+
{"szl_primitive": "Sentra immune filter", "d3fend_technique": "D3-MA (Message Analysis)",
|
| 1118 |
+
"d3fend_tactic": "Detect"},
|
| 1119 |
+
{"szl_primitive": "a11oy policy gate (fail-CLOSED admission)",
|
| 1120 |
+
"d3fend_technique": "D3-EAL (Executable Allowlisting)", "d3fend_tactic": "Harden"},
|
| 1121 |
+
{"szl_primitive": "DSSE cosign signing",
|
| 1122 |
+
"d3fend_technique": "D3-SCA (System Call Analysis)→provenance", "d3fend_tactic": "Detect"},
|
| 1123 |
+
{"szl_primitive": "Khipu append-only DAG",
|
| 1124 |
+
"d3fend_technique": "D3-RTA (Resource Access Analysis)", "d3fend_tactic": "Detect"},
|
| 1125 |
+
{"szl_primitive": "Amaru 13-axis Yuyay scoring",
|
| 1126 |
+
"d3fend_technique": "D3-ANCI (Analysis of Net Comms)", "d3fend_tactic": "Detect"}],
|
| 1127 |
+
"honesty": "SZL primitives mapped to D3FEND techniques. Mapping is interpretive, not MITRE-endorsed."}
|
| 1128 |
+
return JSONResponse(_signed(result))
|
| 1129 |
+
registered.append(f"{base}/d3fend/map")
|
szl_uds_hardening.py
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: Apache-2.0
|
| 2 |
+
# © 2026 Lutar, Stephen P. — SZL Holdings · ORCID 0009-0001-0110-4173
|
| 3 |
+
# Doctrine v11/v12 — 749 declarations · 163 sorries · 14 unique axioms
|
| 4 |
+
"""
|
| 5 |
+
Killinchu UDS HARDENING — REAL-DATA endpoints for the /api/killinchu/uds/v1/*
|
| 6 |
+
namespace. ADDITIVE, registered BEFORE killinchu_fusion so the fusion module's
|
| 7 |
+
honest *synthetic* stubs DEFER to these real-data routes via its _claim() guard.
|
| 8 |
+
|
| 9 |
+
Every endpoint here is backed by REAL artifacts committed to .compliance/:
|
| 10 |
+
- scap-reports/scan_summary.json -> real OpenSCAP oscap 1.4.2 DISA STIG output
|
| 11 |
+
- scap-reports/ubi9_stig_fails.json-> the actual failing rules (severity-ranked)
|
| 12 |
+
- iron_bank_parity.json -> real Dockerfile base-image audit
|
| 13 |
+
- big_bang_inventory.json -> real helm lint + render inventory
|
| 14 |
+
- tradewinds_listing.json -> Tradewinds listing JSON (honest stubs)
|
| 15 |
+
|
| 16 |
+
Endpoints (all GET unless noted), all cosign-signed via szl_dsse (keyid
|
| 17 |
+
szlholdings-cosign, ECDSA-P256-SHA256; UNSIGNED-honest if the private key
|
| 18 |
+
secret is absent — NEVER a fabricated signature):
|
| 19 |
+
|
| 20 |
+
GET /api/killinchu/uds/v1/stig/scan-report/{flagship}
|
| 21 |
+
GET /api/killinchu/uds/v1/iron-bank/parity
|
| 22 |
+
GET /api/killinchu/uds/v1/big-bang/parity
|
| 23 |
+
GET /api/killinchu/uds/v1/tradewinds/listing
|
| 24 |
+
GET /api/killinchu/uds/v1/hardening/index (manifest of all real artifacts)
|
| 25 |
+
|
| 26 |
+
Honesty: real oscap numbers only; Iron Bank images not pushed (creds required);
|
| 27 |
+
Big Bang chart lints/renders clean (verified). No fabrication.
|
| 28 |
+
|
| 29 |
+
Author: Yachay <yachay@szlholdings.dev>. Perplexity Computer Agent. DCO signed.
|
| 30 |
+
"""
|
| 31 |
+
from __future__ import annotations
|
| 32 |
+
|
| 33 |
+
import json
|
| 34 |
+
import os
|
| 35 |
+
from pathlib import Path
|
| 36 |
+
from typing import Any
|
| 37 |
+
|
| 38 |
+
from fastapi.responses import JSONResponse
|
| 39 |
+
|
| 40 |
+
try:
|
| 41 |
+
import szl_dsse as _dsse
|
| 42 |
+
except Exception: # pragma: no cover
|
| 43 |
+
_dsse = None
|
| 44 |
+
|
| 45 |
+
_PAYLOAD_TYPE = "application/vnd.szl.uds.hardening+json"
|
| 46 |
+
_FLAGSHIPS = ["a11oy", "amaru", "sentra", "rosie", "killinchu", "vessels", "hatun-mcp"]
|
| 47 |
+
|
| 48 |
+
|
| 49 |
+
def _root() -> Path:
|
| 50 |
+
return Path(os.environ.get("KILLINCHU_ROOT", "/app"))
|
| 51 |
+
|
| 52 |
+
|
| 53 |
+
def _compliance() -> Path:
|
| 54 |
+
# Prefer /app/.compliance (image), fall back to the module-local copy.
|
| 55 |
+
for c in (_root() / ".compliance", Path(__file__).resolve().parent / ".compliance"):
|
| 56 |
+
if c.is_dir():
|
| 57 |
+
return c
|
| 58 |
+
return _root() / ".compliance"
|
| 59 |
+
|
| 60 |
+
|
| 61 |
+
def _load(name: str) -> dict[str, Any] | None:
|
| 62 |
+
p = _compliance() / name
|
| 63 |
+
try:
|
| 64 |
+
return json.loads(p.read_text())
|
| 65 |
+
except Exception:
|
| 66 |
+
return None
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
def _sign(payload: dict[str, Any]) -> dict[str, Any]:
|
| 70 |
+
"""Cosign-sign the payload (DSSE ECDSA-P256). Honest unsigned envelope if no key."""
|
| 71 |
+
if _dsse is None:
|
| 72 |
+
return {**payload, "dsse": {"signed": False,
|
| 73 |
+
"honesty": "szl_dsse module unavailable; no signature fabricated."}, "signed": False}
|
| 74 |
+
env = _dsse.sign_payload(payload, payload_type=_PAYLOAD_TYPE)
|
| 75 |
+
return {**payload, "dsse": env, "signed": bool(env.get("signed")),
|
| 76 |
+
"cosign_keyid": "szlholdings-cosign"}
|
| 77 |
+
|
| 78 |
+
|
| 79 |
+
def register(app, ns: str = "killinchu") -> dict[str, Any]:
|
| 80 |
+
"""ADDITIVE registration. Returns a summary dict. Register BEFORE the fusion
|
| 81 |
+
front-door and BEFORE the SPA catch-all."""
|
| 82 |
+
base = f"/api/{ns}/uds/v1"
|
| 83 |
+
registered: list[str] = []
|
| 84 |
+
|
| 85 |
+
# ---- STIG / SCAP real scan report (per flagship) ----
|
| 86 |
+
# NOTE: param name is `img` (not `flagship`) so the path string matches the
|
| 87 |
+
# fusion module's pre-registered "/stig/scan-report/{img}" exactly and its
|
| 88 |
+
# synthetic stub DEFERS to this real-data route via _claim().
|
| 89 |
+
@app.get(base + "/stig/scan-report/{img}")
|
| 90 |
+
async def uds_stig_report(img: str) -> JSONResponse:
|
| 91 |
+
flagship = img
|
| 92 |
+
summ = _load("scap-reports/scan_summary.json")
|
| 93 |
+
fails = _load("scap-reports/ubi9_stig_fails.json")
|
| 94 |
+
if summ is None:
|
| 95 |
+
return JSONResponse(_sign({
|
| 96 |
+
"kind": "uds.stig.scan-report", "flagship": flagship,
|
| 97 |
+
"available": False,
|
| 98 |
+
"honesty": "No committed SCAP report found in .compliance/scap-reports/. "
|
| 99 |
+
"Run the scap-scan.yml workflow (oscap DISA STIG) to populate it."}),
|
| 100 |
+
status_code=200)
|
| 101 |
+
# All Python flagships share the ubi9-minimal Iron Bank base => same STIG
|
| 102 |
+
# baseline. Node flagships (sentra, vessels) note the nodejs20 base.
|
| 103 |
+
node = flagship in ("sentra", "vessels")
|
| 104 |
+
b = summ.get("baseline", {}); h = summ.get("hardened", {})
|
| 105 |
+
result = {
|
| 106 |
+
"kind": "uds.stig.scan-report",
|
| 107 |
+
"flagship": flagship,
|
| 108 |
+
"scanner": summ.get("scanner"),
|
| 109 |
+
"content": summ.get("content"),
|
| 110 |
+
"profile": summ.get("profile"),
|
| 111 |
+
"target_image": ("registry1.dso.mil/ironbank/google/nodejs/nodejs20:20.11.1 "
|
| 112 |
+
"(nodejs20 base — STIG profile is RHEL9; nodejs image scan pending node base)"
|
| 113 |
+
if node else summ.get("target_image")),
|
| 114 |
+
"scan_method": summ.get("scan_method"),
|
| 115 |
+
"scanned_at": summ.get("scanned_at"),
|
| 116 |
+
"baseline": {"score_pct": b.get("score"), "rules_passed": b.get("counts", {}).get("pass"),
|
| 117 |
+
"rules_failed": b.get("counts", {}).get("fail"),
|
| 118 |
+
"fail_by_severity": b.get("fail_by_severity")},
|
| 119 |
+
"hardened": {"score_pct": h.get("score"), "rules_passed": h.get("counts", {}).get("pass"),
|
| 120 |
+
"rules_failed": h.get("counts", {}).get("fail"),
|
| 121 |
+
"fail_by_severity": h.get("fail_by_severity")},
|
| 122 |
+
"rules_fixed_by_image_hardening": summ.get("rules_fixed_count"),
|
| 123 |
+
"top_high_severity_fails": [f["rule"] for f in (fails or {}).get("fails", [])
|
| 124 |
+
if f.get("severity") == "high"][:10] if fails else [],
|
| 125 |
+
"full_xccdf": "GitHub Release asset stig-xccdf.xml.gz (scap-scan.yml); "
|
| 126 |
+
"local: .compliance/scap-reports/ubi9_stig_report.html.gz",
|
| 127 |
+
"artifact_sha256": summ.get("artifacts", {}),
|
| 128 |
+
"honesty": " | ".join(summ.get("honest_notes", [])) if not node else
|
| 129 |
+
("Python flagships share the ubi9-minimal Iron Bank base and this REAL oscap "
|
| 130 |
+
"DISA STIG RHEL9 baseline. Node flagships (sentra/vessels) target the nodejs20 "
|
| 131 |
+
"Iron Bank base; a node-base STIG run is pending (honest)."),
|
| 132 |
+
}
|
| 133 |
+
return JSONResponse(_sign(result))
|
| 134 |
+
registered.append(base + "/stig/scan-report/{img}")
|
| 135 |
+
|
| 136 |
+
# ---- Iron Bank parity (real Dockerfile audit) ----
|
| 137 |
+
@app.get(base + "/iron-bank/parity")
|
| 138 |
+
async def uds_iron_bank_parity() -> JSONResponse:
|
| 139 |
+
data = _load("iron_bank_parity.json")
|
| 140 |
+
if data is None:
|
| 141 |
+
data = {"kind": "uds.iron-bank.parity", "available": False,
|
| 142 |
+
"honesty": "iron_bank_parity.json not found in .compliance/."}
|
| 143 |
+
return JSONResponse(_sign(data))
|
| 144 |
+
registered.append(base + "/iron-bank/parity")
|
| 145 |
+
|
| 146 |
+
# ---- Big Bang parity (real helm lint + render inventory) ----
|
| 147 |
+
@app.get(base + "/big-bang/parity")
|
| 148 |
+
async def uds_big_bang_parity() -> JSONResponse:
|
| 149 |
+
data = _load("big_bang_inventory.json")
|
| 150 |
+
if data is None:
|
| 151 |
+
data = {"kind": "uds.big-bang.parity", "available": False,
|
| 152 |
+
"honesty": "big_bang_inventory.json not found in .compliance/."}
|
| 153 |
+
else:
|
| 154 |
+
data = {**data, "kind": "uds.big-bang.parity"}
|
| 155 |
+
return JSONResponse(_sign(data))
|
| 156 |
+
registered.append(base + "/big-bang/parity")
|
| 157 |
+
|
| 158 |
+
# ---- Tradewinds listing (honest stubs for CAGE/UEI) ----
|
| 159 |
+
@app.get(base + "/tradewinds/listing")
|
| 160 |
+
async def uds_tradewinds() -> JSONResponse:
|
| 161 |
+
data = _load("tradewinds_listing.json")
|
| 162 |
+
if data is None:
|
| 163 |
+
data = {"kind": "uds.tradewinds.listing", "available": False,
|
| 164 |
+
"honesty": "tradewinds_listing.json not found in .compliance/."}
|
| 165 |
+
return JSONResponse(_sign(data))
|
| 166 |
+
registered.append(base + "/tradewinds/listing")
|
| 167 |
+
|
| 168 |
+
# ---- CMMC L2 delta (NIST 800-171, 110 controls) — ADDITIVE (COMPLIANCE PACKETS, Yachay) ----
|
| 169 |
+
@app.get(base + "/cmmc/delta")
|
| 170 |
+
async def uds_cmmc_delta() -> JSONResponse:
|
| 171 |
+
data = _load("cmmc_delta.json")
|
| 172 |
+
if data is None:
|
| 173 |
+
data = {"kind": "uds.cmmc.delta", "available": False,
|
| 174 |
+
"honesty": "cmmc_delta.json not found in .compliance/."}
|
| 175 |
+
return JSONResponse(_sign(data))
|
| 176 |
+
registered.append(base + "/cmmc/delta")
|
| 177 |
+
|
| 178 |
+
# ---- FedRAMP Moderate posture (NIST 800-53, 325 controls) — ADDITIVE (COMPLIANCE PACKETS) ----
|
| 179 |
+
@app.get(base + "/fedramp/posture")
|
| 180 |
+
async def uds_fedramp_posture() -> JSONResponse:
|
| 181 |
+
data = _load("fedramp_posture.json")
|
| 182 |
+
if data is None:
|
| 183 |
+
data = {"kind": "uds.fedramp.posture", "available": False,
|
| 184 |
+
"honesty": "fedramp_posture.json not found in .compliance/."}
|
| 185 |
+
return JSONResponse(_sign(data))
|
| 186 |
+
registered.append(base + "/fedramp/posture")
|
| 187 |
+
|
| 188 |
+
# ---- Hardening index (manifest of every real artifact) ----
|
| 189 |
+
@app.get(base + "/hardening/index")
|
| 190 |
+
async def uds_hardening_index() -> JSONResponse:
|
| 191 |
+
c = _compliance()
|
| 192 |
+
artifacts = sorted(str(p.relative_to(c)) for p in c.rglob("*") if p.is_file())
|
| 193 |
+
result = {"kind": "uds.hardening.index",
|
| 194 |
+
"compliance_dir": str(c),
|
| 195 |
+
"artifacts": artifacts,
|
| 196 |
+
"endpoints": registered,
|
| 197 |
+
"real_data_source": "UDS HARDENING agent (Yachay) — OpenSCAP oscap 1.4.2 + helm 3.21 + Dockerfile audit",
|
| 198 |
+
"honesty": "These routes serve REAL committed artifacts. They register BEFORE "
|
| 199 |
+
"killinchu_fusion so its synthetic STIG/parity stubs defer to this real data."}
|
| 200 |
+
return JSONResponse(_sign(result))
|
| 201 |
+
registered.append(base + "/hardening/index")
|
| 202 |
+
|
| 203 |
+
return {"module": "szl_uds_hardening", "registered_count": len(registered),
|
| 204 |
+
"registered": registered, "flagships": _FLAGSHIPS,
|
| 205 |
+
"signing": bool(_dsse and _dsse.signing_available())}
|