콘텐츠로 이동

현재 사양

버전 관리된 제안 스택은 다음 경로 아래에 있으며 docs/proposals/scenario-dsl/ 여전히 규범적 기준(normative source of truth)입니다. 이 페이지는 이를 대체하지 않습니다 — 이 페이지는 언어 버전 0.53.0에서 현재 유효한 것들을 통합한 인덱스입니다. 각 언어 영역에 대해 어떤 제안 리비전이 그것을 도입했고, 어떤 리비전이 마지막으로 변경했으며, 규범적 텍스트를 어디서 읽을 수 있는지를 정리합니다.

0.42.0 — 플레이어 계약 및 볼륨 바인딩

섹션 제목: “0.42.0 — 플레이어 계약 및 볼륨 바인딩”

0.42.0 계약은 언어, IR, Event 및 스냅숏 계약, 플레이어 바인딩, 생성된 계약과 플레이어 패키지를 하나의 축으로 전환합니다. 규범적인 릴리스 제안은 0.42.0.md입니다.

  • volume은 절대 레벨인 프로젝트 도메인입니다. 문서화된 축은 silent, quiet, normal, loud, full이며 숫자 볼륨은 허용되지 않습니다. lute fix은 정확히 예전 순서인 [silent, down, normal, up, full]일 때만 down을 quiet으로, up을 loud로 변경합니다.
  • player.bindings.yaml은 bindingsVersion: "0.42"와 선택적인 volumes: { member: gain } 맵을 사용합니다. gain은 [0, 1]의 유한한 수여야 하며, 알 수 없는 키는 E-BINDING-KEY, 누락된 멤버는 W-BINDING-MISSING, 잘못된 gain은 E-BINDING-SHAPE입니다.
  • bg, music, sfx, vfx, actor, camera, cg, video, sequence 런타임 레코드는 해석된 attrs를 가집니다. 호스트는 아티팩트를 다시 열지 않고 attrs에서 미디어 필드를 읽으며 Event와 스냅숏 스키마는 -0.42 계열로 이동합니다.
  • LutePlayer.make는 한 번 적용되는 cueFactory(base) 래퍼를 받고 핸들은 일관된 snapshot을 노출합니다. 재생은 voiceKey를 사용하며 Director에서는 중복된 사전 구성 핸들러보다 host.plugin이 우선합니다.
  • 패키지 typecheck은 Bun checker(bun check)를 사용하고 CI는 Bun 1.4.3을 고정합니다. 일곱 패키지와 모든 공개 버전 축은 0.42.0/0.42로 기록됩니다.

아래의 역사적 동작은 이를 도입한 제안에 계속 귀속되며, 이 인덱스는 해당 인용을 다시 쓰지 않습니다.

