# GeoIntel hardening — 2026-08-26 This change set converts the 2026-08-26 repository audit into executable guardrails without widening any data-source or AI accuracy claim. ## Implemented controls ### Secure defaults - Guest access is opt-in instead of enabled by default. - Configured YOLO validation-scope enforcement is opt-out only in non-production research/development contexts. - Production YOLO uses CUDA. Configured inference remains bound to the existing immutable validation-scope service; absent or invalid scope evidence keeps YOLO unavailable without taking the GIS runtime offline. ### Repository hygiene - New `.codex-input/` and `.codex-artifacts/` content is forbidden. - Transient SQLite WAL/SHM files are forbidden. - A tracked-file size budget prevents large local scratch artifacts from silently returning; governed accuracy evidence and presentation assets have explicit narrow allowlists. - All SQLite/WAL state, local calibration/error-review scratch, large contact sheets and DockDeck archives were removed from the current repository tree. - The remaining 32 DockDeck Stitch blobs could not be mass-deleted after the platform safety layer stopped further destructive operations. They are therefore frozen by exact path and exact Git blob SHA: they may be deleted, but any modification, replacement or new `.codex-input` file fails the release gate. Historical Git objects are intentionally not rewritten by this change. Purging old blobs requires a coordinated destructive history rewrite and force-update of every clone, so it is a separate operator decision. ### Engineering quality - Repository architecture budgets turn the largest legacy modules into a ratchet: they may shrink but may not grow. - Critical Python static checks and frontend source-policy linting are release gates alongside the existing full tests, typecheck and build. - The source-policy gate forbids debugger statements, `@ts-ignore`, `eval()` and dynamic `Function` construction without adding an unlocked npm dependency. A migration to ESLint 10 remains a dependency upgrade rather than being mixed into this hardening pass. ESLint 9 reached upstream end-of-life in August 2026. ### Supply chain - External Actions are pinned to full commit SHAs. - External Docker base/runtime images are digest-pinned. - CI verifies those policies so mutable references cannot silently return. - Both GIS and AI release images are built, SBOMed and scanned under the same vulnerability policy. - The Unraid Torch index default is aligned with the retained CUDA 12.8 runtime evidence instead of silently selecting a different CUDA wheel channel. ### Deployment gating Tower autoredeploy is downstream of the successful `GeoIntel release gates` workflow on `main` and deploys the workflow's exact validated head SHA. A direct push can therefore no longer bypass release validation and immediately roll to production. ## Explicit non-claims This hardening does **not**: - make the active building detector nationally validated; - replace the required geographically independent protected test and human review evidence; - convert guest mode into tenant isolation; - convert the PostgreSQL/in-process worker model into a distributed queue; - purge historical Git objects; - alter official source semantics or CRS contracts; - claim the 32 safety-frozen legacy Stitch blobs have already been removed. ## External repository control Gitea branch protection for `main` is still required. The connected workspace can audit protection, create isolated branches, validate pull requests and merge them safely, but it does not expose a write operation for branch-protection rules. Until an administrator enables protection, the downstream validated deploy gate remains the compensating production control.