# 인수인계 요약 — poster-desk-lab/1.0.2

[전체 학습용 ZIP 다운로드](https://yenpo.app/examples/poster-desk-handoff-1.0.2.zip) · SHA-256: `c39d19b210c05f4667cd74db4934459a079408d14c5e7678c24cd087e1df5185`

ZIP 안에 있는 요약의 읽기용 사본입니다. 아래 소스와 스크립트 경로는 압축을 푼 `poster-desk-lab` 폴더를 기준으로 합니다. 명령을 실행하고 인수 템플릿을 복사하려면 ZIP을 사용하세요.

목적은 나중에 로컬에서 검토할 포스터 제목을 받는 것입니다. 확인할 제품 약속은 가상으로 만들었으며 AI 출력에서 가져온 주장이 아닙니다. Node.js 22 이상이 필요하며 설치, 네트워크, 자격 증명은 필요하지 않습니다. 새 디렉터리에 압축을 풀고 `poster-desk-lab`으로 들어가 각 명령을 따로 실행하세요. 이 요약은 정확히 해당 패키지와 함께 보관하고 줄 참조를 읽기 전에 매니페스트를 검증하세요.

## 기능에 관한 사실

| ID  | 약속과 실제 관찰                                                                                                                                                            | 분류와 한계                                                                                                                    | 이 리비전의 소스                                                                      |
| --- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------- |
| P1  | “제출한 카드를 나중에 검토할 수 있다.” 별도의 Node 프로세스가 보존된 동일 상태 디렉터리에서 저장한 정확한 ID와 제목을 조회합니다.                                           | **구현됨** — 순차 프로세스 간 로컬 파일 저장입니다. 충돌 시 내구성, 원격 데이터베이스, 배포 후 보존을 뜻하지 않습니다.         | `src/store.mjs` 46–76행, `src/cli.mjs` 12–17행                                        |
| P2  | “영수증을 전송한다.” 수락 결과에는 `adapter: fixture`, `delivery: not-attempted`인 예시 미리보기가 포함됩니다.                                                              | **mock** — 미리보기만 있고 전달은 시도하지 않았습니다. 더 넓은 “전송됨” 약속은 이 패키지에서 성립하지 않습니다.                | `src/cli.mjs` 1–2, 15–17행이 `src/receipt.mjs` 3–7행과 `fixtures/receipt.json`을 선택 |
| P3  | “같은 카드를 재시도해도 중복되지 않는다.” 같은 ID와 제목을 순차적으로 반복하면 `created: false`이며 목록에는 카드 하나만 남습니다. 같은 ID에 다른 텍스트를 쓰면 거부합니다. | **구현됨** — 보존된 이 디렉터리의 정확히 같은 순차 재시도입니다. 동시 실행, 중단된 쓰기, 외부 알림 재시도는 보장하지 않습니다. | `src/store.mjs` 46–60행                                                               |
| P4  | “배포를 교체해도 제출한 카드가 남는다.” 배포 환경이나 상태 디렉터리 수명 주기 정보는 없습니다. 디렉터리를 유지하면 카드가 남고 새 디렉터리는 비어 있습니다.                 | **미확인** — 두 로컬 결과만으로 배포에서 어떤 저장소를 유지하는지 알 수 없습니다. P1을 P4로 확대하지 마세요.                   | `src/store.mjs` 7–9, 22–38행. 이 스냅샷에 배포 설정 없음                              |

여기서 “구현됨”은 입증된 범위만 뜻합니다. “mock”은 알고 있는 모의 경로이며 테스트하지 않은 실제 서비스가 아닙니다. “미확인”은 필요한 환경 증거가 없는 주장이며 기능이 없다고 확인한 상태가 아닙니다.

## 받아서 재현하기

```sh
node --version
node scripts/verify-package.mjs
node scripts/copy-receiver.mjs
node src/cli.mjs init receiver-state
node src/cli.mjs submit receiver-state cloud-poster "Cloud shapes"
node src/cli.mjs list receiver-state
node src/cli.mjs submit receiver-state cloud-poster "Cloud shapes"
node src/cli.mjs list receiver-state
node src/cli.mjs submit receiver-state cloud-poster "Different title"
node src/cli.mjs list receiver-state
node src/cli.mjs init replacement-state
node src/cli.mjs list replacement-state
node src/cli.mjs list receiver-state
node src/cli.mjs init receiver-state
node src/cli.mjs list receiver-state
node --test tests/contract.test.mjs tests/receiver-copy.test.mjs
```

기대 결과: 첫 제출은 `accepted: true`, `created: true`이며 fixture 영수증에 `delivery: not-attempted`가 있습니다. 첫 목록은 `{"cards":[{"id":"cloud-poster","title":"Cloud shapes"}]}`입니다. 정확히 같은 재시도는 `created: false`이며 목록을 바꾸지 않습니다.

다른 제목 명령은 **종료 코드 2**를 반환하고 stderr에 `{"error":"card-id-conflict"}`를 출력하며 stdout은 비어 있습니다. 이어지는 목록에는 원래 제목이 그대로 있습니다. 새 `replacement-state`의 목록은 `{"cards":[]}`이고 보존된 `receiver-state`에는 여전히 카드가 있습니다. `receiver-state`를 다시 초기화하면 `{"error":"EEXIST"}`와 함께 **종료 코드 2**로 끝나며 대체하지 않습니다. 두 경우는 예상한 거부이며 성공 종료 상태가 아니므로 명령을 `&&`로 연결하지 마세요. 재초기화 거부 뒤 목록에는 다시 원래 카드가 보여야 합니다. 다섯 테스트가 통과하며 하나는 외부 인수 기록을 실제로 복사하고 채운 뒤 원본 패키지를 검증합니다.

각 CLI 줄은 별도 프로세스입니다. 보존된 파일을 사용하는 프로세스 재시작을 확인합니다. 빈 대체 디렉터리는 비교용 로컬 설정이며 **실제 배포 실험은 아닙니다**.

## 인수 판단과 열린 질문

위 복사 명령은 변경하지 않을 `RECEIVER.md` 템플릿을 압축 해제한 패키지 밖의 `../poster-desk-receiver.md`에 복사하며 기존 사본을 덮어쓰지 않습니다. 자신의 출력과 소스 읽기로 **그 외부 사본**을 완성하세요. 전달받은 템플릿은 유지하고 인수 기록을 원본 패키지 매니페스트와 분리하세요. 사본을 채운 뒤 실행합니다.

```sh
node scripts/verify-package.mjs
```

원본 패키지는 계속 통과해야 합니다. 명시한 범위에서 P1/P3가 일치하고 P2는 모의 기능으로 남으며 P4는 열린 상태일 때만 이 인수인계를 수락하세요. 미확인 사항은 패키지의 알려진 로컬 관찰을 실패로 표시할 이유가 아니라 배포 후 보존을 약속하지 않을 이유입니다.

실제 환경에서 P4를 해결하려면 정확한 배포·저장소 설정을 확보하고, 사용이 승인된 비민감 데이터로 알려진 레코드가 해당 환경의 교체 절차를 거쳐 유지되는지 독립적으로 테스트하세요. 여기에는 그러한 설정이나 테스트가 없습니다. 동시 쓰기, 전원 손실, 백업 복원, 실제 알림도 평가하지 않았습니다. 소스는 영수증을 준비하기 전에 카드를 기록하므로 영수증 실패 뒤에도 카드가 저장되어 있을 수 있습니다. 오류만으로 아무것도 저장되지 않았다고 판단할 수는 없습니다.