0.53.0(“dogfood round 3”)은 산출물이 아니라 답을 바꿉니다. IR, 런타임, 이벤트 계약, 플러그인 매니페스트는 움직이지 않고 스키마는 -0.53 이름만 얻습니다. 아래 영역별 인덱스의 해당 행이 각 변경을 적습니다. 규범적 텍스트는 0.53.0.md입니다.

  • 섹션을 넘는 루프(§9, #231). 문서의 최상위 ## 섹션은 하나의 range로 실행되므로 하나의 루프 범위입니다. 한도 있는 ::jump{to max}는 앞선 섹션의 label로 되돌아갈 수 있습니다. 섹션은 표현과 식별일 뿐 런타임 range, 재개 지점, 호스트 진입점, 점프 대상이 아닙니다(§9.1). E-JUMP-LOOP-SCOPE는 더 이상 섹션을 이름으로 들지 않고, E-JUMP-INTO-LOOP는 선택지 하나로 옮기라는 힌트를 더합니다.
  • 구조화된 frontmatter 참조(§6, #226). 타입이 entity, domain, enumFromOption, providerRef, assetKind인 참조는 플러그인 frontmatter의 record, list, map 값 어디에 있든 검사되고 메시지에 필드 경로가 나옵니다. 플러그인 frontmatter 타입은 W-DOMAIN-UNREAD의 읽는 쪽으로 칩니다.
  • Accept(§7, #227). 스크립트 안 accept는 follows와 상관없이 수락형 퀘스트를 활성화합니다. accept="external" 퀘스트에는 호스트 경로가 있고, 호스트가 기다리는 조건은 follows="…"로 쓰며 호스트 정책입니다(Lute는 전달하고 분석은 heuristic으로 읽습니다). 도달 분석은 그려지지 않은 accept 엣지에 대해 반복하고, 스크립트 안 accept의 교착은 E-QUEST-START-CYCLE입니다.
  • 마커(§8, #229, #241). 표현식이 {로 열리는 마커는 중괄호 개수 n을 밝히는 E-INTERP-BRACE입니다 (0.52는 E-CEL-PROFILE). 번역은 소스의 각 {{…}} 마커를 같은 횟수만큼, 순서 무관하게 보여 주어야 하며, 그렇지 않으면 E-L10N-MARKERS이고 병합되지 않습니다.
  • Lint(§5, #225). pair lint는 scope: document를 받습니다.
  • lute fix(§4, #224). 이전 모든 릴리스의 모든 이전을 적용하고, 프로필이 스탬프로 선언한 디렉티브 속성은 그대로 두며, 적용한 규칙의 이름(리포트 0.53.0.fix)과 그대로 둔 위치를 출력합니다. lute fix가 실행하는 것을 참고하세요.
  • 비용과 에디터(§3, #228, #240). 문서를 둘 이상 읽는 모든 명령은 프로젝트 입력 계층을 한 번만 만듭니다. lute lint는 피연산자만 읽고, catalog refresh와 doctor는 매니페스트에서 catalogDir을 읽으며, check --project는 lute beats가 보고하는 비트 가림을 보고하고, LSP는 프로젝트 루트마다 입력 캐시 하나를 요청 사이에 유지합니다.

0.52.0(“clean slate”)은 새 키워드나 요소 없이, 검사기가 받아들이는 것과 실제로 실행되는 것 사이의 틈을 메웁니다. 아래 영역별 인덱스의 해당 행이 각 변경을 적습니다. 규범적 텍스트는 0.52.0.md입니다.

  • 리터럴 중괄호(§3, #139, #211, #221). 줄 텍스트에서 {{…}} 마커 바로 앞의 리터럴 {(홀수 개)는 컴파일된 텍스트가 마커와 구별할 수 없으므로 E-INTERP-BRACE입니다. 평범한 {{로 끝나 마커 앞에 끼워지는 ::use 인자도 같습니다. \{{는 라벨 문법을 따르는 모든 값(<choice text>, prompt, 플러그인 text 속성)에서 리터럴 {{이고, 그 밖의 따옴표 값에서는 계속 E-STRING-ESCAPE입니다.
  • 퀘스트 최상위(§4, #208). 퀘스트는 <on>과 <objective> 본문만 실행하므로, <quest> 바로 안에는 그 둘과 <reward>만 올 수 있습니다(E-GRAMMAR-NOT-ADMITTED). E-JUMP-LOOP-SCOPE는 퀘스트 최상위 원인을 잃습니다.
  • 허브(§5, #216, #217, #222). 허브 옵션이나 <return> 본문에서 나가는 앞으로의 ::jump는 그 허브들을 떠납니다(IR jump.leaves, semantic id lute.core.hubLeave/1). 자기 range로 실행되는 본문으로 들어가는 점프는 E-JUMP-INTO-BODY입니다. 각 허브 옵션은 앞선 선택이 남길 수 있는 것에 대한 고정점인 허브 머리에서 판정되므로, W-STAGE-ABSENT와 주입되는 스테이징이 형제 옵션의 퇴장을 봅니다. 합류에서는 모든 경로에서 무대에 있는 캐릭터가 무대에 남습니다.
  • 메뉴 텍스트(§6, #218, #212). prompt는 라벨 문법을 따르고 라벨처럼 검사됩니다(IR promptPlaceholders). 런타임은 라벨과 프롬프트를 렌더링해 awaitChoice 메뉴(text, texts, prompt, promptTexts)에 싣고, 레퍼런스 플레이어가 이를 보여 줍니다. 프로젝트 전체 E-QUEST-REF-UNKNOWN은 프롬프트와 플러그인 text 속성을 읽습니다. <objective title>은 평문입니다: E-OBJECTIVE-TITLE-INTERP.
  • 보상 kind 속성(§7, #201). <reward>는 kind가 선언한 attrs:를 디렉티브 속성처럼 타입 검사해 쓸 수 있고, kind의 효과는 @<attr>를 읽습니다. IR RewardEntry.attrs는 grant 레코드에 복사됩니다. 선언 오류는 로드 때 E-PLUGIN-PARSE입니다.
  • 도구(§8, #209, #210, #213, #214). lute scenario envelope의 출처는 [raises]처럼 [accept] 엣지에서도 멈춥니다. lute impact는 [accept]와 [raises] 엣지를 따라갑니다. loc export는 선택지 본문 안에서 유효한 접두사를 씁니다. lute test --project는 발견 안내를 출력하지 않습니다.
  • 32비트 변환(§9, #198). 목록 인덱스, countDistinct 열, 요일 레이블, lute lint 인덱스가 wasm32에서도 네이티브와 같은 결과를 냅니다.

0.51.0(“flow and text”)은 새 키워드나 요소 없이 네 가지 기능을 더하며, 아래 영역별 인덱스의 해당 행이 각각을 적습니다. 규범적 텍스트는 0.51.0.md입니다.

  • 한도 있는 뒤로 가는 점프(§3). ::jump{to max}는 앞선 ::label로 최대 max번(1~99의 정수 리터럴) 되돌아갈 수 있고, 그 뒤에는 다음 노드로 넘어갑니다. 루프는 한 본문 안에 머물고, 머리 레이블로만 진입하며, 다른 루프와 교차하지 않고 중첩됩니다. 모든 흐름 분석은 레이블에서 모든 점프의 상태를 합류시키고 루프 머리를 고정점까지 반복합니다. 그래서 쓰기를 건너뛰는 점프가 닿는 레이블 뒤의 읽기는 E-MAYBE-UNSET이고, 그 자리의 대사는 W-STAGE-ABSENT가 될 수 있습니다. 새 코드 E-JUMP-MAX, E-JUMP-LOOP-SCOPE, E-JUMP-INTO-LOOP, E-JUMP-LOOP-CROSS. IR: jump.max와 semantic id lute.core.boundedJump/1. 참조 런타임은 적재 시 루프 구조를 다시 검사합니다. 컴포넌트 안의 레이블은 ::use 인스턴스마다 따로 컴파일됩니다(#207).
  • 선언된 occasion raise(§4). 디렉티브나 보상 kind가 effects.raises를 선언하고, occasion은 raisedBy: declared일 수 있습니다. 시나리오 그래프는 던지는 쪽에서 그 occasion에 응답하는 장면과 비트로 [raises] 엣지를 그립니다(0.52부터 lute impact도 이를 따라갑니다. #210). 선언된 raise는 호스트의 약속이며 가능할 뿐 보장이 아닙니다. 새 코드 E-PLUGIN-RAISES, E-RAISES-TARGET, W-OCCASION-NEVER-RAISED. IR: raises. 참조 플레이어는 아직 보내지 않은 raise를 세이브에 담습니다(pendingRaises).
  • 번역할 수 있는 디렉티브 텍스트(§5). text 타입 속성은 번역할 수 있으며, 그 디렉티브는 code=를 받고 식별자는 {prefix}~{tag}~{code}~{attr}입니다. lute tag와 lute loc export / import / report가 이를 다룹니다. 새 코드 E-LINE-CODE-RESERVED, E-LINE-ID-DUP, E-COMPONENT-TEXT-DIRECTIVE. IR: localized.
  • target: pair lint(§6). open, close, 선택적인 inside 술어로 닫히지 않은, 열린 적 없는, 중첩된, 자리가 잘못된 쌍을 body 또는 section 범위에서 찾습니다.

구조화된 속성 값(#176: list, map, record)은 다루지 않고 미룹니다. 거부는 그대로이고 메시지가 스칼라로 나누는 방법을 알려 줍니다(§7).

0.51.0은 0.1.0의 비목표를 대체합니다. 0.1.0 제안(§14)은 뒤로 가는 분기를 비목표로 둡니다. 한도가 있고 잘 중첩된 루프는 모든 분석을 유한하게 유지하고 종료를 증명할 수 있게 하므로 0.51.0이 이를 허용합니다. 이전 제안과 이 페이지의 이력 절은 다시 쓰지 않습니다.

언어 영역도입마지막 변경규범적 출처
AI 편집 루프 및 무손실 소스 도구0.36.6무손실 구문과 정규(canonical) lute fmt, 소스/프로젝트 리비전, 작업 범위의 lute context, 의미론적 lute diff, 그리고 리비전 검사를 거치는 원자적 lute patch입니다. 0.53.0부터 lute fix는 버전 올리기만이 아니라 이전 모든 릴리스의 모든 이전(migration)을 적용하고, 활성 프로필이 스탬프로 선언한 디렉티브 속성은 그대로 두며, 적용한 규칙의 이름과 그대로 둔 위치를 출력합니다. 리포트는 0.53.0.fix입니다.0.36.0.md §1–§8, 0.53.0.md §4
프로젝트 의미론적 모델 및 영향 분석0.34.0프로젝트 명령은 하나의 모델을 공유합니다. lute impact은(는) 결정적인 역방향 의존성 클로저를 계산하고, lute constraints은(는) 명시적 증거 수준과 한정된 범위를 가진 정책 선언을 검사합니다. 0.52.0부터 lute impact는 시나리오 그래프의 [accept]와 [raises] 엣지를 따라갑니다(뒤의 raise 지점이 모두 동적이면 raises 링크는 heuristic). 0.53.0부터 문서를 둘 이상 읽는 모든 명령은 프로젝트 입력 계층을 캐시 키마다 한 번만 만들고(LSP는 프로젝트 루트마다 하나를 요청 사이에 유지하며 요청마다 검증합니다), lute lint는 피연산자만 읽으며, check --project는 lute beats가 보고하는 비트 가림, 우선순위 동률, fact 가드 판정을 보고합니다(루트마다 조정 한 번, #240).0.34.0.md §1–§6, 0.52.0.md §8.2, 0.53.0.md §3, 0.53.0.md §3.10
엔진 의미론 협상0.33.0컴파일러는 로워링된 기능에서 정렬된 requiredSemantics id를 도출합니다. 엔진은 정확한 마이너 IR 게이트 이후 lute.engine.yaml을(를) 로드하고 재생 전에 지원되지 않는 id를 거부합니다. check --engine 및 check-project --engine 명령은 작성 시점에 누락된 capability를 보고합니다.0.33.0.md §2–§5
Frontmatter 및 프로필0.1.00.53.0 (구조화된 플러그인 frontmatter 값 안의 참조 — record 필드, list 항목, map의 키나 값, 중첩 포함 — 는 최상위 값과 똑같이 검사되고 메시지에 필드 경로가 나옵니다. 표현할 수 없는 값과 지원하지 않는 map 키 타입은 계속 E-FRONTMATTER-SCHEMA이며, 플러그인 frontmatter 타입은 W-DOMAIN-UNREAD의 읽는 쪽으로 칩니다; 0.49.0: 참조 타입의 플러그인 frontmatter 키(entity, domain, enumFromOption, providerRef, assetKind, 또는 그 하나의 리스트)는 문자열 값을 그 타입의 속성처럼 검사하며 속성 코드와 did-you-mean을 그대로 씁니다. 다른 값 형태는 계속 E-FRONTMATTER-SCHEMA입니다; 0.37.0: frontmatter title:이(가) 유일한 문서 제목이며, 본문의 # Title 줄은 E-INERT-TITLE입니다. monoSpeakers:은(는) pov: 옆에 씬, 퀘스트, 로어 문서 및 매니페스트의 defaults: 안에 위치합니다. _을(를) 포함하는 작성된 키는 E-AUTHOR-CASE이며 lowerCamelCase 표기를 알려 줍니다. 매니페스트의 sequence: 키는 제거되었습니다(E-REMOVED-PROJECT-KEY). 0.28.0: 다른 계층에 속하는 frontmatter 키는 그 계층을 알려 줍니다(terminal: → 스키마, chapters: / questTier → lute.project.yaml, rearm / tier → <quest> 속성). once이(가) spentBy: 옆에 있는 것은 합법이며 래치의 기간을 설정합니다(once: false 또는 그 옆의 share 키는 E-BEAT-ATTR입니다). bool이나 숫자가 와야 할 자리의 따옴표로 묶인 스칼라(once: "false")는 따옴표 없이 쓰라고 안내합니다. kind: lore 문서는 pov:을(를) 허용합니다. 매니페스트의 defaults.questTier은(는) season:<name>을(를) 허용하며, 매니페스트는 알 수 없는 키를 거부합니다(E-MANIFEST-KEY). 0.27.0: 씬 비트는 for: "kind:<kind>"을(를) 대상이 없는 select: sequence occasion에 쓸 수 있으며, when이(가) 성립하는 멤버마다 한 번씩 제시됩니다. spentBy:은(는) 조건이 성립할 때 비트를 소비합니다(0.28.0: 래치 — 조건이 한 번 성립하면, 즉 어떤 settle 이후의 정착된 세계에서든 비트가 판정될 때든, kind 비트나 for 비트의 경우 멤버별로, 비트는 자신의 once 기간 동안 소비된 상태로 유지되며, 쓰지 않으면 run이고, 조건이 거짓으로 바뀌어도 그대로입니다. once: false 또는 그 옆의 share 키는 E-BEAT-ATTR이고, 플레이 시작 시점에 성립하는 것은 W-BEAT-SPENT-AT-START이며, once을(를) 쓰지 않았는데 다시 거짓으로 바뀔 수 있는 것은 W-SPENT-BY-REVERSIBLE입니다). once: week(클록의 week:과(와) 함께) 및 once: season:<name>. 매니페스트의 chapters:(0.28.0, occasion별 하나씩의 { on, scenes } 체인 목록)은 나열된 각 씬에 on:, 내림차순 priority:, 그리고 — select: sequence occasion이 아닌 경우 — after:을(를) 부여하되, 씬이 해당 키를 직접 쓰면 예외입니다. 대상이 있는 occasion에서는 나열된 모든 씬이 target:을(를) 선언합니다(E-CHAPTERS, W-CHAPTER-ORDER, W-CHAPTER-STALL). 0.26.0: 씬 비트는 target: "kind:<kind>"할 수 있습니다 — 이 경우 kind의 모든 멤버에 응답하고 발생된 멤버를 occasion.target로 읽습니다. 매니페스트의 defaults.uses 항목은 glob일 수 있고 defaults.questTier은(는) 기본 퀘스트 tier=을(를) 설정합니다. 0.25.0: 씬 비트는 share: 키를 쓰여진 once 옆에 지정할 수 있으며, 그 키의 모든 비트와 함께 소비됩니다. 0.24.0: 프로젝트가 클록을 선언하면 씬 비트와 번들 비트는 once: day / once: slot을(를) 받습니다 — 클록이 없으면 E-BEAT-ATTR입니다. 0.21.0: 씬은 씬 전용 키 on: / target: / when: / priority: / once:으로 비트가 됩니다. when, target, priority 또는 once이(가) on 없이 있으면 E-BEAT-ATTR입니다)0.49.0.md §4.3; 0.37.0.md §2.1, §3.1, §3.4; 0.28.0.md; 0.27.0.md; 0.26.0.md; 0.25.0.md; 0.24.0.md; 0.21.0.md, 0.53.0.md §6
섹션(## Heading {#id})0.1.00.53.0 (섹션은 표현과 식별 — 제목, 선택적 {#id}, position의 첫 세그먼트 — 일 뿐 런타임 range, 재개 지점, 호스트 진입점, 점프 대상이 아닙니다. 씬의 최상위 섹션은 하나의 range로 실행되며 하나의 루프 범위입니다; 0.37.0: 문서의 본문은 ## 섹션들로 이루어집니다 — IR의 sections 테이블, { section, heading, id? }. 선택적인 마지막 {#id}은(는) 문서별로 고유한(E-SECTION-DUP) 안정적인 섹션 id이며, 식별 메타데이터일 뿐 ::jump 대상이 되는 일은 없습니다. 첫 제목 앞의 내용은 E-CONTENT-OUTSIDE-SECTION입니다. 예약된 <scene> 태그는 제거되었습니다(E-REMOVED-TAG). 0.6.0: 자유 형식 제목 텍스트)0.37.0.md §3.1; 0.6.0.md, 0.53.0.md §9.1
콘텐츠 줄(@speaker 대사)0.1.00.53.0 (표현식이 {로 시작하는 마커 — {{{run.a}} — 는 리터럴 중괄호 n개 뒤의 마커로 읽어 줄 텍스트와 라벨 문법을 쓰는 모든 값에서 E-INTERP-BRACE로 보고합니다. 0.52는 이를 E-CEL-PROFILE로 보고했습니다. 메시지는 중괄호 개수 n을 밝히고 정확히 n개에 맞는 두 가지 해결 방법을 알려 줍니다. {{…}} 마커가 파싱되지 않거나 소스의 마커가 아닌(각각 같은 횟수, 순서 무관) 번역은 E-L10N-MARKERS이며 병합되지 않습니다; 0.52.0: 줄 텍스트에서 {{…}} 마커 바로 앞의 리터럴 {(홀수 개)는 E-INTERP-BRACE이며, 평범한 {{로 끝나 마커 앞에 끼워지는 ::use 인자도 같습니다. \{{는 라벨 문법을 따르는 모든 값(<choice text>, prompt, 플러그인 text 속성)에서 리터럴 {{이고, 그 밖의 따옴표 값에서는 E-STRING-ESCAPE입니다; 0.50.0: bare 식별자 {{name}}은 플러그인의 hostTokens export(또는 lute.core의 userName)가 선언하면 호스트 토큰이며, 형식 힌트는 토큰의 타입으로 검사됩니다. 선언되지 않은 토큰은 선언된 토큰을 나열하는 E-CEL-PROFILE이고, IR은 호스트가 치환하는 reserved 자리표시자를 그대로 둡니다. on: [line]으로 범위가 정해진 플러그인 스탬프는 줄에만 적용되며, required: true인 스탬프가 없는 줄은 E-MISSING-ATTR입니다; 0.49.0: 콘텐츠 줄은 코어 타이밍 키 wait(bool 또는 bool @ref)를 받고, IR은 작성된 경우에만 timing.wait를 담습니다. delay / duration은 계속 E-UNKNOWN-ATTR입니다. 레퍼런스 플레이어는 wait: false 줄 뒤의 스테이징 cue를 붙잡지 않습니다; 0.47.1: 줄 안의 \{{는 하나의 이스케이프 규칙에 따라 리터럴 텍스트입니다. 모든 스캐너에서 {{ 바로 앞의 홀수 개 백슬래시가 이를 이스케이프합니다. ::use 문자열 인자는 디코딩된 값으로 판단합니다. IR은 text, 세그먼트, 번역에서 리터럴 {{를 \{{로 쓰고 {{ 앞의 백슬래시를 두 배로 쓰며, 플레이스홀더를 직접 치환하는 엔진은 이 이스케이프를 읽어야 합니다. 0.37.0: 줄의 역할은 dialogue, narration(@narrator), 또는 {mono} / {os} / {vo} 플래그의 mono / os / vo입니다. {mono} 화자는 유효한 시점(point of view)이어야 하거나(pov:, 그렇지 않으면 defaults.pov) monoSpeakers:에 나열되어야 하며 — 그렇지 않으면 E-MONO-POV, 시점이 해석되지 않으면 E-MONO-NO-POV — 이는 컴포넌트의 모든 ::use에서 해당 호출자의 컨텍스트로 판정됩니다. 줄은 id=을(를) 받지 않습니다(그 앞의 ::label이(가) 위치를 표시합니다). 줄 텍스트의 인라인 텍스트 수정자 — 코어 :pause{s=…} 및 :speed[…]{rate=…}, 그리고 프로젝트의 textStyle 도메인에서 오는 span 스타일 — 가 있으며, IR의 text은(는) 평문 파생이고 수정된 줄은 segments을(를) 추가합니다(E-TEXT-MODIFIER, E-TEXT-ESCAPE). 0.28.0: kind의 labels: 항목은 텍스트에서 캐스트 name:보다 우선하며(화자 헤드는 캐스트 이름을 유지합니다. W-LABEL-CAST-SHADOWED은(는) 폐기되었습니다) { text, start, indefinite }일 수 있고, {{…:start}} / {{…:indefinite}}에 의해 렌더링됩니다. :capitalize과(와) :cardinalWord이(가) 힌트에 추가되고 #word / #Word은(는) 숫자를 plural(…) 형식으로 표기합니다. 줄 텍스트나 선택지 레이블의 다른 언어 마크업은 경고합니다 — W-TEXT-SINGLE-BRACE({run.oil}, Ink / Yarn 중괄호), W-TEXT-COMMENT-LIKE, W-TEXT-BRACKET-LABEL, W-TEXT-GLUE. 따옴표로 묶이거나 ,으로 구분된 복수형은 E-PLURAL-FORM입니다. 진단 열은 문자 단위로 셉니다. 0.27.0: {{occasion.target}}과(와) { domain: K } / { entity: K } 경로는 kind의 labels:을(를) 렌더링합니다(0.28.0: 레이블이 캐스트 name:보다 우선합니다. 화자 헤드는 캐스트 이름을 유지합니다). {{n:plural(lamp|lamps)}}은(는) 숫자에 따라 형식을 고르며, #이(가) 그 숫자를 대신합니다. 속성 값을 둘러싼 둥근 따옴표는 하나의 E-ATTR-QUOTE입니다. 0.26.0: 컴포넌트 줄 @@who:은(는) speaker 파라미터가 지정하는 캐스트 멤버로서 말합니다. 정확히 동일한 두 캐스트 항목 또는 화자 표시 이름은 W-DISPLAY-NAME-DUP입니다(단, 항목이 sharedName: true인 경우는 예외입니다). 0.25.0: 예약된 relation의 changedOn:은(는) 엔진이 그것을 변경하는 occasion들을 지정하며, 그러면 캐스트 assume: true은(는) 그 중 하나에서 제시되는 유닛, 그 유닛의 after 후손, 또는 그 relation의 fact를 필요로 하는 guard 아래에서는 더 이상 그것을 포괄하지 않습니다. {{x:ordinalWord}} 형식 힌트 — lute play은(는) first … twentieth으로 렌더링되고 엔진이 현지화합니다. 0.24.0: 캐스트 항목은 present:을(를) 선언할 수 있으며 — guard가 이를 함의하지 않는 줄은 W-CAST-ABSENT이고, assume: true은(는) 부정된 엔진 예약 fact를 참으로 읽습니다 — 또한 emotions:을(를) 선언할 수 있으며, 그 밖에서 emotion=은(는) E-BAD-ENUM입니다. {{x:ordinal}} 형식 힌트가 있고, enum 타입 경로의 {{path}}은(는) 멤버의 표시 labels:을(를) 렌더링합니다. 0.23.0: 선언된 캐스트 — 플러그인 cast export 또는 스키마 문서의 cast: — 는 그 밖의 화자를 did-you-mean과 함께 E-CAST-UNKNOWN로 만듭니다. 캐스트가 없으면 화자는 형태만 검사됩니다. 0.5.1: 전달 플래그 작성 표면의 정직성)0.50.0.md §4; 0.49.0.md §4.2; 0.47.1.md §3; 0.37.0.md §3.4, §3.6; 0.28.0.md; 0.27.0.md; 0.26.0.md; 0.25.0.md; 0.24.0.md; 0.23.0.md; 0.5.1.md, 0.53.0.md §8, 0.53.0.md §8.1
코어 지시어(닫힌 lute.core 어휘)0.1.00.53.0 (한도 있는 ::jump{to max}는 섹션들이 하나의 range이므로 앞선 최상위 ## 섹션의 label로 되돌아갈 수 있습니다. E-JUMP-LOOP-SCOPE는 더 이상 섹션을 이름으로 들지 않습니다. E-JUMP-INTO-LOOP는 들어가는 점프가 다른 점프가 가리키지 않는 <choice> 본문의 끝이면 선택지 하나로 옮기라는 힌트를 더합니다; 0.52.0: 허브 옵션이나 <return> 본문에서 허브 뒤의 레이블로 가는 앞으로의 ::jump는 그 허브들을 떠납니다(jump.leaves, semantic id lute.core.hubLeave/1). 자기 range로 실행되는 본문(허브 옵션·<return>, <on>·<objective> 본문, 엔트리, 비트)으로 들어가는 점프는 E-JUMP-INTO-BODY입니다; 0.51.0: ::jump은 max(1~99의 정수 리터럴)를 받으며, 그러면 같은 본문의 앞선 ::label을 대상으로 삼을 수 있습니다. 한도 있는 루프는 머리 레이블로만 진입하고 다른 루프와 교차하지 않고 중첩됩니다(E-JUMP-MAX, E-JUMP-LOOP-SCOPE, E-JUMP-INTO-LOOP, E-JUMP-LOOP-CROSS). 모든 흐름 분석은 레이블에서 모든 점프의 상태를 합류시키고 루프 머리를 고정점까지 반복합니다. 한도 있는 점프는 W-CODE-AFTER-JUMP에서 본문을 끝내지 않습니다. 코어 jump가 max를 선언하므로 모든 capabilitySnapshot이 한 번 바뀝니다; 0.50.0: 플러그인 stampAttrs 항목의 on:은 스탬프를 이름 있는 표면 — line, branch, hub, choice 또는 스탬프 캐리어가 있는 디렉티브 태그 — 으로 한정하고, on:이 없는 항목은 계속 스탬프되는 모든 디렉티브와 콘텐츠 줄에 허용됩니다. 다른 표면으로 한정된 스탬프는 그 표면을 나열하는 E-UNKNOWN-ATTR입니다. required: true는 on:이 필요하며 스탬프가 없는 곳에서 E-MISSING-ATTR입니다. 스탬프 가능한 표면을 지명하지 않는 on:은 E-PLUGIN-STAMP-SURFACE입니다; 0.49.0: ::jump, ::label, ::clear는 스탬프된 레코드를 내지 않으므로 그 위의 코어 타이밍 키나 플러그인 stampAttrs 키는 속성 위치의 E-UNKNOWN-ATTR입니다. 지시어 타이밍 @ref는 그 타이밍 키의 타입으로 검사합니다(E-REF-TYPE); 0.42.0: volume은 절대 레벨 프로젝트 도메인이고 문서화된 축은 silent / quiet / normal / loud / full이며 숫자 볼륨은 거부됩니다. 스테이징 지시어는 0.37 표면인 ::bg, ::music, ::sfx, ::vfx, ::actor, ::camera, ::cg, ::video, ::sequence로 유지되며 런타임 필드는 해석된 형태입니다. 0.37.0의 지시어 이름 변경과 숫자 카메라 어휘 제거 등 이전 전환은 역사적 인용으로 남습니다.)0.51.0.md §3.1–§3.5; 0.50.0.md §3.1–§3.4; 0.49.0.md §4.1; 0.47.0.md §4; 0.42.0.md §3; 0.37.0.md §3.3, §3.5; 0.28.0.md; 0.27.0.md; 0.26.0.md; 0.24.0.md; 0.9.0.md, 0.53.0.md §9, 0.53.0.md §9.4
암묵적 스테이징(스테이지 정리 주입)0.1.00.52.0 (허브의 각 옵션은 허브 머리(진입 스테이지에 exit이 아닌 옵션과 <return>이 남길 수 있는 상태를 고정점까지 합친 것)에서 판정하므로, W-STAGE-ABSENT와 주입되는 anchor·preload가 앞선 선택의 퇴장을 봅니다. 경로가 합류할 때 모든 경로에서 무대에 있는 캐릭터는 스프라이트만 알 수 없게 되고 무대에 남아, 다음 줄의 auto-pose-reset이 유지됩니다; 0.45.0: 주입되는 스테이징 — 장면 전환 hide, 배우 anchor/preload, 포즈 초기화, stage-clear — 과 W-STAGE-ABSENT / W-EXIT-INERT는 디렉티브가 낮춰지는 스테이징 레코드를 기준으로 합니다. 그래서 bg로 낮춰지는 플러그인 디렉티브는 ::bg처럼 장면을 바꾸고, actor로 낮춰지는 것은 ::actor처럼 캐릭터를 세웁니다(exit: true면 퇴장). 기본 §11.5 개정: 여전히 툴체인 규칙이지만 원본 디렉티브가 아니라 낮춰진 레코드의 함수입니다. actor 낮춤은 character를 필수 속성이나 리터럴에 묶어야 하며, 아니면 E-LOWER-RECORD-FIELD)0.45.0.md §2
콘텐츠 어휘(emotion, action, anchor, mood, volume, musicPlayback, vfxType, costume, framing, cameraMove, transition, cgLayout, sequence, textStyle)0.1.0 (lute.core에 포함되어 배포된 닫힌 멤버 목록)0.42.0 (volume 멤버는 절대 레벨이며 문서화된 축은 silent, quiet, normal, loud, full입니다. lute fix은 정확히 예전 순서 [silent, down, normal, up, full]인 도메인만 변경하고 다른 슬롯은 계속 프로젝트가 소유합니다. 0.41.0의 musicAction → musicPlayback은 역사적 변경입니다.)0.42.0.md §3; 0.41.0.md §3.1; 0.37.0.md §3.2; 0.9.0.md
Branch / match / when / hub0.1.00.52.0 (prompt는 라벨 문법을 따릅니다. 마커는 라벨처럼 검사되고 promptPlaceholders로 컴파일됩니다. 런타임은 옵션 라벨과 프롬프트를 렌더링해 awaitChoice 메뉴(text, texts, prompt, promptTexts)에 싣습니다; 0.50.0: <branch>, <hub>, <choice>는 on:이 자신을 지명하는 플러그인 스탬프를 받으며, @ref 값을 포함해 선언으로 타입이 검사됩니다. IR의 choice / hub 레코드 stamps는 요소의 스탬프를 담고, 각 옵션 항목은 해당 <choice>의 stamps를 담습니다. 레퍼런스 플레이어의 ChoiceView도 둘 다 전달합니다; 0.47.0: prompt=가 있는 branch나 hub는 프롬프트 lineId {prefix}.{id}.prompt를 가지며 — IR의 choice / hub 레코드는 이를 promptLineId로, 번역된 프롬프트를 promptTexts로 담습니다 — 그 안의 <choice id="prompt">는 E-CHOICE-DUP입니다. 0.37.0: <choice>의 표시 텍스트는 text=입니다. <match>은(는) subject=으로 주제(subject)를 지정합니다. IR의 choice 및 hub 레코드는 selectionKey을(를) 담습니다. 0.28.0: <hub>은(는) <return> 블록 하나를 가질 수 있으며, 이 블록은 exit이(가) 아닌 모든 옵션의 arm 뒤, 옵션이 다시 판정되기 전에 실행됩니다. 플래그 속성(once, exit, optional, also)은 값 없이 쓰며, ="true" / ="false"은(는) 글자 그대로의 의미이고 그 외의 값은 E-FLAG-VALUE이며, <choice>의 once은(는) 이번 hub 방문에만 해당함을 의미합니다. 모든 조건 슬롯에서 비교는 타입 검사됩니다(E-CEL-TYPE). <when is> arm이 주제 없는 <match> 안에 있으면 E-MATCH-NO-SUBJECT입니다. <else>은(는) <otherwise>을(를) 알려 주는 단일 오류입니다. W-BRANCH-ID-SHARED은(는) 하나의 id를 가진 두 문서의 메뉴에 대한 것입니다. 0.27.0: { domain: K } / { entity: K } 경로는 리터럴과 만나는 모든 곳에서 멤버 검사를 받으며 — ::set, == / != / in, <when is>, into= — 이를 대상으로 하는 <match>은(는) K를 모두 포괄해야 합니다. <match>의 주제 @def이(가) fact 쿼리이면 E-MATCH-RELATION-SUBJECT이며, 인라인 쿼리의 경우도 마찬가지입니다 — arm의 <when test>에서, 즉 주제 없는 <match> 안에서 검사하십시오. 비트의 when:은(는) `
재사용 가능한 콘텐츠 컴포넌트(::use 확장)0.1.00.46.0 (::use 지점은 component, when, at, instance를 예약합니다. 이 이름의 컴포넌트 파라미터는 params: 항목에서 한 번 E-TEMPLATE이며 예약 목록을 알려 줍니다. 0.28.0: 템플릿 헤더는 F[@param]을(를) 허용하고(점 형식은 W-TEMPLATE-DOT-PARAM을(를) 그립니다), also: true을(를) 선언할 수 있으며, 사용 측 자체의 when=이(가) 헤더의 것을 대체하면 그 사실을 알립니다(W-TEMPLATE-OVERRIDE). component / when이라는 이름의 컴포넌트 파라미터, 또는 <beat> 헤더 키와 같은 이름의 템플릿 파라미터는 E-TEMPLATE입니다. 닫힌 { domain: K }({ domain: clock.slot } / { domain: clock.weekdayLabel } 포함)으로 타입이 지정된 파라미터는 K의 멤버에 대해 판정됩니다. occasion.target은(는) kind 비트나 for= 비트에서 컴포넌트 인수가 될 수 있습니다. 0.27.0: 컴포넌트는 beat: 헤더를 선언하고 비트 템플릿으로 사용될 수 있습니다 — <beat use="…" id="…" …>(또는 자체 닫힘)은 자신이 쓰지 않는 모든 헤더 키를 받고, 템플릿의 본문을 실행한 뒤 자신의 본문을 실행하며(::body이(가) 위치를 정합니다), 어떤 검사보다 먼저 일반 비트로 desugar됩니다. 잘못된 사용은 E-TEMPLATE입니다. 0.26.0: 직접 텍스트와의 동등성 — 컴포넌트의 플러그인 결과 슬롯은 호스트에 선언되고, 타입 없는 bridge 응답은 거부되며, 문자열 인수의 {{…}}과(와) 속성 값의 speaker 파라미터는 텍스트에서와 같이 렌더링됩니다. @@who:은(는) speaker 파라미터로서 말합니다(화자가 아닌 파라미터에 대한 @@x은(는) E-COMPONENT-ARG입니다). 파라미터는 default:을(를) 선언할 수 있습니다. 컴포넌트는 자신의 플러그인 지시어의 결과 슬롯을 읽습니다. 0.24.0: effects: true — 컴포넌트는 ::set / ::assert / ::retract할 수 있으며, 각 쓰기는 모든 ::use에서 호스트의 스키마에 대해 검사되고 ::use이(가) 있는 위치에서 컴파일됩니다. speaker 파라미터는 캐스트 id를 받습니다. 0.23.0: 컴포넌트 string 파라미터는 {{@p}}로 보간될 수 있습니다 — 리터럴 ::use 인수는 호출 지점마다 그 호출 자체의 lineId 아래에서 대체되며, 파라미터를 @def에 바인딩하는 것은 E-REF-TYPE입니다. 0.22.0: 컴포넌트 줄은 자신의 식별 범위를 갖습니다 — {prefix}.{component}#{n}.{speaker}_{code}, n은(는) 호스트에서 그 컴포넌트의 1부터 시작하는 ::use 순번 — 따라서 두 사용이 lineId을(를) 공유하는 일은 없습니다. 0.9.0에서는 루트 전용이던 다섯 개의 검사 단계가 임포트된 컴포넌트 본문에 대해서도 실행되게 되었습니다 — 콘텐츠 줄 속성, E-DUP-LINE-CODE, 도달 가능성, 미탐색 콘텐츠 허용, 주입 폴딩)0.46.0.md §2.1; 0.28.0.md; 0.27.0.md; 0.26.0.md; 0.24.0.md; 0.23.0.md; 0.22.0.md; 0.9.0.md
into= 레코드(선택지 실행 기록 sugar)0.1.0 (persist=/into=으로, 0.0.1 as에서 이름 변경)0.49.0 (arm의 기록 set이 arm 본문보다 먼저 오므로 ::jump나 ::end로 끝나는 arm도 선택을 기록합니다; 0.6.0: breaking — persist= 제거, into=만 기록합니다)0.49.0.md §5.1; 0.6.0.md
상태 티어(스칼라 scene/run/user/app)0.1.00.49.0 (블로킹 브리지 호출의 fromBridgeResult 쓰기는 wait="false"로 쓰거나 guard되지 않은 한 호출 뒤에 대입된 것으로 봅니다. '<member>' in <family>는 per: 패밀리의 <family>.<member> 존재 guard이며 모든 힌트는 허용되는 철자를 안내합니다. 가져온 kind 위의 인라인 또는 스키마 per: 패밀리는 명시 경로처럼 멤버별로 병합됩니다(E-STATE-REDECLARE, E-USES-DUP-STATE, E-EXTENDS-STATE-TYPE 또는 extends 세분화); 0.41.0: type: number은(는) — state: 행뿐 아니라 선언되는 모든 타입, 즉 def 결과와 params:, 컴포넌트 params:, 지시어 attrs:, 브리지 result: 및 계기 payload: 필드, 플러그인 상태 형태 fields:에서 — E-TYPE-NUMBER이며, 보이는 값이 모두 정수이면 int을(를) 제안합니다. lute fix 규칙은 없습니다. 파싱에 실패했지만 이름은 복구되는 선언은 무효로 표시된 채 선언으로 남아 자기 오류만 보고합니다 — 그 선언에 의존하는 대상은 알 수 없음이나 타입 오류로 보고되지 않으며(그 선언을 지정하는 clock:에 E-CLOCK-DECL 없음, 그 선언이 정의하는 지시어에 E-UNKNOWN-DIRECTIVE 없음), 첫 번째 의존 대상에 info W-DEPENDS-ON-INVALID 하나가 그 선언을 알려 줍니다. export 항목 일부가 무효인 플러그인도 유효한 항목은 로드됩니다. 0.32.0: int/double이 number를 대체합니다. 상태는 스칼라로 유지됩니다. number은(는) 제거되었습니다. 엔진 소유 쓰기는 E-RUN-OWNED-WRITE을(를) 보고합니다. 0.30.0 (상태 경로의 세그먼트는 이름입니다 — 문자, 숫자, _ 또는 -로 이루어지며 -로 시작하지 않습니다 — 그리고 조건, ::set 대상, {{…}} 또는 state: 키는 식별자가 아닌 세그먼트에 따옴표 인덱스(run.visits["lab-b2"], 작은따옴표 또는 큰따옴표)로 도달하며, 이는 그대로 쓴 표기와 같은 경로입니다. . 뒤의 식별자 아닌 이름은 대괄호 표기를 알려 주는 단일 E-PATH-IDENT입니다. 0.28.0: 알 수 없는 키를 가진 state: 행, 또는 값으로도 선언되고 다른 행의 접두어로도 선언된 경로는 E-STATE-DECL입니다. 엔진 소유 네임스페이스(scene.choices.*, scene.visited.*, occasion.*, 단독 quest.<x> / season.<x>)는 선언할 수 없습니다. 경로 세그먼트로 쓰인 예약어는 E-RESERVED-NAME입니다. F[occasion.target]은(는) kind 비트나 for= 비트에서 쓸 수 있으며 멤버별로 검사됩니다. per:은(는) 다른 스키마가 선언한 kind를 지정할 수 있습니다. 0.27.0: 스키마는 seasons:을(를) 선언할 수 있습니다 — season.<name>.* 경로와 읽기 전용 prev.season.<name>.*이며, 시즌의 live이(가) 거짓→참으로 바뀔 때마다 재설정되고 시즌은 자유롭게 겹칠 수 있습니다(E-SEASON-DECL). per: K은(는) K의 subsetOf: 하위 kind가 추가하는 멤버를 선언합니다. 0.26.0: check-project은(는) 경로에 대한 모든 frontmatter state: 선언 — 인라인 또는 임포트된 것 — 을 수집하며, type, default, per 또는 owner에서 불일치하는 선언은 E-STATE-DECL-CONFLICT이고 두 파일과 줄을 모두 알려 줍니다. 0.24.0: 엔티티 인덱스 상태 — { type: int, default: 0, per: <kind> }은(는) 멤버당 하나의 경로를 선언하며 멤버별 기본값은 { _: 0, <member>: 1 }입니다. 클록이 선언되면 예약된 읽기 전용 clock.index / clock.weekday / clock.weekdayLabel이(가) 있습니다. 정수 %이(가) CEL 프로필에 추가됩니다. 0.23.0: 예약된 읽기 전용 prev.run.<path>은(는) 선언된 모든 run.<path>을(를) 이전 실행이 끝났을 때의 값으로 미러링합니다 — 설정되지 않았을 수 있으므로 읽기에는 isSet 또는 unset arm이 필요하고, 쓰기는 E-QUEST-RESERVED-WRITE이며, prev.*을(를) 선언하는 것은 E-STATE-NAMESPACE입니다. 0.22.0: state: 선언은 owner: engine을(를) 가질 수 있습니다 — 이를 ::set하는 콘텐츠는 E-ENGINE-OWNED-WRITE이고 읽기는 제한되지 않습니다. 예약된 user 티어 entry.<id>.everRead이(가) run 티어 entry.<id>.read에 더해집니다. 0.8.0에서는 스칼라 전용 작성자 state:을(를) 강제했습니다 — E-STATE-COLLECTION)0.49.0.md §5.2; 0.49.0.md §5.3; 0.41.0.md §3.2; 0.30.0.md; 0.28.0.md; 0.27.0.md; 0.26.0.md; 0.24.0.md; 0.23.0.md; 0.22.0.md; 0.8.0.md
Def(frontmatter, 스키마, 플러그인의 defs:. @name / @name(args))0.1.00.41.1 (프로젝트 스키마의 def에 대한 W-DEF-UNUSED는 host: true 탈출구(예: Program.def)를 안내하며, host:를 받지 않는 frontmatter def에는 안내하지 않습니다; 0.41.0: 프로젝트 스키마 파일이나 플러그인의 defs: export에 선언한 def는 host: true을(를) 가질 수 있습니다 — W-DEF-UNUSED에서 제외되고 인덱스에 "host": true(으)로 표시됩니다. frontmatter def의 host:은(는) 여전히 알 수 없는 키이며, frontmatter def는 그 문서에만 속한다는 힌트가 붙습니다. lute compile --all은(는) 문서가 플러그인과 uses:을(를) 통해 보는 def를 params과(와) 함께 인덱스 defs(으)로 내보내며(스칼라 매개변수 타입만, 두 문서가 서로 다른 본문으로 보는 이름은 제외), 매개변수는 param 노드로 로워링됩니다. lute expr <CEL> [--project <dir>] [--json]은(는) 호스트 조건을 프로젝트 루트의 when:처럼 인덱스 def에 대해 검사하고, 런타임의 evaluate에 넘길 exprNode을(를) 출력합니다. 0.21.1: def 본문은 CEL 프로필 게이트를 통과하고, 지시어 속성 안의 def는 리터럴로 접히거나 E-ATTR-DEF-DYNAMIC이며, 인라인할 수 없는 {{@def}}은(는) E-INTERP-DEF입니다)0.41.1.md; 0.41.0.md §3.5–§3.6, §4.3; 0.1.0.md; CHANGELOG 0.21.1
Fact 및 Datalog(관계 계층)0.3.00.32.0 (조건의 fact 쿼리는 표준 CEL 리스트 형식을 사용합니다 — holds(string, list(dyn)), count(string, list(dyn)), countDistinct(string, list(dyn), int), validAt(string, list(dyn), int). rule 구문은 변경되지 않았습니다. E-FACT-QUERY은(는) 잘못된 형식의 쿼리 호출을 다룹니다. 0.30.0 (relation과 fact 인수는 이름입니다. 식별자가 아닌 fact 쿼리 또는 rule 인수는 따옴표로 묶으며 — holds('at', ["lab-b2"]), at(X, "lab-b2"), "lab-b2" = X — 그대로 쓴 표기와 같은 멤버를 지정합니다. 0.28.0: relation의 tier:은(는) season:<name>을(를) 허용하며(시즌이 열릴 때마다 그 fact는 시드로 되돌아갑니다) tier:이(가) 없는 relation은 W-RELATION-TIER-IMPLICIT으로 경고합니다. ::assert / ::retract은(는) occasion.target을(를) kind 비트 또는 for= 비트에서 받을 수 있습니다. 같은 이름의 enum과 엔티티 kind는 E-DOMAIN-NAME-CLASH입니다. 예약된 이름 — relation에 대한 completed / active / cel / not 포함 — 은 E-RESERVED-NAME이며, 이것이 E-RELATION-RESERVED-NAME을(를) 흡수합니다. rule의 cel() guard는 타입 검사와 리터럴 도메인 검사를 받습니다. 0.27.0: occasion.target은(는) kind 비트의 fact 쿼리와 per: 인덱스에서 ground 항이며 멤버별로 검사됩니다. rule의 cel() guard는 바인딩된 변수를 { domain: K } 경로와 비교할 수 있으며 멤버별로 ground됩니다. 플러그인 지시어의 effects: { asserts, retracts }은(는) 각 호출에서 검사되며 호출의 ::assert / ::retract으로 간주됩니다. 엔티티 kind는 표시 labels:을(를) 선언할 수 있으며 그 외의 알 수 없는 키는 E-ENTITY-KIND-SHAPE입니다. 0.26.0: count('R', ['…']) <op> n과(와) countDistinct은(는) head가 의존하지 않는 relation에 대해 rule 본문에 나타날 수 있으며, 그렇지 않으면 E-RULE-AGGREGATE-CYCLE입니다. 스키마는 정확히 하나의 다른 임포트가 선언한 엔티티 kind에 멤버를 add:할 수 있고, subsetOf: 자식의 멤버는 그 부모의 멤버이며, 두 번 나열된 멤버 — 한 kind 안에서든 두 파일이 추가했든 — 는 E-ENTITY-KIND-SHAPE입니다. 0.25.0: relation은 excludes:을(를) 선언할 수 있습니다 — 대칭이며, 같은 인수 kind 또는 E-RELATION-DECL을(를) 가진 파트너입니다. check-project은(는) 둘 다 필요로 하는 guard를 dead로, 부정된 파트너를 따라오는 것으로 읽고, 배제된 fact가 모든 경로에서 성립하는 ::assert은(는) E-FACT-EXCLUSIVE이며, head 자신의 인수에 대해 한쪽을 다른 쪽에서 도출하는 rule은 E-RULE-EXCLUSIVE이고, lute play / lute trace / lute test은(는) 둘 다 성립하게 만드는 쓰기에서 중단합니다. 예약된 relation은 changedOn:을(를) 선언할 수 있습니다 — 예약되지 않은 relation에 있거나 선언되지 않은 occasion을 지정하면 E-RELATION-DECL입니다. 0.24.0: rule 본문의 _은(는) 새로운 익명 변수이며, not 아래에서는 존재 양화됩니다. countDistinct(<pattern>, <Var>). 엔티티 하위 kind(subsetOf:)와 멤버십 검사로서 rule 본문에 쓰이는 엔티티 kind 원자. rule의 cel() guard는 F[P]을(를) per: 패밀리에 대해 읽을 수 있으며, ground된 상태로 컴파일되어 멤버당 하나의 IR rule이 됩니다. E-RESERVED-NAME)0.30.0.md; 0.28.0.md; 0.27.0.md; 0.26.0.md; 0.25.0.md; 0.24.0.md; 0.3.0.md
퀘스트(<quest>, <on> ECA 트리거)0.2.00.53.0 (스크립트 안의 accept — ::accept나 보상의 accept — 는 follows와 상관없이 수락형 퀘스트를 활성화합니다. 조건이 성립하면 호스트가 부여하는 퀘스트는 accept="external" follows="…"로 씁니다. 조건은 호스트가 적용하고, Lute는 이를 전달하며 분석은 호스트 정책으로 읽습니다. 스크립트 안 accept의 교착은 E-QUEST-START-CYCLE이고, start가 없는 퀘스트는 그 id에서 보고합니다. E-QUEST-START-SELF, E-ACCEPT-TARGET, E-ATTR-TYPE은 호스트 정책 표기를 이름으로 듭니다; 0.52.0: <quest> 바로 안에는 <on>, <objective>, <reward>만 올 수 있고 그 밖의 최상위 콘텐츠는 E-GRAMMAR-NOT-ADMITTED입니다. <objective title>은 평문이며 그 안의 {{는 E-OBJECTIVE-TITLE-INTERP입니다. 프로젝트 전체 E-QUEST-REF-UNKNOWN은 프롬프트와 플러그인 text 속성도 읽습니다; 0.41.0: W-OBJECTIVE-STRANDED은(는) objective의 퀘스트가 다시 무장될 때(tier="run", tier="season:…", 비어 있지 않은 rearm=)나 완료 비트가 다른 문서에 있을 때 보고되지 않습니다. 항상 경고이며 info이(가) 되지 않고, 메시지는 증거 수준을 밝힙니다(bounded — 문서 비트들의 선언된 클록 창, 경로 탐색 없음). 0.32.0: 퀘스트 인스턴스는 instance 번호를 가지며 grant는 instance / index을(를) 가집니다. 저장 데이터는 questInstances을(를) 노출합니다. 0.28.0 (속성 이름이 변경되었으며, 각 이전 표기는 새 표기를 알려 주는 오류입니다: <quest follows=>(이전 after=. 퀘스트를 결코 게이트하지 않는 퀘스트 그래프 메타데이터), <objective visibleWhen=>(이전 when=. objective를 숨기기만 합니다), <reward outcome=>(이전 on=). 필수 하위 퀘스트로 인해 실패한 퀘스트는 failedBy == 'subquest'으로 읽힙니다. 하위 퀘스트의 rearm=은(는) E-SUBQUEST-REARM이며, 상수인 경우는 W-QUEST-REARM-CONSTANT입니다. 시즌의 live에 게이트되지 않은 시즌 티어 퀘스트는 W-SEASON-UNGATED으로 경고합니다. occasion.payload.<field>은(는) 발생시키는 occasion의 objective와 핸들러에서 읽을 수 있습니다. .이(가) 포함된 퀘스트 또는 objective id는 E-PATH-IDENT이며, 프로젝트 전체에 걸쳐 알 수 없는 quest.<id> 읽기는 E-QUEST-REF-UNKNOWN입니다. 0.27.0: rearm="<condition>"은(는) 조건이 거짓→참으로 바뀔 때마다 퀘스트를 unset으로 되돌립니다. tier="season:<name>"은(는) 시즌과 함께 재설정됩니다. tier= 없이(그리고 defaults.questTier도 없이) run 상태만 읽는 퀘스트는 W-QUEST-TIER-IMPLICIT입니다. 유한 클록이 결코 도달하지 못하는 by= 기한은 W-DEADLINE-NEVER입니다. 0.25.0: <quest accept="external"> — 스크립트 밖에서 수락됨 — 은(는) W-QUEST-NEVER-ACCEPTED을(를) 침묵시키는 콘텐츠 밖의 유일한 수락이며, 테스트나 트레이스의 accepts: mock은 더 이상 그렇게 하지 않고, start 옆에 있으면 E-ATTR-TYPE입니다. lute scenario은(는) [subquest] 엣지를 그리고, 최상위 start conjunct 중 visited(), entry.X.everRead 또는 quest.Y.state을(를) 읽는 것으로 퀘스트를 앵커링합니다([start] 엣지). 0.24.0: <quest activate="accept"> 하위 퀘스트는 부모가 활성인 동안 ::accept을(를) 기다립니다. <quest complete="any"> 대안은 나머지를 superseded으로 실패시킵니다. by=은(는) 모든 settle마다 판정되며 위치 구속 규칙은 새로운 until=이고, W-DEADLINE-BEFORE-DONE은(는) done이(가) 자신의 by을(를) 함의하는 경우에 해당합니다. 읽기 전용 quest.<id>.failedBy / objectives.<o>.failed. <on event target>. ::accept{at="nextRun"}. W-QUEST-NEVER-ACCEPTED. 0.23.1: E-QUEST-TIER-MIX — tier이(가) 부모와 다른 하위 퀘스트로, 혼합된 트리는 영구적으로 잠기기 때문입니다. on= objective의 by은(는) 해당 occasion이 발생될 때, 그 done 직후에만 판정됩니다. 발생된 occasion은 먼저 같은 이름의 선언된 world 이벤트를 발사하므로, 모든 활성 퀘스트의 <on event> 핸들러가 그 on= objective가 판정되기 전에 실행됩니다. 0.23.0: <objective by="…"> 기한 — objective가 완료되지 않은 상태에서 by이(가) 처음 성립하면 실패하며, 실패한 필수 objective는 퀘스트를 실패시킵니다. <objective on target>은(는) 그 대상에 대해 occasion이 발생될 때만 판정되며, IR은 ObjectiveEntry.by / target입니다. 0.22.0: <quest tier="run"> — 실행이 시작될 때 상태와 objective가 unset으로 재설정되고, 기본값 tier="user"은(는) 실행 간에 유지되며, IR은 QuestCmd.tier입니다. check-project은(는) W-QUEST-HANDLER-DEAD을(를) 경고하는데, 결코 실패할 수 없는 퀘스트의 questFailed 핸들러가 그 대상입니다. 0.14.0에서는 하위 퀘스트가 추가되었습니다 — <objective quest="childId"/>은(는) 자식 퀘스트의 완료를 부모의 objective로 만듭니다. 합성된 done/상향 fail, 엔진 규칙에 의한 하향 캐스케이드 및 참조된 자식 활성화. 네 개의 새 진단과 함께 DAG가 아닌 트리 형태의 프로젝트 구조)0.41.0.md §3.4; 0.28.0.md; 0.27.0.md; 0.25.0.md; 0.24.0.md; 0.23.0.md; 0.22.0.md; 0.14.0.md; CHANGELOG 0.23.1, 0.53.0.md §7, 0.53.0.md §7.3, 0.53.0.md §7.4
타임라인 및 프로퍼티 트랙0.1.00.37.0 (레코드의 타이밍은 하나의 timing 객체입니다 — wait, 그리고 유한한 음이 아닌 초 단위의 duration / delay / at, 더하여 타임라인에서 방출된 레코드에는 timeline 순번이 있습니다. barrier은(는) 자신의 직접적인 timeline과(와) at을(를) 유지합니다)0.37.0.md §5.2; 0.1.0.md
연결성 및 after: 시퀀싱0.2.0 (after: 씬 시퀀싱)0.53.0 (accept="external" 퀘스트에는 호스트 경로가 있습니다 — 열려 있거나, follows가 호스트 정책으로 성립하면 heuristic 입니다. 보상도 그 퀘스트를 수락하면 호스트를 통해 도달할 수 있습니다. 도달 분석은 그려지지 않은 accept 엣지에 대해 반복하며, scenario reach 근거는 heuristic일 수 있습니다; 0.49.0: 순환을 닫는 엣지를 포함해 모든 퀘스트 start 앵커 엣지를 그립니다. start / 서브퀘스트 앵커가 결코 함께 열릴 수 없는 퀘스트들은 E-QUEST-START-CYCLE, 자기 퀘스트를 읽는 start는 E-QUEST-START-SELF입니다. scenario reach와 constraints는 하나의 도달 가능성 판정을 공유합니다; 0.29.0: W-CHAPTER-STALL은(는) chapters:에 한정됩니다 — 체인 밖에서 직접 작성된 after:은(는) 그 자체로 “그 씬을 기다린다”는 진술이며 결코 경고하지 않습니다. lute new scene --occasion O은(는) 항상 on: O을(를) 쓰고, O이(가) 체인을 가지고 있으면 대신 그 씬을 chapter로 만드는 방법을 알려 줍니다. 0.28.0: 매니페스트의 sequence: { occasion, scenes }은(는) chapters: [{ on, scenes }]이며 occasion별로 하나의 체인입니다(E-CHAPTERS, W-CHAPTER-ORDER, W-CHAPTER-STALL — 마지막 것은 영구적으로 거짓으로 남을 수 있는 when:에서만 발사됩니다). 대상이 있는 occasion의 체인은 나열된 모든 씬이 target:을(를) 선언하도록 요구합니다. 퀘스트의 follows=은(는) 게이트 없이 시나리오 엣지를 그립니다. 0.27.0: 매니페스트의 chapters:은(는) 각 체인이 나열하는 씬들을 after: visited("<previous>")으로 연결합니다. 0.25.0: 번들 <beat after=…>은(는) 씬의 after:과(와) 같은 시나리오 엣지입니다. 중첩된 퀘스트는 [subquest] 엣지를 그리고 퀘스트의 최상위 start 읽기는 [start] 앵커를 그리므로, start 기반 퀘스트에는 복사된 after=이(가) 필요 없습니다. lute scenario은(는) when이(가) visited()을(를) after 없이 읽는 유닛을 앵커되지 않은 것으로 나열하며, 써야 할 after을(를) 함께 알려 줍니다. 0.8.0: active("questId") — 세 번째 선행 조건 프리미티브)0.49.0.md §6.1; 0.49.0.md §6.2; 0.49.0.md §6.3; 0.29.0.md; 0.28.0.md; 0.27.0.md; 0.25.0.md; 0.8.0.md, 0.53.0.md §7.1, 0.53.0.md §7.2
식별 및 현지화(lineId / voiceKey, 로케일 텍스트)0.1.00.53.0 (번역은 소스의 {{…}} 마커를 그대로 보여 주어야 합니다. E-L10N-MARKERS는 compile --locale-bundle을 실패시키고, loc import는 파싱되지 않는 마커를 거부합니다; 0.51.0: text 타입의 플러그인 디렉티브 속성은 번역할 수 있습니다. 그 디렉티브는 code=를 받고, 식별자는 lineId 템플릿 밖의 {prefix}~{tag}~{code}~{attr}이며, lute tag, lute loc export / import / report, --locale-bundle이 이를 다룹니다(kind: "directive"). lineId 템플릿의 ~(E-IDENTITY-TEMPLATE)와 코드의 ~(E-LINE-CODE-RESERVED)는 거부되고, 최종 id는 프로젝트 전체에서 고유합니다(E-LINE-ID-DUP); 0.47.1: sourceHash는 인코딩된 줄 텍스트로 계산되므로 \{{가 든 줄은 해시가 바뀌며, 번역에도 리터럴 \{{를 쓸 수 있습니다. 0.47.0: lute loc export는 프롬프트 행(kind: "prompt")을 내보내고 모든 행에 sourceHash가 붙습니다. 로케일 번들은 sourceHashes를 담은 schemaVersion: 2이며, compile --locales는 내보낸 뒤 원본 텍스트가 바뀐 번역에 W-L10N-STALE을 보고합니다. 0.37.0: 모든 줄은 voiceKey을(를) 가지며 — 나레이션과 {mono} 포함 — E-DUP-VOICEKEY은(는) 모든 줄의 수정자가 제거된 텍스트를 비교합니다. lute loc export은(는) 수정자 마크업을 유지하며, 수정자가 원본과 다른 번역은 E-L10N-MODIFIERS이고 병합되지 않습니다. 번역된 모든 로케일에는 평문 texts[locale]이(가) 있고, 수정된 줄은 localeSegments[locale]을(를) 추가합니다. 0.23.1: 태그 없는 컴포넌트 줄은 lute tag이(가) 컴포넌트 파일에 쓸 코드를, 파라미터 범위의 <match>이(가) 폴딩되기 전에 받으므로, 첫 번째가 아닌 arm의 줄은 새 lineId / voiceKey을(를) 한 번만 받습니다 — 그 하나의 lute tag이(가) 유지됩니다. 0.22.0: 컴파일된 id에 대해 breaking — 기본 voiceKey이(가) {prefix}.{speaker}-{code}으로 바뀌므로, 이전 키에 맞춰 녹음된 오디오를 유지하려면 identity.voiceKey: "{speaker}-{code}"을(를) 고정하십시오. 컴포넌트 줄은 {prefix}.{component}#{n}.{speaker}_{code}으로 주소가 지정됩니다. 0.21.1에서는 E-DUP-VOICEKEY이(가) 추가되었습니다 — check-project과(와) compile --all은(는) 텍스트가 다른 줄들이 가진 voiceKey을(를) 거부합니다. 0.8.0에서는 identity: 템플릿과 loc import → compile --locales 왕복이 도입되었습니다)0.51.0.md §5.1–§5.5; 0.47.1.md §3; 0.47.0.md §3; 0.37.0.md §3.4, §6; 0.22.0.md; 0.8.0.md; CHANGELOG 0.21.1 / 0.23.1, 0.53.0.md §8.1
컴파일된 아티팩트 형태(position 주소 지정, IR 캐리어)0.1.00.53.0 (형태 변경 없음. IR 스키마는 lute-ir-0.53입니다; 0.52.0: 허브를 떠나는 jump는 leaves를 담고 semantic id lute.core.hubLeave/1로 수집됩니다. 프롬프트에 마커가 있는 choice / hub는 promptPlaceholders를, RewardEntry는 보상 kind의 attrs를 담습니다(설명용이며 semantic id 없음). IR 스키마는 lute-ir-0.52입니다; 0.51.0: 한도 있는 jump는 max를 담고 semantic id lute.core.boundedJump/1로 수집됩니다. plugin 명령은 선언된 raises와 text 속성의 localized 항목을, RewardEntry는 kind의 raises를 담습니다(설명용이며 semantic id 없음). IR 스키마는 lute-ir-0.51입니다; 0.50.0: choice / hub 옵션 항목이 stamps를 담습니다. RewardEntry는 kind의 retracts / asserts / accepts를 해석해 담고, semantic id lute.quest.rewardEffects/1로 수집됩니다. IR 스키마는 lute-ir-0.50입니다; 0.49.0: 플러그인 stampAttrs 값은 최상위 레코드 키가 아니라 timing, provenance, source 뒤의 중첩된 stamps 객체 하나이며 작성된 스탬프가 없으면 생략됩니다. list / map / record 플러그인 속성 타입은 거부됩니다. IR 스키마는 lute-ir-0.49입니다; 0.42.0: 9개 스테이징 런타임 레코드 bg, music, sfx, vfx, actor, camera, cg, video, sequence는 해석된 attrs를 가집니다. 선택 필드는 생략되며 timing, provenance, plugin 및 envelope 필드의 위치는 유지됩니다. Event와 스냅숏 스키마는 lute-events-0.42 / lute-snapshot-0.42로 이동하고, 0.37의 command family, position, sections, capabilitySnapshot, requiredSemantics는 유지됩니다.)0.51.0.md §3.6, §4.6, §5.4; 0.50.0.md §3.5, §5.5; 0.49.0.md §3.1; 0.49.0.md §3.2; 0.42.0.md §4; 0.41.0.md §4; 0.37.0.md §5; 0.32.0.md, 0.53.0.md §1
버전 스탬프 및 축 정렬0.1.00.53.0 (모든 가시적 축은 0.53.0을 읽고, 스키마는 0.53 계열로 옮겨 가며, bindingsVersion은 "0.53", 플레이어 세이브도 "0.53"을 읽습니다("0.52" 세이브는 거부됩니다); 0.52.0: 모든 가시적 축은 0.52.0을 읽고, 스키마는 0.52 계열로 옮겨 가며, 바인딩은 bindingsVersion: "0.52", 플레이어 세이브는 "0.52"입니다(세이브가 담는 대기 중인 메뉴에 렌더링된 텍스트가 들어가며 "0.51" 세이브는 거부됩니다); 0.51.0: 모든 가시적 축은 0.51.0을 읽고, 스키마는 0.51 계열로 옮겨 가며, 바인딩은 bindingsVersion: "0.51", 플레이어 세이브는 "0.51"입니다(pendingRaises를 담으며 "0.50" 세이브는 거부됩니다); 0.50.0: 모든 가시적 축은 0.50.0을 읽고, 스키마는 0.50 계열로 옮겨 가며, 바인딩은 bindingsVersion: "0.50", 플레이어 저장 형식은 "0.50"입니다. 0.49.1은 0.49 계열의 동작 보존 패치였습니다. 0.49.0은 스키마를 0.49 계열로 옮기고 모든 축을 0.49로 옮겼습니다. 0.48.1은 0.48 계열의 수정 패치였습니다. 0.48.0은 스키마를 0.48 계열로 옮기고 모든 축을 0.48로 옮겼습니다. 0.47.2와 0.47.1은 0.47 계열의 수정 패치였습니다. 0.47.0은 모든 축을 0.47로 옮겼습니다. 0.46.0은 모든 축을 0.46으로 옮겼습니다. 0.45.0은 모든 축을 0.45로 옮겼습니다. 0.44.0은 모든 축을 0.44로 옮겼습니다. 0.43.0은 모든 축을 0.43으로 옮겼습니다. 0.42.1은 스탬프만 바꾼 패치였습니다. 0.42.0: 언어/툴체인, luteVersion, irVersion, Event, 스냅숏, 바인딩, 생성 계약 및 플레이어 패키지가 함께 이동하며, 스키마는 0.42 계열, 바인딩은 bindingsVersion: "0.42"를 사용합니다. 1.0 전 엔진은 여전히 정확한 IR minor를 고정합니다.)0.51.0.md §1; 0.50.0.md §1; 0.49.1.md §1; 0.49.0.md §1; 0.48.0.md §1; 0.47.1.md §1; 0.47.0.md §1; 0.46.0.md §1; 0.45.0.md §1; 0.44.0.md §1; 0.43.0.md §1; 0.42.1.md §1; 0.42.0.md §1; 0.41.1.md; 0.37.0.md §1; 0.32.0.md, 0.53.0.md §1
경고 심각도 진단(W-LUTE-VERSION-STALE, W-TRACE-MOCK-UNPRODUCIBLE, W-CODE-AFTER-END, W-L10N-MISSING, W-FACT-GUARANTEED, W-BEAT-SHADOWED, W-QUEST-STATE-ISSET, W-TEXT-LOOKS-LIKE-REF, W-QUEST-HANDLER-DEAD, W-BEAT-PRIORITY-TIE, W-BEAT-ONCE-RUN-USER, W-REWARD-DOUBLE-CREDIT, W-CAST-ABSENT, W-DEADLINE-BEFORE-DONE, W-QUEST-NEVER-ACCEPTED, W-RELATION-UNREAD, W-DEF-UNUSED, W-DISPLAY-NAME-DUP, W-ENTRY-WRITE-REREAD, W-QUEST-TIER-IMPLICIT, W-CHAPTER-ORDER, W-CHAPTER-STALL, W-DEADLINE-NEVER, W-TEXT-SINGLE-BRACE, W-TEXT-COMMENT-LIKE, W-TEXT-BRACKET-LABEL, W-TEXT-GLUE, W-RELATION-TIER-IMPLICIT, W-SEASON-UNGATED, W-BRANCH-ID-SHARED, W-QUEST-REARM-CONSTANT, W-SPENT-BY-REVERSIBLE, W-TERMINAL-PERSISTENT, W-BEAT-UNRAISED, W-DEADLINE-BEFORE-WINDOW, W-TEMPLATE-OVERRIDE, W-TEMPLATE-DOT-PARAM, W-WIP, W-OBJECTIVE-STRANDED)0.6.10.41.0 (lute check / check-project 요약은 info 진단을 따로 세고 경고로 세지 않으며, 하나라도 있을 때만 , I info을(를) 덧붙입니다. 새 W-DEPENDS-ON-INVALID(무효 선언마다 하나, 처음 억제된 의존 대상 위치)은(는) W- 접두사를 갖지만 info 심각도이므로 그 개수에 들어가고 여기에는 나열되지 않습니다. W-OBJECTIVE-STRANDED은(는) 항상 경고입니다. 0.32.0: W-QUEST-STATE-HAS이(가) W-QUEST-STATE-ISSET을(를) 대체합니다. 새 E-FACT-QUERY 및 E-RUN-OWNED-WRITE. 새 코드 없음. 의도된 설계를 기술할 수 있는 경고는 그 의도를 표명하는 표기를 갖습니다 — W-TERMINAL-PERSISTENT은(는) terminal: 긴 형식에 persists: true이(가) 있으면 침묵하고, W-CHAPTER-STALL은(는) chapters: 체인에서만 경고합니다. 0.28.0: W-TEXT-SINGLE-BRACE, W-TEXT-COMMENT-LIKE, W-TEXT-BRACKET-LABEL 및 W-TEXT-GLUE(텍스트 내 다른 언어의 마크업), W-RELATION-TIER-IMPLICIT, W-SEASON-UNGATED, W-BRANCH-ID-SHARED, W-QUEST-REARM-CONSTANT, W-SPENT-BY-REVERSIBLE, W-TERMINAL-PERSISTENT, W-BEAT-UNRAISED, W-DEADLINE-BEFORE-WINDOW, W-TEMPLATE-OVERRIDE, W-TEMPLATE-DOT-PARAM, 그리고 W-WIP은(는) check-project --wip이(가) 남겨 두는 dead guard를 위한 것입니다(이전에는 경고 심각도의 오류 코드였습니다). W-LABEL-CAST-SHADOWED은(는) 폐기되었습니다. 0.27.0: W-QUEST-TIER-IMPLICIT, W-CHAPTER-ORDER, W-CHAPTER-STALL, W-LABEL-CAST-SHADOWED 및 W-DEADLINE-NEVER. 모든 메시지에서 사양 인용이 제거되었습니다 — 해당 섹션은 --json spec 배열과 lute --explain <CODE>으로 이동합니다. 0.26.0: W-DISPLAY-NAME-DUP — 정확히 동일한 두 캐스트 항목 또는 화자 표시 이름. W-ENTRY-WRITE-REREAD — 본문이 상태를 설정하거나 fact를 철회하는 반복 가능한 항목 비트. W-BEAT-PRIORITY-TIE은(는) 부정을 정규화하고 두 when이(가) 왜 배타적이지 않은지 설명합니다. 0.25.0: W-LUTE-VERSION-STALE은(는) 매니페스트의 defaults:에서 상속된 스탬프에 대해 매니페스트에서 한 번만 보고됩니다. W-QUEST-NEVER-ACCEPTED은(는) 더 이상 mock의 accepts:을(를) 세지 않습니다. 선언된 배제가 함의하는 부정은 W-FACT-GUARANTEED입니다. 0.24.0: W-CAST-ABSENT — guard가 화자의 캐스트 present:을(를) 함의하지 않는 줄. W-DEADLINE-BEFORE-DONE — on= objective로서 그 done이(가) 자신의 by을(를) 함의하는 것. W-QUEST-NEVER-ACCEPTED — 아무것도 수락하지 않는 수락 기반 퀘스트. W-RELATION-UNREAD / W-DEF-UNUSED — 아무것도 쿼리하지 않는 relation, 아무것도 참조하지 않는 def. 0.23.0: W-REWARD-DOUBLE-CREDIT — kind가 상태 경로를 credits하는 보상이 같은 경로의 핸들러 ::set 옆에 있어 두 번 지급하는 경우. 0.22.0: W-QUEST-HANDLER-DEAD — 실패할 방법이 없는 퀘스트의 questFailed 핸들러. W-BEAT-PRIORITY-TIE — 하나의 select: first occasion에 있는 동일 우선순위 비트들의 when이(가) 배타적임을 증명할 수 없어 파일 순서가 선택하는 경우. W-BEAT-ONCE-RUN-USER — user 티어 상태에만 게이트된 once: run 비트는 매 실행마다 재생됩니다. W-STAGE-ABSENT은(는) 경로를 따라가며 각 arm에서 분기하고 수렴 지점에서 합류합니다. 0.21.1에서는 W-QUEST-STATE-ISSET이(가) 추가되었습니다 — has(quest.<id>.state)은(는) 항상 참이므로 == 'unset'과(와) 비교하십시오. W-TEXT-LOOKS-LIKE-REF — 텍스트 전체가 def 또는 파라미터에 대한 @name인 줄은 그 리터럴 텍스트를 그대로 출력합니다. 0.21.0에서는 W-BEAT-SHADOWED이(가) 추가되었습니다 — check-project은(는) 같은 occasion과 대상의 앞선 순서 비트가 항상 적격이고 결코 소비되지 않아 select: first 비트가 결코 선택될 수 없을 때 경고합니다. 0.20.0에서는 W-FACT-GUARANTEED이(가) 추가되고, 원래 0.6.1의 세 커버리지 경고 중 하나인 W-UNPROVEN-RELATIONAL이(가) 제거되었습니다 — --deny에서 이를 지정하는 것은 사용 오류입니다)0.41.0.md §3.2–§3.4; 0.29.0.md; 0.28.0.md; 0.27.0.md; 0.26.0.md; 0.25.0.md; 0.24.0.md; 0.23.0.md; 0.22.0.md; 0.21.0.md
Deny 승격(--deny / --deny-warnings) 및 프로젝트 진단 level(diagnostics:)0.6.10.50.0 (lute.project.yaml의 diagnostics:는 W-* 코드의 level — off, info, warn, error, 선택적으로 paths: glob 아래에서만 — 을 check, compile, trace, expr, lint와 LSP의 보고 경계에서 정합니다. --deny CODE가 설정보다 우선하고 --deny-warnings는 여전히 경고인 것을 승격합니다. level이 바뀐 진단은 [project] / configured를 달고, 숨겨진 진단은 개수를 세며, 잘못된 항목은 E-DIAGNOSTICS-CONFIG입니다. compile은 승격된 모든 check 경고에서 실패합니다; 0.6.1: --deny CODE와 --deny-warnings는 경고를 오류로 승격합니다)0.50.0.md §6; 0.6.1.md
프로젝트 lint(lute lint, lute.lint.yaml, 플러그인 lints: export)0.13.0 (툴체인 동반, plugin-system 0.0.5)0.53.0 (scope: document — 모든 섹션을 포함해 문서 전체에 pair 슬롯 하나. lute lint는 프로젝트 입력 계층을 루트마다 한 번 만들고 피연산자만 읽습니다; 0.51.0: target: pair는 node 행 위의 open, close, 선택적인 inside 술어로 닫히지 않은, 열린 적 없는, 중첩된, 자리가 잘못된 쌍을 body 또는 section 범위에서 찾습니다. pair에는 when을 쓸 수 없습니다; 0.50.0: target: node는 노드마다 한 행 — 콘텐츠 줄, 디렉티브, 로직 요소를 문서 순서대로 — 을 node(kind, tag, speaker, 작성된 그대로의 attrs, 위치, prev / next, parent, 범위가 정해진 preceding 맵)로 바인딩하고 scene, options와 함께 평가하며, 결과는 노드에 고정됩니다. 문자열 멤버 startsWith, endsWith, contains가 생깁니다. E-LINT-CONFIG는 checker 코드를 lute.project.yaml diagnostics:로 안내합니다; 0.49.0: lint <DIR>가 프로젝트의 lute.lint.yaml을 적용하고, asset-exists가 속성 선택자를 받습니다)0.51.0.md §6; 0.50.0.md §8; 0.49.0.md; plugin-system 0.0.5, 0.53.0.md §5, 0.53.0.md §3.2
씬 및 문서 식별(id: frontmatter)0.15.0 (작성된 정규 씬 키. 새 id: frontmatter는 lineId 접두어, visited()/연결성 노드, 그리고 prereqEdges[].node이며, 소비되던 모든 곳에서 파생된 {character}.{episodeId} 조인을 대체합니다. character/season/episode/episodeId은(는) id:이(가) 있으면 선택 사항으로 격하됩니다)0.30.0 (하나의 이름 규칙: 문서 id의 각 세그먼트 — 모든 씬, 비트, 항목, 퀘스트, objective, branch, hub, 선택지 및 mark id, share 키, 시즌, relation, kind 및 멤버, 플러그인 계기 및 이벤트, 대상 및 카테고리와 마찬가지로 — 는 문자, 숫자, _ 또는 -로 이루어지며 -로 시작하지 않습니다. @name으로서 그대로 읽히는 이름(def, def의 파라미터, 컴포넌트 또는 템플릿 파라미터)만 식별자로 남습니다. 0.29.0: 하나의 식별자 규칙: 문서 id의 각 세그먼트 — 모든 씬, 비트, 항목, 퀘스트, objective, branch, hub, 선택지 및 mark id, share 키, 시즌, relation, def, kind, 멤버 및 컴포넌트 파라미터와 마찬가지로 — 는 문자 하나로 시작하고 그 뒤에 문자, 숫자 또는 _이(가) 옵니다. 0.28이 CEL 밖에서 허용했던 - 또는 그 외의 문자는 해당 이름 위치에서 슬롯의 코드(여기서는 E-META-ID)로 camelCase 표기를 알려 주는 오류입니다. 0.19.0: 퀘스트 및 로어 문서는 선택적인 문서 id:을(를) 선언할 수 있습니다 — 번들 이름, 아티팩트의 meta.id, 그리고 그 ProjectIndex 키입니다. 문서 id는 씬 id와 하나의 프로젝트 전역 네임스페이스를 공유하므로 E-META-ID과(와) E-CONN-EPISODE-ID-DUP이(가) 이들에도 적용됩니다)0.30.0.md; 0.29.0.md; 0.19.0.md
서술적 extra: 블록0.15.0 (씬 및 퀘스트 루트의 스칼라 또는 평탄한 스칼라 리스트의 개방형 매핑. meta.extra에 그대로 전달되며 어떤 언어 규칙도 읽지 않습니다 — 중첩 매핑이나 스칼라가 아닌 리스트 항목에는 E-META-VALUE)0.15.00.15.0.md
레거시 식별 키(character / season / episode / episodeId)0.1.00.15.0 (산문으로만 deprecated — W-META-LEGACY은(는) 문서가 id:도 함께 작성할 때 레거시 키마다 경고합니다. id:이(가) 있으면 네 개의 키는 더 이상 필수가 아니며, 제거는 향후 메이저 버전으로 연기되었습니다)0.15.0.md
선언적 보상(퀘스트 / objective <reward/>, 범위 수량)0.16.0 (자체 닫힘 <reward kind= target= amount= when= outcome=/>(0.28.0까지는 on=)을(를) <quest> 또는 <objective>의 직계 자식으로 둡니다 — 소유 레코드의 순수 데이터인 QuestCmd.rewards / ObjectiveEntry.rewards입니다. amount은(는) 정수 스칼라 또는 범위 리터럴 N..M을(를) 허용하며 음수도 실제로 가능합니다. 두 개의 새 진단 E-REWARD-ATTR 형태 / E-REWARD-KIND 어휘. reward.when이(가) CEL 슬롯 레지스트리에 추가됩니다. lute run / play / trace은(는) 각 새 전이마다 결정적인 grant 트랜스크립트 이벤트를 방출합니다 — 엔진이 지급하며, 참조 runtime은 범위를 결코 굴리지 않습니다)0.52.0 (<reward>는 kind가 선언한 속성을 쓸 수 있고, 디렉티브 속성처럼 타입 검사되며(@ref 값은 E-REWARD-ATTR), attrs로 컴파일되어 grant 레코드에 복사됩니다; 0.50.0: 지급된 보상은 grant 레코드 뒤에 kind의 effects — retracts, asserts, accepts, @target은 target=에 바인딩 — 를 수행합니다. 모든 분석이 이를 읽으며, 보상의 assert는 가능(possible)으로만, accepts는 그 퀘스트로 들어가는 길로 봅니다(잘못된 대상은 E-ACCEPT-TARGET); 0.37.0: 선택적 <reward id="…">은(는) 한 퀘스트의 보상 중에서 고유하며(E-REWARD-DUP), IR의 RewardEntry.id과(와) 소스 맵에서 보상의 안정적인 키입니다. 0.28.0: on=은(는) outcome=으로 이름이 변경되었으며(<reward outcome="failed"/>. on=은(는) 이를 알려 주는 E-UNKNOWN-ATTR입니다), IR의 RewardEntry.on은(는) outcome입니다)0.50.0.md §5; 0.37.0.md §3.5; 0.28.0.md; 0.16.0.md
보상 kind 플러그인 어휘(rewardKinds: 매니페스트 export)0.16.0 (kind id → 계약의 선택적 플러그인 매니페스트 맵 — 선택적 target 제공자 도메인과 선택적 추가 속성 스키마 — 으로, 선언되면 <reward kind=> / target=을(를) 정적으로 검사 가능하게 합니다. capability 스냅샷에 guard된 정렬 섹션으로 접혀 들어가므로 capabilityVersion은(는) rewardKinds:을(를) 선언하는 플러그인을 설치한 프로젝트에서만 바뀝니다. 빈 코어 섹션은 바이트 단위로 동일하게 해시됩니다)0.52.0 (kind의 attrs:는 로드 때 검증되고(<reward> 키, 중복, 타입이 맞지 않는 기본값, 구조형 타입은 E-PLUGIN-PARSE), effects는 fact와 raise 대상에서 @<attr>를 읽습니다; 0.50.0: 보상 kind는 effects: { asserts, retracts, accepts }를 선언할 수 있으며, @target만 참조로 허용해 디렉티브 fact effect처럼 검사됩니다. effects.writes는 E-PLUGIN-KEY입니다(보상의 상태 쓰기는 credits:). effects가 없는 kind는 capabilitySnapshot이 그대로입니다; 0.49.0: 보상 kind의 target: { forbidden: true }는 모든 target=을 거부합니다(E-REWARD-TARGET). 따옴표로 쓴 target="…"만 IR에 도달하며 @ref나 bare target은 모든 계약에서 E-REWARD-ATTR입니다; 0.28.0: 플러그인 export 키는 camelCase만 허용됩니다 — rewardkinds / assetkinds / stampattrs은(는) E-PLUGIN-UNKNOWN-EXPORT이며 rewardKinds / assetKinds / stampAttrs을(를) 알려 줍니다. plugin.yaml과(와) 그 export 파일은 알 수 없는 키를 거부합니다(E-PLUGIN-KEY). 0.26.0: 보상 kind의 target: 계약이 검사됩니다 — { entity: kind } 또는 제공자 계약이 값을 검증하고 required: true은(는) 대상이 없는 경우를 거부합니다, E-REWARD-TARGET. 지시어 속성은 { entity: K } 타입일 수 있으며, 컴포넌트의 ::use 인수 또는 파라미터 default:에서 검사됩니다. 0.23.0: 보상 kind는 credits: <state path>을(를) 선언할 수 있으며, 각 보상에 RewardEntry.credits으로 스탬프됩니다. lute run / play은(는) 지급 시 거기에 스칼라 수량을 추가합니다)0.50.0.md §5.1; 0.49.0.md §3.3; 0.28.0.md; 0.26.0.md; 0.23.0.md; 0.16.0.md
플러그인 패스스루 소유권0.17.2 (선택적 plugin 소유자 id가 kind: "plugin" 레코드에 있습니다. 호스트는 (plugin, tag)으로 디스패치합니다. 이전 아티팩트는 이 필드를 생략할 수 있습니다)0.41.1 (layer: bridge와 bridgeCall을 선언한 디렉티브에는 bridge 결과를 읽는 effects.writes 항목이 있어야 하며, 없으면 선언 위치의 E-BRIDGE-NO-RESULT-WRITE이고 프로젝트가 컴파일되지 않습니다. enumFromOption 속성은 옵션의 프로필 값, 없으면 매니페스트 default로 검사합니다; 0.41.0: plugin 실행 레코드는 — 런타임 record 이벤트와 lute run --json 모두 — tag 다음에 호출의 attrs을(를) 가집니다. 이는 occasion.target이(가) 바인딩된 명령의 fields이며, 스탬프의 타이밍이나 stampAttrs 키는 들어가지 않습니다. 컴파일러는 fields을(를) 완전하게 만들어, 지시어 선언에 default이(가) 있는 생략된 속성마다 그 값을 추가합니다. 그 default이(가) 자기 type의 값이 아니면 어셈블리가 거부하며(E-PLUGIN-INVALID-DIRECTIVE), 체커는 그 속성을 생략한 각 호출에서 작성된 값처럼 판정합니다. 0.17.2: 호스트는 (plugin, tag)(으)로 디스패치합니다)0.41.1.md; 0.41.0.md §5.5; 0.17.2.md
로어 항목(조회되는 콘텐츠)0.19.0 (kind: lore 문서는 최상위 <entry> 선언들로 이루어집니다 — 엔진이 재생하는 대신 조회하는 콘텐츠입니다. id / target / category / title / series / order / when 속성이 있으며, target과(와) category은(는) 형태만 검사됩니다. 본문은 콘텐츠 줄, <match>, ::set, ::assert, ::retract을(를) 허용합니다. 지식은 일반 ::assert으로 공개됩니다. 예약된 엔진 기록 entry.<id>.read 경로. 첫 읽기에만 적용되는 효과. 항목을 파일 위치순으로 정렬하는 문서 수준 series:. 새 E-ENTRY-ATTR, E-ENTRY-ID-DUP, E-ENTRY-SERIES-ORDER)0.28.0 (한 문서의 <entry>과(와) <beat>이(가) 같은 id를 갖거나 <beat id>이(가) 반복되면 E-BEAT-ID-DUP입니다. <entry once="false">은(는) 반복 가능한 항목 비트로 허용됩니다. for 항목의 쓰기는 실행 중 각 멤버의 첫 읽기 시 적용됩니다. W-ENTRY-WRITE-REREAD은(는) 실행 중 다시 읽을 수 있으면서 쓰기를 하는 모든 항목을 다룹니다. <entry use=…>은(는) 하나의 E-TEMPLATE입니다. 0.27.0: 항목은 for="kind:<kind>", once="week" 및 spentBy=을(를) 받을 수 있으며(0.28.0: spentBy=은(는) 비트의 것처럼 래치됩니다. once="false"은(는) 생략을 의미합니다. for 항목의 쓰기는 각 멤버의 첫 읽기 시 적용됩니다. 실행 중 다시 읽을 수 있으면서 쓰기를 하는 모든 항목 — 조회 항목, once이(가) 없는 항목, 실행보다 짧은 once, spentBy, for — 은 W-ENTRY-WRITE-REREAD입니다), 그 본문은 선언된 효과만이 유일한 동작인 플러그인 지시어를 호출할 수 있고 이는 첫 읽기 시 적용됩니다. 0.26.0: 항목은 target="kind:<kind>"하고 occasion.target을(를) 읽을 수 있습니다. 본문이 상태를 설정하거나 fact를 철회하는 반복 가능한 항목 비트는 W-ENTRY-WRITE-REREAD입니다. play와 test는 <doc>.<entry>을(를) 항목 id의 별칭으로 허용합니다. 0.25.0: <entry share=…>이(가) 쓰여진 once 옆에 있으면 공유 소비에 참여합니다 — 항목을 읽으면 그 키의 모든 비트가 소비됩니다. 0.24.0: 대상이 없는 occasion에서 항목의 target=은(는) 메타데이터입니다. 항목은 클록이 선언되면 once="day" / once="slot"을(를) 받습니다. entry.X.read 아래에서는 X의 본문이 모든 경로에서 단언하는 fact가 must 집합에 합류합니다. 0.23.0: 로어 문서는 항목 옆에 씬과 유사한 <beat id on target title when priority once also> 블록을 번들할 수 있으며, 정규 id는 <document id>.<beat id>입니다. 항목이나 비트의 본문 세그먼트는 다음 entry 또는 beat 레코드까지 이어집니다. 0.22.0: 항목 비트는 once="run" | "user"을(를) 받습니다 — entry.<id>.read / 새 user 티어 entry.<id>.everRead이(가) 설정되면 적격이 아니며, 없으면 반복 가능합니다. 0.21.0에서는 항목이 on= / priority=을(를) 자신의 when / target 옆에 두어 엔진 occasion에 응답할 수 있게 되었으며, 이로써 항목 비트가 됩니다)0.28.0.md; 0.27.0.md; 0.26.0.md; 0.25.0.md; 0.24.0.md; 0.23.0.md; 0.22.0.md; 0.21.0.md
관계형 guard 분석(fact 엔벨로프)0.20.0 (check-project은(는) guard 슬롯의 모든 holds(…) / count(…)을(를) impossible, guaranteed 또는 possible로 판정하며, 이는 프로젝트 전역의 인수 수준 may 집합과 after: 그래프를 따라 전파되는 단조 fact의 경로 민감 must 집합에서 도출됩니다. guard는 자신의 영역 안에서 가정이며 count은(는) 구간에 대해 판정됩니다. dead 관계형 guard는 자기 슬롯의 코드를 재사용하며 — E-ARM-DEAD, E-OBJECTIVE-UNSATISFIABLE, E-QUEST-UNREACHABLE, W-OBJECTIVE-HIDDEN — 더하여 새 E-ENTRY-UNREACHABLE이(가) 로어 항목 when에 대해 있으며, guaranteed인 guard는 W-FACT-GUARANTEED입니다. 프로젝트 수준 전용 — 단일 파일 check은(는) 관계형 쿼리를 미결정으로 둡니다. lute scenario … envelope은(는) 노드에서 보장되는 fact를 나열합니다)0.25.0 (선언된 excludes: 쌍은 둘 다를 필요로 하는 guard를 거짓으로, 부정된 파트너를 참으로 판정합니다 — 같은 guard 안에서든, 둘러싸는 guard에서든, 모든 경로에서든. 0.23.0: 판정기는 && / `
비트와 계기(스토리 선택)0.21.0 (씬이나 로어 항목은 자신이 응답하는 엔진 계기을 지정함으로써 비트가 됩니다 — 씬 frontmatter on: / target: / when: / priority: / once: run | user | false, 항목 속성 on= / priority=이(가) when / target 옆에 옵니다. after:과(와) when이(가) 성립하고 once이(가) 소비되지 않았을 때 적격이며, 우선순위 다음 ProjectIndex.beats 순서로 정렬됩니다. 선택적 플러그인 occasions: export — select: first | all, target: true — 는 capability 스냅샷에 guard된 섹션으로 접혀 들어가며, 계기 이름은 어떤 플러그인이 선언하기 전까지 형태만 검사됩니다. 새 E-BEAT-ATTR, E-OCCASION-UNKNOWN, E-BEAT-UNREACHABLE, W-BEAT-SHADOWED. when이(가) CEL 슬롯 레지스트리에 추가됩니다. schedule.yaml과(와) 모든 E-SCHED-* / W-SCHED-* 코드가 제거되었고, lute play은(는) 발생된 계기 위에 재구축되어 퀘스트 생명주기를 구동합니다 — 스토리 플레이하기를 참고하십시오)0.51.0 (디렉티브나 보상 kind의 effects.raises는 호출이나 지급에 응답해 호스트가 던지는 occasion을 선언하고, occasion은 raisedBy: declared일 수 있습니다. lute scenario / scenario reach는 던지는 쪽에서 그 occasion에 응답하는 장면과 비트로 [raises] 엣지를 그립니다(가능한 엣지일 뿐 보장이 아니며, 0.52.0부터 lute impact가 이를 따라갑니다. #210). E-PLUGIN-RAISES, E-RAISES-TARGET, W-OCCASION-NEVER-RAISED; 0.30.0: share 키, 계기, 대상, 카테고리는 이름이므로 -과(와) 선행 숫자가 허용됩니다. Lute가 선언한 이름과 엔진 소유 id 사이의 0.29.1의 구분은 사라졌습니다. 0.29.0: 스키마의 terminal:은(는) 긴 형식 { when: "<condition>", persists: true }일 수 있습니다 — 엔딩은 의도적으로 실행보다 오래 지속됩니다: W-TERMINAL-PERSISTENT은(는) 침묵하고, lute play은(는) newRun을(를) 제안하는 대신 게임이 영구적으로 끝났다고 알리며, 긴 형식의 키는 닫혀 있고 run 상태만을 대상으로 하는 persists: true은(는) E-META-VALUE입니다. share 키는 식별자입니다. 0.28.0: spentBy은(는) 래치됩니다: 조건이 한 번 성립하면 비트는 조건이 다시 거짓으로 바뀌어도 자신의 once 기간(그 옆에 쓰며, 쓰지 않으면 run) 동안 소비된 상태로 유지됩니다(W-SPENT-BY-REVERSIBLE). select: sequence 발생은 각 비트의 차례 직전에 다시 판정합니다. for 비트는 once을(를) 멤버별로 소비합니다. occasion은 outsideRun: true을(를) 선언할 수 있습니다(terminal:이(가) 성립한 후에도 발생됨). seam은 occasion이 발생될 때 결정됩니다. 시즌에 게이트되지 않은 once: season:<name> 비트는 W-SEASON-UNGATED으로 경고하고, 발생되지 않는 클록 위치만이 취할 비트는 W-BEAT-UNRAISED이며, 새 실행이 유지하는 상태를 읽는 terminal:은(는) W-TERMINAL-PERSISTENT입니다. also은(는) 모든 곳에서 select: first occasion을 필요로 합니다. 0.27.0: occasion은 raisedWhen: 게이트와 타입이 지정된 payload: 필드(occasion.payload.<field>)를 선언할 수 있고, 스키마는 terminal: 조건을 선언할 수 있습니다 — 검사기는 모든 비트를 그 게이트와 !terminal 아래에서 판정합니다. for="kind:<kind>"은(는) 비트를 멤버마다 한 번씩 제시합니다(0.28.0: 그 once은(는) 멤버별로 소비됩니다). 0.28.0: select: sequence 발생은 그 발생의 앞선 비트가 재생된 후 각 이후 비트를 자기 차례에 다시 판정하며, occasion은 outsideRun: true을(를) 선언하여 terminal:이(가) 성립한 후 발생되게 할 수 있습니다. 동일 우선순위에서는 하위 kind의 비트가 부모 kind의 비트보다 우선합니다. 0.26.0: 비트나 항목은 target="kind:<kind>"할 수 있습니다 — 모든 멤버에 응답하고, occasion.target은(는) kind로 타입이 지정된 발생 멤버이며, 같은 셀에 대한 멤버 특정 비트가 동일 우선순위에서 이를 앞섭니다. lute beats은(는) 다른 비트가 항상 포괄하는 fallback을 표시합니다. 0.25.0: 씬 share:, 번들 <beat share=…> 또는 <entry share=…>이(가) 쓰여진 once 옆에 있으면 비트들이 함께 소비되는 프로젝트 전역 키를 지정합니다 — 잘못된 형식의 키, share이(가) 소비하는 once 없이 있는 경우, 또는 한 키의 비트들이 서로 다른 once을(를) 가지는 경우는 E-BEAT-ATTR입니다. 번들 <beat after=…>은(는) 적격성 conjunct입니다. 0.24.0: 계기 judge: before은(는) 비트가 결정되기 전에 자신의 on= objective를 판정하고 퀘스트를 settle합니다. once: day / once: slot. 번들 비트는 after: 선행자가 될 수 있고 ::accept은(는) 수락 기반 퀘스트를 앵커링합니다. 0.23.1: 계기 target: 도메인은 멤버 부분집합으로 좁힐 수 있으며, { prefix, entity, members: [...] } — 닫힌 kind 밖의 멤버는 E-BEAT-ATTR이고, 목록은 선언된 곳에서만 capabilityVersion을(를) 다시 스탬프합니다. occasion을 발생시키면 같은 이름의 선언된 world 이벤트도 발사됩니다. W-BEAT-ONCE-RUN-USER은(는) 기본값이 적용된 once에서만 발사됩니다. 0.23.0: 계기 select: sequence은(는) 모든 적격 비트를 순서대로 제시합니다. 씬 또는 번들 비트의 also: true은(는) select: first 승자 뒤에 따라붙으며 W-BEAT-SHADOWED / W-BEAT-PRIORITY-TIE에서는 무시됩니다. 로어 문서의 번들 비트. 인덱스 비트 행은 메뉴를 위해 when과(와) title을(를) 가집니다. 0.22.0: occasion의 target:은(는) 도메인 { prefix, entity }을(를) 지정할 수 있으므로, 비트 대상은 <prefix>.<member>이어야 하며 그 entities: kind에 속해야 합니다 — 아니면 did-you-mean과 함께 E-BEAT-ATTR입니다. 항목 비트는 once을(를) 받습니다. pick: none은(는) select: all 목록에서 통과합니다. 새 W-BEAT-PRIORITY-TIE 및 W-BEAT-ONCE-RUN-USER)0.51.0.md §4.1–§4.5; 0.30.0.md; 0.29.0.md; 0.28.0.md; 0.27.0.md; 0.26.0.md; 0.25.0.md; 0.24.0.md; 0.23.0.md; 0.22.0.md; 0.21.0.md; CHANGELOG 0.23.1
Play / test 하네스(lute play 스크립트, trace 및 test에서의 파생)0.22.0 (engine: play 단계는 예약된 relation을 포함하여 엔진 소유 상태와 fact를 씁니다. 스크립트는 저장 데이터에서 시작하여 — visited:, presented:, quests:, entriesRead: — 단계마다 choose:을(를) 변경하고, event:으로 world 이벤트를 발사하며, 단계 및 최상위 expect:으로 단언합니다. lute test은(는) expect:을(를) 가진 모든 play를 실행합니다. lute trace / test / play은(는) 기본적으로 시드 fact와 Datalog rule을 적용하며, derive: false / --no-derive은(는) 0.21 응답을 복원합니다)0.41.1 (bridges: 응답은 긴 형식 { fields, writes }을 쓸 수 있고, writes는 런타임의 bridgeResult.writes로 호출 자리에서 적용되며 --events가 함께 보냅니다. 사람용 트랜스크립트는 비트의 advances: 이동과 그 이동이 만든 시계 발생, 닫혀 발생하지 않은 발생을 보여 줍니다; 0.41.0: advance: 단계의 engine: 쓰기는 클록이 움직이기 전에 적용되므로 새 날의 발생이 그 값을 읽습니다 — 0.40의 순서에 기대던 스크립트는 그 쓰기를 뒤따르는 engine: 단계로 옮깁니다. lute play --events은(는) 게이트 거부를 rejected 줄로 출력하며(종료 코드 1), 일반 및 --json play와 lute test은(는) 거부 문구를 그대로 유지합니다. 0.30.0: state: 키, expect.state, lute trace --state 및 lute calendar --axis은(는) 어느 표기로든 상태 경로를 받으며(run.visits["lab-b2"]), fact 시드나 기대값은 인수를 따옴표로 묶을 수 있습니다(at("lab-b2")). 0.28.0: play와 test의 expect.exit은(는) expect.end: complete | terminal | incomplete | error입니다. test의 메뉴 기대값은 expect.options이고(이전 offered) 퀘스트 목록은 accepts:만 받습니다. play 스크립트는 모든 사용 오류를 각각 위치와 함께 한 번에 보고합니다. 소진된 hub 스크립트는 lute trace / lute test에서 미완료로 중단되며, 이는 lute play과(와) 같습니다. 공허한 단언은 거부됩니다(E-TEST-NEEDLE, 엔진이 발생시키지 않을 mock 계기). include:은(는) label:을(를) 가질 수 있습니다. 0.27.0: lute play, lute run, lute trace 및 lute test은(는) 컴파일된 IR을 하나의 walker에서 실행하며, 차분 테스트로 하나의 트랜스크립트에 묶입니다. lute play은(는) 게이트가 거짓이거나 terminal:이(가) 성립한 이후의 발생을 거부하고(E-OCCASION-GATE), occasion: 단계는 engine: 쓰기와 payload:을(를) 가질 수 있으며, include:은(는) repeat: / choose: / bridges:을(를) 받습니다. 트랜스크립트 needle은 자신의 속성 블록을 판정합니다. lute test은(는) 프로젝트의 판정에 따라 문서를 게이트합니다. play 및 test 스크립트는 실행 전에 검증됩니다. 0.26.0: lute trace / lute test은(는) 선택된 ::next을(를) 따라가고, play처럼 핸들러 ::accept을(를) 적용하며, mock 아래에서 when이(가) 거짓인 비트를 거치는 test는 eligible:을(를) 단언하지 않는 한 거짓 전제를 알려 주며 실패시킵니다. lute test은(는) 프로젝트를 한 번 로드하고 병렬로 실행합니다. advance: { to: … }, 단계 expect: { clock }, engine: { accept: [...] }. accepts:은(는) 퀘스트를 프로젝트 전역에서 해석합니다. 0.25.0: 두 배타적 fact를 모두 성립하게 하는 쓰기는 해당 단계에서 lute play을(를) 중단시키고(종료 코드 1) lute trace / lute test walk를 E-FACT-EXCLUSIVE으로 거부하며, 이미 배제를 위반하는 시드 fact는 실행을 거부합니다. bridges: 응답은 어떤 콘텐츠도 읽지 않는 결과 필드를 생략할 수 있으며, lute play은(는) 결과가 전혀 읽히지 않는 호출에서 더 이상 중단하지 않습니다. 0.24.0: advance: 및 include: play 단계는 선언된 클록을 이동시키고 그 occasion을 발생시킵니다. 플러그인 호출은 play, test, trace에서 bridges:으로 응답됩니다 — scene.* 시드는 더 이상 응답하지 않습니다. lute calendar은(는) clock, visited() 및 occasion별 축을 얻습니다. 0.23.1: ::end이(가) lute play 안에 있으면 자신이 실행되는 프레젠테이션만 종료하고, 단계 end: true은(는) 플레이스루를 종료합니다. 단계 expect:은(는) quests / state / facts / notFacts을(를) 얻습니다. *.test.yaml은(는) expect.facts / notFacts / eligible 및 beat:을(를) 얻습니다. trace와 test는 play처럼 보상 credits:을(를) 적용하고 objective 본문을 거칩니다. lute calendar --script은(는) 스크립트의 단계를 재생합니다. 0.23.0: lute beats, lute calendar 및 lute scenario knowledge 개요. play는 sequence 목록과 also 비트를 제시하고, presented: 기대값을 얻으며, prev.run을(를) newRun 시점에 스냅샷하고, 보상을 지급합니다. trace와 run은 <occasion>@<target>을(를) 발생시키고 --beat과(와) 함께 번들 비트 하나를 제시합니다)0.41.1.md; 0.41.0.md §5.2, §5.4; 0.30.0.md; 0.28.0.md; 0.27.0.md; 0.26.0.md; 0.25.0.md; 0.24.0.md; 0.23.0.md; 0.22.0.md; CHANGELOG 0.23.1
클록(clock: 스키마 선언)0.24.0 (스키마는 하나의 clock: { day, slot, slots, raise, week }을(를) 두 개의 owner: engine 경로에 대해 선언할 수 있습니다. 콘텐츠는 예약된 읽기 전용 clock.index / clock.weekday / clock.weekdayLabel을(를) 읽습니다. 비트는 once: day / once: slot을(를) 소비합니다. raise:은(는) 진행(advance)이 발생시키는 계기 또는 맵 { slot, dayStart, dayEnd }을(를) 지정합니다. 클록은 slot / slots을(를) 생략하고 하루 단위로 셀 수 있습니다. 잘못된 형식의 클록은 E-CLOCK-DECL입니다)0.41.0 (진행(advance)의 호스트 writes은(는) 클록이 움직이기 전에 적용되고 정산되며, 그 쓰기로 terminal이(가) 참이 되면 클록을 움직이지 않고 입력이 끝납니다. 그다음 지나는 자정마다 dayEnd과(와) dayStart을(를) 발생시키고, 도착 지점에서 슬롯 계기를 발생시키며, clock { from, to } 이벤트는 계속 마지막에 옵니다. 비트의 advances:은(는) 그 비트의 presentationEnd 뒤에 클록을 움직입니다. raiseAtStart: true은(는) 실행의 첫 위치에서 호스트가 dayStart과(와) 슬롯 계기를 그 순서로 두 개의 일반 raiseOccasion 입력으로 발생시킨다고 명시합니다 — 런타임은 begin / newRun에서 아무것도 발생시키지 않습니다. 0.28.0: 읽기 전용 clock.day / clock.slot 별칭과, 유한 클록에서는 clock.ended(expect: { clock: { ended: true } }을(를) 가진 play에서 검사됨). raiseAtStart: true은(는) 실행이 시작되는 지점에서 엔진이 슬롯 계기(및 dayStart)을 발생시킨다고 명시합니다. 타입은 클록의 enum을 지정할 수 있습니다({ domain: clock.slot }, { domain: clock.weekdayLabel }). 기본값이 1 미만인 day 경로는 E-CLOCK-DECL입니다. 첫째 날에 끝나는 클록에서 마지막 슬롯 이후의 슬롯은 dead guard 또는 arm입니다. day 경로가 실행보다 오래 지속되는 클록은 newRun에 걸쳐 소비와 종료를 유지합니다. 0.27.0: 클록은 자신의 종료를 선언할 수 있습니다 — last: { day, slot } 또는 days: N. 이를 지나는 진행은 거기서 멈추고 클록을 종료하며, 이후의 advance:은(는) E-CLOCK-END이고, 검사기는 clock.index과(와) day 경로를 유한 범위에 대해 범위 지정합니다)0.41.0.md §5.4; 0.28.0.md; 0.27.0.md; 0.24.0.md
런타임 이벤트 계약(step, 입력, await, 쿼리, 스냅숏)0.38.0 (첫 Event 버전: 파서 없는 런타임이 컴파일된 번들을 실행하고 결정적 이벤트를 스트리밍합니다)0.53.0 (런타임과 이벤트 계약은 바뀌지 않습니다. 섹션은 런타임 경계가 아닙니다. 스키마는 lute-events-0.53 / lute-snapshot-0.53으로 옮겨 갑니다; 0.52.0: awaitChoice 메뉴는 렌더링된 프롬프트와 옵션 텍스트를 번역과 함께 담고(prompt, promptTexts, 각 옵션의 text와 texts), 스냅숏의 대기 중인 await도 이를 담습니다. leaves가 있는 jump는 떠나는 허브 방문을 끝냅니다. grant 레코드의 reward는 attrs를 담습니다. 32비트 인덱스·열·요일 변환이 네이티브와 같습니다. 스키마는 lute-events-0.52 / lute-snapshot-0.52로 옮겨 갑니다; 0.51.0: plugin 레코드는 해석된 raises와 렌더링된 text 속성(attrs와 localized)을, grant 레코드는 kind의 raises를 담습니다. 런타임은 한 번의 walk 동안 한도 있는 점프 카운터를 두고 재생으로 다시 만들므로 스냅숏 형태는 바뀌지 않습니다. 스키마는 lute-events-0.51 / lute-snapshot-0.51로 옮겨 갑니다; 0.50.0: 지급된 보상의 effect는 grant 레코드 뒤에 그 grant를 지명하는 retract / assert / accept 레코드로 이어집니다. 호스트 토큰 마커는 호스트가 치환하도록 그대로 남습니다. 스키마는 lute-events-0.50 / lute-snapshot-0.50로 이동합니다; 0.49.0: 플러그인 이벤트 레코드(일반 및 halted)와 브리지 await, 그리고 이를 담는 스냅숏과 요청은 레코드의 플러그인 스탬프를 attrs 옆의 선택적 stamps 객체로 담으며 둘을 합치지 않습니다. 스키마는 lute-events-0.49 / lute-snapshot-0.49로 이동합니다; 0.47.1: line 레코드의 텍스트·세그먼트·렌더된 번역은 IR 이스케이프 규칙을 따릅니다. 리터럴 \{{는 {{로 렌더되고 실제 마커만 치환됩니다. 0.47.0: line 레코드에 줄의 texts / localeSegments도 실리며 각 {{…}} 마커는 공백을 뺀 마커 텍스트로 원문 마커와 맞춰 렌더됩니다. 0.42.0: 9개 스테이징 레코드 bg, music, sfx, vfx, actor, camera, cg, video, sequence에 해석된 attrs가 들어가며 timing과 envelope의 소유 위치는 유지됩니다. Event/스냅숏 스키마는 lute-events-0.42 / lute-snapshot-0.42입니다.)0.51.0.md §3.7, §4.6, §5.6; 0.50.0.md §5.6; 0.49.0.md §3.1; 0.47.1.md §3; 0.47.0.md §2.2; 0.42.0.md §4; 0.41.0.md §5; 0.40.0.md §4; 0.39.0.md; 0.38.0.md, 0.53.0.md §1
플레이어 바인딩(player.bindings.yaml)0.40.0 (lute.project.yaml 옆의 선택적 프로젝트 파일로 스테이징 어휘와 에셋을 플레이어 효과에 연결)0.47.1 (flow.*.target 값은 접두사가 붙은 형태(place.square)의 완전한 occasion 대상이며, beat와 play 대상과 같은 규칙으로 검사합니다. 접두사 없는 멤버나 대상 도메인이 없는 occasion에 쓴 대상은 E-BINDING-KEY입니다. 0.47.0: ui.title에 제목 헤딩인 선택적 text가 생기고 background / music은 선택 사항이 되며, 빈 ui.title은 E-BINDING-SHAPE입니다. bindingsVersion은 luteVersion 규칙을 따릅니다. 툴체인 계열과 다르면 W-BINDINGS-VERSION-STALE(lute fix가 오래된 값을 올립니다)이고, 선언한 계열보다 새로운 섹션은 E-BINDINGS-VERSION입니다(vfx custom 0.41, volumes 0.42, ui.ended 0.46, ui.title.text 0.47). 0.42.0: bindingsVersion: "0.42"와 -0.42 스키마 계열을 사용하며 선택적인 volumes: { member: gain } gain은 유한하고 [0, 1] 범위입니다. 알 수 없는 키는 E-BINDING-KEY, 누락 멤버는 W-BINDING-MISSING, 잘못된 gain은 E-BINDING-SHAPE입니다. 플레이어는 이 표를 통해서만 볼륨을 해석합니다.)0.47.1.md §2; 0.42.0.md §3; 0.41.0.md §7.7; 0.40.0.md §5
  • 0.53.0(“dogfood round 3”)은 새 키워드나 요소, IR 변경 없이 툴체인의 답을 바꿉니다: 최상위 섹션을 넘는 한도 있는 루프(E-JUMP-LOOP-SCOPE는 더 이상 섹션을 이름으로 들지 않습니다), 구조화된 플러그인 frontmatter(record, list, map) 안의 참조를 필드 경로와 함께 검사, accept 경로(스크립트 안 accept는 follows와 상관없이 활성화하고, accept="external" follows="…"는 호스트 정책이며, accept 교착은 E-QUEST-START-CYCLE), 리터럴 중괄호로 열리는 마커(E-INTERP-BRACE가 E-CEL-PROFILE을 대체), 소스의 마커를 유지하는 번역(E-L10N-MARKERS), scope: document인 pair lint, 스탬프를 유지하고 규칙 이름을 밝히는 lute fix, 명령마다 그리고 LSP 루트마다 프로젝트 입력 계층 하나. 새 코드: E-L10N-MARKERS. IR, 런타임, capabilitySnapshot, 플러그인 매니페스트는 바뀌지 않습니다. 0.53.0 제안을 참고하세요.

  • 0.52.0은(는) 새 키워드나 요소 없이 검사기와 런타임 사이의 틈을 메웁니다: 리터럴 중괄호(E-INTERP-BRACE, 라벨 문법 값의 \{{), 퀘스트 최상위 콘텐츠 거부(E-GRAMMAR-NOT-ADMITTED), 허브 떠나기(jump.leaves, lute.core.hubLeave/1, E-JUMP-INTO-BODY)와 허브 스테이지 머리, 검사되고 렌더링되어 awaitChoice 메뉴에 실리는 프롬프트와 라벨, 평문 목표 제목(E-OBJECTIVE-TITLE-INTERP), <reward>의 보상 kind 속성, [accept]와 [raises] 엣지를 따르는 lute impact와 엔벨로프 출처. 새 코드: E-INTERP-BRACE, E-JUMP-INTO-BODY, E-OBJECTIVE-TITLE-INTERP. capabilitySnapshot은 바뀌지 않습니다. 0.52.0 제안을 참고하세요.

  • 0.51.0은(는) 새 키워드나 요소 없이 흐름과 텍스트를 더합니다: 모든 흐름 분석이 레이블에서 합류시키고 고정점까지 반복하는 한도 있는 뒤로 가는 점프(::jump{to max})(정의적 할당과 스테이지 상태의 앞으로 가는 점프 빈틈도 함께 닫습니다, #215), [raises] 엣지로 그려지는 선언된 occasion raise(effects.raises, raisedBy: declared), code=와 lute loc 지원을 갖춘 번역 가능한 text 디렉티브 속성, target: pair lint. 새 코드: E-JUMP-MAX, E-JUMP-LOOP-SCOPE, E-JUMP-INTO-LOOP, E-JUMP-LOOP-CROSS, E-PLUGIN-RAISES, E-RAISES-TARGET, W-OCCASION-NEVER-RAISED, E-LINE-CODE-RESERVED, E-LINE-ID-DUP, E-COMPONENT-TEXT-DIRECTIVE. 모든 capabilitySnapshot이 한 번 바뀌고(코어 jump가 max를 선언), 스키마는 -0.51 계열로, 플레이어 세이브는 "0.51"로 옮겨 갑니다. 구조화된 속성 값(#176)은 계속 미룹니다. 릴리스 기록은 changelog와 버전 관리 가이드입니다.

  • 0.50.0은(는) 새 키워드나 요소 없이 작성 표면을 더합니다: line, branch, hub, choice 또는 디렉티브로 범위를 정하는 플러그인 stampAttrs의 on:(범위가 정해진 스탬프는 required일 수 있음), 플러그인 hostTokens export의 호스트 보간 토큰, 지급 시점에 적용되고 모든 분석이 읽는 보상 kind effects(asserts, retracts, accepts), checker W-* 코드용 프로젝트 diagnostics: level, 문자열 멤버를 갖춘 target: node lint. 새 코드: E-PLUGIN-STAMP-SURFACE, E-DIAGNOSTICS-CONFIG. IR 변경은 추가형이며 새 semantic id lute.quest.rewardEffects/1가 생깁니다. 0.50.0 제안을 참고하십시오.

  • 0.49.0은(는) 정확성과 진단을 고치고 프로젝트 모델 비용을 줄이며, 구문은 추가하지 않습니다. 플러그인 스탬프는 IR과 플러그인 이벤트 레코드, 브리지 await에서 중첩된 stamps 객체 하나로 옮겨지고, <choice into=…> arm은 기록을 먼저 하며, 콘텐츠 줄은 wait를 가질 수 있습니다. 검사기는 예전에 조용히 버리던 것(::jump / ::label / ::clear 위의 스탬프, list / map / record 플러그인 속성 타입, 검사되지 않던 참조 타입 frontmatter 값, 따옴표 없는 보상 target, start 순환과 자기 읽기)을 거부하고, 예전에 거부하던 브리지 결과와 'm' in family guard는 받아들입니다. constraints는 0.49.0.constraints 보고서(판정마다 reason, 반례는 violated에서만, 잘못된 매니페스트에서는 종료 1)를 출력합니다. 단일 파일 check는 프로젝트 전체만 판단할 수 있는 퀘스트 참조를 알려 주고(W-PROJECT-CHECK-SKIPPED), W-BRANCH-ID-SHARED는 play나 test가 그 id를 지정할 때만 나오며, asset-exists는 줄 속성과 이름 지정 속성을 읽고, lint <DIR>는 프로젝트를 사용합니다. 프로젝트 어휘는 프로젝트마다 한 번 만들어집니다. 0.49.0 제안과 변경 로그를 참고하십시오.

  • 0.37.0은(는) 호환 모드가 없는 breaking 표면 정리입니다. 이름이 변경된 모든 표기는 대체 표기를 알려 주는 오류이며 결코 별칭이 아닙니다: ::auto → ::actor, ::cut → ::cg, ::next → ::jump, ::mark{id} 및 줄의 id= → ::label{name}, 선택지 label= → text=, <match on=> → <match subject=>, 음악 action= → playback=(도메인 musicPlayback), cg / video action= → display=. lute fix <path>…은(는) 이들을 무손실로 재작성합니다. 카메라 숫자(zoom, moveX, moveY, shake, reset, easing), cg full, 음악 track, sfx name, 매니페스트의 sequence:, <scene> 태그 및 본문 # Title에는 무손실 재작성이 없어 수동으로 마이그레이션하며, pov:도 {mono} 줄이 있는 모든 문서에 대해 마찬가지입니다. IR은 addr → position, capabilityVersion → capabilitySnapshot, shots → sections, recordKey → selectionKey, kind background / sprite / cut → bg / actor / cg, 역할 monologue / offscreen / voiceover → mono / os / vo으로 이름을 변경합니다. 또한 모든 명령에 family과(와) 중첩된 timing 객체를, 모든 줄에 voiceKey을(를) 추가하고, provenance.injected을(를) 삭제합니다. 0.36 IR 마이너 버전에 게이트된 엔진은 0.37으로 이동하여 읽는 각 필드를 마이그레이션해야 합니다. 0.37.0 제안을 참고하십시오(§2.2는 전체 이름 변경 표, §7은 lute fix 계약입니다).

  • 0.33.0은(는) 엔진 capability를 명시적으로 만듭니다. 실행 IR과 프로젝트 인덱스는 컴파일러가 도출한 정렬된 requiredSemantics을(를) 가지며, semantic-id 레지스트리는 엔진에 보이는 의무를 명명합니다. lute.engine.yaml 매트릭스는 1.0 이전의 정확한 major.minor IR 게이트 이후에만 검사됩니다: run/play은(는) 재생 전에 지원되지 않는 id를 E-ENGINE-SEMANTICS으로 거부하며, 작성 시점의 check --engine/check-project --engine은(는) E-CHECK-ENGINE-SEMANTICS을(를) 보고합니다. 참조 매트릭스는 현재의 모든 id를 지원하며, 플러그인 의미는 여전히 정확한 capability 스냅샷에 의해 게이트됩니다. 0.33.0 제안과 변경 로그를 참고하십시오.

  • 0.32.0은(는) CEL 및 실행 계약을 표준화합니다. 조건은 int / double과(와) 리스트 형식 fact 쿼리를 가진 닫힌 표준 CEL 프로필을 사용하며, Datalog rule 구문은 변경되지 않았습니다. 스칼라 상태는 number을(를) 제거하고, 퀘스트 저장 데이터는 번호가 붙은 questInstances을(를) 노출하며, 퀘스트 grant는 instance / index을(를) 가집니다. 실행 IR은 {cel, expr, authored?} 슬롯, celEnv 및 owner을(를) 사용하며, W-QUEST-STATE-HAS이(가) W-QUEST-STATE-ISSET을(를) 대체하고 새 E-FACT-QUERY 및 E-RUN-OWNED-WRITE이(가) 추가됩니다. 0.32.0 제안과 변경 로그를 참고하십시오.

  • 0.30.0은(는) 이름을 쓰인 대로 기록하고 JavaScript처럼 도달합니다. 모든 0.29.1 문서는 이전과 같이 검사 및 컴파일되며, 0.29가 거부했던 이름, 즉 - 또는 선행 숫자를 가진 이름이 허용됩니다: 조건이 경로로 도달하는 모든 이름, index 또는 fact 인수는 글자, 숫자, _ 또는 -로 구성되며 -로 시작하지 않고, 반면 @name로 그대로 읽히는 이름(def, def 매개변수, component 및 template 매개변수)은 identifier로 유지됩니다. identifier가 아닌 이름은 condition에서 따옴표로 묶인 index(quest["zero-coke-001"].state) 또는 따옴표로 묶인 fact 인수(holds('at', ["lab-b2"]))로 작성합니다. . 뒤에서는 E-PATH-IDENT이며, 이는 bracket 표기를 가리킵니다. IR에는 필드가 추가되지 않으며 — path 필드는 정규 dotted path를 담습니다 — schema 파일의 이름은 schemas/lute-ir-0.30.schema.json으로 변경됩니다. lute.core는 이동하지 않으므로 capabilityVersion도 이동하지 않습니다. 릴리스 기록은 changelog 및 versioning guide입니다.

  • 0.29.1은 0.29 라인의 버그 수정 패치입니다: 새 구문도 없고 IR 형태 변경도 없습니다. 모든 0.29.0 문서는 이전과 같이 검사되고 컴파일되며, 엔진이 소유하는 id는 다시 그 표기를 유지합니다: target(그 멤버를 어떤 entities: kind도 나열하지 않는 것)과 항목의 category는 -를 허용하며(0.28.1에서처럼), 반면 Lute가 선언하는 모든 이름은 identifier로 유지됩니다. 아티팩트는 오직 버전 문자열에서만 다르며, schemas/lute-ir-0.29.schema.json은 이름을 유지했고 $id도 유지했습니다. 릴리스 기록은 changelog 및 versioning guide입니다.

  • 0.29.0에는 하나의 identifier 규칙과 의도를 나타내는 표기가 있습니다. 0.28.1 문서는 이전과 같이 검사되지만, 이름에 -(또는 다른 문자)를 0.28이 허용했던 자리에 쓰는 경우는 예외입니다 — share= key, 문서 id, branch, hub, choice 또는 mark id, enum 또는 entity 멤버, 플러그인의 계기, event 또는 enum — 이는 이제 해당 이름 위치에서 오류가 되며 camelCase 표기를 안내합니다. terminal:는 새 긴 형식 { when, persists }과 함께 문자열 형식을 유지합니다. lute check-project은 원인을 먼저 출력하고 (lute.project.yaml, 플러그인, 스키마, 경로 순서의 문서, 그다음 프로젝트 전체 행), W-CHAPTER-STALL은 chapters: 체인에서만 경고하며, lute new scene --occasion는 요청받은 on:을 기록합니다. IR에는 선택적 terminalPersists이 추가되고 schema 파일의 이름은 schemas/lute-ir-0.29.schema.json으로 변경됩니다. lute.core는 이동하지 않으므로 capabilityVersion도 이동하지 않습니다. 릴리스 기록은 changelog 및 versioning guide입니다.

  • 0.28.1은 0.28 라인의 버그 수정 패치입니다: 언어 변경도 없고, IR 형태 변경도 없습니다. 모든 0.28.0 문서는 이전과 같이 검사되고 컴파일되며, 아티팩트는 오직 버전 문자열에서만 다르고, schemas/lute-ir-0.28.schema.json은 이름과 $id를 유지했습니다. 릴리스 기록은 changelog 및 versioning guide입니다.

  • 0.28.0은 깔끔한 전환(cutover)으로 이름을 변경하고 모든 슬롯을 같은 방식으로 검사합니다. 이름이 변경된 표기를 전혀 사용하지 않는 0.27.0 문서는 이전과 같이 파싱되며, 각 이전 표기는 새 표기를 안내하는 오류가 됩니다 — manifest의 sequence:는 chapters:으로, <quest after=> / <reward on=> / <objective when=>은 follows= / outcome= / visibleWhen=로, 테스트의 expect.offered은 expect.options으로, accept:는 accepts:으로, expect.exit는 expect.end로, ::camera{move-x move-y}은 moveX / moveY로 바뀌고, 플러그인 export는 camelCase이며 lute new --on는 --occasion입니다. 그 외 변경 사항: 모든 condition 슬롯은 typed 및 literal-domain 검사를 when과 동일하게 실행하고(E-CEL-TYPE, E-WHEN-LITERAL-DOMAIN), 모든 YAML 표면은 알 수 없는 키를 거부하며(E-MANIFEST-KEY, E-PLUGIN-KEY, E-STATE-DECL), 예약어는 선언된 위치에서 E-RESERVED-NAME이 되고, true / false 이외의 값을 받은 flag는 E-FLAG-VALUE이 되며, spentBy 래치됩니다; select: sequence은(는) 각 beat를 해당 차례에 다시 판정하며, for beat는 멤버당 once을(를) 소비합니다; 텍스트에서는 kind 레이블이 cast 이름보다 우선합니다; 그리고 새로운 advisory — 그중에서도 W-TEXT-SINGLE-BRACE, W-RELATION-TIER-IMPLICIT 및 W-SEASON-UNGATED — 가 0.27에서 깨끗했던 프로젝트에서 나타날 수 있습니다. IR은 퀘스트 계층 필드 세 개의 이름을 변경하며 그 외에는 추가적(additive)입니다; lute.core은(는) ::camera의 moveX / moveY와 함께 이동하므로, capabilityVersion도 이동합니다. 릴리스 기록은 changelog입니다.

  • 0.27.0은(는) 구문상 추가적(additive)이지만, checker는 더 자주 거부하며 하나의 런타임이 모든 도구를 결정합니다. 모든 0.26.0 문서는 이전과 같이 파싱되며 새 구문 — for="kind:…", 계기 payload: / raisedWhen:, terminal:, clock last: / days:, directive asserts / retracts, once: week, seasons:, rearm=, spentBy:, 비트 템플릿, sequence:, kind labels:, :plural(…) — 은(는) opt-in입니다. 달라지는 점: ::set 에 할당 연산자가 없으면 E-SET-SHAPE입니다; { domain: K } / { entity: K } 경로는 멤버 검사를 받으며 그 위의 <match>은(는) K를 모두 커버해야 합니다; fact 쿼리에 대한 <match on="@def">은(는) E-MATCH-RELATION-SUBJECT입니다; 중괄호 따옴표로 감싼 attribute 값은 E-ATTR-QUOTE입니다; run을 읽는 quest에 tier=이(가) 없으면 W-QUEST-TIER-IMPLICIT을(를) 경고합니다; lute trace, test, play 및 run은(는) 컴파일된 IR을 하나의 walker에서 실행하므로, 런타임 간에 의견이 달랐던 동작(trace에서의 directive 효과, 모든 쓰기 이후의 exclusivity, bridge unknown, 퀘스트 settle 순서)은 하나의 답을 갖습니다; lute test은(는) 프로젝트의 verdict를 기준으로 게이트하며 raisedWhen / terminal:을(를) 판정합니다; transcript needle은 자신의 attribute 블록을 판정합니다; 그리고 메시지에서는 spec 인용이 제거됩니다. capabilityVersion은(는) 달라지지 않습니다. 릴리스 기록은 changelog입니다.

  • 0.26.0은(는) 구문상 추가적(additive)이지만, 여러 답이 달라집니다. 모든 0.25.1 문서는 이전과 같이 파싱되며 새 구문 — add:, defaults.uses glob, defaults.questTier, { entity: K } attribute 타입, @@who:, param default:, directive when=, target="kind:…", rule-body count / countDistinct, sharedName: — 은(는) opt-in입니다. 달라지는 점: mock 하에서 when이(가) false인 beat를 걷는 테스트는 eligible:을(를) 단언하지 않는 한 실패합니다; trace와 test는 실행된 ::next을(를) 따르므로, 점프 이후의 기대치도 판정됩니다; 서로 다른 shape로 두 번 선언된 경로는 E-STATE-DECL-CONFLICT이며 중복 멤버는 E-ENTITY-KIND-SHAPE입니다; E-WHEN-LITERAL-DOMAIN은(는) != / in도 포함하며 멤버가 아닌 리터럴에 대해 E-ARM-DEAD을(를) 대체합니다; 타입이 없는 bridge 답은 거부됩니다; when은(는) directive에서 예약어입니다; 그리고 W-ENTRY-WRITE-REREAD / W-DISPLAY-NAME-DUP은(는) 새로 추가되었습니다. capabilityVersion은(는) 달라지지 않습니다. 릴리스 기록은 changelog입니다.

  • 0.25.1은(는) 0.25 라인의 성능 패치입니다: 언어 변경도, IR shape 변경도 없습니다. 모든 0.25.0 문서는 이전과 같이 검사되고 컴파일됩니다; artifact는 버전 문자열에서만 차이가 나며, schemas/lute-ir-0.25.schema.json은(는) 이름과 $id을(를) 유지했습니다. 릴리스 기록은 changelog과(와) versioning 가이드입니다.

  • 0.25.0은(는) 구문상 추가적(additive)이지만, 몇 가지 답이 달라집니다. 모든 0.24.0 문서는 이전과 같이 파싱되며 새 구문 — excludes:, changedOn:, share, bundle <beat after=…>, accept="external", {{x:ordinalWord}} — 은(는) opt-in입니다. 달라지는 점: test 또는 trace mock만이 accepts:하는 quest는 다시 경고합니다(W-QUEST-NEVER-ACCEPTED; accept="external"을(를) 선언하십시오); exclusion을 깨는 쓰기는 lute play 및 lute trace을(를) 중단시킵니다; 규칙이 선언된 exclusion과 모순되는 프로젝트는 E-RULE-EXCLUSIVE입니다; manifest에서 상속된 stamp에 대한 W-LUTE-VERSION-STALE은(는) manifest에서 한 번만 보고됩니다; 그리고 bridge 답은 어떤 콘텐츠도 읽지 않는 필드를 생략할 수 있으므로, lute play은(는) 더 이상 아무도 결과를 읽지 않는 호출에서 중단되지 않습니다. capabilityVersion은(는) 달라지지 않습니다. 릴리스 기록은 다음과 같습니다. 변경 로그입니다.

  • 0.24.0은 구문상 additive하지만, 몇 가지 결과가 달라집니다. 모든 0.23.1 문서는 이전과 동일하게 파싱되며, 새 구문 — clock:, once: day|slot, activate=, complete=, until=, <on target>, per:, subsetOf:, cast present: / emotions:, effects: true, ::clear, %, guard가 붙은 ::set, {{x:ordinal}} — 는 opt-in입니다. 달라지는 점: by=은 매 settle마다 판정됩니다 (기존의 place 기반 규칙은 until=입니다). beat의 when:은 그 본문을 좁히므로, checker를 만족시키기 위해서만 남겨 둔 match arm은 이제 E-ARM-DEAD입니다. plugin 호출의 결과는 bridges:로 응답되며, scene.* seed로 응답되지 않습니다. present:를 선언하는 cast는 모든 line을 검사합니다 (W-CAST-ABSENT). 그리고 capabilityVersion은 모든 문서에서 달라지는데, lute.core이 ::clear을 얻기 때문입니다. 릴리스 기록은 변경 로그입니다.

  • 0.23.1은 0.23 라인의 패치입니다: 새 구문 없음, IR 형태 변경 없음. 부모와 tier가 다른 subquest는 이제 E-QUEST-TIER-MIX입니다. 계기 target domain은 members:로 좁혀질 수 있습니다. raise된 occasion은 먼저 같은 이름으로 선언된 world event를 발생시키고 (모든 활성 quest의 <on event> handler), 그다음 자신의 on= objective를 판정하며, 그 by deadline은 done 이후 그곳에서만 판정됩니다. 태그가 없는 component line은 lute tag가 작성할 코드를 취하므로, 그 lineId은 한 번 바뀔 수 있습니다. 스펙 텍스트는 여전히 각 구문을 도입한 proposal이며, 릴리스 기록은 변경 로그와 버전 관리 가이드입니다.

  • 0.23.0은 additive하지만, 더 엄격해진 checker가 깨끗했던 프로젝트를 빨갛게 만들 수 있습니다. 모든 0.22.0 문서는 이전과 동일하게 파싱되고 컴파일되며 (버전 문자열만 바뀝니다), 새 구문 — by=, objective target=, also:, select: sequence, lore 내 <beat>, <hub prompt>, {{@p}} string param, prev.run.*, cast:, credits: — 는 opt-in입니다. 달라질 수 있는 것은 check-project의 결과입니다: condition decider가 이제 같은 경로의 모순 (run.n > 5 && run.n < 3, x && !x)을 dead로 증명하므로, 항상 false였던 guard는 이제 E-BEAT-UNREACHABLE, E-ENTRY-UNREACHABLE, E-ARM-DEAD 또는 E-OBJECTIVE-UNSATISFIABLE이 되며, cast를 선언하는 프로젝트는 speaker를 검사합니다.

  • 0.22.0은 문법이 아니라 컴파일된 identity에 대해 breaking입니다. 모든 0.21.1 문서는 새 diagnostic을 제외하면 이전과 동일하게 파싱되고 검사됩니다. 달라지는 것은 lute compile가 작성하는 id입니다. 기본 voiceKey template은 {prefix}을 얻고 (0.21 기본값이 문서 간에 충돌했습니다), component에서 확장된 line은 자체 {prefix}.{component}#{n}.{speaker}_{code} 주소를 갖습니다. 기존 key에 대해 오디오를 녹음한 프로젝트는 identity.voiceKey: "{speaker}-{code}"를 고정합니다. component를 ::use하는 문서는 localization 및 voice manifest를 다시 export합니다. toolchain 쪽의 결과도 바뀝니다: trace와 test는 이제 기본적으로 프로젝트의 Datalog 규칙을 적용합니다. <quest tier>의 기본값은 user이므로, 기존 quest의 persistence는 바뀌지 않습니다.

  • 0.21.1은 0.21 라인의 패치입니다: 새 구문 없음, 더 엄격한 정적 의미론. 결함을 받아들이고 잘못된 것을 출력하던 검사가 이제 이를 보고합니다: quest.<id>.state는 항상 할당되는 lifecycle enum으로 읽힙니다. def 본문은 CEL profile gate를 통과합니다. directive attribute 안의 def는 literal로 fold되거나 E-ATTR-DEF-DYNAMIC입니다. {{@def}}이 inline될 수 없으면 E-INTERP-DEF입니다. <quest> / <objective> / <on>은 자신의 attribute를 닫습니다 (E-UNKNOWN-ATTR). 작은따옴표로 감싼 attribute 값은 E-ATTR-QUOTE입니다. is= + test= arm은 둘 다 증명하는 것만 cover합니다. E-DUP-LINE-CODE은 확장된 component에 대해 실행됩니다. 그리고 check-project은 컴파일, 단일 snapshot gate (E-CAPABILITY-MISMATCH), 그리고 E-DUP-VOICEKEY를 실행합니다. 이 규칙들의 스펙 텍스트는 여전히 각 구문을 도입한 proposal이며, 릴리스 기록은 변경 로그와 버전 관리 가이드입니다.

  • 0.11.0는 IR의 major.minor을 뒤에 아무것도 없는 채로 옮깁니다 — 최초의 이 스택이 그 shape를 기록하는 것은 처음입니다. 0.10.1은 0.10 안에 머물렀고 비용은 전혀 들지 않았으며, 0.10.2 역시 0.10 안에 머물렀지만 실제 콘텐츠를 이동시켰고 (meta.plugin), 0.11.0는 숫자 자체를 0.10 밖으로 꺼내 0.11으로 옮기면서도 콘텐츠나 shape 변경은 전혀 수반하지 않습니다 — 즉 0.11.0이 생성하는 아티팩트는 0.10.2의 것과 바이트 단위로 동일합니다. IR 0.10에 게이트된 엔진은 아티팩트를 계속 받아들이기 위해 여전히 게이트를 0.11까지 넓혀야 하며 (런타임 계약은 major.minor에 대해 게이트하는 것이며, 내부의 무언가가 실제로 바뀌었는지 여부에 대해서가 아닙니다), schemas/lute-ir-0.10.schema.json은 schemas/lute-ir-0.30.schema.json로 이름이 바뀌는데, 이는 0.7.0 선례에 따른 것입니다 — major.minor 이동은 이동의 이유와 무관하게 스키마 파일의 이름을 바꿉니다. 이 릴리스 자체는 전적으로 툴체인 변경입니다: 새로운 schedule.yaml 프로젝트 파일 레이어와 lute play 명령(0.21.0는 이 레이어를 다시 제거하고 lute play를 계기 위에 재구축했습니다 — Playing a story), 그리고 공유 reference runner의 두 가지 수정(컴파일된 <when is=…> match arm은 이제 구조화된 expr을 읽으며 더 이상 무조건 <otherwise>로 fall through하지 않고, 스크립트된 결정이 소진되었는데 선택 가능한 옵션이 남아 있는 hub는 이제 조용히 수렴하는 대신 미완료 상태로 중단됩니다).

  • 0.6.0는 현재 스택에서 유일한 호환성 파괴 문법 개정입니다. 이 개정은 persist= 속성을 제거하여 into=만이 choice run-record sugar를 구동하도록 했으며, shot 제목을 자유 텍스트로 만들었습니다. 0.6.0 이전 문서가 bare into=(이전에는 조용한 no-op)를 담고 있던 경우 이제 기록됩니다.

  • 0.8.0 — 도입(adoption) 릴리스 — 은 문법상 하위 호환되지만, 순수한 추가만은 아닙니다. 여기에 포함된 모든 항목은 실제 777개 씬 / 583개 퀘스트 게임 카탈로그에 대해 Lute를 평가하면서 발견된 공백에서 비롯되었으며, 그중 두 항목은 언급할 가치가 있는 경계 사례를 갖습니다. IR은 command kind를 하나 얻습니다, end; 알 수 없는 kind는 실행 모델 버전 정책에 따라 hard error이므로, 0.7 엔진은 이를 담은 아티팩트를 반드시(MUST) 거부해야 합니다 — 이것이 의도된 신호인데, 종료(termination)는 구 엔진이 흉내 낼 수 없는 기능이기 때문입니다. 그리고 E-STATE-COLLECTION는 항상 규범적이었지만 결코 검사되지 않았던 규칙을 강제합니다: state: 선언이 list/record/map 타입인 경우 이전에는 shape validator를 통과했지만 이제는 실패합니다. 그 외 모든 것은 선택 사항이며 append-only입니다 — 그 선언 하나를 제외하면, 0.7.0에서 깨끗한 문서는 luteVersion:만 다시 찍으면 0.8.0에서도 깨끗하게 검사를 통과합니다.

  • addr 폭은 아티팩트별로 균일하며, 이는 이제 보장됩니다. 인덱스 세그먼트는 예전에 고정 4자리였기 때문에, 100개 이상의 레코드를 가진 shot은 001-11500을 001-1400와 나란히 내보냈고 문자열 비교는 "001-11500" < "001-1400"라고 보고했습니다 — 사전식 순서가 실행 순서에서 조용히 벗어난 것입니다. 이제 두 세그먼트 모두 문서로부터 계산된 폭으로 패딩되고 아티팩트 전체에서 균일하게 유지되므로, 사전식 순서가 addr 위에서 실행 순서와 같다는 것은 엔진이 의존할 수 있는 사실입니다. 모든 shot이 100개 미만의 주소를 내보내는 문서는 바이트 단위로 동일하게 컴파일되어 0.7.0과 같습니다. addr은 여전히 매 컴파일마다 재생성되는 위치이며, 결코 식별자(identity)가 아닙니다 — 안정적인 join은 여전히 lineId / voiceKey입니다.

  • 0.9.0 — 어휘 소유권(vocabulary ownership) — 은 문법이 아니라 검증에서 호환성을 깨뜨립니다. 컴파일러는 일곱 개의 콘텐츠 어휘 slot을 선언하고 멤버는 전혀 제공하지 않으므로, emotion="delighted"를 작성하는 문서는 그 프로젝트가 emotion를 선언해야 하며; 아무도 선언하지 않은 slot을 사용하는 것은 E-DOMAIN-UNKNOWN, 즉 오류인데, 특히 action는 이전에는 아예 건너뛰어졌습니다. 0.9.0 이전의 모든 enums: 블록은 여전히 바이트 단위로 그대로 파싱되지만 — bare 시퀀스는 { members: [...] }의 축약형입니다 — action의 선언은 이제 반드시(MUST) exits:를 제공해야 하고 anchor 중 하나의 선언은 반드시(MUST) default:를 제공해야 하는데, 이 두 곳이 컴파일러가 어느 멤버인지에 따라 분기하는 지점이며, 더 이상 이름 접두사로부터 이를 추론하지 않기 때문입니다. 해당 릴리스에서 IR shape는 움직이지 않았습니다: 어떤 필드도 추가, 이름 변경, 이동되지 않았으며, irVersion이 "0.9.0"로 읽힌 것은 릴리스가 모든 축을 재정렬하기 때문일 뿐입니다 — IR 0.8에 게이트된 엔진은 게이트를 0.9까지 넓히기만 하면 되었습니다. 아티팩트의 콘텐츠는 실제로 움직입니다 — enums은 인라인으로 또는 uses:을 통해 선언하는 프로젝트에서 채워지고, capabilityVersion가 바뀝니다. 저작(authoring) 측면은 Content vocabulary에 정리되어 있습니다.

  • 0.9.0는 또한 import된 component 본문이 그 본문을 사용하는 콘텐츠와 동일하게 검사되도록 합니다. check()의 18개 진단 단계 중 5개는 root 전용이어서 컴포넌트 본문에 대해서는 실행되지 않았으므로, 동일한 줄이 ::use을 통해서는 clean으로 검사되고 씬 수준에서는 dirty로 검사되었습니다 — 콘텐츠 줄 attribute 규칙, E-DUP-LINE-CODE, reachability, walker가 처리하지 않는 콘텐츠의 admission, 그리고 injection folding이 그것입니다. 이제 다섯 가지 모두 ::use 위치에 anchor되어, 컴포넌트와 그 파일을 명시하는 접두사를 붙여 실행됩니다. 이전에 통과하던 컴포넌트 본문이 보고될 수 있으며, 그러한 모든 보고는 이미 artifact에 도달하고 있었거나 이미 조용히 버려지고 있었던 것입니다. 컴포넌트 본문이 여전히 갖지 못하는 것은 자체 vocabulary scope입니다: 그 uses:와 자체 inline enums:는 모두 parse 시 버려지므로, 본문은 가져오는(importing) 문서를 기준으로 vocabulary를 해석합니다.

  • 0.10.0 — toolchain은 아는 것을 말합니다 — 는 문서, mock, 그리고 IR shape를 빨갗게 만듭니다. 13건의 언어 변경이 있으며, 그 공통 맥락은 그 모든 항목이 checker가 이미 답을 알고 있던 지점이라는 것입니다. 그중 세 가지는 현재 clean으로 검사되는 문서를 빨갗게 만들 수 있습니다: ::set은 이제 우변의 타입을 자신이 쓰는 경로에 맞춰 검사하고 (E-SET-TYPE), 여섯 logic tag는 자신의 attribute 집합을 닫으며 (E-UNKNOWN-ATTR, 그리고 E-AS-REMOVED은 as=에 대해, 즉 <choice> 상에서 적용됨), 결코 열릴 수 없는 <quest start> gate는 이전에는 조용히 지나가던 곳에서 E-QUEST-UNREACHABLE로 처리됩니다. mocks/*.yaml는 처음으로 검증되며 그 file: 키는 필수입니다 — 이 키가 없는 mock은 E-MOCK-SUBJECT입니다. 그리고 IR shape가 처음으로 움직이는데, 이는 0.8.0 이후 처음입니다: provenance.reason가 provenance.explanation가 되므로, IR 0.9에 gate된 engine은 0.10로 넓히고 자신이 읽는 그 한 필드의 이름을 바꿔야 합니다. W-INJECT-CONFLICT은 좁혀지는 대신 제거되며, 그것이 담고 있던 정보는 이전(migrate)되지 않고 버려집니다 — 선언된 기본값과의 일치가 유일한 트리거였으므로, 더 이상 경고할 것이 남아 있지 않았습니다.

  • 0.6.1 coverage 경고는 오류가 아니라 정직함입니다. 이 경고들은 정적 분석이 증명할 수 있는 것의 정확한 경계를 지목합니다 — 오래된 luteVersion stamp, 생성 불가능한 trace mock — 그리고 스스로 exit code를 바꾸는 일은 결코 없습니다. 세 번째인 W-UNPROVEN-RELATIONAL(checker가 증명도 반박도 할 수 없었던 관계형 fact query)은 0.20.0 이후 사라졌습니다: 이제 check-project이 관계형 guard를 판정하며, dead guard는 해당 slot의 오류를 통해 보고하고 redundant guard는 W-FACT-GUARANTEED로 보고하며, 단지 가능한 guard는 정상적인 경우로서 조용히 지나갑니다. 두 가지 0.8.0 추가 항목은 coverage 주장이 아니라 일반적인 finding입니다 — ::end 뒤의 도달 불가능한 콘텐츠, 그리고 번들이 선언한 locale이 누락된 translatable record — 하지만 동일한 severity를 갖습니다. 이들 중 어느 것이든 --deny <CODE> 또는 --deny-warnings로 오류로 승격할 수 있습니다.

  • 설계 근거는 spec과 함께 존재합니다. 4계층 state model의 이유는 state-model-design.md에 기록되어 있으며, 이는 0.0.1 §9의 비규범적(non-normative) 동반 문서입니다.

  • Capability surface는 별도로 명세됩니다. Character/cast identity와 plugin 시스템은 핵심 scenario-DSL 개정이 아니라 capability 제안입니다. plugin 시스템의 현재 개정판은 0.0.4이며, 0.10.2과 함께 도입됩니다: plugin이 소유하고 checker가 검증하는 frontmatter 키가 이제 컴파일 시 버려지는 대신 컴파일된 artifact(meta.plugin)에 도달합니다. 0.0.3 — lute.core은 빈 enums를 export하고, enums 항목은 긴 형식의 멤버 의미론을 가질 수 있으며, 닫힌 semantics flag vocabulary는 어떤 consumer도 읽지 않던 두 flag를 제거합니다 — 와 0.0.2 — option 및 frontmatter 값 검증, 예약된 stamp-attribute 거부, cross-cutting stampAttrs, 그리고 실제로 구현된 선언적 lower: { record, fields } 형식 — 은 개정된 형태로 그 기반으로 남아 있습니다. 네 가지 모두에 대해서는 specification index를 참조하십시오.

언어와 아티팩트 형태는 위의 버전 주장에 정의된 계약을 따릅니다. 0.43 에이전트용 추가 사항은 CLI 계약입니다. JSON 보고서는 command, schemaVersion, 종료 코드와 일치하는 ok를 갖는 평면 객체이며, JSON 모드 실패는 E-CLI-USAGE, E-CLI-IO, E-CLI-INPUT을 사용합니다. lute schema는 파서의 명령 트리를 설명하고, 로컬 텔레메트리는 LUTE_TELEMETRY=0 또는 DO_NOT_TRACK=1로 선택 해제합니다. 아티팩트, run --json, 이벤트 스트림은 기존의 보고서가 아닌 프로토콜을 유지합니다.

0.48.0은 명령줄(과 아래의 동작 하나)만 바꾸며 언어와 아티팩트 형태는 그대로입니다. 프로젝트는 항상 --project <DIR>로 지정하고, --project를 주지 않은 명령은 현재 디렉터리 (check, compile, context, trace는 파일 피연산자의 디렉터리)에서 위쪽으로 가장 가까운 lute.project.yaml을 찾습니다(해당 디렉터리 자신 포함). 발견된 프로젝트는 명시한 --project와 똑같이 쓰이므로, 프로젝트 안에서 compile <FILE>과 trace <FILE>은 이제 프로젝트 판정으로 게이트됩니다. check-project는 lute check로 합쳐졌습니다. lute check --project <DIR>이 프로젝트 전체 검사이고 lute check <FILE>…은 문서만 검사합니다. lute compile --project <DIR> -o <OUT>이 compile --all을, lute compile --stream <FILE>이 compile-stream을 대체합니다. check --json 보고서는 files[]와, 프로젝트 전체 모드에서는 project_diagnostics를 갖는 0.48.0.check이며 0.43.0.check-project 보고서는 폐기되었습니다. 플래그 이름도 일관되게 바뀌었습니다(예: --out은 -o, --output, --locales는 --locale-bundle, context --target은 --node). 이 페이지의 이전 행과 노트는 설명하는 버전의 표기를 그대로 유지합니다.