콘텐츠로 이동

manifest

문서
03
상태
초안
판
v0.7
날짜
2026-10-13

manifest는 기록마다 「언제, 무엇이, 어떤 지문으로, 누구 것으로, 어디까지 열려, 어디로 갔는지」를 적는 장부다.


  • 안에서는 한 가지 모양만 쓴다. 기록 한 줄짜리 장부(아래 2절)다. 녹음이든 고문서든 공통 칸은 같고, 유형마다 칸 몇 개만 더한다(4절).
  • 밖으로 낼 때 국제 표준 모양으로 만들어 낸다. 고문서는 IIIF 매니페스트로, 통째로 내려받기는 BagIt 꾸러미로, 출처 표시는 C2PA로(7절). arkive가 지금 IIIF 매니페스트를 그때그때 만들어 내는 것과 같은 방식이다.
  • 저장하는 것은 우리 장부 하나뿐이다. 같은 내용을 여러 모양으로 저장하면 언젠가 서로 어긋난다.
  • 칸 이름은 짧은 영어로, 값은 가능한 한 표준 어휘를 그대로 쓴다. 「조문은 우리 말, 필드는 표준 말」(외부 표준 매핑 3절).
  • 파일: 기탁자의 하루 폴더마다 manifest.jsonl 하나. 한 줄에 JSON 하나(JSON Lines), UTF-8.
  • 덧붙이기만 한다. 지난 줄은 고치지도 지우지도 않는다. 상태가 바뀌면 그 기록의 최신 줄을 복사해 바꾼 뒤 새 줄로 더한다.
  • 같은 id의 마지막 줄이 지금 상태다.
  • 장부가 깨져도 원본 파일과 지문으로 다시 만들 수 있어야 한다. 파일이 진짜다.

필수: 모든 줄에 있어야 한다. 원본: 원본 기록에만. 해석: 해석층(초벌, 확인본, 파생) 기록에만. 선택: 있을 때만.

칸 뜻 예시 언제 표준 대응
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/081203_3f9a1c2e.m4a” 필수
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절).

공통 칸에 유형마다 아래 칸을 더한다. 바깥 표준은 그 유형을 밖에 낼 때 쓰는 모양이다.

칸 뜻 예시
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). 이 지침도 「태어날 때부터 디지털인 파일은 원래 형식을 그대로 보존한다」고 한다. 녹음 원본을 다른 형식으로 바꿔 내지 않는다.

칸 뜻 예시
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/img004.jpg”}

바깥 표준: 보기와 교환은 IIIF Presentation 3(면 = 캔버스, 권 = 매니페스트)와 IIIF Image API. 판독문 각 줄은 W3C Web Annotation으로 이미지 영역을 가리킨다(#xywh=). arkive가 이미 이렇게 내보낸다. 기관과 판독문을 주고받을 때 TEI, 꾸러미째 주고받을 때 METS.

칸 뜻 예시
width, height 크기 4032, 3024
taken_at 찍은 때 "2026-10-11T07:58:00+09:00"
place 장소. 정밀도는 기탁자가 고른다 "하회마을"

파일 안의 EXIF·XMP 정보는 원본의 일부라 건드리지 않는다. 바깥 표준: IPTC Photo Metadata, C2PA, 보기는 IIIF 3 캔버스.

duration_sec, width, height, codec, device, place. 바깥 표준: IIIF 3 캔버스(길이와 크기가 함께 있는 캔버스), C2PA(c2pa.hash.bmff.v3), 자막은 WebVTT.

칸 뜻 예시
language 언어 "ko" (BCP 47)
chars 글자 수 812

형식은 text/plain 또는 text/markdown, UTF-8.

해석층 기록 (전사, 교정, 번역, 요약)

섹션 제목: “해석층 기록 (전사, 교정, 번역, 요약)”

유형은 원본을 따른다(녹음의 전사본도 kind: "audio"). level은 draft, confirmed, derived 가운데 하나이고, derived_from과 made_by가 반드시 있다. 해석층의 칸 모양은 원본 유형의 바깥 표준(Web Annotation)을 따른다.

국제 보존 표준 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 앱의 처리 상태만 바뀌었다

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곳 고침」.

등급은 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 등)는 저장소 안에만 있다.

녹음 원본이 저장소에 들어온 줄:

{"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"}
지금 이 문서
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는 당장 이름을 바꾸지 않아도 된다. 다음에 데이터 구조를 바꿀 때 이 문서에 맞추고, 그때까지는 읽을 때 같은 것으로 본다. 이름을 바꾸는 것은 각 저장소의 데이터 구조 변경이라 따로 승인을 받는다.

  • secretary 녹음 형식이 잠정 AAC(ADTS)다(secretary 결정 0006). ADTS는 MP4 계열이 아니라서 C2PA를 파일에 붙이는 방식이 m4a와 다르다. 형식을 확정할 때 함께 본다.
  • hgp: 이름표의 공개 주소는 https://hgp.hahoe.io/ns/v1.jsonld (08-이름표, 결정 0014). v1에는 지문과 관계망 칸만 들었다. 이 문서의 장부 칸은 03이 승인되면 v2에 넣는다.