Skip to content

P02 지점 운영자 자기 프로필 실제 actor acceptance

이 페이지는 P02-branch-manager-profile의 canonical 실제 actor 근거다. Phase ID의 branch-manager는 호환 이름이고 canonical role은 branch_operator다. 증거 판정은 phaseAcceptancePassed: true, 전체 마이그레이션 판정은 completionClaim: false다. P03부터 P13까지 통과하기 전에는 100% 완료를 주장하지 않는다.

상위 결정 권위는 ADR-030ADR-033이다. 구현 전에 고정한 문턱은 P02 workflow-first RED 역사 기록에 보존한다.

RoleRevisionTree
assembly69038b47f97b68d5e3b7a7ec9fa223032bc2d8cfef101e421753387cc65ee1683a628d40857a865e
contractf2457fb12e08991881d4a41ce86233fe33f59c491df3214e49d2ae4b5d73c33b5d6875428d4c3d56
backendba4fe75cf4a126f9f1eccf2370dddd8651c96ca87580b45cc12e737edb32b0a7e8959eacd6e2464b
frontend8440ef6480d7b801ec92e4b2575e8f75a49e493c2d1396887512012ec1f8d2ce6970735b58c4625b

브라우저가 사용한 frontend artifact는 sha256:ff97596dd05b45b08134199153bd7c71616ed0e8ffee45a7ec3f88c3d351ef9b, backend container image는 sha256:47965cdc9d53a515f68f78241161c901e70051ce428f12e791bd7fe19f6a631a다. canonical-pack.json은 API network assertion과 Supabase primary-state actor proof를 각 source hash에 묶은 통합 canonical pack이다. 이름을 맞추기 위한 별도 가짜 manifest를 만들지 않는다.

Anchor레거시 실제 동작검증한 경계
source-refs/sanmopia-admin/application/controllers/OfficeManagement.php:374-381non-admin 상세 GET만 URL index를 session 지점으로 치환한다.GET과 PATCH 모두 server-resolved subject와 정확히 하나의 active membership을 사용한다.
source-refs/sanmopia-admin/application/controllers/OfficeManagement.php:399-448상세 POST는 caller $index를 저장 경계에 그대로 넘긴다.public own-profile 입력에는 branch/profile/actor id가 없다.
source-refs/sanmopia-admin/static/js/office_management/office_detail.js:1-10일부 input을 readonly로 표시한다.UI 표시가 아니라 backend authority와 closed request schema가 권한을 강제한다.
source-refs/sanmopia-admin/static/js/office_management/office_detail.js:253-276caller index로 POST한 뒤 reload/history 이동을 섞는다.full projection, revision, exact replay, stale conflict recovery를 명시한다.
source-refs/sanmopia-admin/application/models/Branch_model.php:202-286profile, credential, lifecycle, 계좌, 회비를 한 호출에서 갱신한다.P02 PATCH는 표시·연락·구조화 주소 facts만 변경한다.
  1. A — immutable 입력 고정

    assembly, contract, backend, frontend의 clean revision과 tree를 기록한다.

  2. B — runtime artifact 고정

    실제 backend container image/source tree와 production frontend artifact digest를 기록한다.

  3. C — P01 prerequisite 생성

    실제 HQ actor가 test-owned branch, invited operator authority, onboarding 최소 profile을 만들고 accepted P01 lineage 1을 따로 추적한다.

  4. D — 실제 Supabase session

    invited branch_operator의 실제 Auth session을 발급한다. token, cookie, email, UUID는 게시 근거에 남기지 않는다.

  5. E — activation context 거부

    anonymous context는 401, 다른 actor context는 scope-safe 403|404이며 primary mutation은 0인지 확인한다.

  6. F — activation ready

    self-scoped context가 server revision, invitationStatus: sent, activationReadiness: ready를 반환하는지 확인한다.

  7. G — 가짜 사전 권한 차단

    P01 SpiceDB manage가 미리 존재해도 activation 전 profile GET/PATCH가 403, command mutation이 0인지 확인한다.

  8. H — invitation activation

    caller scope id 없이 activation을 실행해 HTTP 201authorizationRelationshipStatus: pending을 확인한다.

  9. I — activation 원자성

    invitation accepted, membership active, activation audit, relationship delivery intent가 exact lineage에서 한 번만 전진하는지 Supabase primary snapshot으로 대조한다.

  10. J — accepted context

    같은 context가 invitationStatus: accepted, activationReadiness: already_accepted로 전이됐는지 확인한다.

  11. K — activation exact replay

    같은 actor/key/payload의 HTTP 200 replay 전후 membership, member profile, invitation, audit, live/archive queue cardinality와 canonical state가 같은지 확인한다.

  12. L — pending delivery 거부

    worker 적용 전 profile GET/PATCH는 모두 403, profile command와 primary mutation은 0인지 확인한다.

  13. M — 경쟁 worker 격리

    기존 worker 상태를 먼저 판정하고 runner가 실행 중 worker만 일시 정지한다. 캡처 종료 뒤 원래 상태를 복구하며 이 격리가 실패하면 증거를 만들지 않는다.

  14. N — relationship delivery

    runner가 소유한 worker가 exact queue intent를 archive하고 application receipt를 남기는지 확인한다.

  15. O — SpiceDB 권한 검증

    canonical branch_operator relationship과 manage permission이 실제 SpiceDB에 수렴한 뒤에만 profile route를 연다.

  16. P — 자기 profile GET

    branch id 없는 GET /branch/profile HTTP 200, full operator-visible projection, revision, completeness, allowedNextActions를 확인한다.

  17. Q — authorized PATCH

    표시명, 연락 이메일, E.164 전화번호, 구조화 주소, reason, expected revision만 보내 HTTP 201과 revision 1회 증가를 확인한다.

  18. R — primary/non-owner authority 대조

    current profile, revision, command result는 public projection과 같고 legal/business/lifecycle, fee, account, service-area, credential facts는 canonical byte-equivalent로 불변인지 확인한다.

  19. S — profile exact replay

    같은 actor/key/payload가 HTTP 200, 같은 projection, idempotentReplay: true를 반환하고 추가 revision/audit mutation은 0인지 확인한다.

  20. T — conflict 2 variants

    same-key different-payload와 stale revision 409 latestProjection/fieldDiff가 모두 accepted authority를 바꾸지 않는지 확인한다.

  21. U — validation 6 variants

    email, phone, postal address, blank reason, unknown field, HQ-only legal name 오류를 closed 422로 거부하고 부분 저장 0을 확인한다.

  22. V — authorization 13 variants

    context actor, pre-activation, pending delivery, foreign/HQ actor, generic bypass, 복수 active membership, withdrawn identity의 GET/PATCH를 401|403|404로 닫고 mutation 0을 확인한다.

  23. W — desktop 실제 browser

    1440px production build에서 activation, edit, apply, exact replay, stale conflict recovery와 실제 API network를 확인한다.

  24. X — mobile 실제 browser와 WebP

    390px activation/replay/stale recovery에 horizontal overflow가 없음을 확인하고 서로 다른 실제 상태 여섯 frame을 animated WebP로 고정한다.

  25. Y — cleanup과 process residue

    operational/Auth/relationship residue를 각각 0으로 만들고 Chromium/profile/frontend process residue도 0인지 확인한다. activation audit·application receipt·P01 lineage만 정해진 cardinality로 보존한다.

  26. Z — privacy와 범위 판정

    token, key, body, PII, opaque identifier, private topology가 없고 다섯 PNG와 여섯-frame WebP가 redaction review를 통과했을 때 P02만 PASS로 판정한다.

