mirror of
https://github.com/azaion/gps-denied-onboard.git
synced 2026-06-22 18:01:13 +00:00
[AZ-507] [AZ-323] [AZ-324] C10 Manifest build + verify + AZ-270 hygiene
AZ-507: codify cross-component import rule. Added _types/inference_errors.py shim re-exporting EngineBuildError + CalibrationCacheError from c7_inference; narrowed C10 EngineCompiler's except Exception to the two typed errors so unknown exceptions propagate (AC-3). Rewrote module-layout.md "Imports from" sections for 9 components + added Rule 9; appended an architecture.md ADR-009 note explaining why components must go through _types/*. AZ-323: ManifestBuilder + Ed25519ManifestSigner. Canonical JSON via orjson OPT_SORT_KEYS+OPT_INDENT_2, atomic-write Manifest.json + sha sidecar + .sig via AZ-280, operator-key fingerprint allowlist gate (C10-ST-01), ADR-010 takeoff_origin + flight_id baked into Manifest AND manifest_hash so re-planned routes change the cache identity (AC-15/AC-16). 20 unit tests cover all 16 ACs. AZ-324: ManifestVerifierImpl. Fail-closed Steps A-D: Manifest.json sidecar self-hash, Ed25519 trust-key set, schema parse with absolute/.. path rejection + takeoff_origin in-bbox check, stream SHA-256 per artifact with multi-failure accumulation. Operator mode re-derives tiles_coverage_sha256 from C6; airborne mode trusts the signed aggregate. 19 unit tests cover all 17 ACs. Composition root: c10_factory.build_manifest_builder + build_manifest_verifier + c6_tile_metadata_store_to_tiles_query adapter (the one place that legitimately imports both C6 and C10 without violating the AZ-270 lint). Dependency: pinned cryptography>=43.0,<46.0 in pyproject.toml. Tests: 1300 passed, 80 skipped (env-only), ruff clean for all AZ-323/324 files. AZ-306 (FAISS) intentionally deferred to batch 35 — needs C++ pybind11 toolchain not present in this environment. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
"""C10 cache-provisioning error family.
|
||||
|
||||
Rooted at :class:`C10ProvisioningError`; today the family contains
|
||||
:class:`ManifestWriteError` (AZ-323) covering signing-key load failure,
|
||||
fingerprint-allowlist rejection, and any I/O failure path during
|
||||
``ManifestBuilder.build_manifest``. AZ-324 / AZ-325 add additional
|
||||
subtypes (``ManifestVerifierError``, ``ManifestCoverageError``,
|
||||
``ContentHashMismatchError``) under the same root as they land.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
__all__ = [
|
||||
"C10ProvisioningError",
|
||||
"ManifestWriteError",
|
||||
]
|
||||
|
||||
|
||||
class C10ProvisioningError(Exception):
|
||||
"""Base class for the C10 cache-provisioning error family."""
|
||||
|
||||
|
||||
class ManifestWriteError(C10ProvisioningError):
|
||||
"""``ManifestBuilder.build_manifest`` could not produce a signed Manifest.
|
||||
|
||||
Surfaces three failure modes:
|
||||
|
||||
1. Operator-mode signing key fingerprint not in the configured
|
||||
allowlist (C10-ST-01).
|
||||
2. Signing key file unreadable or malformed PEM (the underlying
|
||||
``cryptography`` exception is chained via ``__cause__``).
|
||||
3. Any underlying atomic-write / sidecar failure during Manifest
|
||||
or signature emission.
|
||||
|
||||
Callers catch this single envelope; the structured `kind=
|
||||
"c10.manifest.build.error"` log payload (set by ``ManifestBuilder``)
|
||||
carries the discriminator field.
|
||||
"""
|
||||
Reference in New Issue
Block a user