LUCAS 콘텐츠 문법 4.0 — 뉴스와 AI 사전

입구: https://lucasainews.com/editor/
기존 3.0/3.1/3.2 원고와 이미지는 보존한다. 새 웹 편집실은 4.0을 사용한다. 3.2 ZIP은 기존 로컬 편집실에서 처리하거나 4.0 구조로 다시 작성한다. 숫자만 4.0으로 바꾸면 호환되지 않는다.

최상위 JSON:
{"format":"lucas-content","version":"4.0","documents":[문서,...]}
한 번에 1~30문서. 뉴스(kind=news)와 사전(kind=term)을 섞어도 된다.
JSON Schema: content-v4.schema.json
의미 검증까지 포함한 기준 구현: content-v4.ts
구조 예시: example-do-not-publish.json (발행 불가 예시)

문서의 모든 필수 키:
kind, slug, title, summary, company, category, tags, aliases, publishedAt, updatedAt, eventAt, revision, changeNote, sources, blocks, related, assets.
slug: 영문 소문자·숫자·하이픈, 최대 100자. 한 문서의 영구 URL이므로 제목이 바뀌어도 유지.
company: openai / anthropic / google / other.
category: basics / models / companies / prompting / agents / training / architecture / evaluation / multimodal / infrastructure / safety / culture.
tags: 문자열 최대 12개. aliases: 같은 뜻의 표기 최대 20개. related: 관련 사전 slug 최대 20개.
publishedAt/updatedAt: 시간대가 있는 ISO 8601, 예 2026-10-08T09:00:00+09:00.
eventAt: 사건 시각. 확인되지 않으면 null. 기사 발행 시각과 구분.
revision: 신규 1, 수정은 현재 초안 개정+1. 초안 수정을 저장해도 공개본은 유지된다.
changeNote: 실제 변경 요약. 이전 개정 원고는 서버에서 보관한다.

sources: 1~40개. 각 출처는 id, title, url, kind, accessedAt, publishedAt, license.
kind=official(공식) / press(언론) / community(커뮤니티) / reference(참고 문헌).
url은 HTTPS. accessedAt은 실제 열람 시각. publishedAt은 원문 시각 또는 null. license는 알려진 본문 이용 조건 또는 null. 이미지 권리는 sources가 아닌 assets에 별도로 선언.

blocks: 3~120개의 다음 블록. HTML, 마크다운 표, 임의 필드 불가.
1) {"type":"heading","id":"how-it-works","text":"어떻게 작동하나"}
2) {"type":"paragraph","text":"설명… [[gpt|GPT]] …","voice":"fact","sourceIds":["source-one"]}
   voice=fact(출처 필수), analysis(근거 있는 해석), guide(사용 안내).
3) {"type":"list","items":["항목 1","항목 2"],"sourceIds":["source-one"]}
4) {"type":"table","headers":["항목","설명"],"rows":[["A","B"]],"sourceIds":["source-one"]}
5) {"type":"image","assetId":"image-one","caption":"내용과 출처 설명","alt":"화면을 볼 수 없는 독자를 위한 설명"}
sourceIds는 같은 문서의 sources.id만 사용. 표의 열 수 일치. heading.id 중복 불가.

사전 연결:
[[gpt|GPT]], [[prompt-engineering|프롬프트 엔지니어링]], [[harness|하네스]].
[[slug]]도 가능하지만 독자에게 보일 명칭을 직접 쓰는 형식을 권장한다.
공개된 사전 문서만 링크가 된다. 집필 후보는 일반 용어로 표시되어 404를 만들지 않는다.
사전 페이지에는 다른 사전과 관련 기사로 이동하는 링크와 '이 용어를 다룬 글' 역방향 연결이 표시된다.
본문에서 한 용어를 과도하게 반복 연결하지 않는다. 기존 별칭을 우선한다.

assets: 최대 12개. 이미지 생략 가능. 다음 필드를 포함한다.
id, path(assets/파일명.png|jpg|jpeg|webp), sha256(최종 파일 바이트의 SHA-256), rights.
rights의 필수 키:
status: licensed 또는 owned
license: CC0-1.0 / CC-BY-4.0 / CC-BY-SA-4.0 / CC-BY-3.0 / CC-BY-SA-3.0 / permission / editorial-permission / owned
creator, credit: 실제 저작자와 표시해야 할 크레딧
sourceUrl: 원본 페이지. 자체 제작이면 null 가능
licenseUrl: 적용 조건 URL. 외부 이미지 필수
evidenceUrl: 이 파일에 조건이 적용됨을 확인한 URL. 외부 이미지 필수
evidenceText: 구체적 사용 근거와 제한. 다운로드 가능·출처 표기만으로 허가를 만들어 내지 말 것
checkedAt: 조건을 실제 확인한 시각
commercialUse: true. 상업적 재게시 근거가 없으면 이 배열에 넣지 말 것
modifications: 실제 변환 내역. 없으면 빈 문자열
scope: original-article(원 기사와 일치) / related-illustration(관련 자료) / original-graphic(자체 제작)
자체 제작은 status=owned, license=owned, scope=original-graphic을 함께 쓴다.
CC 라이선스 URL은 creativecommons.org의 정확한 조건 페이지와 일치해야 한다.
rights 전체는 수집기의 제공 값을 유지한다. 사람이 제공한 이미지라면 동일한 근거 항목을 작성하고 검토한다.

ZIP 규칙: 최상위 content.json + 실제 사용한 assets/*만 허용. 폴더 이동 경로, 실행 파일, SVG, HTML, 원문 증거 파일은 발행 ZIP에 넣지 않는다. 증거 파일은 취재 ZIP에 보존한다.
크기: 압축 ZIP 40MB / 해제 48MB / 파일 100개 / JSON 1.5MB / 문서 180KB / 이미지 1MB / 이미지 한 변 4096px / 800만 화소. 30편에 이미지가 많으면 ZIP을 나눠도 최종 발행 수에는 제한이 없다.

검증 실행 (Node 22.18 이상):
npm install
node validate.mjs 완성원고.zip research.json
research.json을 생략하면 구조·참조·해시만 확인하며 제공된 권리 정보와의 일치 여부는 검사하지 않는다.
서버는 권한·CSRF·출처·크기·문법·이미지 존재·동시 수정까지 다시 확인한다.
문법 검사 PASS는 내용의 진실 또는 법률상 사용 허가를 보장하지 않는다. 사실과 사용 조건을 검토한 뒤 웹 편집실에서 공개한다.

다량 작성: 30편은 30개의 독립 기사가 아니라 30개 독립 사건일 때만 작성한다. 3편과 30편에 같은 문법을 사용한다. 30편 저장은 원자적으로 처리한다. 여러 문서 공개는 순차 처리하며 중단 시 완료 수를 알려 준다. 실패한 문서는 초안으로 남는다.
