사양 색인
Lute는 docs/proposals/ 아래에 버전별 제안서 스택으로 사양이 정의되어 있습니다. 각 개정판은 이전 개정판을 호환 가능한 방식으로 정제하거나 확장하므로, 이 스택은 누적해서 읽습니다. 0.1.0은 씬 종류와 공유 커널이며, 이후의 모든 개정판이 이를 인용합니다.
시나리오 DSL (언어)
섹션 제목: “시나리오 DSL (언어)”| 버전 | 범위 | 원본 |
|---|---|---|
| 0.0.1 | 작성 언어의 최초 구현 전 초안 — .lute 시나리오의 어휘 구조, 문법 및 의미론입니다. | 0.0.1.md |
| 0.1.0 | 본격적인 언어 — 씬 종류와 공유 커널: 로직 계층, Lute-CEL, 스칼라 상태 모델, 전체성, 식별성/i18n 및 재사용 가능한 콘텐츠 컴포넌트입니다. | 0.1.0.md |
| 0.2.0 | 문서 종류 시스템(.lute를 다형적으로 만듦), <on> ECA 트리거, quest.* 상태 계층 및 완전한 퀘스트 종류입니다. | 0.2.0.md |
| 0.3.0 | 관계형 팩트 계층 — 유효 시간 구간, 델타 assertion/retraction 및 전체 Datalog 도출 계층을 갖춘 폐쇄형 SVO/n항 팩트 데이터베이스입니다. | 0.3.0.md |
| 0.4.0 | 작가 경험 계층 — lute trace 미리보기, 증명 가능한 소프트락/데드 콘텐츠 진단, 매개변수 범위 컴포넌트 <match> 디스패치, ceremony sugar 및 진단 표시입니다. | 0.4.0.md |
| 0.5.0 | 작성 피드백 강화 — 진단의 구체성, trace의 정직성, 도달성 경계 및 lute context의 완전성입니다. | 0.5.0.md |
| 0.5.1 | 퀘스트 게이트 읽기의 trace 미리보기와 작성 표면 정직성 항목(전달 플래그, lute context 예약 경로, 이벤트/컴포넌트 진단)입니다. | 0.5.1.md |
| 0.5.2 | CEL 가드에서 unset 센티넬을 가장 흔히 잘못 표기하는 경우를 포착하는 새로운 단일 E-UNSET-LITERAL 진단입니다. | 0.5.2.md |
| 0.6.0 | persist= 없는 into= 레코드, 자유로운 샷 제목 — 호환성이 깨집니다. | 0.6.0.md |
| 0.6.1 | 세 가지 검증 커버리지 경고(W-UNPROVEN-RELATIONAL, W-LUTE-VERSION-STALE, W-TRACE-MOCK-UNPRODUCIBLE)와 --deny/--deny-warnings 경고 승격입니다. 0.6.0을 호환 가능한 방식으로 정제한 버전입니다. | 0.6.1.md |
| 0.7.0 | 버전 통합 — 언어, IR 및 도구 모음이 0.7.0으로 정렬됩니다. 문법, 의미론 또는 IR 형태 변경은 없습니다(0.6.1 의미론과 바이트 단위로 동일). | 0.7.0.md |
| 0.8.0 | 도입 릴리스: ::end 종료, after: active(), 예약된 quest.<id>.activatedAt 앵커, 스칼라 전용 작성자 state:, Artifact.shots, 지역화 왕복, identity: 템플릿 및 균일 폭 addr입니다. 모든 항목은 실제 777개 씬 / 583개 퀘스트 게임 카탈로그를 대상으로 Lute를 평가하며 발견한 격차로 추적됩니다. | 0.8.0.md |
| 0.9.0 | 어휘 소유권: 컴파일러가 7개의 콘텐츠 어휘 슬롯(emotion, action, anchor, mood, volume, musicAction, vfxType)을 선언하고 멤버는 제공하지 않습니다. 따라서 모든 멤버는 프로젝트에 속하며, 인라인으로 선언하거나 uses:를 통해 도달한 스키마 또는 플러그인의 enums 내보내기에서 선언합니다. enums: 장문 형식의 exits:/default:는 추측에 사용되던 하드코딩된 이름 휴리스틱 두 개 대신 멤버 의미론을 전달합니다. 아무도 선언하지 않은 슬롯을 사용하면 조용히 검사하지 않는 대신 E-DOMAIN-UNKNOWN이 됩니다. 이제 루트 전용 검사 단계 5개도 가져온 컴포넌트 본문에 적용됩니다. 슬롯을 사용하는 문서와 호환성이 깨집니다. IR은 0.9.0에 맞춰 다시 정렬되었으며 0.8.0과 형태가 동일합니다. | 0.9.0.md |
| 0.10.0 | 도구 모음이 아는 것을 말합니다: 검사기가 답을 보유하면서도 말하지 않던 지점을 닫는 13가지 변경입니다. ::set은 자신이 쓰는 경로에 맞춰 우변의 타입을 지정합니다(E-SET-TYPE). 6개 로직 태그가 속성 집합을 닫습니다(E-UNKNOWN-ATTR, E-AS-REMOVED). 절대 열릴 수 없는 퀘스트 게이트는 오류가 되고 모순된 목표 쌍은 E-OBJECTIVE-CONTRADICTION이 됩니다. lute.project.yaml에 defaults:가 추가됩니다. 모든 명령이 중첩 매니페스트를 순회하며 검증합니다. mocks/*.yaml을 검사하며 file:이 필요합니다. 타임라인 시간은 정수 밀리초입니다. 새 경고 4개가 추가되고, 유일한 트리거가 일치였던 W-INJECT-CONFLICT는 제거됩니다. §3, §4, §5 문서와 mock에 대해 호환성이 깨집니다. IR 형태가 0.8.0 이후 처음 변경됩니다 — provenance.reason이 provenance.explanation이 되므로 IR 0.9에 묶인 엔진은 0.10까지 범위를 넓혀야 합니다. | 0.10.0.md |
| 0.10.1 | 정렬만 수행: 문법 생성 규칙, 정적 의미 규칙 및 IR 형태 변경이 없습니다. 0.10.0 의미론과 바이트 단위로 동일합니다. 이 릴리스의 두 수정은 도구 모음에 관한 것입니다. 매니페스트를 통해 스키마나 디렉티브에 도달하는 문서도 테스트할 수 있도록 lute test에 --project가 추가되고, 폐쇄형 세그먼트 생성 규칙 바깥의 Type으로 선언된 assetKind 세그먼트는 아무것도 적용하지 않고 플러그인 로드 시 거부됩니다. 이 스택에 없는 언어 버전과 아무도 기록하지 않은 언어 버전을 구별할 수 있도록 기록했습니다. | 0.10.1.md |
| 0.10.2 | 언어 축에서만 정렬되며 IR 축에서는 그렇지 않습니다: 문법 생성 규칙과 정적 의미 규칙이 없습니다(0.10.1/0.10.0 의미론과 바이트 단위로 동일). 이 릴리스는 IR/도구 모음 변경 하나입니다. 플러그인이 소유하고 검사기가 검증한 frontmatter 키가 컴파일 시 버려지는 대신 컴파일된 아티팩트(meta.plugin)에 도달합니다(플러그인 시스템 0.0.4). 추가만 이루어집니다. 0.10.2가 0.10.0/0.10.1과 major.minor 0.10을 공유하므로 엔진 게이트가 넓어지지 않습니다. | 0.10.2.md |
| 0.11.0 | 양쪽 축 모두에서 정렬만 수행: 문법 생성 규칙, 정적 의미 규칙, IR 형태 또는 콘텐츠 변경이 없습니다(0.10.2/0.10.1/0.10.0 의미론과 바이트 단위로 동일). 릴리스 전체가 도구 모음에 관한 것입니다 — schedule.yaml 프로젝트 파일 계층과 lute play, --coverage 검토 공백 보고를 포함한 전체 프로젝트 연쇄 플레이스루 명령, 그리고 공유 참조 실행기 수정 2개입니다. 당시의 major.minor 게이트에서는 이 버전이 소비 엔진에 무료가 아니었습니다. 0.10 → 0.11이 게이트된 선을 넘었으므로, 0.7.0의 선례에 따라 스키마 파일 이름을 바꿨습니다(현재 lute-ir-0.29.schema.json으로 공개). | 0.11.0.md |
| 0.11.1 | <branch>에 두 개의 선택적 속성이 추가됩니다. prompt="…"(호스트 UI가 선택지 레이블 위에 표시하는 상황 문장, E-BRANCH-PROMPT)과 timeout="N"(양의 정수 초 예산, E-BRANCH-TIMEOUT)입니다. IR은 추가만 이루어집니다. 선택지 레코드의 prompt/timeoutSec은 작성되지 않은 경우 생략됩니다. 2026-08-26에 소급 기록 — 2026-08-19에 릴리스되었지만 당시에는 변경 로그에만 레코드가 있었습니다. | 0.11.1.md |
| 0.12.0 | 순방향 점프: ::mark{id=…} / 콘텐츠 행의 id=…가 위치를 표시합니다. ::next{to=… when=…}는 그 위치로 순방향만 점프하므로 순회가 DAG로 유지됩니다. 새로운 진단은 E-MARK-DUP, E-NEXT-UNDEFINED, E-NEXT-BACKWARD, W-CODE-AFTER-NEXT입니다. IR은 순수한 재스탬프입니다(::next는 기존 jump/match 레코드로 낮춰짐). lute.core에 mark/next가 추가되어 capabilityVersion이 이동합니다. | 0.12.0.md |
| 0.13.0 | 코드 잠금: 문서의 행 코드를 공개된 식별성으로 표시하는 새로운 범용 frontmatter 키 codesLocked:입니다. lute tag --force는 초안의 번호를 깨끗한 문서 순서로 다시 매기고 잠긴 문서는 거부합니다(실패 폐쇄). 도구 모음의 lint 계층(lute lint, lute.lint.yaml, 플러그인 lints 내보내기)과 함께 제공되며 런타임 버전 게이트를 MAJOR 전용(minor/patch는 기본적으로 호환)으로 완화합니다. IR은 순수한 재스탬프입니다. | 0.13.0.md |
| 0.14.0 | 하위 퀘스트: <objective quest="childId"/>는 하위 퀘스트의 완료를 부모 목표로 만듭니다. 완료 및 상향 실패는 컴파일러가 합성합니다(done = quest.<child>.state == 'complete'; 부모 fail에는 필요한 각 하위 퀘스트에 대해 failed 검사가 하나씩 추가됨). 하향 실패(종료된 부모가 여전히 active인 하위 퀘스트를 실패시킴)와 참조된 하위 퀘스트 활성화(start 없음 → 부모와 함께 활성화되고, start는 부모가 활성 상태일 때만 평가됨)는 엔진 규칙입니다. 프로젝트 형태는 DAG가 아니라 트리입니다 — E-OBJECTIVE-QUEST-DONE, E-QUEST-REF-UNKNOWN, E-QUEST-MULTI-PARENT, E-QUEST-TREE-CYCLE, 그리고 도달할 수 없는 하위 퀘스트에서 전파되는 E-OBJECTIVE-UNSATISFIABLE이 추가됩니다. IR은 추가만 이루어집니다. ObjectiveEntry.quest는 작성되지 않은 경우 생략됩니다. | 0.14.0.md |
| 0.15.0 | 작성된 씬 식별성: 새로운 씬 frontmatter 키 id: 하나가 오늘날 파생된 {character}.{episodeId} 조인이 사용되는 모든 곳( lineId 접두사, visited()/연결성, prereqEdges, project.index.json, 런타임 visited-set)에서 표준 씬 키가 됩니다. 그 키가 있을 때 4개의 레거시 식별성 키(character/season/episode/episodeId)는 선택 사항으로 강등됩니다. 두 번째 새 frontmatter 키 extra:는 씬 및 퀘스트 루트에 자유로운 설명 블록으로 추가됩니다(스칼라 또는 평면 스칼라 목록으로 이루어진 열린 매핑이며, meta.extra에 있는 그대로 전달되고 어떤 언어 규칙도 읽지 않음). 새로운 진단 E-META-ID/E-META-VALUE/W-META-LEGACY 3개, 병합된 frontmatter에 id:가 없을 때만 발생하도록 범위가 좁혀진 E-META-MISSING, 그리고 메시지가 표준 씬 id를 명명하도록 일반화된 E-CONN-EPISODE-ID-DUP입니다. IR은 0.13.0의 MAJOR 전용 게이트 아래에서 추가만 이루어집니다. SceneMeta.id는 필수이고, 4개의 레거시 식별성 필드는 선택 사항이며, extra는 SceneMeta와 QuestMeta 양쪽에 있습니다. | 0.15.0.md |
| 0.15.1 | 양쪽 축 모두에서 정렬만 수행: 문법 생성 규칙, 정적 의미 규칙, IR 형태 또는 콘텐츠 변경이 없습니다(0.15.0 의미론과 바이트 단위로 동일). 릴리스 전체가 도구 모음에 관한 것입니다. npm 배포판이 lute와 함께 lute-lsp를 제공합니다(두 번째 bin 실행기 항목이며, 각 플랫폼별 코어 패키지에 두 바이너리가 모두 포함됨). 따라서 다운스트림 편집기는 CLI가 이미 사용하는 동일한 @lute-lang/lute 설치를 통해 언어 서버를 생성할 수 있습니다. schemas/lute-ir-0.15.schema.json은 이름과 $id를 유지하며 0.13.0의 MAJOR 전용 런타임 계약에 따라 엔진 게이트가 넓어지지 않습니다. | 0.15.1.md |
| 0.16.0 | 선언적 보상: 새로운 self-closing 요소 <reward kind= target= amount= when= on=/>는 <quest> 또는 <objective>의 직접 자식으로만 허용되며, amount는 정수 스칼라(음수도 실제 값) 또는 새로운 범위 리터럴 N..M을 받습니다. 소유 레코드(QuestCmd.rewards / ObjectiveEntry.rewards)의 순수 데이터로 낮춰집니다. 엔진이 부여하며 참조 런타임은 범위를 굴리지 않습니다. 새로운 진단 E-REWARD-ATTR(형태)와 E-REWARD-KIND(어휘, 플러그인이 rewardKinds:를 선언한 경우에만)가 추가됩니다. reward.when은 CEL 슬롯 레지스트리에 참여합니다. lute run / play / trace는 각각의 새로운 전환에서 결정적인 grant transcript 이벤트를 방출합니다(사양 §3 D-D — 목표 보상이 퀘스트 보상보다 먼저이고, 모든 보상이 해당 라이프사이클 핸들러 본문보다 먼저임). 플러그인 매니페스트는 rewardKinds: 어휘를 내보낼 수 있으며, capability 스냅샷에 보호되고 정렬된 섹션으로 접혀 들어가므로 종류를 선언하는 프로젝트에서만 capabilityVersion이 이동합니다. IR은 0.13.0의 MAJOR 전용 게이트 아래에서 추가만 이루어집니다. 두 rewards 배열은 skip-when-empty이므로 보상 없는 아티팩트는 0.15.1 출력과 바이트 단위로 동일하게 유지됩니다. tree-sitter 문법에 reward 생성 규칙이 추가됩니다. | 0.16.0.md |
| 0.16.1 candidate | 도구 모음만을 위한 예정 항목이며 릴리스되지 않았습니다. 검사된 continuation 컴파일러는 일반 최종 샷 본문 원본을 동결된 씬 템플릿에 추가하고, 완전하게 수락된 각 단위에 대해 완전한 일반 아티팩트 스냅샷을 방출합니다. lute compile-stream은 flush된 NDJSON과 동일한 계약을 노출합니다. 새로운 문법, 권한, 런타임 효과 또는 IR 패치 형태는 없습니다. 각 단위는 기존 컴파일러를 통해 누적 원본을 다시 컴파일하며, 스냅샷 소비자는 주소 조회를 재구축하는 동안 수치 커서/상태/팩트를 유지합니다. | 0.16.1.md |
| 0.17.0 | 검사된 continuation과 최소 권한 컴파일: 도구 모음에 추가 전용 검사 continuation 컴파일러와 lute compile-stream, 그리고 디렉티브, 상태 및 팩트 쓰기, 브리지, 보상 및 퀘스트를 위한 일반 capability 권한 상한이 추가됩니다. 둘 다 기존 언어와 일반 아티팩트 계약을 재사용하므로 언어와 IR은 문법, 정적 의미 또는 IR 형태 변경이 없는 정렬 재스탬프입니다. | 0.17.0.md |
0.17.1 | 정렬 전용 릴리스입니다. 문법 생성 규칙, 정적 의미 규칙 또는 IR 형태/콘텐츠 변경이 없습니다(0.17.0 의미론과 바이트 단위로 동일). 릴리스는 저장소 위생에 관한 것입니다. 예시 캐스트/프로젝트 식별자를 같은 길이의 중립적인 이름으로 바꾸고, 비규범적인 도입 평가를 삭제했습니다. schemas/lute-ir-0.17.schema.json은 이름과 $id를 유지합니다. | 0.17.1.md |
0.17.2 | 추가적인 플러그인 소유자 메타데이터: 패스스루 kind: "plugin" 레코드는 선택적 plugin 메타데이터에 해석된 소유 플러그인 id를 담을 수 있으므로, 호스트가 (plugin, tag)로 디스패치할 수 있습니다. lower: { record, fields }를 사용하는 선언적 표시 디렉티브는 계속 안정적인 코어 레코드를 방출합니다. 문법 또는 정적 의미 변경은 없습니다. schemas/lute-ir-0.17.schema.json은 이름과 $id를 유지합니다. | 0.17.2.md |
0.18.0 | <when is>의 범위 패턴: 포괄적 숫자 범위 리터럴 N..M / N.. / ..M(부호가 있는 10진수 경계)이 is= 리터럴 집합에 참여하며, number로 선언된 subject는 커버리지 검사 가능한 도메인이 됩니다. 실수 전체에 대한 구간 합집합이므로 E-NONEXHAUSTIVE는 처음 발견된 미포괄 공백을 명명하며 E-ARM-DEAD / W-OVERLAP-ARMS / W-OTHERWISE-DEAD는 구간을 인식합니다. 새로운 E-WHEN-RANGE(잘못되었거나 빈 범위)와 W-WHEN-TEST-LITERAL(is=로 표현할 수 있는 리터럴 비교 test 가드)이 추가됩니다. migrate fixit은 lute fix가 적용합니다. IR은 정렬 재스탬프입니다. 범위 arm은 기존 >= / <= / && 연산자로 낮춰지며, 스키마 이름은 schemas/lute-ir-0.18.schema.json으로 바뀝니다. | 0.18.0.md |
0.19.0 | 로어 엔트리(조회되는 콘텐츠): 세 번째 문서 종류인 kind: lore는 <entry id target category title series order when> 선언 집합을 최상위에 둡니다. 이는 재생되는 대신 엔진이 조회하는 콘텐츠(아이템 설명, 발견한 노트, 비문, 코덱스 페이지, 짖음)입니다. 엔트리 본문은 콘텐츠 행, <match>, ::set, ::assert, ::retract를 받을 수 있습니다. 지식은 일반 ::assert로 공개합니다. 엔진이 쓰도록 예약된 entry.<id>.read 경로가 시리즈와 씬을 게이트하며, 효과는 첫 번째 읽기에만 적용됩니다. 퀘스트 및 로어 문서는 문서 id:(번들 이름)를 선언할 수 있으며, 로어 문서는 파일 위치 순으로 정렬된 series:를 선언할 수 있습니다. 새로운 E-ENTRY-ATTR, E-ENTRY-ID-DUP, E-ENTRY-SERIES-ORDER, W-ENTRY-REF-UNKNOWN과 lute trace/run --entry, lute lore가 추가됩니다. IR은 추가됩니다 — kind: "lore"인 아티팩트와 LoreMeta, entry 레코드, QuestMeta.id, ProjectIndex.entries가 추가되며, 스키마 이름은 schemas/lute-ir-0.19.schema.json으로 바뀝니다. | 0.19.0.md |
0.20.0 | 팩트 엔벨로프(지식 분석): 문법 변경 없이 정적 의미만 변경됩니다. check-project는 모든 가드 슬롯의 모든 관계형 쿼리(holds(…), count(…))를 프로젝트 전체의 인자 수준 may 집합(시드, 활성 assert, 규칙 또는 예약 관계가 생성할 수 있는 모든 ground 팩트)과 경로에 민감한 must 집합(문서 내부 및 after: 그래프 전체에서 해당 슬롯으로 가는 모든 경로에 참인 단조 팩트, 가드는 그 영역 내부의 가정, count는 구간으로 결정됨)으로부터 불가능, 보장, 가능 중 하나로 결정합니다. 데드 관계형 가드는 각 슬롯의 기존 코드(E-ARM-DEAD, E-OBJECTIVE-UNSATISFIABLE, E-QUEST-UNREACHABLE, W-OBJECTIVE-HIDDEN)를 재사용합니다. 새로운 E-ENTRY-UNREACHABLE(절대 성립하지 않는 로어 엔트리 when — 단일 파일 check에서도 스칼라로 결정됨)와 W-FACT-GUARANTEED(중복 관계형 가드)가 추가되며, W-UNPROVEN-RELATIONAL은 제거됩니다. lute scenario … envelope는 노드에서 보장된 팩트를 나열합니다. IR은 정렬 재스탬프이며 스키마 이름은 schemas/lute-ir-0.20.schema.json으로 바뀝니다. | 0.20.0.md |
0.21.0 | 비트와 계기(스토리 선택): 프로젝트는 스토리 비트를 선택할 수 있는 엔진 순간인 계기(허브 방문, 방에 들어가기, NPC와 대화)를 명명합니다. 씬 또는 로어 엔트리는 씬 frontmatter on: / target: / when: / priority: / once: run | user | false에 하나로 응답하거나 엔트리 속성 on= / priority=를 지정하여 비트가 됩니다. 비트는 after:와 when이 성립하고 once가 소진되지 않았을 때 적격입니다. 적격 비트는 우선순위, 그다음 프로젝트 순서로 정렬됩니다. 플러그인은 occasions:(select: first | all, target: true)를 내보낼 수 있습니다. 계기 이름은 하나가 실제로 동작하기 전까지 형태만 가집니다. 새로운 E-BEAT-ATTR, E-OCCASION-UNKNOWN, E-BEAT-UNREACHABLE, W-BEAT-SHADOWED가 추가됩니다. schedule.yaml과 모든 E-SCHED-* / W-SCHED-* 코드는 제거됩니다. lute play는 계기가 발생할 때 재구축되며 퀘스트 라이프사이클을 구동합니다. IR은 추가됩니다 — SceneMeta.beat, EntryCmd.on / priority, ProjectIndex.beats가 추가되며 스키마 이름은 schemas/lute-ir-0.21.schema.json으로 바뀝니다. | 0.21.0.md |
0.21.1 | 패치: 조용히 잘못된 답을 내지 않습니다. 새로운 문법은 없습니다. 결함을 허용하던 검사가 이제 보고하도록 정적 의미가 강화됩니다. quest.<id>.state는 항상 할당되는 라이프사이클 열거형으로 읽힙니다(W-QUEST-STATE-ISSET). def 본문은 CEL 프로필 게이트를 통과합니다. 디렉티브 속성의 def는 리터럴로 접히거나 E-ATTR-DEF-DYNAMIC이 됩니다. 인라인할 수 없는 {{@def}}는 E-INTERP-DEF입니다. <quest> / <objective> / <on>은 속성을 닫습니다. 작은따옴표 속성 값은 E-ATTR-QUOTE입니다. check-project는 컴파일, 단일 스냅샷 게이트(E-CAPABILITY-MISMATCH) 및 새로운 E-DUP-VOICEKEY를 실행합니다(기본 voice-key 템플릿에서 다중 씬 프로젝트가 identity.voiceKey: "{prefix}.{speaker}-{code}"를 고정함). IR 변경은 추가만 이루어집니다. ref 플레이스홀더는 선택적 expr을 담고 def 본문은 인라인됩니다. schemas/lute-ir-0.21.schema.json은 이름과 $id를 유지합니다. | CHANGELOG; versioning.md |
0.22.0 | 엔진을 대신할 수 있는 참조 플레이어: lute play 스크립트는 engine: 단계로 엔진 소유 항목을 씁니다(리터럴 또는 { add: n }인 선언된 상태, 선언된 모든 관계의 팩트와 철회, 예약된 관계 포함; newRun: { state, facts }). 저장에서 시작하고(visited:, presented: { run, user }, quests:, entriesRead: { run, user }), 단계별 choose:를 선택하고, 월드 이벤트(event:)를 발생시키며, select: all 목록을 넘기고(pick: none), 단계 expect: { winner, offered, notOffered }와 최상위 expect:로 단언합니다. lute test는 expect:를 포함한 모든 play를 실행하며, lute trace / test / play는 기본적으로 프로젝트의 시드 팩트와 Datalog 규칙을 적용합니다(derive: false / --no-derive가 0.21 모델을 복원하며 lute play --explain <atom>을 사용함). 실행 경계: 새로운 실행에서 <quest tier="run">이 초기화되고, 엔트리 비트는 once="run" | "user"를 취하며 예약된 사용자 계층 entry.<id>.everRead는 모든 실행에서 유지됩니다. state: 선언은 owner: engine일 수 있습니다(E-ENGINE-OWNED-WRITE). 계기의 target:은 도메인 { prefix, entity }를 명명할 수 있습니다(그 밖에는 E-BEAT-ATTR). W-STAGE-ABSENT는 경로를 따릅니다. 새로운 경고 W-QUEST-HANDLER-DEAD, W-BEAT-PRIORITY-TIE, W-BEAT-ONCE-RUN-USER가 추가됩니다. 컴파일된 id와 호환성이 깨집니다: 기본 voiceKey가 {prefix}.{speaker}-{code}가 됩니다(기존 키를 유지하려면 identity.voiceKey: "{speaker}-{code}"를 고정). 컴포넌트 행은 {prefix}.{component}#{n}.{speaker}_{code}로 주소가 지정됩니다. IR은 추가됩니다 — QuestCmd.tier, EntryCmd.once가 추가되며 스키마 이름은 schemas/lute-ir-0.22.schema.json으로 바뀝니다(이후 이름이 변경됨). | 0.22.0.md |
0.23.0 | 작성자 개요와 시간: lute beats는 각 계기의 비트 사다리와 check-project 판정을 출력하고, lute calendar는 저장에서 플레이 자체의 적격성을 상태 값 격자(--axis run.day=1..7 --axis run.slot=…)에 대해 평가하며, lute scenario knowledge는 팩트가 가드하는 모든 조건을 생산자까지 추적합니다. <objective by="…">는 데드라인이 처음 성립할 때 목표를 실패시키고 <objective on target>은 해당 target에 대해서만 판단합니다. 계기 select: sequence는 적격한 모든 비트를 표시하며 also: true인 비트는 select: first 승자 뒤에 따라옵니다. 로어 문서는 씬과 유사한 <beat> 블록을 묶을 수 있습니다(표준 id <document id>.<beat id>). <hub prompt>가 추가됩니다. 컴포넌트 string 매개변수는 {{@p}}를 보간합니다. 읽기 전용으로 예약된 prev.run.<path>가 추가됩니다. 선언된 캐스트가 있으면 알 수 없는 화자는 E-CAST-UNKNOWN입니다. 보상 종류는 상태 경로에 credits:할 수 있습니다(W-REWARD-DOUBLE-CREDIT). 조건 결정기는 && / ` | |
0.23.1 | 패치: trace, test 및 play가 일치합니다. 새로운 문법과 IR 형태 변경은 없습니다. 정적 의미가 강화됩니다. 부모와 tier가 다른 하위 퀘스트는 E-QUEST-TIER-MIX이며, match arm은 subject를 좁히므로 모든 unset 값을 취하는 arm 뒤의 읽기는 더 이상 E-MAYBE-UNSET이 아닙니다. 안정적으로 도출된 팩트에 대한 부정이 결정되고 W-BEAT-ONCE-RUN-USER는 기본값으로 설정된 once에서만 발생합니다. 계기 target 도메인은 members:로 좁혀질 수 있습니다. 런타임 답변이 변경됩니다. 발생한 계기는 먼저 같은 이름의 선언된 월드 이벤트(모든 활성 퀘스트의 <on event> 핸들러)를 발생시키고 그 다음 on= 목표를 판단합니다. 이 목표의 by 데드라인은 done 후 그곳에서만 판단됩니다. 태그 없는 컴포넌트 행은 lute tag가 쓸 코드를 취하므로 lineId가 한 번 변경될 수 있습니다. 도구 모음: lute play의 ::end는 해당 표시만 끝내고(단계의 end: true는 play를 끝냄), trace와 test는 보상 credits:와 목표 본문을 적용하며 lute calendar --script는 스크립트를 재생합니다. schemas/lute-ir-0.23.schema.json은 이름과 $id를 유지합니다. | CHANGELOG; versioning.md |
0.24.0 | 시계, 퀘스트 구조, 파티: 스키마는 두 개의 owner: engine 경로(clock.index / clock.weekday / clock.weekdayLabel, once: day / once: slot, lute play의 advance: 및 include: 단계, clock 달력 축)에 걸쳐 하나의 clock:을 선언할 수 있습니다. 열거형 멤버 표시 레이블, 정수 %, 가드된 ::set{… when="…"}이 추가됩니다. <quest activate="accept"> 하위 퀘스트, 나머지를 superseded로 실패시키는 <quest complete="any"> 대안, 읽기 전용 quest.<id>.failedBy / objectives.<o>.failed, 계기 judge: before, ::accept{at="nextRun"}, <on event target>이 추가됩니다. by=는 모든 settle에서 그 옆의 장소에 묶인 until=과 함께 판단됩니다. 엔티티 하위 종류(subsetOf:)와 엔티티 인덱스 상태(per:)가 추가됩니다. 캐스트 present: / emotions: 및 W-CAST-ABSENT, ::clear, effects: true와 speaker 매개변수를 가진 컴포넌트, {{x:ordinal}} 형식 힌트가 추가됩니다. play, test 및 trace에서 브리지 답변(bridges:)을 사용할 수 있습니다. IR은 추가됩니다. | 0.24.0.md |
0.25.0 | 배제, 공유 소비, 그래프 간선: 관계는 excludes:를 선언할 수 있습니다(대칭적이며, 둘 다 필요한 가드는 데드가 되고 부정이 뒤따르며 E-FACT-EXCLUSIVE / E-RULE-EXCLUSIVE가 발생하고 lute play / lute trace는 위반 시 중지). 하나의 share 키를 가진 비트는 함께 소비됩니다. 번들 <beat after=…>는 시나리오 간선이며 lute scenario는 [subquest] 및 [start] 앵커를 그립니다. <quest accept="external">은 유일한 비콘텐츠 수락입니다(test mock은 더 이상 해당하지 않음). 예약된 관계의 changedOn:은 캐스트 assume: true를 좁힙니다. 읽지 않은 브리지 결과 필드는 생략할 수 있습니다. {{x:ordinalWord}}가 추가됩니다. IR은 추가됩니다. | 0.25.0.md |
0.25.1 | 패치: 더 빠른 프로젝트 명령. 언어 변경과 IR 형태 변경은 없습니다. 프로젝트 명령은 실행당 각 프로젝트의 공유 입력을 한 번 로드하고, 각 문서를 한 번 파싱하며, 문서를 병렬로 검사하고, 범위 오프셋을 행별로 계산합니다. 출력, 진단 및 종료 코드는 바이트 단위로 동일합니다. schemas/lute-ir-0.25.schema.json은 이름과 $id를 유지합니다. | CHANGELOG; versioning.md |
0.26.0 | 규모와 여러 작가(몬스터 수집 RPG에서 한 명의 리드와 4명의 영역 작가): 팩트 분석과 lute test는 프로젝트를 한 번 로드합니다(Monster League check-project 6.1초 → ≈1.2초, lute test 병렬 실행). check-project는 경로의 모든 frontmatter state: 선언을 비교합니다(E-STATE-DECL-CONFLICT). 멤버가 두 번 나열되면 E-ENTITY-KIND-SHAPE이고, 스키마는 다른 import가 선언한 종류에 add: 멤버를 추가할 수 있으며, subsetOf: 자식의 멤버는 부모의 멤버입니다. defaults.uses는 glob을 취하고 defaults.questTier는 퀘스트 계층을 설정합니다. 디렉티브 속성은 { entity: K } 타입이며, 보상 target: 계약(E-REWARD-TARGET)과 lute refs가 추가됩니다. 컴포넌트는 speaker 매개변수(@@who:)로 말하고 매개변수 default:를 취하며 자체 디렉티브 결과를 읽고 직접 텍스트와 동등한 기능을 제공합니다. ::use, ::accept, ::assert, ::retract, ::give 및 플러그인 디렉티브에 when=이 추가됩니다. 비트 또는 엔트리는 전체 종류를 대상으로 할 수 있습니다(target="kind:X", occasion.target). 규칙 본문에 count / countDistinct가 추가됩니다(E-RULE-AGGREGATE-CYCLE). trace와 test는 ::next를 따르고 핸들러 수락을 적용하며 적격하지 않은 순회에서 실패합니다. play에는 advance: { to }, expect.clock 및 engine: { accept }가 추가됩니다. W-DISPLAY-NAME-DUP, W-ENTRY-WRITE-REREAD가 추가됩니다. IR은 추가만 이루어집니다. 여러 작가, 하나의 프로젝트를 참조하세요. | 0.26.0.md |
0.27.0 | 하나의 런타임, 계절, 템플릿(다섯 번째 dogfood 라운드): lute play, lute run, lute trace 및 lute test는 하나의 walker에서 컴파일된 IR을 실행하고 차분 테스트를 통해 하나의 transcript로 유지합니다. occasion.target은 팩트 쿼리와 per: 인덱스의 ground term이고, for="kind:X"는 멤버마다 한 번 비트를 표시하며, 계기는 타입이 지정된 payload:를 선언할 수 있습니다. 엔진 접점 — 계기 raisedWhen: 게이트, 스키마 terminal: 조건(E-OCCASION-GATE), 유한 시계(last: / days:, E-CLOCK-END) 및 디렉티브 effects: { asserts, retracts }. 주기 — once: week, 퀘스트 rearm=, seasons:(E-SEASON-DECL) 및 spentBy:. 비트 템플릿(<beat use=…>, E-TEMPLATE)과 매니페스트의 sequence:(E-SEQUENCE)가 추가됩니다. 종류 labels:와 {{n:plural(one|many)}}이 추가됩니다. 검사기는 더 자주 말하지 않습니다(E-SET-SHAPE, 멤버가 검사하는 { domain: K } 경로, E-ATTR-QUOTE, W-QUEST-TIER-IMPLICIT). 메시지는 --json의 spec과 lute --explain <CODE>를 위해 사양 인용을 제거합니다. IR은 추가만 이루어집니다. | 0.27.0.md |
0.28.0 | 슬롯마다 하나의 규칙, 아이디어마다 하나의 이름(여섯 번째 dogfood 라운드: 11개 게임과 새 페르소나 4개): 모든 조건 슬롯(when, after, rearm, spentBy, season live, raisedWhen, terminal, 규칙 cel(), def 본문)은 동일한 타입 검사를 실행합니다(E-CEL-TYPE). 모든 YAML 표면은 위치가 표시된 did-you-mean과 함께 알 수 없는 키를 거부합니다(E-MANIFEST-KEY, E-PLUGIN-KEY). 예약어는 선언된 곳에서 거부됩니다(E-RESERVED-NAME). 플래그 속성은 bare로 작성합니다(E-FLAG-VALUE). 이름 변경은 이전 표기가 새 표기를 명명하는 오류가 되는 깨끗한 전환으로 적용됩니다 — sequence: → chapters: [{ on, scenes }](E-CHAPTERS, W-CHAPTER-STALL), <quest after=> / <reward on=> / <objective when=> → follows= / outcome= / visibleWhen=, expect.offered → expect.options, expect.exit → expect.end, ::camera{move-x} → moveX, camelCase 플러그인 내보내기, lute new --occasion. spentBy는 래치되고 그 옆의 once가 지속 시간을 설정합니다. occasion.target은 작성할 수 있습니다. select: sequence는 각 비트의 차례에 다시 판단하며 for 비트는 멤버별로 once를 소비합니다. clock.day / clock.slot / clock.ended 및 시계의 raiseAtStart:가 추가됩니다. 계절 계층 관계, outsideRun: 계기, <return> 허브 블록이 추가됩니다. :start / :indefinite / :capitalize / :cardinalWord를 사용하는 종류 레이블 형식이 추가되며 텍스트에서는 종류 레이블이 캐스트 이름보다 우선합니다. 다른 언어의 마크업은 경고합니다(W-TEXT-SINGLE-BRACE, W-TEXT-COMMENT-LIKE, W-TEXT-BRACKET-LABEL, W-TEXT-GLUE). IR: 퀘스트 계층 필드 3개의 이름이 변경됩니다(visibleWhen, outcome, follows). 나머지는 추가됩니다. | 0.28.0.md |
0.28.1 | 패치: 여섯 번째 dogfood 라운드의 남은 항목. 언어 변경과 IR 형태 변경은 없습니다. 검사기가 여러 진단으로 보고하던 실수가 원인을 명명하는 하나의 진단이 되었으며 lute play, lute lore, lute beats, lute trace는 언어가 말하는 대로 답합니다. schemas/lute-ir-0.28.schema.json은 이름과 $id를 유지합니다. | CHANGELOG; versioning.md |
0.29.0 | 작성된 이름, 말로 표현할 수 있는 의도, 예시로서의 게임: 작성자가 쓰는 모든 이름 — 씬, 비트, 엔트리, 퀘스트, 목표, branch, hub, choice 및 mark id, 문서 id 세그먼트, share 키, season, 관계, def, 종류 및 멤버, 컴포넌트 매개변수, 플러그인이 선언하는 항목 — 은 문자로 시작하고 그 뒤에 문자, 숫자 또는 _가 오며, -는 슬롯 코드가 camelCase 표기를 명명하는 이름 오류입니다(0.28에서는 CEL이 이름을 읽는 곳에서만 이를 거부). lute check-project는 원인을 먼저 출력합니다(lute.project.yaml, 플러그인, 스키마, 경로 순서의 문서, 그 다음 프로젝트 전체 행). W-CHAPTER-STALL은 chapters:에만 구체적으로 적용됩니다. lute new scene --occasion은 on:을 작성합니다. 의도한 설계를 설명할 수 있는 경고에는 의도를 명시하는 표기가 있으며, terminal:은 의도적으로 실행보다 오래 지속되는 종료를 위한 장문 형식 { when, persists: true }를 취합니다(W-TERMINAL-PERSISTENT는 조용하고 lute play는 게임이 영원히 끝났다고 말함). 14개 dogfood 게임은 docs/examples/games/ 아래 검사된 예시로 제공됩니다. IR은 추가됩니다(terminalPersists). schemas/lute-ir-0.28.schema.json은 lute-ir-0.29.schema.json으로 이름이 바뀝니다. | 0.29.0.md |
0.29.1 | 엔진 소유 id는 표기를 유지합니다. 새로운 문법과 IR 형태 변경은 없습니다. 0.29 식별자 규칙은 Lute가 선언하는 모든 이름에 계속 적용되지만 엔진이 소유하는 id에는 적용되지 않습니다. 즉 entities: 종류가 멤버를 나열하지 않는 target과 엔트리의 category는 0.28.1처럼 다시 -를 허용합니다. schemas/lute-ir-0.29.schema.json은 이름과 $id를 유지합니다. | CHANGELOG; versioning.md |
0.30.0 | 작성한 이름, JavaScript 같은 경로: 경로, 인덱스 또는 팩트 인수로 조건이 도달하는 모든 이름 — 씬, 비트, 엔트리, 퀘스트, 목표, branch, hub, choice 및 mark id, 문서 id 세그먼트, share 키, season, 관계, 열거형 및 엔티티 종류와 멤버, 플러그인 계기와 이벤트, target 및 category — 는 문자, 숫자, _ 또는 -이며 -로 시작하지 않습니다(lamp-out, zero-coke-001, 001). 이는 0.29.1의 Lute 선언 이름과 엔진 소유 id 간 구분을 유지합니다. @name으로 bare하게 읽는 이름(def, def 매개변수, 컴포넌트 및 템플릿 매개변수)은 식별자로 유지됩니다. 식별자가 아닌 이름은 JavaScript 및 CEL처럼 조건에서 따옴표로 묶은 인덱스 또는 따옴표로 묶은 팩트 인수로 작성합니다 — 가드, ::set / ::assert / ::retract target, {{…}}, Datalog 규칙과 play / test / trace 입력에서 quest["zero-coke-001"].state, run.visits['lab-b2'], holds('at', ["lab-b2"])와 같이 작성하며 두 표기는 하나의 이름입니다. . 뒤에 오는 비식별자 이름은 대괄호 표기를 명명하는 E-PATH-IDENT입니다. IR에는 필드가 추가되지 않습니다. 경로 필드는 정식 dotted path를 가지며 그 세그먼트에는 -가 들어가거나 숫자로 시작할 수 있습니다. schemas/lute-ir-0.29.schema.json은 schemas/lute-ir-0.30.schema.json으로 이름이 바뀝니다. | 0.30.0.md |
0.32.0 | 표준 CEL과 실행 IR: 폐쇄형 표준 CEL 프로필은 조건에서 int / double 및 목록 형식 팩트 쿼리를 사용하며 Datalog 규칙 문법은 변경되지 않습니다. 스칼라 상태에서 number가 제거되고 퀘스트 저장은 번호가 매겨진 questInstances를 노출하며 보상은 instance / index를 담습니다. 실행 IR은 celEnv, owner 및 {cel, expr, authored?} 슬롯을 담습니다. W-QUEST-STATE-HAS가 W-QUEST-STATE-ISSET을 대체하고 E-FACT-QUERY와 E-RUN-OWNED-WRITE가 추가됩니다. | 0.32.0.md |
0.33.0 | 도메인 모듈과 의미 협상: 실행 IR과 프로젝트 인덱스는 컴파일러에서 도출된 정렬된 requiredSemantics를 담습니다. 레지스트리는 엔진에 표시되는 의미 id를 할당하고 lute.engine.yaml은 supportedIds를 선언합니다. 1.0 이전 엔진은 먼저 정확한 major.minor를 게이트한 다음 재생 전에 지원되지 않는 id를 거부합니다(E-ENGINE-SEMANTICS). check --engine과 check-project --engine은 작성 시 누락된 id를 보고합니다(E-CHECK-ENGINE-SEMANTICS). 잘못된 매트릭스, 지원되지 않는 IR 행 및 알 수 없는 id를 다루는 새 진단이 추가됩니다. 참조 매트릭스는 모든 현재 id를 지원하며, 플러그인 의미는 정확한 capability 스냅샷으로 고정됩니다. | 0.33.0.md |
0.34.0 | 프로젝트 의미 모델과 영향 분석: 하나의 공유 프로젝트 모델이 프로젝트 명령을 구동합니다. lute impact는 결정적인 역방향 의존성 폐쇄를 보고하고 lute constraints는 도달 가능, 완료 가능, 화자 가드 및 단일 슬롯 진행 정책을 검사합니다. 진단과 분석 결과에는 명시적인 증거 수준과 제한된 범위가 포함됩니다. | 0.34.0.md |
0.36.6 | AI 편집 루프: 손실 없는 구문과 표준 형식 지정, 원본/프로젝트 개정판, 작업 범위 컨텍스트와 위치 쿼리, 의미론적 diff 및 원자적 개정판 검증 원본 패치입니다. | 0.36.0.md |
0.37.0 | 표면 정리 — 호환성이 깨지는 깨끗한 전환: 선택적인 안정 {#id}가 붙은 ## 섹션, ::actor, ::cg{assetId display layout}, ::sequence{name}, ::music{playback}, ::video{display}가 추가됩니다. ::camera는 프로젝트에서 선언한 framing / move / transition 멤버를 취합니다. ::jump{to} / ::label{name}, choice text=, <match subject=>, <reward id>가 추가됩니다. {mono}는 관점 또는 monoSpeakers:에만 사용합니다. 모든 행에 voiceKey가 추가됩니다. 인라인 텍스트 수정자 :pause{s}, :speed[…]{rate}와 textStyle 범위가 추가됩니다. frontmatter title:이 유일한 제목입니다. IR은 모든 명령에 family와 position을 부여하고, 타이밍을 timing 안에 중첩하며, 종류를 bg / actor / cg로 역할을 mono / os / vo로 이름을 바꾸고 capabilitySnapshot을 담습니다. lute fix는 손실 없이 이름이 변경된 항목을 다시 작성합니다. | 0.37.0.md |
0.50.0 | 작성 확장성: 새 키워드나 요소 없이 작성 표면을 확장합니다: 이름 있는 표면(line, branch, hub, choice, 디렉티브 태그)으로 범위를 정하는 플러그인 stampAttrs의 on:(범위가 정해진 스탬프는 required일 수 있음), 플러그인 hostTokens export로 선언하는 호스트 보간 토큰, 지급 시점에 적용되고 모든 분석이 읽는 보상 kind의 effects(asserts, retracts, accepts), lute.project.yaml의 checker W-* 코드용 프로젝트 diagnostics: level, 문자열 멤버를 갖춘 target: node lint. 새 코드 E-PLUGIN-STAMP-SURFACE와 E-DIAGNOSTICS-CONFIG. IR은 추가형입니다(옵션 stamps, RewardEntry 효과, semantic id lute.quest.rewardEffects/1). | 0.50.0.md |
0.51.0 | Flow and text: 새 키워드나 요소 없이 다음을 더합니다. 한도 있는 뒤로 가는 점프 ::jump{to max}(max 1~99)는 모든 흐름 분석이 레이블에서 합류시키고 고정점까지 반복하며, 뒤로 가는 분기를 비목표로 둔 0.1.0을 대체합니다. 디렉티브와 보상 kind의 플러그인 effects.raises와 raisedBy: declared occasion은 시나리오 그래프에 [raises] 엣지로 그려집니다. text 속성 타입은 code=, lute tag, lute loc로 번역할 수 있는 디렉티브 텍스트입니다. target: pair lint도 추가됩니다. 구조화된 속성 값(#176)은 계속 미룹니다. 새 코드 E-JUMP-MAX, E-JUMP-LOOP-SCOPE, E-JUMP-INTO-LOOP, E-JUMP-LOOP-CROSS, E-PLUGIN-RAISES, E-RAISES-TARGET, E-LINE-CODE-RESERVED, E-LINE-ID-DUP, E-COMPONENT-TEXT-DIRECTIVE, W-OCCASION-NEVER-RAISED. IR은 추가형입니다(jump.max, semantic id lute.core.boundedJump/1, raises, localized). | 0.51.0.md |
0.52.0 | Clean slate: 새 키워드나 요소 없이 다음을 바꿉니다. 마커 앞의 리터럴 {는 E-INTERP-BRACE이고 라벨, 프롬프트, 플러그인 text 속성에서 \{{는 리터럴 {{입니다. 퀘스트 최상위에는 <on>, <objective>, <reward>만 옵니다. 허브 본문에서 나가는 앞으로의 점프는 허브를 떠나고, 따로 실행되는 본문으로 들어가는 점프는 E-JUMP-INTO-BODY입니다. 허브 스테이지 머리. 프롬프트는 라벨 문법을 따르고 런타임이 라벨과 프롬프트를 렌더링해 메뉴에 싣습니다. 목표 제목은 평문입니다. <reward>의 보상 kind 속성을 효과가 @<attr>로 읽습니다. lute impact는 [accept]/[raises]를 따르고 엔벨로프 출처는 [accept]에서 멈춥니다. 새 코드 E-INTERP-BRACE, E-JUMP-INTO-BODY, E-OBJECTIVE-TITLE-INTERP. IR 추가(jump.leaves, semantic id lute.core.hubLeave/1, promptPlaceholders, rewardEntry.attrs). awaitChoice 메뉴는 렌더링된 text/texts/prompt/promptTexts를 담습니다. | 0.52.0.md |
0.53.0 | Dogfood round 3: 새 키워드나 요소, IR 변경 없이 다음을 바꿉니다. 한도 있는 루프가 최상위 ## 섹션을 넘을 수 있습니다. 구조화된 플러그인 frontmatter 값(record, list, map) 안의 참조를 필드 경로와 함께 검사합니다. 스크립트 안 accept는 follows와 상관없이 퀘스트를 활성화하고, accept="external" follows="…"는 호스트 정책이며, accept 교착은 E-QUEST-START-CYCLE입니다. 리터럴 중괄호로 열리는 마커는 E-CEL-PROFILE이 아니라 E-INTERP-BRACE이고, 번역은 소스의 마커를 유지해야 합니다(E-L10N-MARKERS). pair lint는 scope: document를 받습니다. lute fix는 플러그인 스탬프를 유지하고 규칙 이름을 밝히며 그대로 둔 위치를 보고합니다. 문서를 둘 이상 읽는 모든 명령은 프로젝트 입력 계층을 한 번만 만들고 LSP는 루트마다 캐시 하나를 유지합니다. 새 코드 E-L10N-MARKERS. | 0.53.0.md |
| — | 상태 모델 설계 근거 및 감사 기록 — 4계층(scene/run/user/app) 상태 모델이 왜 이런 형태인지 설명하는, 0.0.1 §9의 비규범적 동반 문서입니다. | state-model-design.md |
어휘 슬롯을 작성자 측에서 읽는 방법 — 세 가지 선언
경로와 우선순위, 그리고 exits:/default: 장문 형식 —은
콘텐츠 어휘를 참조하세요.
Capability 제안
섹션 제목: “Capability 제안”| 제안 | 범위 | 원본 |
|---|---|---|
| Plugin system 0.0.1 | capability/플러그인 시스템의 규범적 형식과 의미론 — 플러그인 패키지, YAML 매니페스트 스키마, 해석, capability 스냅샷 및 데이터↔코드 경계입니다. | plugin-system/0.0.1.md |
| Plugin system 0.0.2 | 0.0.1에 대한 델타 — 플러그인 옵션과 frontmatter 값 검증, 예약된 stamp-attribute 거부, 모든 디렉티브와 콘텐츠 행에서 허용되는 교차 기능 stampAttrs, 그리고 구현된 선언적 lower: { record, fields } 형식입니다. | plugin-system/0.0.2.md |
| Plugin system 0.0.3 | 0.0.1/0.0.2에 대한 델타이며 dsl 0.9.0과 함께 적용됩니다 — lute.core는 빈 enums를 내보내고, enums 항목은 멤버 의미론(members/default/exits)을 담은 장문 형식을 사용할 수 있으며, 폐쇄형 semantics 플래그 어휘에서는 소비자가 읽지 않는 플래그 2개(isStateful, cancelsPrevious)가 제거되어 12개에서 10개가 됩니다. | plugin-system/0.0.3.md |
| Plugin system 0.0.4 | 0.0.1/0.0.2/0.0.3에 대한 델타이며 dsl 0.10.2와 함께 적용됩니다 — 플러그인이 소유하고 검사기가 검증하는 최상위 frontmatter 키(E-FRONTMATTER-SCHEMA)가 컴파일 시 버려지는 대신 컴파일된 아티팩트의 meta.plugin에 도달합니다. 어떤 CheckResult 게이트가 아티팩트를 생성했는지와 무관하게 결정적(키 정렬)으로 방어 심층 재검증을 수행합니다. | plugin-system/0.0.4.md |
| Plugin system 0.0.5 | 0.0.1–0.0.4에 대한 델타이며 dsl 0.13.0과 함께 적용됩니다 — 자문용 lints 내보내기 종류: 선언적 CEL lint 규칙(lints/*.yaml, 네임스페이스가 지정된 <plugin-id>/<rule-id>)입니다. lint 엔진에 로드되며 capability 스냅샷과 capabilityVersion에서는 제외되므로 편집 정책이 아티팩트 식별성을 이동시키지 않습니다. | plugin-system/0.0.5.md |
| Plugin system 0.0.6 candidate | 예정 항목이며 릴리스되지 않았습니다. 0.0.1–0.0.5에 대한 델타로, 디렉티브, 상태/팩트 쓰기, 브리지, 보상 및 퀘스트를 위한 일반 프로젝트/호스트 capability 권한 상한, 결합적인 프로젝트/프로필/호스트 계층화, --permission-profile, 공유 검사기/컴파일러/LSP/context 적용, 정책이 없는 해시를 변경하지 않는 제한 정책 capability 해싱을 추가합니다. 컴파일 시점 허용만 해당하며 런타임 샌드박스 또는 보상 구현은 없습니다. | plugin-system/0.0.6.md |
| Plugin system 0.0.7 | 0.0.1–0.0.6에 대한 델타입니다. 패스스루 플러그인 IR 레코드는 선택적 plugin 메타데이터에 해석된 소유자 id를 담을 수 있습니다. 호스트는 (plugin, tag)로 디스패치하며 선언적 표시 디렉티브는 계속 안정적인 코어 레코드로 낮춰집니다. 필드가 없는 이전 아티팩트도 유효합니다. | 0.0.7.md |
| Character & cast 0.0.1 | capability 플러그인으로서 캐릭터 식별성, 표시 레이블, 의상, 이름 공개 및 voice-join에 관한 언어 계약입니다(레지스트리, cast: frontmatter, scene.cast.* 상태, 해석, seal/reveal/wear). | character-cast/0.0.1.md |
플러그인 시스템에는 docs/plugin-system.md에 사람이 읽는 개요가 있으며, 캐릭터/캐스트 capability에는 character-cast/design.md에 설계 근거가 있습니다.