# Pi readiness-gate UI deployment evidence

Status: passed
Type: evidence
Updated: 2026-08-02
Next Action: return to expendable same-family A/B sample intake
Campaign Reason: Historical record from campaign 014-complete-standalone-sd-qualifier-acceptance; retained independently after campaign closure and requires no separate owner-queue execution.
Campaign: standalone
Parent: work/tickets/ticket-clarify-sd-qualifier-readiness-gates.md

## Outcome

The `srv-rpi00.local` qualifier now distinguishes actionable readiness,
fixture-validation, pre-live requirements, and deliberately disabled live
authorities. Every controller, target-write, power, and raw-media capability
remains fail-closed.

## Exact release

- Repository: `PC-Redemption/sd-qualification`
- Pull request: `#31` (`Clarify appliance readiness gates`)
- Source: `32b636c048fdf680f9de49b4aa164f6dc59dd817`
- Release: `readiness-gates-32b636c`
- Deployed image: `sha256:ffef68210a538d9868b0b1056124f14f6428b8b5ae92000b45dd36dfa27cdd4b`
- Database backup: `/backups/sd-qualifier-20260803T045056Z.dump`
  (UTC timestamp); restore check passed before deployment.

## Fixture-image identity

The existing server-owned image
`fixtures/generated/hpt-media2-v0.5.0.img` is a read-only regular file with
SHA-256
`0a6fc612c75d067ebd0888f640ab48f07dd1c921c329ca1c693af0e08c8687b7`.
The reviewed hash is now present in protected deployment configuration. The
live gate reports `HPT_FIXTURE_IMAGE_READY` and explicitly retains raw-device
authority as disabled.

## Regression and live verification

- Exact ARM64 test image: `130/130` Django tests pass on SQLite.
- Exact ARM64 test image: `130/130` Django tests pass on PostgreSQL.
- Migration drift check: no changes detected; no migrations pending.
- Live health: database, evidence storage, clock, and workers pass;
  `fixture_only=true`, `live_admitted=false`, all state-changing capability
  flags false.
- Appliance API schema `appliance-status/0.3` reports:
  - approval trust anchor `BLOCKED` / `Required before live`, with the
    trust-store integration explicitly identified as unimplemented;
  - live adapter `DISABLED` / `Expected disabled` with exact-run wording;
  - HPT2 controller/media-write authority separately `DISABLED`;
  - bench power/raw-media authority separately `DISABLED`.
- The deployed Django-rendered operator page contains all new status labels and
  stable blocker codes. The in-app browser backend was unavailable, so no
  screenshot was captured; rendered production HTML and live API assertions
  passed instead.
- Read-only, programmer, and HPT2 role/endpoint configuration values are empty.
  No observer, programmer, or HPT2 tools-profile container is running.

No controller was contacted, programmed, reset, or written. No power or media
operation occurred.
