P04 본사 대여용품 카탈로그 실제 actor 증거
대여용품 명칭·비목·요금·지점 확인 여부·배송비는 UI 상수가 아니라 Pricing Settlement의 append-only immutable revision으로 발행한다. 브라우저는 cookie-derived same-origin server boundary만 사용하고 bearer token이나 service-role credential을 받지 않는다.
A → Z 실제 절차
Section titled “A → Z 실제 절차”-
A · 격리 Supabase 구성
pinned Supabase CLI
2.109.1로 GoTrue·Storage 선행 스키마와 repository migration315/315를 disposable PostgreSQL에 적용하고 PostgREST를 연결한다. -
B · 실제 actor 생성
실제 GoTrue에 HQ actor와 비권한 actor를 각각 만들고 로그인한다. 브라우저에는 HQ session cookie만 전달한다.
-
C · 권한 관계 생성
disposable SpiceDB에 production schema를 쓰고 HQ actor에만
hq_settlement:price_catalog_management#manage관계를 부여한다. -
D · 현재 revision 조회
Astro production UI가 same-origin GET을 통해 현재 승인 revision과 대여용품
5개를 읽는다. 화면은 응답 행으로 초기화하며 상품을 코드 상수로 만들지 않는다. -
E · 새 revision 편집
현재 revision을 draft로 복제하고
아기 체중계를 여섯 번째 stable entry로 추가한다. 표시명, legacy source code, 장비료, 지점 확인 여부, 순서, 발효 기간, source anchor와 SHA-256, repository revision, 승인 근거를 실제 UI에서 입력한다. -
F · immutable 발행과 재조회
실제 POST가 HQ identity와 SpiceDB 권한을 검증한 뒤 service-role publication RPC를 호출한다. UI는 receipt를 표시하고 current catalog를 다시 읽어
5 → 6을 확인한다. -
G · idempotency와 conflict
같은 idempotency key·같은 payload의 exact replay는 같은 결과를 반환한다. 같은 key의 변경된 payload는
503으로 거절되고 직접 SQL로 revision·entry 수가 변하지 않았음을 확인한다. -
H · 비권한 actor 차단
비권한 GoTrue actor의 GET과 POST는 모두
403이다. HQ actor나 service-role 정보를 client payload로 위조할 수 없다. -
I · 직접 DB 계보 검증
PostgreSQL에서 revision
2, supersession1, current published entry6, source evidence1, 최초 publisher 보존을 assertion한다. -
J · 데스크톱 반응형 검증
1440px에서 Material navigation rail
88px, TanStack desktop table 표시, 수평 overflow0, console warning/error0, failed request0을 확인한다. -
K · 모바일 카드 치환
390px에서는 표를 줄이지 않고 별도 세로 카드 DOM으로 치환한다. 발행된 카드
6장, 수평 overflow0을 확인한다. -
Z · cleanup
SpiceDB 관계와 두 GoTrue actor를 삭제하고 Auth row
0을 확인한다. PostgreSQL, PostgREST, GoTrue, SpiceDB, Astro process·container·network·임시 디렉터리 제거가 성공한 뒤에만 manifest에 cleanup PASS를 기록한다.
데스크톱 실제 발행 흐름
Section titled “데스크톱 실제 발행 흐름”



모바일 카드 치환
Section titled “모바일 카드 치환”

| Gate | 실제 결과 | 위상 |
|---|---|---|
| Actor/auth | real GoTrue HQ + unauthorized actor | GREEN |
| Authorization | real SpiceDB HQ allow, unauthorized GET/POST 403 | GREEN |
| Backend/API | production adapters/composition, current GET, immutable POST | GREEN |
| Replay/conflict | exact replay PASS, altered replay 503, DB unchanged | GREEN |
| Database lineage | revisions 2, supersession 1, entries 6, evidence 1 | GREEN |
| Browser layout | desktop overflow 0, mobile overflow 0, rail 88px, cards 6 | GREEN |
| Browser diagnostics | console warning/error 0, failed request 0 | GREEN |
| Cleanup | Auth actor·SpiceDB relation·runtime resource 제거 PASS | GREEN |
| Backend downstream rental contract | selection → quote → handoff → booking workflow → finalized charge | GREEN · code gate |
| Backend regression | 7,079 passed, Ruff/Tach/Vulture PASS | 코드 gate |
| Frontend regression | 95 files / 591 tests, lint, Astro check/build PASS | 코드 gate |
| P04 전체 | 산모 browser·실제 workflow·payment/정산/문서·법무·final confirm 미완 | RED/partial |
| Online deployment | 실행하지 않음 | 제외 |
동일 revision 예약 과금 code gate
Section titled “동일 revision 예약 과금 code gate”Backend 7f51408b9f5ba81452ec8923307fc43c251eeccf는 관리 화면이 발행한
catalog revision을 예약에서 다시 해석하는 후속 경계를 구현했다.
- 선택 항목은 effective catalog의 stable key·label·장비료·왕복 배송비·지점 확인 flag로
ReservationRentalSelectionRevision에 동결한다. - catalog 밖 key, 중복 key, 지점 확인이 필요한 항목의 미확인은 fail-closed다.
- 배송비는 선택 개수와 무관하게
reservation_level_max_once로 한 줄만 계산한다. - 최종 검토 quote의 rental item/delivery line, payable, charge handoff pricing revision, internal booking mapping이 같은 selection/catalog revision을 사용한다.
- 승인 handoff 번역은 final-review 선택, quote line, offering, pricing revision 중 하나라도 달라지면 booking command를 만들지 않는다.
- Restate workflow input이 selection revision과 line별
policyVersionLabel을 보존하고, finalized charge snapshot의 rental line도 catalog revision을 그대로 보존한다.
집중 회귀 153 passed, 전체 Python 7,079 passed, Ruff PASS, Tach dependency/interface/
exact/external diagnostic 0이다. Vulture confidence-100에서 새 contract/query 후보는 0;
넓은 경로 후보 12건은 호출되는 Protocol 인자로 확인해 삭제하지 않았다. 이 gate는
backend 계약 증거다. 새 actor/browser/WebP 또는 실제 Supabase booking 실행을 주장하지 않는다.
Asset SHA-256·크기·frame 수·privacy 판정은
actual evidence manifest이
소유한다. 직접 SQL 결과는
database verification에
고정했다. Manifest는 classification: actual-actor-browser-backend-database-acceptance,
evidenceStatus: passed, routeInterception: false, authenticatedActor: true,
completionClaim: false를 명시한다.
역사적 UI-only 증거
Section titled “역사적 UI-only 증거”Frontend 4996253d의 route-intercepted pack은 레이아웃 구현 당시의 회귀 자료로 남긴다.
provisional manifest는
실제 actor/backend 근거가 아니며 위 actual pack을 덮지 않는다.