manifest
manifest는 기록마다 「언제, 무엇이, 어떤 지문으로, 누구 것으로, 어디까지 열려, 어디로 갔는지」를 적는 장부다.
1. 안은 하나, 밖은 표준
섹션 제목: “1. 안은 하나, 밖은 표준”- 안에서는 한 가지 모양만 쓴다. 기록 한 줄짜리 장부(아래 2절)다. 녹음이든 고문서든 공통 칸은 같고, 유형마다 칸 몇 개만 더한다(4절).
- 밖으로 낼 때 국제 표준 모양으로 만들어 낸다. 고문서는 IIIF 매니페스트로, 통째로 내려받기는 BagIt 꾸러미로, 출처 표시는 C2PA로(7절). arkive가 지금 IIIF 매니페스트를 그때그때 만들어 내는 것과 같은 방식이다.
- 저장하는 것은 우리 장부 하나뿐이다. 같은 내용을 여러 모양으로 저장하면 언젠가 서로 어긋난다.
- 칸 이름은 짧은 영어로, 값은 가능한 한 표준 어휘를 그대로 쓴다. 「조문은 우리 말, 필드는 표준 말」(외부 표준 매핑 3절).
2. 장부의 모양
섹션 제목: “2. 장부의 모양”- 파일: 기탁자의 하루 폴더마다
manifest.jsonl하나. 한 줄에 JSON 하나(JSON Lines), UTF-8. - 덧붙이기만 한다. 지난 줄은 고치지도 지우지도 않는다. 상태가 바뀌면 그 기록의 최신 줄을 복사해 바꾼 뒤 새 줄로 더한다.
- 같은
id의 마지막 줄이 지금 상태다. - 장부가 깨져도 원본 파일과 지문으로 다시 만들 수 있어야 한다. 파일이 진짜다.
3. 공통 칸
섹션 제목: “3. 공통 칸”필수: 모든 줄에 있어야 한다. 원본: 원본 기록에만. 해석: 해석층(초벌, 확인본, 파생) 기록에만. 선택: 있을 때만.
| 칸 | 뜻 | 예시 | 언제 | 표준 대응 |
|---|---|---|---|---|
hgp |
따른 규격 판 | "2026.10" |
필수 | HGP-0010 규격판 |
id |
기록 번호. 기기에서 만든다 | "3f9a1c2e-7b4d-4e1a-9c2f-0d8e5a6b7c10" |
필수 | UUID (RFC 9562) |
at |
이 줄을 쓴 시각 | "2026-10-11T08:47:10+09:00" |
필수 | RFC 3339 |
event |
이 줄을 쓴 까닭 (5절) | "received" |
필수 | PREMIS 3 사건 이름 |
status |
지금 처리 상태 (앱마다 다름) | "corrected" |
선택 | |
depositor |
기탁자 번호. 이름이 아니다 | "u_7k2m9q" |
필수 | ODRL assigner |
kind |
데이터 유형 (4절) | "audio" |
필수 | |
level |
원본격. original 원본, draft 초벌, confirmed 확인본, derived 파생 (04-층 2절) |
"original" |
필수 | PROV-O Entity |
file |
파일 위치 (하루 폴더 기준) | “raw/ |
필수 | |
mime |
파일 형식 | "audio/mp4" |
필수 | IANA 미디어 타입 |
bytes |
파일 크기 | 8213004 |
필수 | |
sha256_device |
기기에서 뜬 지문. 못 떴으면 null |
"a3f9…" |
원본 | 02-지문 2절 |
sha256_store |
저장소에서 뜬 지문 = 원본 지문 | "a3f9…" |
필수 | BagIt manifest-sha256, PREMIS messageDigest |
sha256_stored |
잠근 파일의 지문 (보관 지문) | null |
잠갔을 때 | 02-지문 4절 |
encryption |
잠금 | "none" 또는 "user-key" |
필수 | |
store |
원본이 지금 있는 곳. staging(앱 서버의 임시 저장고) 또는 arkive (04-층 4절) |
"staging" |
원본 | |
started_at |
기록이 시작된 때 (스캔은 촬영한 때) | "2026-10-11T08:12:03+09:00" |
원본 | RFC 3339 |
source_type |
어떻게 생겨났나 (6절) | "digitalCapture" |
필수 | IPTC digitalSourceType |
action |
만든 행위 | "c2pa.created" |
필수 | C2PA c2pa.actions.v2 |
derived_from |
어느 기록에서 나왔나 (원본 지문들) | ["a3f9…"] |
해석 | PROV wasDerivedFrom, C2PA ingredient |
made_by |
누가 만들었나. 사람인지 기계인지 | {"type":"machine","name":"scribe_v2","provider":"elevenlabs"} |
필수 | PROV wasAttributedTo |
confirmed_by |
누가 어느 자격으로 확인 도장을 찍었나 (01-권한 2절). at은 도장 찍은 때로, 줄의 at(적은 때)과 따로다. 대개 같다 |
{"who":"u_7k2m9q","as":"depositor","at":"2026-10-11T21:03:00+09:00"} |
선택 | |
edits |
고친 곳 수. 사람과 기계 따로 | {"human":3,"machine":41} |
선택 | |
scope |
범위 (00-원칙 3절) | "private" |
필수 | ODRL 정책 묶음 |
approval_required |
「승인 필요」 표시 | false |
선택 | |
scope_after |
기한이 있는 범위 (07-기탁 5절) | [{"at":"2050-01-01","scope":"public"}] |
선택 | NAK 8 공개예정일자 |
owner |
소유자 번호. 기탁자와 다를 때만. 모르면 {"known":false} (07-기탁 2절) |
"g_house_a" |
다를 때 | CIDOC-CRM P52 |
holder |
실물 보관처 (07-기탁 2절) | "org_ksi" |
선택 | CIDOC-CRM P50 |
agreement |
기탁 약정 번호 (07-기탁 4절) | "ag-0001" |
소유자 ≠ 기탁자일 때 | ODRL Agreement |
rights |
해석층의 권리 근거와 권리자 (07-기탁 3절) | {"basis":"copyright","holder":"u_3x8p"} |
해석 | PREMIS rightsBasis |
consent |
쓰임새 동의 네 칸 (00-원칙 4절) | {"archive":true,"family":false,"publish":false,"train":false,"at":"…"} |
원본 | ODRL Permission |
voices |
다른 사람 목소리와 그 동의 | [{"who":"p_2","consent":"yes","at":"…"}] |
선택 | |
sent_to |
원본이나 글이 밖으로 간 기록 (8절) | [{"provider":"elevenlabs","purpose":"transcribe","what":"audio","at":"…","last_at":"…","count":1}] |
선택 | PROV Activity |
via |
원본이 저장소에 오기 전에 거쳐 온 바깥 곳 (결정 0017) | ["telegram"] |
선택 | PROV wasInfluencedBy |
title |
제목 | "아침 산책" |
선택 | |
people |
나온 사람 | ["길동이"] |
선택 |
값 이름표:
scope:sealed봉인 ·private나만 ·relation관계 ·community조합 ·public공개rights.basis:none권리 없음(옛 글 자체) ·ownership소유권과 약정 ·copyright만든 사람의 저작권 ·contract약정이 정함 ·unsettled법이 아직 분명하지 않음made_by.type:human사람 ·machine기계voices[].consent:yes·no·asked(물었고 답 기다림)confirmed_by.as:depositor기탁자 ·editor사람 수정자 ·admin관리자 (기탁자가 그 기록을 맡겼을 때만). 기계는 값이 없다consent.train:false, 또는 동의한 학습의 목록[{"by":"nodeone","for":"ocr"}].by는 누가,for는 무엇을 가르치나. 목록에 없는 쓰임은 동의하지 않은 것이다encryption:none·user-key
title, people, voices의 사람 이름은 해석 정보다. 저장소 안에만 두고, 잠글 때 원본과 함께 잠그고, 인증소나 앵커로 절대 나가지 않는다(9절).
4. 유형별 칸
섹션 제목: “4. 유형별 칸”공통 칸에 유형마다 아래 칸을 더한다. 바깥 표준은 그 유형을 밖에 낼 때 쓰는 모양이다.
녹음 audio
섹션 제목: “녹음 audio”| 칸 | 뜻 | 예시 |
|---|---|---|
duration_sec |
길이 (초) | 2052 |
codec, sample_rate, channels |
소리 형식 | "aac", 44100, 1 |
device |
녹음한 기기 | "SM-S921N" |
place |
장소. 정밀도는 기탁자가 고른다 | "안동" |
바깥 표준: 보기와 교환은 IIIF 3 캔버스(길이 있는 캔버스), 전사의 각 대목은 W3C Web Annotation으로 시간 구간을 가리킨다(#t=12.5,18.0, W3C Media Fragments). 자막으로 낼 때는 WebVTT. 출처 표시는 C2PA(m4a 같은 MP4 계열은 c2pa.hash.bmff.v3). 구술 기록 보관소와 주고받을 때만 PBCore 또는 OHMS, 국내 기관이면 국립중앙도서관 「구술자료 메타데이터 작성 지침」(2023). 이 지침도 「태어날 때부터 디지털인 파일은 원래 형식을 그대로 보존한다」고 한다. 녹음 원본을 다른 형식으로 바꿔 내지 않는다.
고문서·종이 스캔 scan
섹션 제목: “고문서·종이 스캔 scan”| 칸 | 뜻 | 예시 |
|---|---|---|
book |
권 번호 | "book-0001" |
seq |
권 안의 순서 | 4 |
width, height, dpi |
이미지 크기 | 2481, 3508, 400 |
faces |
이 파일에 든 면들 (IIIF 캔버스와 그 안의 영역) | [{"canvas":"c-004a","xywh":[0,0,2481,1000]},{"canvas":"c-004b","xywh":[0,1000,2481,1000]}] |
from_bundle |
받은 묶음 파일 지문과 그 안의 위치 | {“sha256”:“9be1…”,“path”:“scan-bundle/ |
바깥 표준: 보기와 교환은 IIIF Presentation 3(면 = 캔버스, 권 = 매니페스트)와 IIIF Image API. 판독문 각 줄은 W3C Web Annotation으로 이미지 영역을 가리킨다(#xywh=). arkive가 이미 이렇게 내보낸다. 기관과 판독문을 주고받을 때 TEI, 꾸러미째 주고받을 때 METS.
사진 photo
섹션 제목: “사진 photo”| 칸 | 뜻 | 예시 |
|---|---|---|
width, height |
크기 | 4032, 3024 |
taken_at |
찍은 때 | "2026-10-11T07:58:00+09:00" |
place |
장소. 정밀도는 기탁자가 고른다 | "하회마을" |
파일 안의 EXIF·XMP 정보는 원본의 일부라 건드리지 않는다. 바깥 표준: IPTC Photo Metadata, C2PA, 보기는 IIIF 3 캔버스.
영상 video
섹션 제목: “영상 video”duration_sec, width, height, codec, device, place. 바깥 표준: IIIF 3 캔버스(길이와 크기가 함께 있는 캔버스), C2PA(c2pa.hash.bmff.v3), 자막은 WebVTT.
직접 친 글 text
섹션 제목: “직접 친 글 text”| 칸 | 뜻 | 예시 |
|---|---|---|
language |
언어 | "ko" (BCP 47) |
chars |
글자 수 | 812 |
형식은 text/plain 또는 text/markdown, UTF-8.
해석층 기록 (전사, 교정, 번역, 요약)
섹션 제목: “해석층 기록 (전사, 교정, 번역, 요약)”유형은 원본을 따른다(녹음의 전사본도 kind: "audio"). level은 draft, confirmed, derived 가운데 하나이고, derived_from과 made_by가 반드시 있다. 해석층의 칸 모양은 원본 유형의 바깥 표준(Web Annotation)을 따른다.
5. 사건 이름 (event)
섹션 제목: “5. 사건 이름 (event)”국제 보존 표준 PREMIS 3의 사건 이름에 맞춘다.
event |
뜻 | 가장 가까운 PREMIS 사건 |
|---|---|---|
captured |
기기에서 기록이 끝나고 지문을 떴다 | capture |
received |
저장소가 받았고 지문이 맞았다. 임시 저장고에서 arkive로 옮길 때도 이 이름을 한 번 더 쓰고 store가 바뀐다 (결정 0017) |
ingestion |
fixity_checked |
정기 확인에서 지문이 맞았다 | fixity check |
fixity_failed |
정기 확인에서 지문이 다르거나 파일이 없다 | fixity check |
sent |
원본이나 글이 밖으로 나갔다 (8절) | transfer |
derived |
이 기록에서 해석이 하나 생겼다 | creation |
confirmed |
사람이 확인 도장을 찍었다 | validation |
scope_changed |
범위가 바뀌었다 | policy assignment |
consent_changed |
쓰임새 동의가 바뀌었다 | policy assignment |
encrypted |
기탁자 열쇠로 잠갔다 | encryption |
destroyed |
열쇠를 없앴다 (지우기). 이 줄은 남는다 | deletion |
status |
앱의 처리 상태만 바뀌었다 |
6. 어떻게 생겨났나 (source_type)
섹션 제목: “6. 어떻게 생겨났나 (source_type)”IPTC digitalSourceType 어휘를 그대로 쓴다. 값만 맞추면 되는 표준이라 지금 「준수」라고 말할 수 있는 유일한 것이다(외부 표준 매핑 0절). 아래는 HGP 9월 「기록 좌표 예제」를 따른 것이다.
| 기록 | level |
action |
source_type |
|---|---|---|---|
| 녹음 원본, 직접 찍은 사진·영상 | 원본 | c2pa.created |
digitalCapture |
| 고문서·육필 원고 스캔 | 원본 | c2pa.created |
digitalCapture |
| 직접 친 글 | 원본 | c2pa.created |
digitalCreation |
| 기계 전사, OCR, 초벌 탈초 | 초벌 | c2pa.converted |
trainedAlgorithmicMedia |
사전 교정 (사전으로 확실한 것만 바꿈. made_by에 사전) |
초벌 | c2pa.edited |
trainedAlgorithmicMedia (바탕이 기계 전사) |
| 사람이 고치거나 확인한 확인본 | 확인본 | c2pa.edited |
humanEdits |
| 잡음 제거한 음원 | 확인본급 | c2pa.edited |
algorithmicallyEnhanced |
| AI 요약, 번역 | 파생 | c2pa.created |
trainedAlgorithmicMedia |
| AI로 바꾼 목소리 (대역) | 없음 | c2pa.edited |
trainedAlgorithmicMedia |
9월 예제는 기계 전사(초벌)의 source_type을 「해당 없음」으로 비워 두었다. 여기서는 원칙 6(AI 기여 표시)을 위해 trainedAlgorithmicMedia로 채운다.
AI 기여 표시는 이 칸과 made_by, confirmed_by, edits로 계산한다. 예: 「기계 전사, 사람 확인, 사람이 3곳 고침」.
7. 밖으로 낼 때 쓰는 국제 표준
섹션 제목: “7. 밖으로 낼 때 쓰는 국제 표준”등급은 HGP 9월 「외부 표준 매핑」을 따른다. 준수: 검사 도구로 확인했다. 정합: 우리 것을 그 표준 모양으로 바꿔 낼 수 있다. 참조: 참고했다. 검사하기 전에는 「준수」라고 쓰지 않는다.
| 쓰임 | 표준 | 지금 등급 | 준수로 올리려면 |
|---|---|---|---|
| 지문 | SHA-256 (FIPS 180-4) | 준수 | |
| 시각, 번호, 형식, 언어 | RFC 3339, UUID (RFC 9562), IANA 미디어 타입, BCP 47 | 준수 | |
| 어떻게 생겨났나 | IPTC digitalSourceType |
준수 | |
| 통째로 내려받기 | BagIt (RFC 8493). manifest-sha256.txt에 우리 원본 지문이 그대로 들어간다 |
정합 | BagIt 검사 도구 통과 |
| 고문서 보기·교환 | IIIF Presentation 3 | 준수 | arkive 매니페스트 여섯 권이 IIIF 공식 검사기(presentation-validator 3.0) 경고 없이 통과 (2026-10-12). 지문은 metadata와 seeAlso 지문 묶음으로 (02-지문 9절, 결정 0009) |
| 고문서 그림 내기 | IIIF Image API | 정합 | arkive가 Image API 서비스를 열고 검사 도구 통과 |
| 녹음·영상 보기 | IIIF Presentation 3 (길이 있는 캔버스) | 정합 | secretary가 낸 매니페스트가 같은 검사기 통과 |
| 전사·교정·의견 | W3C Web Annotation (판독은 supplementing, 고침 제안은 editing, 의견은 commenting) |
정합 | |
| 출처와 AI 표시를 파일에 붙이기 | C2PA 2.x, CAWG Identity | 정합 | 서명을 붙이고 C2PA 검사 도구 통과 (secretary v0.2 이후) |
| 범위와 쓰임새 | W3C ODRL 2.2 | 정합 | HGP ODRL 프로파일 발표 |
| 내력 사슬 | W3C PROV-O | 정합 | |
| 보존 사건 | PREMIS 3 사건 이름 | 정합 | |
| 저장 폴더 모양 | OCFL | 참조 | |
| 구술 보관소 교환 | PBCore, OHMS, 국립중앙도서관 「구술자료 메타데이터 작성 지침」(2023.1, 국내 구술 기관 공통) | 참조 | 상대 기관이 생길 때. 국내 기관에 낼 때는 국립중앙도서관 지침이 먼저다 |
| 판독문·꾸러미 교환 | TEI, METS | 참조 | 상대 기관이 생길 때 |
한국 기관(국학진흥원, 국가기록원 등)과 주고받을 때는 그 기관의 표준을 따로 확인해 이 표에 더한다.
8. 원본이 밖으로 간 기록 (sent_to)
섹션 제목: “8. 원본이 밖으로 간 기록 (sent_to)”전사처럼 원본이 다른 회사로 가면 그 사실을 남긴다(원칙 5).
- 보내기 전에 먼저 적는다. 보낸 뒤에 적으면, 보내고 나서 멈췄을 때 기록이 빠진다. secretary 모델 게이트웨이가 지금 이렇게 한다.
sent_to에는 (provider,purpose,what) 짝마다 한 칸만 둔다.at은 처음,last_at은 마지막,count는 횟수다 (결정 0017).event: "sent"줄은 그 짝으로 그날 처음 보낼 때 하나 쓴다.- 학습(
train)은 묶지 않는다. 보낼 때마다sent_to에 따로 더하고 줄도 따로 쓴다.
| 칸 | 뜻 | 값 |
|---|---|---|
provider |
어느 회사 | "elevenlabs", "anthropic" |
purpose |
무엇 하러 | "transcribe" 전사, "chat" 비서 대화, "interpret" 해석, "train" 학습 (consent.train에 있는 곳으로만) |
what |
무엇이 갔나 | "audio" 원본 소리, "text" 글 |
at |
처음 보낸 때 | RFC 3339 시각 |
last_at |
마지막으로 보낸 때 | RFC 3339 시각 |
count |
보낸 횟수 | 수 |
- 돌아온 결과(전사본 등)는 새 해석 기록으로 만든다.
derived_from에 원본 지문,made_by에 그 회사와 모델을 적는다. - secretary v0 스펙 예시는
purpose를"전사"로 적었지만 코드는"transcribe"만 받는다. 영어 이름표로 맞춘다.
9. 밖에 나가는 칸과 안에만 있는 칸
섹션 제목: “9. 밖에 나가는 칸과 안에만 있는 칸”| 어디로 | 나가는 칸 |
|---|---|
| 인증소, 등록부 (HGP-0005 10절) | hgp, sha256_store, at, event, scope, 서명 |
| 앵커 (밖에 새기기) | 노드 하루 지문 한 줄과 시각만 (02-지문 6절) |
| 공개 원장 위의 등록부 (범위가 공개인 기록만, 결정 0016) | 판 번호, 기록 전체의 지문, 앞 기록의 등록부 줄 번호. 저장고 운영자 서명 |
| 통째로 내려받기 (기탁자 본인) | 전부 |
나머지(title, people, voices, place, sent_to 등)는 저장소 안에만 있다.
10. 예시
섹션 제목: “10. 예시”녹음 원본이 저장소에 들어온 줄:
{"hgp":"2026.10","id":"3f9a1c2e-7b4d-4e1a-9c2f-0d8e5a6b7c10","at":"2026-10-11T08:46:30+09:00","event":"received","status":"received","depositor":"u_7k2m9q","kind":"audio","level":"original","file":"raw/081203_3f9a1c2e.m4a","mime":"audio/mp4","bytes":8213004,"sha256_device":"a3f9c1…","sha256_store":"a3f9c1…","encryption":"none","started_at":"2026-10-11T08:12:03+09:00","source_type":"digitalCapture","action":"c2pa.created","made_by":{"type":"human","who":"u_7k2m9q"},"scope":"private","consent":{"archive":true,"family":false,"publish":false,"train":false,"at":"2026-10-11T08:12:03+09:00"},"duration_sec":2052,"codec":"aac","sample_rate":44100,"channels":1,"title":"아침 산책","people":["길동이"]}같은 녹음을 전사 회사로 보낸 줄 (바로 앞 줄을 복사해 바꿈, 바뀐 칸만 보이면):
{"at":"2026-10-11T08:47:10+09:00","event":"sent","status":"transcribing","sent_to":[{"provider":"elevenlabs","purpose":"transcribe","what":"audio","at":"2026-10-11T08:47:10+09:00"}]}돌아온 기계 전사본 (새 기록):
{"hgp":"2026.10","id":"5c1e0b7a-2d3f-4a8b-9e6c-1f2a3b4c5d6e","at":"2026-10-11T08:52:44+09:00","event":"derived","depositor":"u_7k2m9q","kind":"audio","level":"draft","file":"transcripts/081203_3f9a1c2e_raw.md","mime":"text/markdown","bytes":31877,"sha256_store":"7d20e4…","encryption":"none","source_type":"trainedAlgorithmicMedia","action":"c2pa.converted","derived_from":["a3f9c1…"],"made_by":{"type":"machine","name":"scribe_v2","provider":"elevenlabs"},"scope":"private"}고문서 스캔 한 장 (면 둘이 든 파일):
{"hgp":"2026.10","id":"0b6f2c9d-4e1a-4c3b-8a7d-6e5f4a3b2c1d","at":"2026-10-11T20:58:23+09:00","event":"received","depositor":"u_9c4w1n","kind":"scan","level":"original","file":"scans/book-0001/img004.jpg","mime":"image/jpeg","bytes":1003501,"sha256_device":null,"sha256_store":"a2c7bb…","encryption":"none","source_type":"digitalCapture","action":"c2pa.created","made_by":{"type":"human","who":"국학진흥원 촬영"},"scope":"private","consent":{"archive":true,"family":false,"publish":false,"train":false,"at":"2026-10-11T20:58:23+09:00"},"book":"book-0001","seq":4,"width":2481,"height":3508,"faces":[{"canvas":"c-004a","xywh":[0,0,2481,1754]},{"canvas":"c-004b","xywh":[0,1754,2481,1754]}],"from_bundle":{"sha256":"9be1d0…","path":"scan-bundle/img004.jpg"}}하루 지문 줄과 권 지문 줄 (02-지문 5·6절):
{"hgp":"2026.10","event":"day_root","depositor":"u_7k2m9q","day":"2026-10-11","version":1,"count":3,"method":"rfc6962-sha256","root":"e81f03…","at":"2026-10-14T00:00:00+09:00"}{"hgp":"2026.10","event":"book_root","book":"book-0001","version":2,"count":143,"method":"rfc6962-sha256","root":"4c9a7e…","at":"2026-10-11T21:30:00+09:00"}11. 지금 있는 장부와의 대응
섹션 제목: “11. 지금 있는 장부와의 대응”| 지금 | 이 문서 |
|---|---|
secretary sha256_phone |
sha256_device |
secretary sha256_server |
sha256_store |
secretary id, file, started_at, duration_sec, title, people, status, sent_to, encryption, store, at |
같은 이름 그대로 |
arkive fixity.tsv의 sha256, path, size, registered_at, source |
sha256_store, file, bytes, at(event: "received"), from_bundle |
arkive readings.jsonl의 made_by, agent_type, verified_by |
made_by.who, made_by.type, confirmed_by |
9월 규격과 hgp v0.1의 level 값 L0, L1, L2, L3 |
original, draft, confirmed, derived |
arkive corrections.jsonl의 상태 accepted |
event: "confirmed", confirmed_by |
개인 아카이브 hashes.jsonl의 layer: A~D |
쓰지 않는다 (9월 용어 정본에서 걷어 낸 칸). level로 |
secretary와 arkive는 당장 이름을 바꾸지 않아도 된다. 다음에 데이터 구조를 바꿀 때 이 문서에 맞추고, 그때까지는 읽을 때 같은 것으로 본다. 이름을 바꾸는 것은 각 저장소의 데이터 구조 변경이라 따로 승인을 받는다.