Case실제 proof
P02-happy-pathcontext ready/accepted, activation 201, pending 403, worker receipt, GET 200, PATCH 201
P02-authorizationclosed authorization 13 variants, mutation 0
P02-validationclosed validation 6 variants, 모두 422, mutation 0
P02-conflictconflicting replay와 stale revision 2 variants, accepted authority 불변
P02-exact-replayactivation/profile replay 200, canonical state·projection 동일, 중복 mutation 0
P02-cleanupactor/browser operational·Auth·relationship 0, process residue 0, retained cardinality 일치
지점 운영자가 초대를 활성화하고 자기 프로필을 저장·재실행한 뒤 stale conflict를 복구하는 여섯 프레임 실제 UI 전이
Production Astro UI · animated WebP 6 frames · redaction reviewed
지점 운영자 자기 프로필 저장과 exact replay가 완료된 desktop 화면
Desktop · 1440px · apply/replay success
최신 프로필과 변경 필드로 stale conflict 복구를 안내하는 desktop 화면
Desktop · 1440px · stale conflict recovery
초대 activation 준비 상태를 보여주는 390픽셀 mobile 화면
Mobile · 390px · activation ready
자기 프로필 저장과 exact replay가 완료된 390픽셀 mobile 화면
Mobile · 390px · apply/replay success
stale conflict와 최신 값 복구를 보여주는 390픽셀 mobile 화면
Mobile · 390px · stale conflict recovery

브라우저 manifest는 route interception과 mock network가 모두 false, 예상 밖 console error와 failed request가 0, mobile document overflow가 없음을 기록한다. competing worker는 runner가 일시 정지하고 원래 running 상태로 복구했다.

상태Actor runBrowser run
test-owned operational residue00
temporary Auth identity00
temporary SpiceDB relationship00
retained activation audit11
retained application receipts22
retained accepted P01 lineage11

Canonical machine evidence는 docs/evidence/p02-branch-operator-profile/의 actor run, browser run, combined canonical pack, cleanup manifest, privacy review가 소유한다. access/refresh token, cookie, idempotency key, request/response body, actor/resource identifier, PII, private topology는 보존하지 않았다.