Private Asset Consumer Test Contract - barocss/barocss-editor GitHub Wiki
네 제품의 비공개 자산 소비자 검사 계약
관리자: Execute Storage. 준비일: 2026-10-10, 한국 시간. 대상: 기존 #416 Site, #509 Word, #510 Slides, #511 Note.
이 문서는 원래 완료 기준에 대응하는 source/fixture/interface 준비다. 아래 실제 제품·권한·장애 검사는 아직 실행하지 않았다. 독립적으로 계산한 기존 fixture의 바이트 수와 SHA256만 이번 준비에서 확인했다. 기존 consumer 네 이슈를 재사용한다.
고정 입력과 책임 경계
- #412 source candidate:
1e6f4b9229cf8c871e52fbf8dff0a1bb2a83fb51, treed8918c41e5cd911d0fdba45635737e929daca3c6. branch와 기존 첫 실패 기록을 보존한다. - 현재 checkpoint — 2026-10-10: local develop
9ad7597d410478e0bcf0a2fd0d13fd004463d658를 고정 확인했고 #503은 CLOSED다. 이전 c7/#503 writer-fixture 기록은 당시 준비 이력이다. 마지막 compact owner 관측에서 Integration은 #377 통합 후보의 최종 preflight를 진행하고 #504의 실패·재시도·재열기 검사를 준비하고 있었다. 그 관측은 최종 gate 통과나 다음 runtime 배정 증거가 아니다. #412는 원래 통합·실제 인수가 남아 있고 Root의 다음 안전 checkpoint와 wiring/resource 상태를 다시 확인한다. - #513 copy source:
bebff553310820884f3bad223d99a79c8d3a620c; host successor:9b43b55fbe49e0548c0954a48c126a0253908d4b. 둘 다 source preparation이며 genuine 통합 인수는 아직 남아 있다. - Storage는 asset DTO·byte/hash·attempt/failure 계약과 이 fixture 표를 관리한다. Editor는 제품 native mapping/model/target lifetime/export 파일, Workspace는 현재 Office identity/host/document transport 파일을 맡는다. 정확한 product 파일 범위와 private interface 합의가 source 변경 전에 필요하다.
- Integration은 migration/package/config/policy/local develop과 shared API/PG/OIDC/browser/private-object 실행 자원을 단독 관리한다. 이 준비는 source checkout 복구, 공유 runtime 실행, 새 file lease 또는 priority 변경을 수행하지 않는다.
기존 #412 입력·출력
검사 준비는 기존 asset contract와 정확한 candidate source를 사용한다.
| 경계 | 입력 | 성공 결과·대조 |
|---|---|---|
| asset upload | 기존 document ID, 현재 인증된 요청, raw Buffer, Content-Type, x-asset-kind=image, 고정 x-asset-attempt-key. query/filename/bucket/object path/owner 권한 필드를 보내지 않는다. | AssetReceipt의 assetId/documentId/kind/mediaType/byteCount/sha256/status. 실제 upload 성공은 객체 재읽기·해시 비교와 ready DB commit 뒤에 반환한다. HTTP 201만 보고 전체 문서 saved로 표시하지 않는다. |
| ready read | 현재 인증된 tenant/document/asset exact GET | 원본 바이트와 receipt hash/count 비교. image Content-Type, nosniff/no-store. browser에 bucket/object key/credential을 전달하지 않는다. |
| document creation | 제품의 기존 고정 create/copy/import intent와 현재 source/destination 권한 | 실제 대상 document 생성 receipt를 복구·확인한다. #412 upload는 기존 문서가 필요하다. 생성 성공은 자산 참조까지 확인된 복사 성공과 구분한다. |
| native binding | ready destination asset identity, declared supported native mapping, 현재 target lifetime | full native fields와 원래 참조 의미를 보존한다. rendering URL은 일시적 표현이며 저장 identity/권한이 아니다. |
| snapshot | 기존 현재 권한·expectedRevision·고정 snapshot 시도 | 확인된 snapshot receipt/canonical raw readback. 생성→자산 ready→참조 연결→snapshot 확인을 모두 마쳐야 whole saved/copied를 표시한다. |
브라우저 요청 capability는 기존의 검증된 host에서 받아야 한다. 임의 principal/token/fetch, receipt JSON이나 URL을 새 권한으로 취급하지 않는다. 이 표는 새 wire protocol이나 public SDK hash 정의가 아니다.
독립 byte/hash seed
입력은 #412 candidate의 apps/office-service/test/document-asset-store.test.ts에 있는 기존 base64 fixture다. 2026-10-10 Python 표준 라이브러리로 Git commit의 바이트를 직접 decode하고 SHA256을 계산했다. DB·S3·브라우저 검사 결과는 아니다.
| seed | media type | 원본 byte count | 원본 SHA256 |
|---|---|---|---|
| png | image/png | 70 | c414cd0e204de974f73753c7e28d7638e7b3691bb8b1a2bab6b25bb7fed7ce77 |
| jpeg | image/jpeg | 207 | 78c75ba679f1b2a34500516d16491333ce503806d2cd7fac0a243eef57f7686f |
| gif | image/gif | 49 | 800490d47fb9cf61e1c3a3b4d25e515f92b8b2a48f69afa2b2f2ee9c2a0bc946 |
| webp | image/webp | 96 | 2d9f3340a9b5f4fcd3939d81452459c6be37b6dddd715c92d84ae68a1363b7db |
각 실제 campaign은 원본 seed, API 회수 바이트와 실제 객체 저장소 회수 바이트의 count/hash를 별도로 계산한다. native envelope SHA256, asset SHA256, create/update request correlation hash, static export 파일 SHA256을 각각 이름 붙여 기록한다. 서로 같은 digest라고 가정하지 않는다.
실제 준비 artifact: /Users/user/.codex/visualizations/2026/10/10/412-consumer-fixture-preparation-v1/manifest.json과 같은 폴더의 seed.png, seed.jpeg, seed.gif, seed.webp. Manifest SHA256: 624577523064d3630b0dfa7ec095aa0587851b9c5ef89c2db9b939c4f128dfe8. 기존 commit의 seed를 decode하고 모든 파일을 다시 읽어 원본 bytes/count/hash를 비교했다. 상태는 PREPARATION_ONLY이며 full native fixture와 실제 UI/OIDC/API/PG/S3 campaign은 미실행이다. 이 manifest version/hash는 fixture artifact 식별이며 public SDK/wire hash 계약이 아니다.
제품별 full native fixture
Site A/B/C source fixture packet — 2026-10-10
실제 artifact: /Users/user/.codex/visualizations/2026/10/10/416-site-native-fixtures-v1/manifest.json. SHA256: 473b14328d8c4f47e988bc8e07145bfb164bbae76368fe24f318ca1c0a1cbf3f. 분류는 SOURCE_NATIVE_FIXTURE_VALIDATION_ONLY다. 고정 baseline 9ad7597d410478e0bcf0a2fd0d13fd004463d658의 실제 Site schema/codec/reference/server-file gate를 private Git source extraction에서 Node 22.22.0/esbuild 0.27.7로 사용했다. 재작성한 validator나 fake backend를 쓰지 않았다. 52개 artifact 파일과 실제 bundled source 입력 428개의 해시를 기록했다.
| fixture | 전체 native 내용·정확한 참조 | UTF-8 bytes | Source SHA256 |
|---|---|---|---|
| A | 단일 /, asset:logo-a PNG hero/component, asset:photo-a GIF dataset, catalog-A의 두 stable row, text:body-A rich body, inline rich content, absent/empty/bold marks와 ordered nested metadata |
11390 | c3cf2694848a750fea65e0392c0c45ceb5937d93f4118edeab46630aaa2786d7 |
| B | /와 /about/, asset:brand/logo·asset:brand:logo, catalog-B/image/rich body/component 참조. 서로 다른 name/label이 같은 검증된 PNG 바이트를 가짐 |
12843 | 08dbb39ce1c5cdf2c78bcf1c357a34d115b4b3e2c43272cdda4dbc4ac602f61c |
| C | local native에서 지원하는 SVG 원본 asset:logo-a와 GIF·dataset·full rich body. private raster 업로드는 거부해야 함. API 거부는 아직 미실행 |
11430 | 3e0051e4c403889f570618e73b83613b1a18142951383860f50e83a9ffb76a30 |
| C-unresolved | C의 전체 원본에 exact asset:missing-native-file 참조를 추가. local codec는 원본을 보존하고 strict source server-file gate는 unresolved_site_reference로 거부 |
원본 파일로 별도 기록 | 3830bcc76bad87155582fa4b80f8cc78f49fce3c0ddb87b89c77898fb3973c2c |
각 fixture에 완전한 source.site.json, 독립적으로 미리 선언한 expected-materialized-copy.site.json·expected-native-export.site.json, 참조의 exact JSON pointer·원본 MIME/count/hash·필요한 static file 목록·권한/부분 실패 기대값을 담은 expectations.json이 있다. 실제 copy/export 구현으로 기대값을 생성하지 않았다. 이 fixture는 native rename/title/page remap을 요청하지 않는다. 대상 server IDs는 실제 receipt에서 확인하며 native aliases를 권한으로 쓰지 않는다. 실제 server-bound codec mapping은 Editor/Workspace와 정확히 합의한 뒤 확정한다.
기대 출력: A는 index.html과 필요한 PNG/GIF·dataset/carried 바이트를 가진 완전한 단일 page 출력이다. B는 index.html·about/index.html을 포함하며 두 이름이 기존 projection에서 assets/brand-logo.png로 충돌한다. 명시적으로 lossless 참조-to-file 매핑 또는 incomplete/refusal이어야 하며 silent overwrite/name/ref 소실을 성공으로 처리하지 않는다. 같은 바이트를 명시적으로 공유할 경우에도 두 native identity/label/ref 의미를 유지한다. C는 unsupported private-upload 시 source/native를 유지하고, C-unresolved는 참조를 조용히 삭제하거나 빈 이미지로 바꾸지 않는다. 고정 timestamp template와 실제 명시적 envelope export timestamp 차이만 구분하고, 전체 native/metadata/array order/image bytes는 비교한다.
실행 결과: source fixture 3개를 fixed strict native gate에서 full-tree 대조했고, materialized-copy/native-export 기대 template 6개를 같은 codec로 확인했다. 미해결 참조 1개를 거부하면서 전체 local native를 유지했다. 이것은 실제 Site copy/export/렌더링, 두 계정, OIDC/API/privatePG/S3 또는 OS restart 인수가 아니다. authority-stage-expectations.json은 기존 current source-read/destination-create-write/다른 reader/입력 거부와 생성 receipt→asset ready→binding→snapshot 부분 실패 기대값을 선언한다.
첫 실패도 보존했다. 최초 bundle의 source/import 해석 오류, import-condition-only math-editor 경로, 최초 fixture의 잘못된 root 순서·미등록 stack 노드를 setup/fixture 작성 오류로 분류했다. 검증기를 바꾸지 않고 원래 모델 순서와 frame으로 fixture만 수정했다. 추가 기존 Site PNG seed의 CRC 불일치 관측도 보존하고 positive B에는 사용하지 않았다. 원래 #416 제품 실패나 genuine PASS로 표시하지 않는다.
각 제품은 A=정상 작은 이미지, B=같은 이미지 바이트를 가진 서로 다른 native 위치/참조, C=지원하지 않는 입력을 보존한 거부 fixture를 준비한다. 실제 raw source와 independently declared expected destination/export 전체를 private 파일로 보존하고 각각 해시를 기록한다.
| 제품 | full source에서 반드시 비교할 요소 | 복사·출력의 독립 기대값 |
|---|---|---|
| Site | page/path, page와 dataset 이미지, resource ID/name/label/dimension, nested rich body, carried 참조, supported component 구조 | 기존 copy 규칙에 따른 대상 ID/참조 매핑과 original source 보존. 단일 page와 다중 page static/native 출력, 이름 충돌에서도 모든 필요한 이미지 바이트 |
| Word | 전체 native text/marks/attrs, image native identity/src/alt, supported layout/crop/caption, 주변 글 | 새 document에 연결된 자산과 지원 copy 변환. image 원본 hash가 같은 self-contained native file; local 5 MiB와 server 4 MiB 한도 차이 |
| Slides | image object와 image paint fill, slide/object IDs, placement/crop/paint, component/layout/master/connector 참조, full text와 presenter notes | 새 deck의 대상 자산과 declared native identity 변환. unsupported 위치를 silent drop하지 않고 supported native/playback와 independent native download 검증 |
| Note | picture/block identity/src/alt, root/nested body/attrs/marks와 supported unknown fields; native2이면 full ordered schemaBundle/pins/definitions/digests | 실제 지원 native mode를 선언. 기존 self-reference/page copy 변환 외에는 schema identity 보존. 새 Note 자산과 full native envelope를 가진 independent native file |
새 문서 ID/page ID·지원 self-reference remap·명시적 title 변경 등 copy 변환은 사전에 기대값으로 선언한다. 그 때문에 바뀌는 destination raw를 source raw와 무조건 동일하다고 요구하지 않는다. source 원본은 그대로 유지해야 한다. image original bytes는 위치·crop·native ID 변화와 별도로 byte-equivalent여야 한다. 문자열 일부, node count, normalize한 tree만으로 full native 보존을 통과시키지 않는다.
정상·거부·부분 실패 기대값
아래 case ID는 검사 기록의 식별자이며 실행한 테스트 수가 아니다. 각 consumer의 원래 기준에 연결한다.
| case | 실제 경계와 입력 | 요구하는 canonical/native 결과 |
|---|---|---|
| N1 writer insert/reopen | 실제 UI+OIDC+API+PG+private object, source seed 삽입·저장·reload | exact original byte/hash와 full native/참조 유지. 주변/nested text 편집이 이미지를 잃지 않음 |
| N2 independent reader | 별도 profile의 현재 허용 reader, writer cache 없이 reopen/view | 같은 ready 바이트. viewer mutation/upload 거부. 선언한 shared asset 수와 distinct native identity를 유지 |
| N3 new-document copy | fixed source raw/revision/bytes, source-read와 destination-create/write, 기존 copy 경로 | distinct destination과 destination-bound ready assets, current reader reopen, source full preservation. source asset ID/URL이 대상 권한이 아님 |
| N4 independent export | 현재 권한으로 필요한 바이트를 모두 resolve, service 없이 native/static reopen | full supported artifact와 original image hash, private URL/token/cookie/credential 없음. Site 출력 이름 충돌·단일 page coverage 포함 |
| R1 authority refusal | viewer write, 다른 tenant/document/asset, expired/revoked/no membership, operator-only | 적절한 refusal과 hidden bytes 비노출. dispatch 전 거부 case는 DB/object/native no-effect를 독립 확인 |
| R2 admission refusal | wrong media/body, damaged structure, SVG/HTML inline, empty/over-limit, client owner/path/bucket fields | ready 자산 없음. source/local original과 draft 보존. asset 4 MiB와 native snapshot/global JSON limits를 각각 검사 |
| R3 target replacement | account/document/root/block/runtime 교체·삭제·dispose와 late completion | 새 target native/input/selection/history가 바뀌지 않음. owned rendering URL 해제. 이미 시작한 server 쓰기의 rollback을 약속하지 않음 |
| P1 create lost ACK | 기존 destination create의 응답 유실·동일 고정 재시도·기존 receipt recovery | 같은 대상 identity/receipt. 자산 upload 전 existing destination 확인. extra destination 생성이나 early copied 상태 없음 |
| P2 object failure | absent/failed put, mismatch length/hash, read missing/corrupt object | truthful pending/failed/unavailable, ready 성공 없음. source/draft/object/attempt 증거 유지 |
| P3 binding/snapshot failure | asset ready 뒤 native 적용 거부·snapshot CAS conflict/commit failure·lost ACK | asset ready를 whole saved로 바꾸지 않음. later draft와 fixed snapshot/native 상태를 보존하고 exact 결과만 확인 |
| P4 restart/requalification | 같은 DB/object를 사용하는 API OS restart, browser reload/new current login | exact original attempts/receipts와 current authority를 다시 확인. historical DATA만으로 submit brand/native/write/asset 권한을 복원하지 않음 |
| P5 partial copy/current retirement | 각 생성/asset/binding/snapshot 단계에서 fail/revoke/retire/held reply | full source/copy draft/fixed attempt와 부분 대상 상태 유지. dispatched write가 commit했을 수 있는 uncertain 결과를 기록하며 새키/자동 재전송/삭제/중복 ready를 만들지 않음 |
R1/R2의 predispatch no-effect와 P5의 entered-write uncertain outcome을 혼동하지 않는다. source-read와 destination server authority도 하나의 atomic ACL 검사가 아니다. 판정은 실제 요청 dispatch, receipt/currentness, 독립 canonical before/after를 함께 기록한다.
Measured Site native-load metadata boundary — 2026-10-10
Latest owner-reported sanctioned-runtime result: Editor reached complete original qualified B native value/omission equality through actual Site runtime load/export, including authored loadedAt, omitted root loadedAt and repeated load/export, without filter/core repair. First raw object-key-order assertion failed after deep original equality had already passed; expected complete file DTO/value/omission comparison was corrected while fixed raw/server hash domains stayed unchanged. The generic loader failure below remains a lower-level observation, not a missing Site native restoration fix. These reports are scoped runtime/source results, not actual private consumer/backend acceptance or an independent Storage rerun.
Follow-up qualification: unchanged51d의 실제 app Site runtime에는 loadNativeDocument/exportNativeDocument와 mapNativeSource/reconcile의 sanctioned value/omission 복원 경로가 있다. Static source는 이 경로의 존재를 확인했으며 actual runtime의 full-original metadata value+omission baseline은 아직 별도 실행해야 한다. Generic createSiteEditor/loader 실패만으로 product runtime에 복원 코드가 없거나 새 shared-loader fix가 필요하다고 확정하지 않는다. 최초 generic failure와 operated-state oracle은 보존하며 sanctioned 경로도 blanket metadata 무시로 바꾸지 않는다.
Editor의 실제 B consumer 검사 consumer-second.log, session93578에서 7PASS/1FAIL을 기록했다. 첫 full original native 대조는 exporter assertion 전에 실패했다. Unchanged51d/accepted54693 packages/datastore/src/loader.ts:80은 모든 노드에 새 metadata.loadedAt을 넣고 root의 fixed-native-time도 덮어쓴다. 정확한 loader SHA256 5550e662a8a149ce9d07503341ad731e2f0beb41b761d6f02b32bba9b3dad20c를 Git source와 독립 대조했다. Finding SHA256 a25e1902f020687618a4ed59a454c5b49987eaa14b51eacd7a1565185cdff62d, 원본 Editor artifact 416-editor-export-plan-v1/LOAD-METADATA-FINDING.json; Storage 보존 artifact 416-native-load-boundary-v1.
이 결과는 기존 loader의 full-native load-roundtrip 공백이며 filename plan의 변경 효과나 private consumer 인수가 아니다. Original input raw는 보존된다. Editor의 filename slice는 complete operated model/native/history의 export 전후를 비교하며 이를 original load-roundtrip PASS로 표시하지 않는다. 기존 Source fixture gate는 원래 envelope/document를 반환하는 검증과 codec template 비교였고, 로드 후 모델이 원본과 같다는 검사는 아니었다. FOUR helper51d의 source/data/path-plan 자격도 해당 범위로 유지한다.
| 해시·대조 경계 | 요구하는 의미 |
|---|---|
| Original source raw/native | 원본 file bytes, full metadata와 arrays/asset bytes를 그대로 보존한다. |
| Materialized complete pre-load native | private bytes 복원 후 실제 load 전에 원본 또는 명시적으로 선언한 copy 변환과 전체를 비교한다. |
| Operated post-load model/native | 현재 loader의 runtime 주입/overwrite를 별도로 기록한다. export 전후 전체 operated state/history 불변은 이 경계의 증거다. |
| Export artifact | 완전한 native/static output과 bytes/hash를 기록한다. 앞선 loader 변화를 숨기거나 original roundtrip 성공으로 상속하지 않는다. |
loadedAt을 일괄 무시하거나 metadata를 잘라내는 normalizer로 원래 기준을 통과시키지 않는다. User-defined source metadata와 runtime-only state의 소유·저장 경계, actual private snapshot/raw/hash domain은 기존 #416 안에서 Root/정확한 shared loader owner와 합의해야 한다. Shared loader는 Storage FOUR와 Editor SIX 밖이므로 여기서 고치지 않았다. 원래 full native/byte/current-authority/export 기준은 남아 있으며 새 이슈·release gate·runtime activation을 추가하지 않는다.
#511 native2 복사에서 재사용할 #513
native2 copy를 지원할 때만 기존 #513을 입력으로 재사용한다. #513의 source/controlled 준비를 accepted runtime으로 표시하지 않는다.
- 기존 factory는
createAuthenticatedNative2Copy(), host seam은noteCopyLeaseFactory(tenantId, workspaceId, binding?)이다. 기존 privateopen(scope)는 complete captured source와prepare({title,idempotencyKey}),submit(attempt),recover(attempt), currentness/retirement를 제공한다. client/host lifetime은 opaque attempt를 보호한다. - 기존 create는 같은 tenant/workspace의
POST /note-native2/documents,importMode:new-page-copy, format Note/version2를 사용한다. 새 create protocol, caller token/fetch/role, 별도 copy store/UI를 만들지 않는다. 현재 sourceId는 caller DATA이고 create receipt는 server-attested source provenance가 아니다. Native2CopyReceipt의 operation/idempotencyKey/requestHash/document/snapshotText는 정확한 기존 요청과 native copy 결과에 상관되어야 한다. 기존 private request hash domain을 asset SHA256이나 확정 public SDK hash로 바꾸지 않는다.- 생성 receipt의 independent document/page/documentKey·revision과 full native/bundle은 첫 단계 결과다. 대상 asset ready→compatible native reference binding→기존 현재 write/CAS에 따른 final snapshot receipt/readback까지 별도로 확인한다. mapping이 selected schema에 맞지 않으면 block하거나 기존 명시적 adoption을 사용한다. pin/unknown native field/legacy 변환을 몰래 바꾸지 않는다.
recoverOriginal(input)의 새-login 경로는 기존 create receipt의 GET-only historical DATA를 재확인한다. 이는 기존 private submit attempt, 최신 native head, asset upload/current write capability가 아니다. 이후 대상의 현재 document 권한과 applicable accepted writer boundary를 다시 확인한다. 현재 호출이 이미 서버에 들어갔으면 retirement 후에도 commit할 수 있으므로 original uncertain operation과 later draft를 유지한다.
직접 owner interface checkpoint
Agreed FOUR helper source delivery — 2026-10-10
Immutable local candidate 51d33a7442a19292859eb0784a505118db39ad52, tree 82f8d02b047c29f38940da115941719475df0996, exact parent 54693e7f3234dda90192266b5c7aca1a0ffe93b6. Clean worktree /Users/user/.codex/worktrees/416-private-asset-helpers/barocss-editor, branch codex/416-private-asset-helpers, easylogic author/committer. Exactly FOUR new files: package office-site src/private-asset-sources.ts, test/private-asset-sources.test.ts, src/asset-export-plan.ts, test/asset-export-plan.test.ts. Existing host/renderer/codec/index and shared package/config/lock are unchanged.
Editor directly agreed the four disjoint paths. Workspace directly confirmed no competing claim on exact54693; its readonly report SHA256 is e0517db988aeefd2936d6a4576202cde66cfa63040ada281a7270e1e12c1aa03. Its earlier courier placeholder is not a receipt. Existing Site files still require a separately named lease. Root owns shared snapshot/wiring/runtime.
| Actual helper API | DATA and alias/lifetime semantics |
|---|---|
| collectPrivateRasterSources(native, {names,maxSlots,maxTotalBytes}) | Capture selected original/rendition slots before awaits, preserve native names/fields/all array order. Hard per-image 4 MiB; caller processing bounds are not a new server quota. Return frozen name/slot/width/path/nativeMediaType/media hint/count/hash and a bytes getter that copies fixed bytes. Parent MIME stays untouched; rendition hint may differ. Full media admission remains #412. |
| matchReadyAsset(source,destinationDocumentId,unknown) | Match exact seven public receipt fields, ready state and destination/media/count/hash. Return frozen ReadyAssetData; this is not current login/read/write/native authority. |
| async planAssetExport(readonly Asset[]) | One completed AssetExportPlan with readonly files {file,type,bytes:base64}[], original(name) and rendition(name,width) lookups. Capture inputs before awaits. Preserve all source data/names/renditions; collide originals AND variants with conservative case-insensitive keys. Uncollided paths keep existing projection; colliding paths use full filename identity SHA over the declared name/type/kind/width tuple. Reject remaining ambiguity/collisions/invalid width/unknown lookup. |
Editor confirmed existing exportPage/exportSite/drawn are synchronous. Future RenderEnv/assetSrc/srcset/favicon/dataset/carried lookup and file writer must consume the SAME completed plan. Do not await/recompute per asset, change public synchronous APIs or fix only zip entries. The current candidate performs no export/native apply/HTTP operation.
Workspace identified reusable host fields: tenant/workspace/issuer/subject/authorizedFetch/client ownership, isAuthorized, role/permission epoch, authority/access epoch, native generation/hostSlot and deepest input/pending/recovery. Existing dispatch/header and JSON guards do not qualify later arrayBuffer/stream bytes. Materialization must bracket each await with actual current account/document/root/target and cancel held body. An old ready receipt remains DATA. The accepted private transport/full materialization/512 KiB hash-receipt-recovery boundary is still unresolved with Root; original asset.data is not stripped or replaced by a sentinel.
Actual checks: new helper 13, affected 40 across five files PASS; final amended Node22.22.0/pnpm8.15.0 unchanged-budget preflight EXIT0. Source gate 45 projects/3 configured known-broken; Site test type budget21/21 unchanged. Raw package tsc still failed on existing sibling noUnused diagnostics with no helper diagnostic; it is not relabeled PASS. Preserved failures include missing future helper imports, explicit absent esbuild path, nested base64 regex stack overflow corrected by size-first linear matching, and NaN lookup wrongly selecting an original corrected by a positive-safe-integer guard. First completed preflight precedes that final amendment; the final gate applies to the amended committed source.
Source/check receipt /Users/user/.codex/visualizations/2026/10/10/416-private-binding-interface-v1/RESULT.json SHA256 49ad27d6198ce5ca4016d6b8d7a8bbb0a6762844551bca0f2d766091d28e06e3; 25-file manifest f34896366a3a7cdcca502c2f81483af38ca36db4186eb0f9dc3a3dc5365e5b6d; exact FOUR patch c4a71658ff3bda6a9320811cd5ca119e9a4c3fcade6ed447f74bd6a5f1c3513a. Source-only handoff delivered directly to Editor/Workspace/Integration. Actual consumer/current-authority/backend/copy/export/PG/S3/browser/restart acceptance remains unrun. #4121e6f/0018 and original #416 criteria stay intact.
Editor consumer lease amendment — EIGHT, separate from Storage FOUR
Latest declaration is TEN: Editor adds existing apps/site/src/runtime.ts and apps/site/test/runtime.test.ts to the EIGHT below after its immutable earlier gate completes. Zero-argument input witness retains its original refusal semantics; only the exact current entered exportSite/exportPage command may use the additional reader-command guard. Source/host callback and full-native actual runtime baseline still need their own executed evidence. No shared/core/auth/native-format lease follows this declaration; Storage's NUL TWO is disjoint.
Current TEN owner checkpoint: Editor consumed only verified51d→f421 TWO, with TEN own bytes unchanged and each source/index/size checked. Amended affected + mandatory gate53201 is RUNNING and not PASS. Earlier scoped runs are app/runtime24 (runtime17/App7), normal output1/late composition0 with complete state, and package consumer11 including editUndoABA/NUL sink refusal. Do not add these counts into a genuine campaign. First normal self-retirement5s timeouts remain. Optional exact current reader-command witness qualifies only its own executing command; zeroarg/foreign/input/ABA refusals remain. Sanctioned metadata full-original baseline is owner-reported as above, distinct from fixed raw/server hash/copy/authority/private512KiB/backend gates.
Editor declared its next exact slice on immutable51d: existing package office-site src/assets.ts, src/export-html.ts, src/renderers.ts, src/publish-commands.ts, test/assets.test.ts, new test/asset-export-consumer.test.ts, plus existing app Site src/app.tsx and test/input-readiness.test.tsx. These eight paths do not overlap Storage's four. The earlier immutable SIX gate94543 covers only that earlier tree; Editor waits for its terminal result before adding the TWO and runs the original App baseline5 before those writes. This is a scope/chronology record, not an EIGHT acceptance result.
The added App boundary is needed because digest planning introduces an await between flush and output delivery. Capture the existing lifecycle.captureInputIntent after flushBodies; enforce its owner/currentness and hasPendingInput across command preparation and package/host delivery. New composition/input, editor/root/model replacement, permission epoch or disposal must refuse stale output without losing the original or newer draft. The package and host must share this captured boundary, not rely only on editor/root equality. Preserve synchronous public APIs, full source/operated/native/history and all binary data; no format/auth/backend/shared-loader takeover follows this lease. The measured loadedAt gap stays separately unresolved.
NUL name refusal successor — existing #416 scope
Original51d remains immutable. Minimal actual helper baseline returned NUL-containing original/rendition paths with native input unchanged. Independent refusal/no delivery/source-preservation expectations preceded production repair; source test measured1FAIL6PASS. This is helper source RED, not executed filesystem/real exporter/API/private runtime acceptance.
Successor f421a8e5ef23a17d756886a569290b4c85db87ff, tree 4e619147cdf6a3e458273cc28c6ee50643f39c43, parent51d, easylogic both. Exactly TWO owned files: one NUL-name rejection in asset-export-plan.ts plus13 lines in its test. Refuse invalid_export_name before exposing output; no sanitizing/renaming/reencoding or replacement protocol. Native names/bytes/renditions and ordinary collision/data semantics are preserved.
Affected5files41PASS/new14 and final unchanged Node22.22/pnpm8.15 preflight EXIT0 (source45/known3; Site tests21/21). Source receipt 416-nul-name-refusal-v1/RESULT.json SHA fefd7db501ada3a75530d360d549d58fd31183f38987871d1b6f2939e8c8e234; 13-file index 918c4d899187dd8fc08dfcfe183fa2bccb365c90e34c551dca1f1e8dbffa0298; exact51d→TWO patch 9cd0d2cffb7fc71a3f4dcc41271f2e9d456ea6996880ea2f5c63e75afa3b5bb1. Deliver the narrow successor after original FOUR once; no whole branch/Four replay or runtime interruption. Original first evidence,51d qualification,1e6/0018 and all true consumer/transport/current-authority/native criteria remain.
| 실제 owner | 합의할 입력·출력 | 현재 상태 |
|---|---|---|
| Storage ↔ Integration | immutable #412 code/DTO/attempt, exact migration/export/config/registrar transaction, 실제 ready/read 객체 대조와 실패 위치 | #503 CLOSED; candidate/0018 예약 보존. 실제 현재 serial 작업의 안전 checkpoint와 #412 wiring/resource 준비를 Root가 조정 |
| Storage ↔ Editor | full native fixture/expected transform, ready asset DATA mapping, current target lifetime, native/export 완전성 | FOUR pure helper source/test lease agreed and51d33 delivered. Existing Site renderer/host/codec files and actual private mapping still separately agreed |
| Storage ↔ Workspace | 현재 verified host request/document create/update/recovery, account/document/binary lifetime, #511 지원 native mode | exact546 readonly seam/no FOUR conflict confirmed. Binary awaits need explicit currentness/cancel; real join remains pending. #513 reuse remains conditional source input |
| Integration ↔ 실제 campaign | protected current actor/source/destination, canonical before/after, stage failure/held reply/control, 같은 DB/object restart | owner가 실제 실행 자원과 control을 제공한 뒤 실행. 가짜 backend/authority/global을 만들지 않음 |
실제 실행 기록에는 case ID, complete source/expected artifact hashes, original/request/native/object/export digest 이름, stage별 fixed key/receipt/revision/identity, 명령과 exit code, 실제 권한/dispatch 상태, canonical before/after, 남은 draft/uncertain evidence를 남긴다. private fixture·credential은 공개 Wiki/Issue에 복사하지 않는다.