콘텐츠로 이동

진단 코드 레퍼런스

Lute가 출력하는 모든 진단에는 코드가 붙습니다. E- 코드는 오류입니다: 문서가 검사를 통과하지 못하고 lute check는 1로 끝납니다. W- 코드는 경고입니다: --deny <CODE>나 --deny-warnings가 오류로 올리지 않는 한 문서는 통과합니다. E- 코드가 경고로 출력되는 일은 없습니다: 프로젝트 전체 check --wip가 봐주는 죽은 가드는 W-WIP로 보고되고, 메시지가 플래그 없이는 같은 가드에 붙을 오류 코드를 밝힙니다. lute --explain <CODE>는 아래 항목을 터미널에 출력하고, 에디터는 각 코드를 이 페이지의 해당 절로 연결합니다.

메시지는 무엇이 잘못되었는지를 평이한 말로 알려 줍니다. 코드 뒤의 스펙 절은 각 항목 아래에 해당 제안서 링크와 함께 나열되며, --json 출력에서는 각 진단의 spec 필드에 담깁니다.

위치 file:line:column의 줄과 열은 1부터 세며, 열은 바이트가 아니라 문자 단위입니다: 오류 앞의 한글 한 글자나 이모지 하나는 한 열입니다. --json의 span.column과 lute scenario … reach의 causes[].column도 같은 수입니다. 언어 서버는 LSP 규약대로 UTF-16 위치를 보고합니다.

::accept 지시어가 퀘스트를 지정하지 않았거나, quest 값이 인용된 퀘스트 id가 아니거나, at 값이 "nextRun"이 아니거나, 이미 부모와 함께 활성화되는 accept="external" 퀘스트를 대상으로 지정해 수락이 아무 효과가 없습니다. 0.50.0부터는 보상 kind의 accepts 효과에도 같은 규칙을 적용합니다. 해결된 quest id가 알 수 없는 id(did-you-mean 포함)이거나, start가 있는 퀘스트이거나, 자동 활성화되는 자식이면 이 코드이며, @target에서 온 id는 보상의 target= 값에, 그렇지 않으면 kind=에 표시됩니다. 메시지가 보상을 지목합니다: `<reward kind="OFFER_QUEST" target="secnd">` accepts quest `secnd` (its kind's `effects.accepts`), but no quest in the project declares that id — did you mean `second`?.

명세: dsl 0.21.0 §7a.3, dsl 0.24.0 §2, dsl 0.25.0 §5, dsl 0.50.0 §5.2

반복 가능한 비트가 자신을 표시한 클록 상승 이벤트에 응답하면서 다음 위치로 시간을 이동해, 반복되는 중첩 advances: 연쇄를 만듭니다.

명세: dsl 0.31.0 §1

연령 게이트가 적용된 <match subject="app.rating">가 teen 분기도 <otherwise>도 포함하지 않아, 릴리스 빌드에서 어느 경우에도 매치되지 않을 수 있습니다.

명세: dsl §11.2

::set 지시어가 app.* 네임스페이스에 씁니다. 이 네임스페이스는 엔진/설정 계층만 소유하므로 콘텐츠가 쓸 수 없습니다.

명세: dsl §9.5

게이트가 걸린 콘텐츠 라인, <match> 분기, <choice when>, 또는 ::jump{when}의 when 가드가 항상 거짓임이 증명되어 절대 표시되거나 선택될 수 없습니다.

명세: dsl 0.4.0 §5.2, dsl 0.4.0 §7.2, dsl 0.20.0 §5

선택지가 제거된 as 속성을 사용합니다. 선택지가 기록하는 run 팩트는 into로 지정합니다.

명세: dsl 0.10.0 §4

에셋 id 문자열의 세그먼트 개수가 선언된 종류에 맞지 않거나, 고정(const) 세그먼트 값이 해당 종류가 요구하는 값과 일치하지 않습니다.

명세: dsl §7.2

에셋 id의 한 세그먼트가 선언된 열거형의 구성원이 아니거나, 숫자가 필요한 자리에 숫자가 아니거나, 공급자 카탈로그에 알려진 id가 아닙니다.

명세: dsl §7.2

순수 조회형 에셋 종류의 id 문자열이 선언된 공급자 카탈로그에 알려진 id가 아닙니다.

명세: dsl §7.2

지시어(일반 ::directive 또는 ::use)가 <track> 클립 밖에서 타임라인 위치 속성 at을 사용했습니다. at은 그 위치에서 유효하지 않습니다.

명세: dsl §7.5

지시어 속성 값으로 쓰인 @def나 컴포넌트 본문 속성에 대응되는 ::use 인자가 상태에 의존해 컴파일 타임 상수로 축약되지 않습니다.

명세: dsl §5.1

속성 값이 필수인 곧은 겹따옴표 " 대신 홑따옴표나 굽은(워드프로세서) 따옴표로 구분되어 있습니다.

명세: dsl §4.4, dsl §4.5

속성 값이 선언된 타입과 맞지 않습니다. 예를 들어 숫자가 아닌 duration/delay, 불리언이 아닌 플래그, 인용된 문자열이 필요한 자리의 맨 식별자, 또는 공급자·도메인·엔티티 종류의 구성원을 가리키지 않는 값입니다. 0.51.0부터 text 속성(과 그 옆의 code)은 인용된 문자열입니다: @def에는 자체 번역이 없으므로 @ref 값은 거부됩니다(`title` of `::banner` is localizable `text`, written as a quoted string; a `@def` value has no translation of its own).

명세: dsl 0.51.0 §5.2

작성 속성, 태그 속성 또는 프런트매터 키가 lowerCamelCase가 아닙니다(_가 들어 있습니다). 메시지가 lowerCamelCase 표기를 알려 줍니다.

명세: dsl 0.37.0 §2.1

값이 속해야 하는 닫힌 열거형, 도메인, 엔티티 종류의 구성원이 아닙니다. 예를 들어 콘텐츠 라인의 emotion=이 화자에게 선언된 emotions: 밖의 값이거나, 엔티티 id가 해당 종류 밖의 값입니다.

0.49부터 플러그인 frontmatter 키도 같은 검사를 받습니다. 키의 타입이 entity, domain, enumFromOption, providerRef, assetKind이고 값이 YAML 문자열이면 구성원인지 확인하며(예: mirra is not a member of entity kind person (attribute lead of frontmatter) — did you mean mira?), 위치는 해당 frontmatter 키입니다. 해당 타입의 list는 요소마다 검사하고, 문자열이 아닌 값은 계속 E-FRONTMATTER-SCHEMA입니다.

명세: dsl 0.24.0 §4

비트의 on, target, priority, once 속성이 잘못되었습니다. 이름이 아닌 on, target: true로 선언되지 않은 occasion에 붙은 target, 정수가 아닌 priority, run/user/false 밖의 once, on 없는 비트 키, 아직 존재하지 않는 씬 자신의 scene.* 상태를 읽는 when, 또는 once: false나 share 키와 함께 쓴 spentBy가 해당합니다.

명세: dsl 0.21.0 §3, dsl 0.21.0 §5, dsl 0.28.0 §6

한 lore 문서의 두 선언이 같은 id를 씁니다. 번들 <beat> id가 반복되었거나, <entry>의 id가 <beat>의 id와 같습니다. 이때 비트의 정식 id <문서 id>.<id>가 entry의 별칭이기도 해서, visited()나 플레이의 expect.winner가 둘을 모두 가리키게 됩니다.

명세: dsl 0.28.0 §7

씬 비트의 when 가드가 항상 거짓임이 증명되어 그 비트가 절대 선택될 수 없습니다.

명세: dsl 0.21.0 §5

플레이어 바인딩이 알 수 없는 효과를 지정하거나 해당 효과가 받지 않는 매개변수를 지정합니다.

명세: dsl 0.40.0 §5, dsl 0.40.0 §7.4

플레이어 바인딩이 assetsBase에 상대적인 위치에서 존재하지 않는 파일을 가리킵니다(ui 참조는 먼저 assets: 키로 해석됩니다).

명세: dsl 0.40.0 §5, dsl 0.46.0 §3.1

플레이어 바인딩 키가 선언된 도메인 구성원, cast id, occasion, target, 컴파일된 스테이징 값 또는 닫힌 domain 종료 화면 구성원이 아닙니다.

명세: dsl 0.40.0 §5, dsl 0.46.0 §3.2

플레이어 바인딩 YAML이 잘못되었거나 알 수 없는 키를 포함하거나, 작성된 ui.title이 text, background, music 중 아무것도 지정하지 않거나 빈 text를 가집니다.

명세: dsl 0.40.0 §5, dsl 0.46.0 §3.2, dsl 0.47.0 §4.1

플레이어 바인딩 섹션이 파일에 선언한 bindingsVersion 라인보다 새롭습니다(vfx의 effect: custom 0.41, volumes 0.42, ui.ended 0.46, ui.title.text 0.47). bindingsVersion을 그 섹션에 필요한 라인으로 올리세요.

명세: dsl 0.47.0 §4.2

비어 있지 않은 <branch>의 모든 <choice>에 when 가드가 걸려 있어, 모든 가드가 동시에 거짓이 되어 빈 메뉴가 나타날 수 있습니다. 가드 없는 선택지가 최소 하나 필요합니다.

명세: dsl §11.1

시간 제한이 있는 <branch>에 default=로 지정한 유효한 직접 옵션이 없거나 항상 선택 가능하지 않습니다.

명세: dsl 0.40.0 §2.1

<branch> 또는 <hub>에 <choice>가 하나도 없어, 라우팅할 수 없는 선택지로 축약됩니다.

명세: dsl §7.3

<branch prompt> 또는 <hub prompt> 값이 없거나 빈 문자열입니다. 프롬프트는 UI가 보여주는, 비어 있지 않은 문장이어야 합니다. 프롬프트의 {{…}} 마커는 선택지 문구처럼 렌더링됩니다.

명세: dsl 0.11.1 §4, dsl 0.23.0 §4, dsl 0.52.0 §6.1

<branch timeout> 값이 양의 정수 초로 해석되지 않습니다.

명세: dsl 0.11.1 §4

플러그인 디렉티브가 layer: bridge와 bridgeCall 의미를 선언했지만 bridge 결과를 읽는(fromBridgeResult) effects.writes 항목이 없어, 호출이 아무것도 기다리지 않는 레코드로 컴파일됩니다. fromBridgeResult 쓰기를 추가하거나 layer: bridge를 지우세요.

명세: dsl 0.41.1 §3.5

::camera 지시어가 focus, framing, move, transition 중 어느 것도 지정하지 않아 할 일이 없습니다.

명세: dsl 0.37.0 §3.3

::camera 지시어가 제거된 수치·구식 속성(zoom, moveX, moveY, shake, reset, easing)을 씁니다. 카메라 값은 이제 프로젝트가 선언하는 framing, cameraMove, transition 구성원이므로 손으로 옮겨야 합니다.

명세: dsl 0.37.0 §3.3, dsl 0.37.0 §4

같은 프로젝트의 두 문서가 서로 다른 기능(capability) 스냅샷으로 해석되어, 프로젝트가 색인할 단일 capabilityVersion을 가지지 못합니다.

명세: dsl §13

콘텐츠 라인의 화자나 ::actor{character}/::camera{focus} 리터럴이 프로젝트에 선언된 캐스트 밖의 id를 가리킵니다.

명세: dsl 0.23.0 §7, dsl 0.24.0 §4

조건 슬롯, def 본문, 또는 present:/비트 when 안의 CEL 식이 올바른 CEL 문법으로 파싱되지 않습니다.

명세: dsl 0.4.0 §8.1

CEL 식이 제한된 Lute-CEL 프로파일 밖의 구문을 사용합니다. 허용되지 않는 함수 호출, 컴프리헨션 매크로, 맵/구조체 리터럴, 상태 경로나 def가 아닌 맨 식별자, 예약된 내부 토큰, 또는 조건 슬롯 밖에서 쓰인 visited(…)가 해당합니다. 보간 {{…}}에서는 0.50.0부터 선언된 호스트 토큰도 허용되는 형태이며, 선언되지 않은 맨 식별자 보간의 메시지가 “a declared host token”을 언급하고 선언된 토큰(예: userName)을 나열합니다: interpolation `playerName` is not a valid `{{…}}` form — only a state path, …, a def `@ref` / `@ref(args)`, or a declared host token (`userName`) are permitted; declare `playerName` in a plugin's `hostTokens:` export if the engine substitutes it …. 메시지의 나머지는 그대로입니다.

명세: dsl §8.4, dsl 0.21.0 §7a.1, dsl 0.50.0 §4.2

조건의 타입이 쓴 뜻을 낼 수 없습니다. bool·숫자·문자열 사이의 비교(visited('x') > 2, run.oil == true, run.day == 'monday'), 숫자가 아닌 값의 순서 비교(run.hour >= 'h03'), && / || / ! / ?:의 bool이 아닌 피연산자나 조건, 계산할 수 없는 산술, 정수 나머지 연산자 %의 정수가 아닌 피연산자가 해당합니다.

명세: dsl 0.24.0 §1, dsl 0.28.0 §1

::cg 지시어가 제거된 full 속성을 씁니다. 이를 대신할 수 있는 것은 layout=으로 쓰는 프로젝트 선언 cgLayout 구성원뿐이므로 손으로 옮겨야 합니다.

명세: dsl 0.37.0 §3.3, dsl 0.37.0 §4

프로젝트의 chapters:가 잘못되었습니다. { on, scenes } 체인의 목록이 아니거나, 둘 중 어느 것도 아닌 키가 있거나(체인은 occasion을 occasion:이 아니라 on:으로 씁니다), 장면 id가 아닌 항목이 있거나, 장면이 두 번 나열되었거나, 한 occasion에 체인이 둘 있거나, 매니페스트가 아직 폐지된 sequence: 키를 씁니다. 또는 체인이 어떤 플러그인도 선언하지 않은 occasion을 가리키거나(shape-only에서는 다른 비트가 응답하는 occasion의 오타), 어떤 장면도 선언하지 않은 id를 나열하거나(번들 비트·lore 항목·문서면 그렇다고 말합니다), 나열된 장면의 on:이 다른 occasion에 응답하거나, target과 함께 올리는 occasion에서 target:이 없는 장면을 나열합니다(모든 target에서 재생됩니다). 잘못된 체인은 적용되지 않고, 나머지 체인은 적용됩니다. 매니페스트 줄에서 보고되며(빠진 target:은 장면의 id:에서), 문서들은 그대로 검사됩니다.

명세: dsl 0.28.0 §4

선택한 엔진이 지원하지 않는 의미 기능을 구성 요소가 요구합니다.

명세: dsl 0.33.0 §4

<branch> 또는 <hub>가 같은 id를 가진 <choice>를 두 번 선언했습니다. 선택지 id는 같은 branch/hub 안에서 유일해야 합니다. 또는 prompt=가 있는 branch/hub에 <choice id="prompt">가 있어, 그 lineId가 프롬프트의 lineId({prefix}.{branchOrHubId}.prompt)와 겹칩니다 — 선택지 이름을 바꾸세요.

명세: dsl §11.1, dsl 0.47.0 §3.1

가드나 조건이 예약된 선택 기록(choice-log) 경로를 읽습니다. 이 경로는 가드나 조건에서 읽을 수 없습니다.

명세: dsl §9.6

입력 파일을 읽었지만 명령에 맞지 않습니다. JSON이나 YAML 형식이 깨졌거나, 문서 종류가 다르거나, 지원하지 않는 버전입니다.

명세: dsl 0.43.0 §4.3

명령이 가리키는 파일이나 디렉터리를 읽거나 쓸 수 없습니다.

명세: dsl 0.43.0 §4.3

명령줄이 잘못되었습니다. 알 수 없는 명령이나 인자, 빠진 필수 인자, 잘못된 값이나 조합입니다.

명세: dsl 0.43.0 §4.3

같은 <track> 안의 두 클립이 겹치는 [at, at+duration) 구간을 가집니다.

명세: dsl §11.4

하나의 <track> 클립이 절대 위치인 at과 상대적 지연인 delay를 동시에 가지고 있습니다. 이 둘은 한 클립에서 함께 쓸 수 없습니다.

명세: dsl §7.5, dsl §11.4

clock: 선언이 잘못되었거나(필드 누락, slots에 없는 last.slot, days: 0, last와 days 동시 지정) 프로젝트가 clock:을 두 번 이상 선언했습니다.

명세: dsl 0.24.0 §1

유한한 클록이 이미 끝난 상태에서 lute play/lute test의 advance: 단계가 실행되었거나, 마지막 위치를 지나서 시작되었습니다. 클록은 이미 마지막 dayEnd를 발생시키고 멈췄으므로 newRun을 플레이하거나 스크립트를 종료해야 합니다.

명세: dsl 0.27.0 §4

/* … */ 블록 주석이 닫는 */ 없이 파일 끝까지 이어졌습니다.

명세: dsl §4.2

::use 호출이 확인되지 않은 채로 컴파일 단계에 도달했습니다. <timeline> 클립 안에서 쓰였거나(허용되지 않음), 해석 가능한 컴포넌트를 지정하지 않았거나, 인자가 컴포넌트의 파라미터와 맞지 않는 경우로, 검사 게이트가 이미 잡았어야 하는 상황입니다.

CEL 슬롯이나 비트 when이 컴파일 시점에 확장되지 못했습니다. 확장 순환, 알 수 없는 def, 또는 인자 개수 불일치가 원인입니다.

컴파일러가 복구할 수 없는 상태에 이르렀습니다. Lute의 버그이므로 이 오류를 일으키는 문서와 함께 보고해 주십시오.

::use 호출의 인자가 지정한 컴포넌트의 선언된 파라미터와 맞지 않습니다. 알 수 없는 인자, 필수 파라미터 누락, 타입이 맞지 않는 값, 호환되지 않는 기본값, 또는 speaker 파라미터에 리터럴 캐스트 id가 아닌 인자가 그 예입니다.

명세: dsl §13, dsl 0.24.0 §3, dsl 0.26.0 §3.3

컴포넌트 본문에 표현(presentational)이 아닌 구문이 있습니다. 상태를 쓰거나 영향을 주는 ::set, <branch>, <hub>, <timeline>, <objective>, <on>, ::assert, ::retract, 또는 effects: true를 선언하지 않고 효과가 있는 내부 컴포넌트를 ::use한 경우입니다.

명세: dsl 0.4.0 §6.2, dsl 0.24.0 §4

::use 호출들의 연쇄가 컴포넌트들 사이의 순환으로 확장됩니다.

명세: dsl §13

서로 다른 두 컴포넌트 파일이 같은 component: 이름을 선언했습니다.

같은 컴포넌트와 인스턴스 키가 하나의 직접 확장 소유자 안에서 두 번 나타납니다.

명세: dsl 0.36.0 §2.3

instance가 비어 있거나 64자를 초과하거나 ASCII가 아닌 토큰을 사용하거나, 하나의 ::use에서 identity 속성으로 두 번 나타납니다.

명세: dsl 0.36.0 §2.3

컴포넌트 파일을 읽거나 해석하거나 깨끗하게 파싱할 수 없습니다. 해석할 수 없는 components: 임포트 경로, 없는 component: 이름, 또는 잘못된 params: 항목이 원인입니다.

컴포넌트 본문이 파라미터를 통하지 않고 주변(ambient) 상태를 직접 읽거나 씁니다. 상태 경로를 참조하는 CEL, 팩트 조회, 또는 상태/브리지 결과 쓰기를 선언하는 지시어가 해당합니다.

명세: dsl 0.4.0 §6.1, dsl 0.4.0 §6.2, dsl 0.24.0 §4

lute tag를 실행한 컴포넌트의 사용처들이 가진 capability snapshot이, 컴포넌트가 호출하는 디렉티브에 text 속성이 있는지에 대해 서로 다릅니다. 한 사용처는 그 속성을 선언한 플러그인을 활성화하고 다른 사용처는 활성화하지 않은 경우입니다. 호출 하나에는 현지화 식별자가 하나뿐이므로 lute tag는 그 호출에 code를 주지 않고 컴포넌트를 그대로 둡니다. 호출 위치에서 보고하고, 두 종류의 사용처를 하나씩 관련 위치로 붙입니다.

명세: dsl 0.51.0 §5.3

::use의 component 속성이 해석된 components: 테이블에 없는 컴포넌트를 지정합니다.

명세: dsl §13

프로젝트의 after 선행조건 그래프에 순환이 있어, 모든 after 조건을 동시에 만족하는 평가 순서가 존재하지 않습니다.

명세: dsl §4.1

두 문서(또는 문서와 파생 키)가 프로젝트의 공유 id 네임스페이스에서 같은 문서 id를 갖습니다.

명세: dsl 0.15.0 §2, dsl 0.19.0 §2.1

after 선행조건 수식의 원자(atom) 개수가 방어적 상한을 초과했습니다. 이는 사람이 직접 작성했다기보다 병적이거나 기계적으로 생성된 수식의 특징입니다.

명세: dsl §4.1

after 선행조건 수식이 제한된 선행조건 프로파일 밖의 구문을 사용합니다. &&/||와 괄호로 결합된 visited(…)/completed(…)/active(…) 원자 외의 것이 해당합니다.

명세: dsl §4.1

after 선행조건 수식의 visited(K)/completed(Q)/active(Q) 원자가 프로젝트 어디에도 존재하지 않는 노드를 가리킵니다.

명세: dsl §2.3, dsl §4.1

씬, 퀘스트, 또는 비트가 도달할 수 없음이 증명됩니다. 어떤 평가 순서로도 해당 after 선행조건을 만족시킬 수 없습니다.

명세: dsl §4.1, dsl §4.2

프로젝트 제약 선언이 잘못되었습니다. 알 수 없는 키/종류, 누락된 필수 필드, 잘못된 노드 참조 또는 중복 ID가 포함되어 있습니다. 0.49.0부터 lute constraints 보고서에서 이 항목은 constraints가 아니라 diagnostics에 들어갑니다.

명세: dsl 0.34.0 §5.1

프로젝트 제약이 위반되었습니다. 진단에는 판정의 증거 수준과 해당하는 경우 제한 범위 및 원인 스팬이 포함됩니다.

명세: dsl 0.34.0 §5.2

콘텐츠 라인의 속성이 필수인 {…} 대신 […]로 작성되었습니다. (::directive{…}와 같은 구분자를 써야 합니다.)

명세: dsl §2.1

@speaker…, ::directive, <tag> 같은 콘텐츠 형태의 줄이 문서의 첫 ## 섹션 제목보다 앞에 나왔습니다. 콘텐츠는 섹션 본문 안에만 있을 수 있습니다.

명세: dsl 0.5.0 §2.1, dsl 0.6.0 §3.3

context 위치 질의의 좌표가 잘못되었거나 소스 파일 범위를 벗어났습니다.

명세: dsl 0.36.0 §3.3, dsl 0.36.0 §8

context 대상 키가 프로젝트 그래프에서 없거나 모호합니다.

명세: dsl 0.36.0 §3.1, dsl 0.36.0 §8

::assert/::retract 페이로드나 facts: 항목, rules: 항의 항이 f(g(x))와 같은 복합/함수 항을 사용했지만, 팩트와 규칙 항은 그라운드 식별자/불리언만 허용합니다.

명세: dsl 0.3.0 §7.1

규칙 본문의 CEL 가드가 holds, count, validAt, now를 통해 팩트 저장소나 서사 시간을 읽었지만, 가드는 이에 의존할 수 없습니다.

명세: dsl 0.3.0 §7.2, dsl 0.3.0 §7.3

facts:/rules: 항목이 인용된 문자열이 아니거나, 인용된 facts:/rules: 문자열이 올바른 그라운드 팩트나 규칙으로 파싱되지 않습니다.

명세: dsl 0.3.0 §4, dsl 0.3.0 §5

규칙의 부정 원자, != 비교, 또는 CEL 가드가 어떤 양의 본문 원자로도 먼저 바인딩되지 않은 변수를 읽어, 규칙을 안전하게 평가할 수 없습니다.

명세: dsl 0.27.0 §3, dsl 0.24.0 §3

규칙의 부정 간선이 술어 의존 그래프에서 순환(p :- not p 포함)을 닫아, 규칙 집합을 계층화할 수 없습니다.

명세: dsl §7.2

defs: 항목이 잘못되었습니다 — CEL 문자열이나 { type?, params?, cel } 매핑이 아니거나, 알 수 없는 키가 있거나, cel:이 없거나, type:이 본문에서 추론할 수도 본문과 일치하지도 않습니다.

명세: dsl 0.21.0 §7b

매니페스트의 defaults: 블록이 닫힌 기본값 가능 프런트매터 집합 밖의 키를 지정했거나, 기본값 가능한 키에 잘못된 형태의 값을 지정했습니다.

명세: dsl 0.10.0 §6.1

콘텐츠 줄이 상호 배타적인 전달 플래그 mono, os, vo 중 둘 이상을 지정했습니다.

명세: dsl 0.2.2 D7

전달 플래그(mono/os/vo)에 값이 지정되었지만, 전달 플래그는 값 없이 단독으로 씁니다.

명세: dsl 0.2.2 D7

narrator 콘텐츠 줄에 전달 속성이 붙었지만, 내레이션은 전달을 갖지 않습니다.

명세: dsl 0.1.0 §12.1

둘 이상 플러그인의 depends 선언이 순환을 이루어, 활성화 순서를 결정할 수 없습니다.

플러그인의 depends가 프로젝트에 설치되지 않은 다른 플러그인 id를 지정했습니다.

플러그인의 depends가 설치된 플러그인을 지정했지만, 그 버전이 선언된 버전 범위를 만족하지 않습니다.

관계가 derive: true로 선언되었지만 동시에 쓰기 tier:도 선언했으나, 파생 관계는 자체 쓰기 tier를 갖지 않습니다.

명세: dsl 0.3.0 §4, dsl 0.3.0 §7.1

rules: 항목의 머리가 derive: true로 선언되지 않은 관계(기본 관계, 예약 관계, 또는 엔티티 종류 이름)를 지정했지만, 파생 관계만 규칙의 머리가 될 수 있습니다.

명세: dsl 0.3.0 §7.1, dsl 0.3.0 §3.1

콘텐츠가 derive: true로 선언된 관계를 assert하거나 retract했지만, 파생 관계는 rules:가 계산하므로 직접 쓸 수 없습니다.

명세: dsl 0.3.0 §5

lute.project.yaml의 diagnostics: 항목이 잘못되었거나 허용되지 않습니다. 매니페스트 진단이며 매니페스트당 한 번 보고하고(CLI 매니페스트 패스와 LSP), 해당 항목은 버려지고 나머지는 로드되지만 매니페스트는 유효하지 않게 됩니다. 원인과 메시지(level·paths 등 항목 모양의 오류에는 메시지 앞에 `<code>`:가 붙습니다): E-* 코드(`E-UNKNOWN-ATTR` is an error: an error is a contract violation and cannot be re-levelled; fix the reported source instead), L-* 코드(`L-…` is a lint rule; set its level in `lute.lint.yaml` `rules:`), 툴체인이 정의하지 않은 코드(`W-STAGE-ABSNT` is not a diagnostic code — did you mean `W-STAGE-ABSENT`?), 잘못된 level(level `silent` is not one of `off`, `info`, `warn`, `error`), 잘못된 paths — [], 문자열이 아닌 값, 절대 경로 또는 .. 세그먼트(`paths` takes project-relative globs, e.g. `scenes/imported/**`). level:이 없는 매핑 항목이나 level/paths 외의 키도 이 코드입니다. 설정 가능한 것은 W-* 코드뿐입니다.

명세: dsl 0.50.0 §6.1

diff 한쪽을 읽거나 안전하게 임시 materialize하거나 완전한 프로젝트 모델로 만들 수 없습니다.

명세: dsl 0.36.0 §4, dsl 0.36.0 §8

한쪽의 완전한 프로젝트 모델을 만들 수 없어 의미론적 diff를 수행할 수 없습니다.

명세: dsl 0.36.0 §4, dsl 0.36.0 §8

매치 대상을 가리키는 $가 <match> 블록 밖에서 사용되었지만, 그 위치에서는 유효하지 않습니다.

명세: dsl §8.2

프로젝트 자체의 enums:/entities: 선언(인라인 또는 uses:/extends:로 도달한 것)이 플러그인이나 코어가 이미 선언한 도메인 이름을 지정했지만, 도메인 이름은 정확히 하나의 출처만 가져야 합니다.

명세: dsl 0.3.0 §3, dsl 0.9.0 D-D

한 이름이 enums: 도메인과 엔티티 종류로 함께 선언되었습니다. 한 문서 안이든, 문서가 합치는 여러 스키마 사이든 같습니다. enum과 엔티티 종류는 도메인 이름공간 하나를 함께 쓰므로, 그 이름이 값의 타입이 되는 곳마다 종류의 멤버가 enum의 멤버를 조용히 대신하게 됩니다.

콘텐츠 줄의 emotion/action 슬롯, 엔티티 속성, 또는 암묵적 anchor 읽기가 어떤 enums:/entities: 선언도 정의하지 않은 도메인을 지정했습니다.

명세: dsl 0.9.0 D-C, dsl 0.9.0 D-D

<branch id> 또는 <hub id>가 같은 에피소드 안에서 다른 브랜치나 허브가 이미 사용한 id를 반복했습니다. 브랜치와 허브 id는 하나의 고유성 영역을 공유합니다.

명세: dsl §11.1, dsl §7.3.2

같은 화자의 콘텐츠 줄 두 개가 동일한 :line code=를 공유했지만, (화자, 코드) 쌍은 고유해야 합니다 — 이는 voiceKey/번역 식별 조인 키입니다. 0.51.0부터는 text 속성이 있는 같은 디렉티브의 호출 두 개가 한 식별 범위에서 code=를 공유하는 경우도 같은 코드입니다. (디렉티브, 코드) 쌍이 그 text 속성들의 현지화 식별자입니다: `::banner` calls at lines N and M share `code="0010"`; a (directive, code) pair is the localization identity of its `text` attributes.

명세: dsl §12, dsl 0.51.0 §5.3

<timeline> 안의 두 <track>이 동일한 트랙 키를 공유했습니다.

평문 텍스트(인라인 수식 마크업을 제거한 텍스트)가 다른 두 줄이 동일한 voiceKey로 컴파일되어, 하나의 녹음이 둘 다를 대신 말하게 됩니다 — 보통 voiceKey 템플릿에 {prefix}가 없어 문서 간에 충돌하기 때문입니다.

명세: dsl 0.37.0 §3.6

엔진 매트릭스와 실행 아티팩트가 허용된 IR 버전 계열 밖에 있습니다.

명세: dsl 0.33.0 §4, dsl 0.33.0 §5

엔진 기능 매트릭스를 읽을 수 없거나 형식이 잘못되었습니다.

명세: dsl 0.33.0 §4

::set이 owner: engine으로 선언된 상태 경로에 썼지만, 그 경로는 엔진이 쓰고 콘텐츠는 읽을 수만 있습니다.

명세: dsl 0.22.0 §1.2

선택한 엔진이 아티팩트에 필요한 의미 기능을 지원하지 않습니다.

명세: dsl 0.33.0 §4

어떤 id가 서로 다른 두 엔티티 종류의 members:에 함께 나열되었지만, 한 종류가 다른 종류의 subsetOf:로 선언되지 않는 한 id는 정확히 하나의 종류에만 속해야 합니다. 두 종류가 id 공간이 다를 뿐 id의 철자({id})만 같다면, 두 공간의 멤버를 모두 나열하는 공유 루트 종류를 선언하고 각각을 그 하위 종류로 만드세요({first}: { subsetOf: <root>, members: […] }). 모든 참조는 여전히 자신의 종류에 대해 검사됩니다(0.49.0).

명세: dsl 0.3.0 §3.1, dsl 0.24.0 §3

엔티티 종류 선언이 잘못되었습니다 — members:/open: 중 어느 것도 또는 둘 다 선언했거나, 알 수 없는 키가 있거나, 멤버를 두 번 이상 나열했거나, labels:/add: 항목이 그 종류에 없는 멤버를 지정하거나 open:/알 수 없는 종류를 대상으로 합니다. YAML 목록은 { members: [...] }로 고쳐 써야 합니다.

명세: dsl 0.3.0 §3.1, dsl 0.26.0 §2.3, dsl 0.27.0 §2, dsl 0.46.0 §2.2

<entry> 속성의 형태가 잘못되었습니다 — 값이 인용된 문자열이 아니거나, id가 없거나 잘못되었거나, 문서 수준 series: 아래에서 series=/order=를 작성했습니다.

명세: dsl 0.19.0 §3, dsl 0.19.0 §2.1

두 <entry> 요소가 같은 id를 공유했지만, 항목 id는 문서 전체(그리고 프로젝트 전체 check에서는 프로젝트 전체)에서 고유해야 합니다.

명세: dsl 0.19.0 §3

두 <entry> 요소가 같은 (series, order) 위치로 귀결되었지만, 한 시리즈의 각 위치는 정확히 하나의 항목만 지정해야 합니다.

명세: dsl 0.19.0 §2.1, dsl 0.19.0 §3

로어 항목의 when 자격 가드가 결코 참이 될 수 없음이 증명되어, 그 항목은 결코 제시될 수 없습니다.

명세: dsl 0.20.0 §5

도메인의 default: 값이 그 도메인 자신이 선언한 멤버 중 하나가 아닙니다.

명세: dsl 0.9.0 D-D

도메인의 exits: 목록이 그 도메인 자신이 선언한 멤버가 아닌 값을 지정했습니다.

명세: dsl 0.9.0 D-D

도메인의 labels: 키가 그 도메인 자신이 선언한 멤버가 아닌 값을 지정했습니다.

명세: dsl 0.24.0 §1

도메인이 default: 또는 exits: 의미를 요구하는 슬롯(예: anchor)을 차지했지만, 그 도메인(또는 이를 대신하는 entities: 종류)이 둘 다 선언하지 않았습니다.

명세: dsl 0.9.0 D-D

musicPlayback 도메인의 stops: 목록이 도메인 자신이 선언한 멤버가 아닌 값을 지정했습니다.

명세: dsl 0.40.0 §2.2

도메인이 default: 또는 exits:를 선언했지만, 그 도메인이 채우는 슬롯에는 그런 의미가 없습니다.

명세: dsl 0.9.0 D-D

extends 기반 엔티티 종류, 관계, 또는 열거형이 자식 스키마에서 members/open 형태가 바뀌거나 기반 멤버가 빠지거나 기반 선언과 다르게 재선언되었지만, 재선언은 합법적인 상위집합 세분화여야 합니다.

명세: dsl 0.3.0 §4.1

가져온 스키마의 상태 경로가 더 깊은 extends 기반이나 씬의 인라인 state:에서 다른 type으로 재선언되었지만, 영속 상태는 안정적인 타입을 유지해야 합니다.

명세: dsl §9.2

규칙 가드, 색인 조회, 또는 콘텐츠 조회가 관계 인자를 닫힌 종류 위를 순회하지 않는 변수와 비교/바인딩하거나, 그 인자의 선언된 도메인과 멤버를 공유하지 않는 종류와 비교/바인딩했습니다.

명세: dsl 0.27.0 §3, dsl 0.3.0 §3.1

::assert{A(x)}가 상호 배타적인 관계의 팩트가 이미 성립하는 인자를 대상으로 했지만, 두 관계는 그 인자들에 대해 배타적으로 선언되어 있습니다.

명세: dsl 0.25.0 §1

팩트 조회 호출(holds, count, countDistinct, validAt)이 0.32에서 요구하는 목록 형식 name('relation', ['arg', …])을 사용하지 않았습니다.

명세: dsl 0.32.0 §2

콘텐츠가 app 등급 기본 관계를 assert하거나 retract했지만, 이는 app.* 스칼라 상태와 마찬가지로 엔진 소유의 읽기 전용입니다.

명세: dsl 0.3.0 §5, dsl 0.3.0 §9.5

flag 속성(<choice once>/exit, <objective optional>, <beat also>)에 true/false가 아닌 값이 지정되었습니다. flag는 값 없이 단독으로 쓰며, 선택지에 쓴 beat/entry의 once 주기(run, user 등)는 거부됩니다.

명세: dsl 0.28.0 §1

포매터가 요청한 파일을 파싱하거나 보존할 수 없습니다.

명세: dsl 0.36.0 §1, dsl 0.36.0 §8

포매터 검사에서 요청한 파일의 비표준 바이트를 발견했습니다.

명세: dsl 0.36.0 §1, dsl 0.36.0 §8

활성 플러그인이 선언한 문서 프런트매터 키의 값이 그 플러그인이 선언한 타입 형태와 일치하지 않습니다.

문서가 해당 맥락에서 그 문서 종류의 문법이 금지하는 구성을 사용했습니다 — 예를 들어 씬 안의 <quest>, 퀘스트 최상위의 <on>/<objective> 이외의 모든 것(퀘스트는 핸들러와 목표 본문만 실행합니다), 퀘스트 어디서든 <hub>/<timeline>, 로어 <entry> 안의 연출/선택지 등입니다.

명세: dsl 0.2.0 §3.3, dsl 0.2.0 §6.7, dsl 0.19.0 §4, dsl 0.52.0 §4

<hub>가 결코 빠져나갈 수 없습니다 — 가드 없는(when 없는) exit 선택지도 없고, 자격 있는 집합이 확실히 비도록 모든 선택지가 once인 것도 아닙니다.

명세: dsl §7.3.2, dsl §11.1.3

프로젝트의 identity.lineId/identity.voiceKey 템플릿이 알 수 없는 {token}을 지정했거나, 빈 문자열로 귀결됩니다. 0.51.0부터는 lineId 템플릿의 리터럴 텍스트에 ~가 있는 경우도 같은 코드입니다. ~는 디렉티브 텍스트 식별자({prefix}~{tag}~{code}~{attr})의 구분자로 예약되어 있습니다.

명세: dsl 0.8.0 §9, dsl 0.51.0 §5.3

본문의 # 제목은 문서 제목이 아닙니다. 값을 프런트매터 title:에 적으세요. 문서 제목은 그것 하나뿐입니다.

명세: dsl 0.37.0 §3.1

줄 텍스트의 {{…}} 마커 바로 앞에 리터럴 {가 홀수 개 연달아 있어, 컴파일된 텍스트에서 마커와 구별되지 않습니다. 또는 줄 텍스트나 레이블의 마커가 리터럴 중괄호에서 열립니다({{{run.a}}: 식이 {로 시작합니다). 또는 일반 {{로 끝나는 ::use 인자가 마커 바로 앞에 끼워져 그 마커를 삼킵니다. 중괄호와 마커 사이에 문자를 하나 넣거나, 각 중괄호를 문자열 상태 경로로 보여 주세요. 인자 안의 리터럴 {{는 \\{{로 씁니다.

명세: dsl 0.52.0 §3.1, dsl 0.53.0 §8

{{@def}} 보간이 하나의 독립된 표현식으로 인라인될 수 없습니다 — 본문에 확장 순환이 있거나, $를 읽거나, 파싱에 실패합니다.

{{…}} 보간이 줄 끝 전에 닫히지 않았습니다.

명세: dsl §7.6

<choice>의 into= 속성이 없거나, run.<path> 문자열 리터럴이 아니거나, 단독 run이나 run.*가 아닌 경로를 지정했습니다.

명세: dsl 0.6.0 §2.2

<choice>의 into="run.<path>"가 run 스키마에 선언되지 않은 경로를 지정했으며, 선언되지 않은 경로는 필드를 암묵적으로 만들 수 없습니다.

명세: dsl 0.6.0 §2.2

<choice>의 into= 런-레코드 축약 표기에서 value 속성이 없거나, bool 경로에 true/false 리터럴이 아니거나, 대상 경로의 선언된 타입과 호환되지 않습니다.

명세: dsl 0.6.0 §2.2

lute run이 받은 실행 IR에 0.37에서 제거되거나 이름이 바뀐 필드(addr, capabilityVersion, recordKey, shots, 평탄화된 wait/duration/delay/at/timeline 스탬프, provenance.injected, 카메라 zoom·cg.full·cg/video/music의 action·music.track·sfx.name 같은 종류별 필드, 선택지 label, monologue 같은 옛 대사 역할 등)가 남아 있거나, position이 없는 명령이 있습니다. 메시지가 0.37의 대체 필드를 알려 줍니다. 현재 툴체인으로 소스를 다시 컴파일하세요.

명세: dsl 0.37.0 §4, dsl 0.37.0 §5.3

max가 없는 ::jump{to}가 문서 순서상 자신보다 앞서거나 같은 위치의 레이블을 가리킵니다. 점프는 max를 지니지 않는 한 앞으로만 갑니다: ::jump{to="again" max="3"}은 최대 3번까지 되돌아갑니다. 선택지를 다시 보여 주려면 <hub>를 쓰세요.

명세: dsl 0.12.0, dsl 0.51.0 §3.1

::jump가 따로 실행되는 본문 — <hub> 선택지 본문이나 <return> 본문, <on>·<objective> 본문, 엔트리, 비트 — 안의 레이블을 그 본문 밖에서 가리킵니다. 점프는 자기 본문 안에 머물거나, <hub> 선택지·<return> 본문을 떠나 그 바깥 본문(허브 뒤)의 레이블로 갑니다. <branch>의 <choice> 본문과 <match> 갈래는 바깥 본문의 일부이고, 씬의 섹션들은 하나의 본문입니다.

명세: dsl 0.52.0 §5.1

루프(::label과 그 뒤에서 그 레이블로 되돌아가는 ::jump{to max}) 밖의 앞으로 가는 ::jump가 루프 안, 머리 레이블보다 뒤의 레이블에 도착합니다. 루프에는 머리 레이블로만 들어갈 수 있습니다. 그 점프가 <choice> 본문 하나의 마지막이고 다른 점프가 그 레이블을 가리키지 않으면, 메시지는 그 블록을 해당 선택지 본문 안으로 옮기라고 제안합니다.

명세: dsl 0.51.0 §3.2, dsl 0.53.0 §9.4

두 루프가 중첩되지 않고 겹칩니다. 뒤 루프의 머리 레이블이 앞 루프 안(머리보다 뒤)에 있는데, 뒤 루프는 앞 루프보다 늦게 끝납니다. 루프는 중첩되거나 서로 떨어져 있어야 합니다. 바깥 루프가 되돌아가기 전에 안쪽 루프를 닫으세요.

명세: dsl 0.51.0 §3.2

max가 있는 ::jump{to max}가 자신이 실행되는 본문 밖의 레이블로 되돌아갑니다. 루프는 <branch>의 <choice> 본문과 <match> 갈래만 지날 수 있고, <hub> 선택지나 <return> 본문, <on>·<objective> 본문, 퀘스트, 엔트리, 비트를 벗어날 수 없습니다. 문서의 ## 섹션들은 하나의 루프 범위입니다.

명세: dsl 0.51.0 §3.2, dsl 0.53.0 §9.2

::jump의 max가 1부터 99까지의 정수 리터럴이 아니거나(루프 한도는 정적이므로 @ref도 거부됩니다), 의미가 없는 앞으로 가는 점프에 붙어 있습니다. 정수가 아닌 값은 E-ATTR-TYPE입니다.

명세: dsl 0.51.0 §3.1

::jump{to}가 문서 내 어떤 ::label도 선언하지 않은 레이블을 가리킵니다.

명세: dsl 0.12.0

루트 문서가 kind: 프런트매터 키를 선언하지 않았고 매니페스트의 defaults:에도 지정된 것이 없어 문서의 kind를 확정할 수 없습니다.

명세: dsl 0.2.0 §3.1, dsl 0.19.0 §2, dsl 0.10.0 §6.3

entities: 블록에서 같은 엔티티 kind 이름을 두 번 선언했거나, 두 스키마가 한 kind를 다르게 선언했거나, 한 이름이 엔티티 kind이자 관계로 동시에 선언되었습니다.

명세: dsl 0.3.0 §4

번역문(대사, 선택지 레이블, 프롬프트, 지시어 text 속성)이 원문의 {{…}} 마커를 그대로 보여 주지 않습니다. 마커를 파싱할 수 없거나(리터럴 중괄호에서 열린 마커 {{{run.a}}. lute loc import에서는 }}로 닫히지 않은 대사의 {{도 해당하며, compile은 이를 E-L10N-MODIFIERS로 보고합니다), 마커가 원문과 다릅니다(원문의 각 마커를 같은 횟수만큼, 순서는 자유. 마커 양 끝의 공백은 세지 않지만 안쪽의 공백이나 형식 힌트는 마커의 일부입니다). 런타임은 이런 마커를 쓴 그대로 보여 주므로 해당 번역문을 병합하지 않습니다. lute loc import는 파싱할 수 없는 마커를 거부합니다.

명세: dsl 0.53.0 §8.1

대사 번역문의 인라인 수식(이름, 스팬/리프 형태, 속성)이 원문 줄과 다르거나 마크업을 파싱할 수 없어, 해당 번역문을 병합하지 않습니다.

명세: dsl 0.37.0 §6

레이블 이름(::label{name})이 문서 내 어딘가에서 두 번 이상 선언되었습니다 — 모든 레이블은 문서 전체에서 하나의 네임스페이스를 공유합니다.

명세: dsl 0.12.0

콘텐츠 줄이 @로 대체된 예전 : 화자 기호를 사용합니다 — @speaker{…}: text 형식으로 쓰십시오.

명세: dsl §7.1

콘텐츠 줄이나 text 속성이 있는 디렉티브의 code=에 ~가 있습니다. ~는 디렉티브 텍스트 식별자({prefix}~{tag}~{code}~{attr})의 구분자입니다: `code="a~1"` contains `~`, which is reserved for directive text identities. lute tag는 이런 코드를 쓰지 않습니다.

명세: dsl 0.51.0 §5.3

프로젝트의 현지화 단위(줄, 선택지와 허브 옵션, 프롬프트, 디렉티브 텍스트) 두 개가 같은 최종 lineId로 컴파일되었습니다. 나중 단위에서 보고하고 처음 단위를 관련 위치로 붙입니다: lineId `intro.mira_0010` of this line is also the lineId of the line at scenes/intro2.lute:8 — a lineId keys one translation. {prefix}가 없는 lineId 템플릿이 문서 사이에서 만들 수 있습니다. lineId 하나는 번역 하나의 키이므로 lute loc import와 --locale-bundle이 둘을 구별할 수 없습니다. 프로젝트 전체 check와 compile --project에서 보고합니다.

명세: dsl 0.51.0 §5.3

lute.lint.yaml가 잘못되었습니다 — 타입이 틀렸거나 알 수 없는 최상위 키, 잘못된 규칙 오버라이드, 또는 코어 규칙 id와 충돌하는 커스텀 규칙 id입니다. 0.49.0부터는 options.providers의 asset-exists 키가 셀렉터 형태(<tag>, <tag>.<attr>, @<attr>) 중 어느 것도 아닌 경우도 포함합니다. 0.50.0부터 rules:의 id가 checker 코드이면 “알 수 없는 규칙 id” 대신 올바른 위치를 알려 줍니다: `W-STAGE-ABSENT` is a checker code, not a lint rule — set its level in `lute.project.yaml` `diagnostics:`. E-* id는 … an error cannot be re-levelled로 끝납니다.

0.51.0부터 커스텀 규칙의 키가 대상에 맞지 않는 경우 — target: pair의 when, open이나 close가 없는 pair 규칙, 다른 대상의 open·close·inside·scope — 도 이 코드입니다: bad custom rule: rule `g`: `when` is refused on `target: pair`, which states `open` and `close` instead.

명세: dsl 0.49.0 §7.3, dsl 0.50.0 §6.4, dsl 0.51.0 §6.1

린트 규칙의 술어 — when, 또는 pair 규칙의 open·close·inside(메시지에 이름이 나옵니다) — 를 파싱하거나 해석할 수 없거나 타입이 잘못되어, 해당 규칙이 이 문서에서 건너뛰어집니다.

명세: dsl 0.51.0 §6.1

플러그인 또는 커스텀 린트 규칙 선언이 잘못되었습니다(예: 코어 규칙의 id를 재사용).

lute compile --locale-bundle가 로케일 임포트 파일을 병합하지 못했습니다 — 구문 오류, locale이 비어 있는 행, 또는 같은 로케일에 대한 중복된 lineId입니다.

로직 블록에 허용되지 않는 자식이 있거나(<branch>와 <hub>는 <choice>만, <match>는 <when>과 <otherwise>만 받습니다), <choice>·<when>·<otherwise>·<track>·<reward>가 속해야 할 블록 밖에 있거나, <reward>가 자체 종료 형식이 아닙니다.

명세: dsl §7.3, dsl §7.3.2, dsl 0.16.0 §2

디렉티브의 선언적 lower: { record, fields } 매핑이 해당 레코드에 없는 대상 필드를 지정했거나, 쓸 수 없는 필드에 매핑했습니다.

디렉티브의 lower: { record: … }가 선언적 로워링이 지원하는 스테이징 레코드 종류의 닫힌 집합 밖의 값을 지정했습니다.

lute.project.yaml를 매니페스트로 읽을 수 없습니다. 파싱되지 않거나, 매핑이 아니거나, defaultProfile:이 없거나, 값의 모양이 틀렸습니다.

명세: dsl 0.28.0 §1

lute.project.yaml에 정의되지 않은 키가 있습니다(최상위, 프로필, identity:). 또는 다른 층이 소유한 키입니다(terminal: 같은 스키마 키, defaults: 아래에 써야 할 문서 키).

명세: dsl 0.28.0 §1

<match>에 <otherwise> 분기가 두 개 이상 있지만, 최대 하나만 허용됩니다.

명세: dsl §11.2

subject=가 없는 <match>에 <when is=…> 분기가 있어서, 그 리터럴을 비교할 주어가 없습니다. <match>에 subject=를 쓰거나, 분기를 test=로 쓰세요.

<match subject> 주어가 직접, 또는 확장되는 @def를 통해 holds/count/validAt 같은 사실 질의가 되었는데, match 주어로는 허용되지 않습니다.

명세: dsl 0.27.0 §2, dsl 0.3.0 §8

상태 경로가 아직 설정되지 않았을 수 있는 지점에서 읽혔습니다 — 기본값도, 지배하는 ::set도, 이를 증명하는 가드도 없습니다.

명세: dsl §9.4

문서의 id: 프런트매터 값이 점으로 이은 id가 아닙니다. id는 이름(글자, 숫자, _, -로 이루어지고 -로 시작하지 않는 이름)을 .으로 이은 것입니다.

명세: dsl 0.30.0 §1

장면 정체성을 선언해야 하는 문서에 필수 프런트매터 키(예: character/season/episode 또는 id:)가 없습니다.

명세: dsl 0.15.0 §2, dsl 0.15.0 §4

문서의 프런트매터가 올바른 YAML이 아니거나, YAML로 파싱되더라도 매핑 형태가 아닙니다.

문서가 코어 키도 아니고 활성 플러그인이 소유하지도 않은 최상위 메타 키를 선언했거나, 다른 문서 kind 전용으로 예약된 키를 선언했습니다.

프런트매터 값의 형태가 잘못되었습니다 — 잘못된 extra: 매핑이나 키, 이름이 아닌 series:, 잘못된 cast:/enums:/terminal: 항목(terminal: 긴 형식에서 when/persists 외의 키, 또는 true/false가 아닌 persists), run 상태만 읽는 terminal:에 쓴 persists: true(그 결말은 run을 넘어 남을 수 없음), 또는 잘못된 effects: 플래그입니다.

명세: dsl 0.15.0 §3, dsl 0.19.0 §2.1, dsl 0.23.0 §7, dsl 0.29.0 §5

디렉티브에 선언된 스키마가 요구하는 속성이 빠져 있습니다. 0.50.0부터는 required: true인 플러그인 스탬프(on:이 있는 항목만 가능)가 그 표면에 작성되지 않은 경우도 해당하며, 디렉티브와 콘텐츠 줄은 그 머리 span에서, <branch>/<hub>/<choice>는 요소 전체 span(E-DUP-BRANCH와 같은 span)에서 보고합니다. 컴포넌트 본문에서도 적용되고, ::use로 삽입되는 줄은 컴포넌트에서 한 번만 검사합니다. 선언된 default:는 보지 않습니다(스탬프는 주입되지 않습니다). 메시지: `::bg` requires attribute `assetName` (a stamp of `acme.stage`), this content line requires attribute `voiceAssetId` (a stamp of `acme.stage` for content lines), `<choice id="goLeft">` requires attribute `optionKey` (a stamp of `acme.stage`).

0.52.0부터 <reward>가 보상 종류에 required: true로 선언된 속성을 쓰지 않은 경우도 이 코드이며, <reward> 요소에서 보고합니다. 선언된 default:는 required를 채우지 않습니다: `<reward kind="SEALED">` requires attribute `seal`.

명세: dsl 0.50.0 §3.4, dsl 0.52.0 §7.2

--mock/mocks/*.yaml 항목이 file:을 선언하지 않았거나, 존재하지 않거나 .lute 문서가 아닌 file: 경로를 지정했거나, 명령줄에 지정된 문서와 일치하지 않습니다.

명세: dsl 0.10.0 §8

{mono} 줄이 있는 문서에서 시점이 정해지지 않았고(프런트매터 pov:도, 프로젝트 defaults.pov도 없습니다) 화자도 monoSpeakers:에 없습니다. 컴포넌트의 줄은 ::use 지점마다 호출한 문서의 맥락으로 판정합니다.

명세: dsl 0.37.0 §3.4

{mono} 줄의 화자가 문서의 실제 시점(pov:, 없으면 프로젝트의 defaults.pov)도 아니고 monoSpeakers: 목록에도 없습니다. 컴포넌트의 줄은 ::use 지점마다 호출한 문서의 맥락으로 판정합니다.

명세: dsl 0.37.0 §3.4

<match>에 <otherwise>가 없고 주어의 도메인이 <when> 분기들로 완전히 덮이지 않았습니다 — 메시지에 빠진 값이나 처음 덮이지 않은 구간이 표시됩니다.

명세: dsl 0.18.0 §4, dsl §11.2

하나의 <quest>에 속한 두 개의 필수 <objective>가 같은 상태 경로에 대해 서로 동시에 참일 수 없는 done 조건을 선언했습니다.

명세: dsl 0.10.0 §5.2

같은 <quest> 안에서 <objective id>가 두 번 이상 선언되었습니다.

<quest> 안의 <objective>에 id가 없습니다.

<objective>의 done 완료 조건이 비어 있고 완료를 위임할 quest= 참조도 없습니다.

<objective>가 quest= 하위 퀘스트 참조와 비어 있지 않은 done= 조건을 동시에 가지고 있는데, 이 둘은 함께 쓸 수 없습니다.

<objective title>에 {{가 있습니다(이스케이프 여부와 상관없이). 퀘스트 UI는 제목을 쓰인 그대로 보여주므로 제목에는 {{…}}를 쓸 수 없습니다. 제목은 평문으로 쓰고, 바뀌는 값은 대사로 보여주세요.

명세: dsl 0.52.0 §6.7

필수 <objective>의 done 조건이 결코 참이 될 수 없거나, <objective quest="…">가 참조하는 하위 퀘스트 자체가 도달 불가능합니다.

명세: dsl 0.4.0 §5.3

lute play 단계가 raisedWhen 게이트가 거짓인 상태에서, 또는 스키마의 terminal: 조건이 이미 참인 상태에서 occasion을 발생시키려 했습니다 — 엔진은 실제로는 이를 발생시키지 않습니다.

명세: dsl 0.27.0 §4

비트 또는 엔트리의 on=이 어떤 리졸브된 플러그인도 선언하지 않은 occasion을 가리킵니다.

명세: dsl 0.21.0 §2

<on>에 event 속성이 없습니다 — 모든 <on>은 하나의 명확한 이벤트에 연결되어야 합니다.

명세: dsl 0.2.0 §4.1

스테이징된 패치가 새로운 검사 또는 프로젝트 오류를 도입했습니다.

명세: dsl 0.36.0 §5.2, dsl 0.36.0 §8

패치 편집이 잘못되었거나 대상 밖에 있거나 다른 편집과 겹치거나 escape-hatch 스팬 검사를 통과하지 못했습니다.

명세: dsl 0.36.0 §5.1, dsl 0.36.0 §5.2, dsl 0.36.0 §8

패치가 영역 포맷을 거친 .lute 파일을 정규 형식이 아닌 상태로 남기게 됩니다. lute fmt --check를 통과하던 파일이 통과하지 못하게 되거나, 건드린 줄을 다시 포맷하면 바뀝니다. 아무것도 쓰지 않으며, 메시지가 파일 이름을 알려 줍니다.

명세: dsl 0.47.0 §5.1

패치가 요청된 보존 조건을 위반했습니다. 모호한 보상 또는 컴포넌트 일치도 포함됩니다.

명세: dsl 0.36.0 §5.3, dsl 0.36.0 §8

패치의 기준 프로젝트 또는 지정 파일 리비전이 현재 리비전과 다릅니다.

명세: dsl 0.36.0 §5.2, dsl 0.36.0 §8

패치 대상이 없거나 모호하거나 편집 가능한 소스 앵커가 없습니다.

명세: dsl 0.36.0 §5.1, dsl 0.36.0 §8

이름에 이름 규칙(글자, 숫자, _, -로 이루어지고 -로 시작하지 않음) 밖의 문자가 있습니다: 상태 경로 세그먼트, quest·objective·entry·branch·hub·choice·mark id, relation·enum·엔티티 종류 이름, enum·엔티티 멤버. def와 def 파라미터는 @name이나 def 본문에서 그대로 읽히므로 식별자(글자나 _로 시작하고 글자, 숫자, _로 이어지는 이름)여야 합니다. 또는 조건식에서 식별자가 아닌 이름을 . 뒤에 썼습니다(quest.zero-coke-001.state). CEL은 이를 뺄셈으로 읽으므로, 메시지가 대괄호 표기(quest["zero-coke-001"].state)를 알려 줍니다.

엔티티·enum 멤버의 경우 0.49부터 메시지가 한 가지를 더 안내합니다. 이름이 아닌 다른 시스템의 id(vendor:reply)를 검증하려면 provider(plugins/<id>/providers/, catalogDir의 고정 스냅숏)를 선언하고 속성 타입을 { providerRef: <provider> }로 지정하세요.

명세: dsl 0.30.0 §1, dsl 0.30.0 §2, dsl §8.4

디렉티브가 유효한 bridges 권한 상한이 금지하는 브리지 서비스/오퍼레이션을 호출합니다.

::set/::assert/::retract 또는 플러그인 디렉티브가 유효한 directives 권한 상한에 의해 금지됩니다.

사실 쓰기(::assert/::retract, 플러그인 효과, 또는 시드 팩트)가 유효한 factWrites 권한 상한이 금지하는 관계를 대상으로 합니다.

--permission-profile <name>가 --project <DIR>로 로드된 lute.project.yaml 없이 지정되어 프로파일을 확인할 수 없습니다.

유효한 quests 권한 상한이 퀘스트 선언을 금지하는 곳에서 <quest>가 선언되었습니다.

유효한 rewards 권한 상한이 보상 선언을 금지하는 곳에서 <reward>가 선언되었습니다.

::set, choice의 into=, 상태/플러그인 기본값 초기화, 또는 확정할 수 없는 플러그인 쓰기 경로가 유효한 stateWrites 권한 상한이 금지하는 경로를 대상으로 합니다.

디렉티브가 제거된 persist 속성을 사용합니다 — into=만으로 run 팩트가 기록됩니다.

명세: dsl 0.6.0 §2.2

플러그인의 assetKinds export가 세그먼트 위치에서 허용되는 타입(enum, int, double, string, providerRef) 밖의 세그먼트 타입을 선언했습니다.

두 개의 활성 플러그인이 같은 디렉티브, 이벤트, 보상 종류, occasion, cast id, 또는 브리지 오퍼레이션을 선언했습니다. 먼저 선언한 플러그인의 것을 씁니다. 0.50.0부터는 두 플러그인의 같은 이름 stampAttrs 항목의 표면(on:)이 겹치는 경우(두 플러그인과 공유 표면을 알려 줍니다, 표면이 서로소이면 허용), 그리고 다른 플러그인(또는 lute.core)이 이미 선언한 호스트 토큰을 다시 선언한 경우도 해당합니다.

명세: dsl 0.50.0 §3.2, dsl 0.50.0 §4.1

플러그인 패키지가 하나의 익스포트 종류 안에서 같은 id를 두 번 이상 선언했습니다. 먼저 선언한 것을 쓰고, 프로젝트의 나머지 검사는 계속합니다. 0.50.0부터는 한 패키지 안에서 같은 이름의 stampAttrs 항목 둘의 on: 표면이 겹치는 경우도 같은 코드입니다(on:이 없는 항목은 모든 항목과 겹칩니다). 메시지가 공유 표면을 알려 줍니다: stampAttr `assetName` is declared twice on the surface `bg` — give each entry disjoint `on:` surfaces. 두 항목 모두 on:이 있고 표면이 서로소이면 한 이름을 다른 타입으로 선언할 수 있습니다.

명세: dsl 0.50.0 §3.2

플러그인 디렉티브 선언이 닫힌 어휘 밖의 semantics: 플래그를 사용했거나, 같은 속성 이름을 두 번 이상 선언했거나, 속성의 type에 속하지 않는 값을 default:로 선언했습니다(double 속성의 정수 기본값은 허용됩니다). 또한 속성 값은 스칼라 하나로 쓰므로(문자열, 숫자, bool, enum 또는 엔티티 멤버, provider 또는 asset id) 최상위 타입이 list, map, record인 디렉티브 속성이나 stampAttrs 항목은 어떤 .lute 값으로도 만족할 수 없어 플러그인 로드 시 거부됩니다. 0.51.0부터 메시지는 구조화된 값이 아직 지원되지 않는다고 말하고, 맞는 경우 스칼라로 나누는 방법을 알려 줍니다: 필드마다 속성 하나(스탬프는 on:으로 표면을 정할 수 있음), 여러 언어로 보이는 텍스트는 text 속성, 선택지 목록은 <choice> 요소. 스탬프의 메시지에는 text 안내가 없습니다(스탬프는 text일 수 없습니다). text 타입 stampAttrs 항목도 이 코드입니다. 0.51.0부터는 lower:가 스테이징 레코드를 만들거나 builtin 훅을 실행하는 디렉티브가 effects.raises를 선언한 경우도 이 코드입니다. 그런 lowering은 효과를 호스트에 전달하지 못하므로(plugin 레코드만 전달합니다) 그 raise는 버려집니다: lower:를 지워 호출이 plugin 레코드로 남게 하거나, passthrough 디렉티브에서 occasion을 raise하세요.

명세: dsl 0.49.0 §3.2, dsl 0.51.0 §4.2, dsl 0.51.0 §5.1, dsl 0.51.0 §7

플러그인 익스포트 파일이나 디렉터리를 입출력 또는 인코딩 오류로 읽을 수 없습니다.

플러그인의 plugin.yaml이나 export 파일에 그 파일이 받지 않는 키가 있습니다(의도한 키를 함께 알려 줍니다. 예: dependencies → depends). 또는 plugin.yaml의 kind:가 capability가 아닙니다. 0.50.0부터 보상 kind의 effects.writes도 이 코드이며, 메시지에 — a reward's state write is `credits:`가 덧붙습니다. 디렉티브 속성에 on:을 쓰는 경우도 계속 이 코드입니다.

명세: dsl 0.28.0 §1, dsl 0.50.0 §5.1

플러그인 패키지의 plugin.yaml 매니페스트가 없거나, 올바른 YAML이 아니거나, id/version/kind/exports 중 하나를 적지 않았습니다.

프로필이 활성화한 플러그인 id가 plugins 디렉터리에 설치되어 있지 않거나, 해당 패키지 로드에 실패했습니다.

명세: dsl §11

플러그인 매니페스트의 exports: 항목이 디스크에 존재하지 않는 경로를 가리킵니다.

명세: dsl §4, dsl §11

플러그인 활성화 시 지정한 옵션 값이 매니페스트가 해당 옵션에 선언한 타입과 일치하지 않습니다.

명세: plugin Appendix C1

플러그인 활성화가 해당 플러그인 매니페스트에 없는 옵션 이름을 설정했습니다.

명세: plugin Appendix C1

플러그인 export 파일이 올바른 YAML이 아니거나 키의 값 모양이 틀렸습니다(줄과 그 키가 받는 모양을 알려 줍니다). 또는 디렉티브의 effects.writes/effects.asserts/effects.retracts 항목이 해당 디렉티브가 선언하지 않은 속성을 가리킵니다(또는 assert가 _를 사용합니다). 0.50.0부터는 다음 원인도 같은 코드입니다. stampAttrs 항목: on:이 문자열 목록이 아니거나 비어 있음(stamp attribute `X` has an empty `on:` — list the surfaces it applies to, or omit `on:` for every directive and content line), on:에 같은 표면이 두 번 나옴(stamp attribute `X` lists `bg` twice in `on:`), on: 없는 required: true(stamp attribute `X` is `required: true` but has no `on:`; a stamp required on every record is not a column — name its surfaces with `on: […]`). 호스트 토큰: 허용되지 않는 타입이나 키, 식별자가 아닌 토큰 이름(host token `player-name` is not an identifier (letters, digits and `_`, not starting with a digit)). 보상 kind effects: 빈 effects: {}(“declares no effect”), @target 외의 @name 인자(reward kind `BADGE` effect `met(@rarity)` reads `@rarity`; a reward kind's effects read only `@target` (a `<reward>` takes no other attribute)), 인자가 @target 또는 리터럴 quest id(식별자)가 아닌 accepts 항목, target: { forbidden: true }인데 @target을 읽는 효과. 0.51.0부터는 effects.raises 목록이 비어 있거나, 항목이 occasion과 선택적 target의 매핑이 아니거나, target이 @<attr>도 점으로 이은 대상도 아니거나, 디렉티브에서 @<attr>이 그 디렉티브의 속성을 가리키지 않거나, 보상 종류의 raise가 @target 이외의 @attr을 대상으로 하거나(target: { forbidden: true }인 종류의 @target raise 포함), occasion의 raisedBy가 declared가 아닌 경우도 같은 코드입니다. 보상 종류의 “declares no effect” 메시지는 raises:도 나열합니다.

0.51.0부터 type: text가 디렉티브 속성이 아닌 곳(플러그인 옵션, occasion payload, 보상 종류 속성, bridge 결과, state shape, 중첩된 { list: text })에 있거나, 디렉티브의 text 속성이 lower: 또는 bridge:가 있는 디렉티브에 있거나(현지화된 텍스트가 호스트에 닿지 않음), default:를 선언했거나(기본값에는 번역이 없음), code라는 선언된 속성 옆에 있는 경우(code는 text 속성이 있는 디렉티브의 식별 속성)도 이 코드입니다: `title` of `::banner` is `text`, but `::banner` lowers to the `actor` record, which carries no localized text — declare it `string`, or drop `lower:` so the call stays a `plugin` record.

0.51.0부터 lints/ 규칙의 키가 대상에 맞지 않는 경우(target: pair의 when, open이나 close가 없는 pair 규칙, 다른 대상의 open·close·inside·scope)도 이 코드입니다.

0.52.0부터 보상 종류의 attrs: 항목이 디렉티브 속성 선언 규칙을 어기면 이 코드이며, 그 항목의 줄에서 보고합니다: <reward>가 이미 가진 이름(id, kind, target, amount, when, outcome, reward kind `BADGE` declares attribute `amount`, which `<reward>` already has (…) — give it another name), 같은 이름의 반복(… declares attribute `rarity` more than once — keep one declaration), 선언한 타입이 아닌 default:(… declares attribute `rarity` as `string` with `default: 3`, which is not of type `string` — give a default of the declared type), list·map·record 타입. 또한 보상 종류의 effects는 이제 종류가 선언한 속성도 @<attr>로 읽으므로, 위의 @target 외 @attr 원인은 @target도 선언된 속성도 아닌 경우에만 해당하고 메시지가 바뀌었습니다: reward kind `BADGE` effect `badge(@rarty)` reads `@rarty`, but the kind declares no such attribute (declared: target, rarity); did you mean `@rarity`?(raise 대상도 같은 문장).

명세: dsl 0.27.0 §2, dsl 0.27.0 §4, dsl 0.28.0 §7, dsl 0.50.0 §3.2, dsl 0.50.0 §4.1, dsl 0.50.0 §5.1, dsl 0.51.0 §4.1, dsl 0.51.0 §4.2, dsl 0.51.0 §5.1, dsl 0.51.0 §6.1, dsl 0.52.0 §7.1, dsl 0.52.0 §7.3

디렉티브나 보상 종류의 effects.raises 항목이 활성 플러그인 어디에도 선언되지 않은 occasion을 가리키거나(비슷한 이름을 제안하거나, 설치되었지만 비활성인 플러그인이면 depends:에 선언하라고 알려 줍니다), 대상 없이 raise되는 occasion에 target을 주거나 대상과 함께 raise되는 occasion에 target을 빠뜨렸거나, 도메인 occasion의 @attr 대상의 타입이 { entity: <도메인의 종류> }가 아니거나(보상 종류에서는 target: 계약이 그렇지 않은 경우), 리터럴 대상이 occasion의 <prefix>.<member> 모양이나 members: 밖에 있습니다. 모든 활성 플러그인의 occasion을 아는 플러그인 조립 단계에서 판정합니다. 해당 항목은 버려지고 나머지 항목은 그대로 들어갑니다.

명세: dsl 0.51.0 §4.2

플러그인이 코어 언어가 가진 이름을 선언했습니다. 코어 문장(set, assert, retract, accept, use, body, cut), 코어 블록 태그(scene, on, quest, objective, match, branch, hub, choice, when, otherwise, entry, beat, timeline, track, reward, return), lute.core 디렉티브(end, mark, bg …)와 같은 이름의 디렉티브, 엔진 lifecycle 이벤트(questComplete …)나 play 스텝 키와 같은 이름의 이벤트·occasion, cast id narrator가 여기에 해당합니다. 0.50.0부터는 상태 루트나 CEL 리터럴(scene, run, user, app, quest, entry, prev, clock, occasion, season, true, false, null)과 같은 이름의 호스트 토큰(hostTokens)도 해당하며, 메시지가 이유를 알려 줍니다: `{{run}}` would read as a state root. 선언한 파일과 줄을 가리킵니다.

예약된 이름 전체와 각 이름을 거부하는 자리, 대신 쓸 이름: 예약된 이름.

명세: dsl §10, dsl 0.28.0 §1, dsl 0.50.0 §4.1

코어가 아닌 플러그인의 stampAttrs export 또는 디렉티브의 attrs가 코어 stamp가 이미 소유한 속성 이름(at/duration/delay/wait/timeline/provenance/source)을 선언했습니다. 0.50.0부터는 범위가 정해진 스탬프(on:)가 그 표면 자신의 속성과 같은 이름이라 읽을 수 없게 되는 경우도 같은 코드입니다: stamp attribute `prompt` (`acme.stage`) is scoped to `branch`, but `prompt` is an attribute of `<branch>` itself, so the stamp could never be read. 표면 자신의 속성은 디렉티브의 선언된 attrs(::jump은 when도, 0.51.0부터 text 속성이 있는 디렉티브는 code도), line의 알려진 속성과 가드 when, branch의 id/prompt/timeout/default, hub의 id/prompt, choice의 id/text/when/into/value/once/exit(그리고 이름이 바뀌거나 제거된 label/as/persist)입니다. 범위 없는(교차) 항목은 이 규칙을 받지 않으며 표면 자신의 선언이 우선합니다.

명세: plugin §14, dsl 0.50.0 §3.2, dsl 0.51.0 §5.1

플러그인 stampAttrs 항목의 on:이 스탬프를 실을 수 있는 표면이 아닌 이름을 지정했습니다. 스탬프 가능한 표면은 line, branch, hub, choice, 그리고 해결된 프로필의 디렉티브 중 스탬프를 실을 레코드가 있는 것입니다. 항목은 버려지고 나머지 항목은 그대로 적용됩니다. 메시지: stamp attribute `assetName` (`acme.stage`) names `bgg` in `on:`, which is not `line`, `branch`, `hub`, `choice` or a directive of the resolved profile — did you mean `bg`?. 스탬프 레코드가 없는 디렉티브를 지정해도 같은 코드입니다: … names `jump` in `on:`, but `::jump` emits no stamped record (0.49.0 §4.1)(jump, label, clear). 다른 플러그인의 디렉티브로 스탬프 범위를 정하려면 그 플러그인을 depends:에 선언해 그 디렉티브가 모든 활성 프로필에 들어가게 해야 합니다. 태그가 설치되어 있지만 비활성인 플러그인에 있으면 메시지가 그렇게 알려 줍니다.

명세: dsl 0.50.0 §3.2

디렉티브가 활성 플러그인 어디에도 선언되지 않은 asset kind에 속성을 바인딩했습니다.

명세: plugin §7

플러그인 매니페스트의 exports: 키가 export 종류가 아닙니다(did-you-mean을 붙입니다). 예전 철자 rewardkinds/assetkinds/stampattrs에는 새 이름 rewardKinds/assetKinds/stampAttrs를 알려 줍니다.

명세: plugin §4, dsl 0.28.0 §6

rewardKinds: 항목이 활성 플러그인 어디에도 선언되지 않은 provider를 target: { provider: <name> }로 지정했습니다.

명세: dsl 0.16.0 §4

{{n:plural(…)}} 힌트의 형태가 |로 구분된 따옴표 없는 단수형과 복수형이 아닙니다. 따옴표로 감싼 형태, , 구분자, 빠지거나 빈 형태가 여기에 해당합니다.

명세: dsl 0.27.0 §7, dsl 0.28.0 §5

프로필의 extends 체인이 자기 자신으로 순환합니다.

명세: dsl §11

프로젝트가 lute.project.yaml에 선언되지 않은 프로필 이름을 선택했습니다.

명세: dsl §11

편집기가 문서의 lute.project.yaml을 로드하지 못했습니다(프로젝트 매니페스트가 잘못되었거나 읽을 수 없습니다).

<quest id=…>가 이 문서 안, import 그래프, 또는 프로젝트 전체에서 이미 사용된 id를 반복합니다.

명세: dsl 0.2.0 §6.3

<quest>에 id 속성이 없습니다.

명세: dsl 0.2.0 §6.3

서브퀘스트가 서로 다른 두 부모 퀘스트의 <objective quest=…>에서 자식으로 참조되었지만, 퀘스트는 부모를 하나만 가질 수 있습니다.

<objective quest=…>가 프로젝트의 어떤 퀘스트도 정의하지 않은 자식 퀘스트 id를 가리킵니다.

state: 선언 경로가 암묵적으로 선언된 예약 퀘스트 필드(quest.<id>.* / objectives.<oid>.done)와 충돌합니다.

명세: dsl 0.2.0 §5.2

::set가 엔진이 채우는 예약 경로(quest.<id>.state, objectives.<oid>.done, entry.* 경로, prev.run.*, prev.season.*, clock.*)에 값을 씁니다.

명세: dsl 0.2.0 §5.4, dsl 0.19.0 §5

퀘스트의 start가 영영 성립할 수 없습니다(0.49.0). 퀘스트의 start 조건과 스크립트 안의 수락(::accept, 보상 종류의 accepts)이 서로를 기다리고 순환 밖의 어떤 소스도 그중 하나를 시작시키지 않아, 앵커 엣지의 순환 위에서 교착됩니다(0.53.0부터 수락 앵커도 포함). 강연결 집합마다 하나씩 가장 작은 퀘스트의 start에서, start가 없으면(수락으로 시작하는 퀘스트) 그 id에서 보고하며, 경로는 엣지 종류와 함께 기다리는 순서로 표시합니다: quest start cycle: quest(intro) -[start]-> quest(letter) -[accept]-> quest(intro) — each waits for the next (a `start` for its condition, an accept for the `::accept` or reward that grants it) and no source outside the cycle starts any of them; start one of them from something outside the cycle, or let the host grant one with `accept="external"` . 순환 밖의 무언가에서 하나를 시작시키거나 호스트가 accept="external"로 그중 하나를 부여하게 하세요. 외부에서 진입할 수 있는 순환은 오류가 아닙니다.

명세: dsl 0.49.0 §6.1, dsl 0.53.0 §7.3

퀘스트가 자신의 start에서 자기 상태(quest.<own id>.*)를 읽습니다(0.49.0). 퀘스트가 시작되기 전에는 그 상태에 값이 없으므로 이 조건으로는 퀘스트를 의도대로 시작할 수 없습니다. 호스트만 부여하는 퀘스트는 start 없이 accept="external"로 쓰고, 호스트가 다른 장면이나 퀘스트가 끝난 뒤에만 부여한다면 그 조건을 follows="…"로 씁니다(호스트 정책: Lute는 이를 호스트에 전달하고 분석이 읽지만 강제하지는 않습니다). 자기 읽기만으로 인한 교착은 E-QUEST-START-CYCLE이 아니라 이 코드로 보고합니다.

명세: dsl 0.49.0 §6.2, dsl 0.53.0 §7.4

서브퀘스트의 실효 tier가 부모 퀘스트의 tier와 다릅니다.

명세: dsl 0.23.0 §6

<objective quest=…>가 만드는 부모-자식 관계가 순환을 이루며, 퀘스트가 자기 자신을 자식으로 지정하는 경우도 포함됩니다.

<quest>의 start 조건이 항상 거짓으로 결정되거나 fail 조건이 항상 참으로 결정되어, 해당 퀘스트가 결코 완료될 수 없음이 증명됩니다.

명세: dsl 0.4.0 §5.3

선언된 raise의 확정된 대상 — 호출의 속성 값(@def는 상수로 접힙니다)이나 선언된 default:, 보상의 target=, 또는 리터럴 — 이 occasion의 members: 밖에 있거나(리터럴은 엔티티 종류 밖), 그 대상으로 occasion에 응답하는 장면이나 비트가 없습니다(비슷한 대상을 제안합니다). occasion.target을 읽는 대상은 런타임이 묶으므로 판정하지 않고, 값도 default:도 없는 속성은 아무것도 raise하지 않습니다. 컴포넌트 본문 안의 호출은 각 ::use에서 판정합니다. 프로젝트 전체 check에서만 보고합니다.

명세: dsl 0.51.0 §4.3

def를 호출하는 @name(args)에 def가 선언한 매개변수 타입과 맞지 않는 정적 타입의 인자를 전달했습니다.

명세: dsl §8.1

@name(args) 호출이 def가 선언한 매개변수 개수와 다른 개수의 인자를 전달했습니다.

명세: dsl §8.1

@ref가 채우는 CEL 슬롯·컴포넌트 인자·{{…}} 보간 위치와 맞지 않는 타입을 산출합니다 — 렌더링 불가능한 산출 타입이거나, int/double이 아닌 값에 숫자 형식 힌트를 붙인 경우를 포함합니다.

명세: dsl §8, dsl §7.6, dsl 0.24.0 §4

팩트 아톰(시드 facts: 항목, 규칙 본문·헤드 아톰, ::assert/::retract, 또는 CEL 팩트 쿼리)이 관계가 선언한 것과 다른 개수의 인자를 전달합니다.

명세: dsl 0.3.0 §4, dsl 0.3.0 §5

관계가 reserved: true가 아닌데 changedOn:을 선언했거나, changedOn:이 선언되지 않은 occasion을 가리키거나, excludes: 항목이 인자 종류가 맞지 않는 관계를 가리키거나 대칭성 계약을 위반합니다.

명세: dsl 0.25.0 §1, dsl 0.25.0 §6

관계가 스키마가 인식하지 못하는 필드, 알 수 없는 tier, 범위를 벗어나거나 중복된 key: 인덱스, 또는 선언되지 않은 엔티티 종류·enum·도메인을 가리키는 인자 도메인을 선언했습니다.

명세: dsl 0.3.0 §4

relations: 블록에서 같은 관계 이름이 두 번 이상 선언되었습니다.

명세: dsl 0.3.0 §4

관계가 args:를 선언하지 않았습니다.

명세: dsl 0.3.0 §4

관계가 derive: true와 reserved: true를 동시에 선언하여 서로 충돌하는 두 개의 쓰기 소유자를 갖게 되었습니다.

명세: dsl 0.3.0 §4, dsl 0.3.0 §5

팩트 아톰(시드, 규칙, ::assert/::retract, 또는 CEL 팩트 쿼리)이 어떤 스키마도 선언하지 않은 관계를 가리킵니다.

명세: dsl 0.3.0 §4

지시어가 손실 없이 바꿔 쓸 수 없는 제거된 속성(::music{track}, ::sfx{name})을 씁니다. 메시지가 대체할 방법을 알려 주며, 옮기는 작업은 손으로 해야 합니다.

명세: dsl 0.37.0 §3.3, dsl 0.37.0 §4

lute.project.yaml에 제거된 sequence: 키가 남아 있습니다. 이 키는 읽지 않으며 대체 키도 없습니다. 체인은 모두 chapters:에 선언합니다.

명세: dsl 0.37.0 §2.2

제거된 <scene> 태그를 썼습니다. 문서의 섹션은 ## 제목이고, 장면은 문서 그 자체입니다.

명세: dsl 0.37.0 §2.2

이름 변경 항목이 잘못되었거나, 알 수 없는 종류/키를 사용하거나, 출발지 또는 목적지를 중복하거나, 정식 키 매핑이 아닙니다.

명세: dsl 0.36.0 §3

이름 변경 항목이 체인, 자기 자신을 가리키는 고리, 또는 순환을 이룹니다.

명세: dsl 0.36.0 §3

프로젝트 해석 후에도 원본 키가 남아 있거나 목적지 키가 없습니다.

명세: dsl 0.36.0 §3

지시어나 콘텐츠 줄이 속성의 옛 이름(::music{action}, ::video{action}, ::cg{action}, ::label{id}, 콘텐츠 줄의 id=)을 씁니다. 메시지가 새 이름을 알려 주고, lute fix가 바꿔 씁니다.

명세: dsl 0.37.0 §2.2, dsl 0.37.0 §4

지시어가 옛 태그(::auto, ::cut, ::next, ::mark)를 씁니다. 메시지가 새 태그(::actor, ::cg, ::jump, ::label)를 알려 주고, lute fix가 바꿔 씁니다.

명세: dsl 0.37.0 §2.2, dsl 0.37.0 §4

<choice>나 <match>가 속성의 옛 이름(label=, on=)을 씁니다. 메시지가 text= 또는 subject=를 알려 주고, lute fix가 바꿔 씁니다.

명세: dsl 0.37.0 §3.5, dsl 0.37.0 §4

선언한 이름이 Lute가 스스로 쓰는 이름입니다. entity 멤버·def·시즌 이름이 state 루트이거나, 멤버 이름이 unset/true/false/null/_이거나, id가 none이나 CEL 리터럴이거나, state 경로(또는 경로가 되는 id)에 CEL 키워드가 있거나, 관계 이름이 CEL 호출이나 규칙 단어이거나, cast:에 narrator가 있거나, 멤버 목록에 숫자가 있습니다. 쓰는 곳에서 그 낱말로 읽히므로 선언에서 거부합니다. 메시지가 대신 쓸 이름을 제시하고, lute --explain E-RESERVED-NAME이 예약된 이름을 모두 보여 줍니다.

예약된 이름 전체와 각 이름을 거부하는 자리, 대신 쓸 이름: 예약된 이름.

명세: dsl 0.28.0 §1

와일드카드(_)를 허용하는 ::retract 패턴이 아닌 곳에서 관계 인자에 _를 사용했습니다.

명세: dsl 0.3.0 §5

<reward> 요소의 형식이 잘못되었습니다: 비어 있거나 없는 kind, 부호 있는 정수나 올바른 N..M 범위가 아닌 amount=, objective 수준 reward에 쓰인 outcome=이나 "failed"가 아닌 outcome= 값, 또는 따옴표로 감싼 id가 아닌 target=(IR에 실을 수 없는 @ref나 값 없는 target)입니다.

0.52.0부터 보상 종류가 선언한 속성을 @ref로 쓴 경우도 이 코드입니다. 보상의 속성은 엔진이 지급에 쓰는 정적 데이터이므로 따옴표 값으로 씁니다: `<reward rarity=@r>`: a reward's attributes are static data the engine grants against — write a quoted value (`rarity="…"`).

명세: dsl 0.16.0 §2, dsl 0.16.0 §6, dsl 0.49.0 §3.3, dsl 0.52.0 §7.2

한 퀘스트의 <reward> 두 개(퀘스트 자신의 것과 목표의 것을 모두 포함)가 같은 id=를 씁니다. 보상 id는 퀘스트 안에서 고유해야 합니다.

명세: dsl 0.37.0 §3.5

<reward kind=…> 값이 해석된 capability 스냅샷의 rewardKinds 어휘에 선언되지 않은 reward kind를 가리킵니다.

명세: dsl 0.16.0 §4, dsl 0.16.0 §6

<reward>의 target=이 해당 reward kind의 target 계약을 위반합니다: 필수인데 없거나, 선언된 엔티티 종류의 멤버도 provider 카탈로그 id도 아닙니다. 0.49.0부터는 reward kind가 target: { forbidden: true }를 선언했는데 <reward>가 target=을 쓰는 경우도 포함합니다: `<reward kind="COINS">` takes no `target=`: its reward kind declares `target: { forbidden: true }` — remove the attribute. forbidden: true는 provider/entity/required와 함께 쓸 수 없습니다.

명세: dsl 0.26.0 §2.5, dsl 0.49.0 §3.3

규칙의 count(...)/countDistinct(...) 집계가 그 규칙의 헤드 자신에 의존하는 관계를 읽지만, 집계는 자기 헤드의 순환 밖에 있는 관계만 읽을 수 있습니다.

명세: dsl §9

규칙이 특정 양의 본문 관계가 같은 인자에서 성립할 때만 헤드 관계를 도출하지만, 두 관계는 상호 배타적으로 선언되어 있어 모든 도출이 그 배타성을 위반합니다.

명세: dsl 0.25.0 §1

규칙의 cel("...") 가드가 @def/@def(args) 참조를 전개할 수 없습니다 — def가 선언되지 않았거나, 인자 개수가 맞지 않거나, 가드에서 사용할 수 없는 형태입니다.

lute run이 엔진 소유 상태 경로에 쓰거나 예약된 관계를 assert/retract하는 명령을 포함한 실행 IR을 받았습니다.

명세: dsl 0.32.0 §5

런타임 bridgeResult가 대기 중인 bridge 호출이 읽는 필드를 빠뜨렸거나, 그 필드에 선언과 다른 타입의 값을 주었습니다.

명세: dsl 0.38.0 §5.3

런타임이 다른 입력의 응답을 기다리는 동안 다른 입력이 들어왔거나, 대기 중인 요청이 없는데 응답이 들어왔습니다.

명세: dsl 0.38.0 §5.3

런타임 조건 질의(IR 식의 evaluate, 프로젝트 def의 def)가 오류로 평가되었습니다. 예: 0으로 나누기, 숫자가 아닌 값의 int().

명세: dsl 0.41.0 §5.1

런타임 상태가 halted가 된 뒤에 입력이 들어왔습니다. 이전 스냅샷을 복원해서 이어가세요.

명세: dsl 0.38.0 §5.3

런타임 seed나 입력이 프로젝트에 없는 항목을 가리키거나, 선언된 타입으로 해석할 수 없는 값을 담고 있습니다.

명세: dsl 0.38.0 §5.3

런타임 bundle의 실행 IR 버전(major.minor)을 이 런타임이 지원하지 않습니다.

명세: dsl 0.38.0 §4.1

런타임 choose가 대기 중인 메뉴에 없는 선택지, 또는 열려 있지 않은 선택지를 골랐습니다.

명세: dsl 0.38.0 §5.3

런타임 choose나 bridgeResult의 request id가 대기 중인 요청과 다릅니다.

명세: dsl 0.38.0 §5.3

런타임 스냅샷이 다른 프로젝트 bundle에 속합니다.

명세: dsl 0.38.0 §7.2

런타임 스냅샷의 major 또는 minor 버전이 호환되지 않습니다.

명세: dsl 0.38.0 §7.2

타임아웃 입력이 시간 제한이 있는 선택지가 아닌 대기 중인 요청에 전달되었습니다.

명세: dsl 0.40.0 §4.3

명세: dsl 0.27.0 §5

한 문서의 두 섹션이 같은 {#id}를 씁니다. 섹션 id는 문서 안에서 고유해야 합니다.

명세: dsl 0.37.0 §3.1

섹션 제목의 끝에 있는 {#id} 식별자 접미사가 형식에 맞지 않습니다.

명세: dsl §3.1

실행 아티팩트 또는 엔진 매트릭스가 알 수 없는 의미 ID를 지정합니다.

명세: dsl 0.33.0 §4

::set의 복합 연산자(+=/-=/*=)가 선언된 타입이 int나 double이 아닌 경로를 대상으로 합니다.

명세: dsl §7.3.4

::set의 형식이 잘못되었습니다: 경로 뒤에 유효한 대입 연산자(=/+=/-=/*=)가 없거나, = 대신 ==를 사용했거나, state family 경로를 구체적인 키가 아닌 파라미터로 인덱싱했습니다.

명세: dsl 0.27.0 §2

::set의 우변 표현식에서 결정 가능한 타입이 해당 경로에 선언된 타입과 일치하지 않습니다.

명세: dsl 0.10.0 §3

state: 선언이 경로에 컬렉션 타입(list/record/map)을 지정했지만, 작성자 state는 스칼라여야 합니다.

명세: dsl 0.3.0 §3

state: 선언이 잘못되었습니다: 문자열이 아닌 키, 알 수 없거나 불완전한 type:(type: 아래에 중첩되지 않은 enum 포함), type: text(플러그인 디렉티브 속성 전용 타입), 잘못된 default:/per: 형태, 또는 state: 자체가 맵이 아닙니다.

명세: dsl 0.8.0 §4, dsl 0.51.0 §5.1

같은 경로에 대한 두 state: 선언이 type, default, per, owner 중 하나에서 서로 다르며, 어느 쪽도 extends:로 다른 쪽을 재정의하지 않습니다.

명세: dsl §2

state 경로를 읽는 지점에 도달하는 어떤 선언된 after: 경로도 그 값을 설정함을 보장하지 않거나(오류 등급), 일부 경로에서만 설정됩니다(경고 등급).

명세: dsl §4.3

state: 경로가 인식되는 네임스페이스 루트인 scene., run., user., app., season. 중 하나로 시작하지 않습니다.

씬의 인라인 state:가 임포트된(uses:) 스키마가 이미 선언한 상태 경로를 선언하거나 재정의했으며, 씬은 이를 재선언해서는 안 됩니다.

명세: dsl §9.2

state: 셰이프가 자기 자신을, 직접적으로든 다른 셰이프를 거쳐서든 참조하여 순환을 이룹니다.

스트리밍 이어쓰기가 입력 끝에서 구문 도중에 끝났거나, 본문에 이어쓰기 본문이 담을 수 없는 프런트매터나 헤딩이 포함되어 있습니다.

이어쓰기 컴파일러가 이미 닫힌 뒤에 스트리밍 이어쓰기가 제출되었습니다.

스트리밍 이어쓰기에서 덧붙인 소스가 입력의 앞부분에 대해 이미 방출된 명령이나 상태를 바꾸게 됩니다.

스트리밍 이어쓰기의 템플릿이 섹션을 하나 이상 가진 씬이 아닙니다.

따옴표로 묶인 속성 값이 정의된 네 가지 이스케이프(\", \\, \n, \t) 외의 백슬래시 이스케이프를 사용하거나, 레이블 문법을 따르지 않는 값에 \{{(리터럴 {{)를 씁니다. 레이블 문법을 따르는 값은 <choice text>, prompt, 플러그인 text 속성뿐입니다.

명세: dsl §4.4, dsl 0.52.0 §3.2

<objective quest=…>가 하위 퀘스트로 지정한 퀘스트가 rearm=을 선언합니다. 하위 퀘스트는 부모와 함께 활성화되므로, 부모가 끝난 뒤에는 재무장된 자식이 unset으로 남습니다.

명세: dsl 0.27.0 §5, dsl 0.28.0 §5

블록의 본문(그리고 흔히 닫는 태그까지)이 여는 태그와 같은 줄에 쓰였습니다. 여는 태그, 본문의 각 줄, </tag> 닫는 태그는 각각 자기 줄에 있어야 합니다.

명세: dsl §2.3

<tag …> 여는 태그의 속성들이 문법이 요구하는 한 줄에 머무르지 않고 다음 물리적 줄로 넘어갑니다.

명세: dsl §2.3

편집 작업 모음의 트랩이 패치를 예상대로 거부하거나 표시하지 못했습니다.

명세: dsl 0.36.0 §6, dsl 0.36.0 §8

비트 템플릿이 잘못 사용되었습니다: <beat use=>가 컴포넌트를 지정하지 않거나 beat: 헤더가 없는 컴포넌트를 지정했거나, 템플릿의 beat: 헤더가 형식에 맞지 않거나 헤더 매개변수에 허용되지 않는 값을 주었거나, 컴포넌트가 사용 자리의 키와 이름이 같아 어떤 사용도 넘길 수 없는 매개변수(component, when, at 또는 instance, 비트 템플릿이면 title, once, id 같은 <beat> 머리 키)를 선언했거나, ::body가 템플릿의 최상위 밖에 나타났습니다.

명세: dsl 0.27.0 §6, dsl 0.28.0 §1, dsl 0.46.0 §2.1

내러티브 시간 값(now() 등)이 다른 내러티브 시간 값과의 순서 비교나 validAt의 세 번째 인자가 아닌 다른 자리(단독 값, 산술, 인덱싱, 필드 접근, 리스트 리터럴, 또는 !=)에 사용되었습니다.

명세: dsl 0.3.0 §6

*.test.yaml의 file:이 존재하지 않는 문서를 가리킵니다.

*.test.yaml에 인식되지 않는 최상위 또는 expect: 레벨 키가 있거나, 키가 문자열이 아닙니다.

테스트의 file:이 로어 문서를 가리키는데, 로어 문서는 플레이되지 않고 조회되므로 테스트는 대신 표시할 대상(entry:/entries:, beat:)을 지정하거나 expect:로 판정해야 합니다.

명세: dsl 0.22.0 §5

*.test.yaml의 transcriptContains/transcriptLacks 니들이 프로젝트 캐스트 밖의 화자, 어떤 트랜스크립트 줄에도 나타나지 않는 속성, 또는 도메인 밖의 값을 지정해, 표시된 줄과 결코 일치할 수 없습니다.

*.test.yaml이 인식되는 expect: 키를 하나도 선언하지 않아, 이 테스트는 아무것도 단언하지 않으므로 통과할 수 없습니다.

인라인 텍스트 수식에서 정의되지 않은 백슬래시 이스케이프를 사용했습니다.

명세: dsl §3.6

인라인 텍스트 수식의 중첩이 잘못되었거나 스팬 또는 속성 본문이 닫히지 않았습니다.

명세: dsl §3.6

작성된 시간 값(클립 at, duration, delay, 또는 <timeline duration>)이 밀리초보다 더 정밀한 소수 자릿수를 가집니다.

명세: dsl 0.10.0 §10.1

<timeline> 또는 <track> 본문에 클립·스테이징 요소가 아닌 콘텐츠가 포함되어 있습니다.

명세: dsl §7.4

<timeline duration>이 클립들의 최대 해석된 끝 시점보다 낮게 명시적으로 설정되어, 타임라인 자체의 내용을 잘라내게 됩니다.

명세: dsl §11.4

--accepted-quest/accept: 항목이 알 수 없는 퀘스트 id를 지정했거나, start 술어를 가진(선언적으로 활성화되어 accept가 필요 없는) 퀘스트를 지정했거나, 부모의 <objective quest=…>가 참조하는(부모를 통해 활성화되는 no-start 자식) 퀘스트를 지정했습니다.

명세: dsl 0.4.0 §4.3, dsl 0.4.0 §4.4

lute trace --beat <id>가 kind: lore가 아닌 문서를 대상으로 하거나, 문서가 선언하지 않은 <beat> id를 지정했습니다.

명세: dsl 0.23.0 §4

--choice 항목이 알 수 없는 분기/허브 id를 지정했거나, 그 분기/허브의 알 수 없는 선택지 id를 지정했거나, 도달 시점에 선택지의 가드가 거짓으로 판정되었습니다.

명세: dsl 0.4.0 §4.3, dsl 0.4.0 §4.4

lute trace --entry <id>가 kind: lore가 아닌 문서를 대상으로 하거나, 문서가 선언하지 않은 <entry> id를 지정했습니다.

명세: dsl 0.19.0 §8

--event/events: 항목이 엔진이 자체적으로 파생시키는 내장 생애주기 이벤트(questActive, questComplete, questFailed)를 지정했으며, 이는 사용자가 직접 발생시킬 수 없습니다.

명세: dsl 0.4.0 §4.3, dsl 0.4.0 §4.4

--fact/facts: 항목이나 테스트의 expect.facts/expect.notFacts 원자가 정형화된 사실 패턴으로 파싱되지 않거나, 알 수 없는 관계·잘못된 자릿수·다른 문서의 인자를 지정했습니다.

명세: dsl 0.4.0 §4.3

--mock/mocks/*.yaml 파일이 잘못되었습니다 — 유효하지 않은 YAML이거나, 맵이 아니거나, 인식되지 않는 최상위 키가 있거나, state:/facts:/choose:/events:/quests: 섹션의 형식이 맞지 않습니다.

명세: dsl 0.4.0 §4.3, dsl 0.10.0 §8

목 또는 테스트 시드의 리터럴(--state <path>=<literal>, state:, quests:)이나 테스트의 expect.state 값이 해당 경로의 예약된 도메인이나 선언된 타입과 맞지 않거나 — { domain: K }, { entity: K } 또는 enum 경로라면 그 멤버가 아니거나 — 응답한 브리지 결과에 콘텐츠가 읽는 필드가 빠져 있습니다.

명세: dsl 0.4.0 §4.3, dsl 0.24.0 §5, dsl 0.27.0 §2

--state <path>=… 시드가 클록이 파생시키는(시드 불가능한) 경로를 지정했거나, 해석된 스키마에 선언되지 않은 경로를 지정했거나, 문서 내 어디에서도 읽지 않는 경로를 지정했거나, 어떤 디렉티브도 읽거나 쓰지 않는 호출/필드를 지정한 브리지 응답입니다.

명세: dsl 0.4.0 §4.3, dsl 0.24.0 §1, dsl 0.24.0 §5

<track>이 subject, channel, subject+property 쌍 중 어느 것도 선언하지 않아 식별 키가 없습니다.

명세: dsl §7.4

선언의 타입이 number입니다. number는 더 이상 숫자 타입이 아닙니다 — 상태 행, def와 그 매개변수, 컴포넌트 매개변수, 디렉티브 속성, 브리지 결과, 오케이전 페이로드, 플러그인 상태 셰이프 필드는 int나 double 중 하나를 골라야 합니다.

명세: dsl 0.41.0 §3.2

본문 줄이 Lute 구문이 아닙니다 — 콘텐츠 줄, 디렉티브, ::set, 알려진 블록 중 어느 것도 아니거나 — 블록이 올 수 없는 자리(예: 섹션 안의 <quest>)에 있습니다.

명세: dsl 0.5.0 §2.1

블록이 닫히지 않았습니다 — 자기 </tag>보다 먼저 파일 끝, ## 제목, 또는 바깥 블록의 닫는 태그에 이르렀습니다 — 또는 </tag>가 열려 있는 어떤 블록도 닫지 않습니다.

명세: dsl §5, dsl §7.3

CEL 슬롯, ::set 대상, 또는 규칙 가드가 어떤 스키마에도 선언되지 않은 상태 경로를 읽거나 씁니다.

명세: dsl §7.3.4, dsl §9.4

@name 보간 또는 가드 참조가 어떤 스키마에도 선언되지 않은 def를 지정합니다.

명세: dsl §8.1

콘텐츠 줄이나 디렉티브, 또는 <branch>/<hub>/<choice>가 콘텐츠 줄 문법 또는 해당 표면의 선언이 인식하지 못하는 속성 키를 가지고 있습니다. 스탬프를 실을 레코드가 없는 디렉티브(::jump, ::label, ::clear)에 타이밍 키(wait/duration/delay)나 플러그인 스탬프를 쓴 경우도 포함합니다. 그 값은 버려지기 때문입니다. 0.50.0부터 키가 on:으로 다른 표면에 범위가 정해진 플러그인 스탬프이면, 그 표면의 속성 목록 대신 스탬프가 적용되는 곳을 알려 줍니다: `::bg` has no attribute `voiceAssetId`: it is a stamp of `acme.stage` for content lines only, `<branch>` has no attribute `optionKey`: it is a stamp of `acme.stage` for `<choice>` only. 그렇지 않으면 기존 메시지를 쓰되, 로직 태그(<branch>/<hub>/<choice>)의 속성 목록에는 그 표면이 허용하는 스탬프가 포함됩니다: `<choice>` has no attribute `cue`; its attributes are `id`, `text`, `when`, `into`, `value` and the stamps `optionKey` (`acme.stage`).

0.51.0부터 text 속성이 없는 디렉티브의 code=는 이유를 알려 줍니다: `::bg` has no attribute `code`; its attributes are …; `code` is the localization identity of a directive with a `text` attribute, and `::bg` declares none.

0.52.0부터 <reward>는 보상 종류가 attrs:에 선언한 속성을 받습니다(디렉티브 속성처럼 타입을 검사합니다). 그런 종류의 <reward>에서는 메시지가 선언된 속성도 나열합니다: `<reward>` has no attribute `rarety` — did you mean `rarity`?; its attributes are `id`, `kind`, `target`, `amount`, `when`, `outcome`, and kind `BADGE` declares `rarity`. 속성을 선언하지 않은 종류나 알 수 없는 종류에서는 메시지가 그대로입니다.

명세: dsl 0.1.0 §7.1, dsl 0.49.0 §4.1, dsl 0.50.0 §3.4, dsl 0.51.0 §5.2, dsl 0.52.0 §7.2

::directive가 코어나 활성화된 플러그인 어디에도 선언되지 않은 태그를 지정합니다.

<on event="…">가 내장 생애주기 이벤트도, 기능으로 선언된 월드 이벤트도 아닌 이벤트를 지정합니다.

명세: dsl 0.2.0 §4.5

providerRef id를 참조하는 속성이나 플러그인 프런트매터 키가 고정된 제공자 카탈로그에 없는 id를 지정합니다.

명세: dsl 0.49.0 §4.3

문서의 kind: 프런트매터 키 값이 scene, quest, lore 중 어느 것도 아닙니다.

명세: dsl 0.2.0 §3.1, dsl 0.19.0 §2

CEL 가드 슬롯이 unset일 수 있는 유한 도메인 주체를 실제로는 다른 문자열 리터럴인 'unset'과 비교했으며, 이는 DSL의 실제 unset 센티널을 가장 흔히 잘못 표기한 형태입니다.

명세: dsl 0.5.2 §2

<match> 주체가 unset일 수 있는데(스키마 default가 없는 run./user./app. 경로. 분기의 scene.choices.* 기록을 포함한 scene.* 경로는 경로마다 E-MAYBE-UNSET으로 판정합니다) unset을 매칭하는 분기나 <otherwise>로 커버되지 않았습니다.

명세: dsl §11.2

문서의 uses:/extends: 임포트가 순환 구조를 이룹니다.

같은 임포트 깊이의 두 피어 임포트가 같은 def 이름을 서로 다르게 선언했습니다.

같은 임포트 깊이의 두 피어 임포트가 같은 관계 또는 열거형 이름을 서로 다르게 선언했습니다.

같은 임포트 깊이의 두 피어 임포트가 같은 상태 경로를 서로 다르게 선언했습니다.

uses:/extends: 임포트가 해석하거나 읽을 수 없는 경로를 지정합니다.

uses:/extends: 임포트가 가리키는 대상 문서 자체에 파싱 또는 프런트매터 오류가 있습니다.

validAt이 파생 관계에 대해 사용되었으며, 그 규칙 클로저는 CEL 가드를 포함하고 있어 단일한 잘 정의된 타임스탬프를 유지하지 않습니다.

명세: dsl §8

<when is="…"> 리터럴이 주체의 결정된 유한 도메인 밖에 있습니다 — 다른 열거형 멤버(오타), 도메인과 맞지 않는 숫자/불리언 리터럴, 또는 결코 unset이 될 수 없는 주체에 대한 unset입니다.

명세: dsl 0.4.0 §5.2, dsl §6.3

<when> 항목에 is 리터럴 패턴도 test 가드도 없지만, 둘 중 하나는 반드시 있어야 합니다.

명세: dsl §7.3.1

<when is="…">의 항목이 ..를 포함하지만 형식이 잘못되었거나(.., a..b, 1...2 등) 비어 있는 범위 리터럴입니다(예: 3..1).

명세: dsl 0.18.0 §2

<when is="unset"> 분기는 <match> 주어가 단순한 상태 경로여야 하는데, 이 주어는 표현식입니다.

명세: dsl §7.3.1

<timeline>의 서로 다른 <track>에 있는 두 <clip>이 겹치는 시간에 겹치는 상태 대상을 씁니다.

명세: dsl §11.4

에셋 id가 출시 전에 확정해야 할 자리표시자(placeholder)처럼 보입니다.

장면 비트의 once가 기본값 run이지만 when이 사용자 계층 상태만 읽어서 once를 명시적으로 쓰지 않으면 매 실행마다 다시 나타납니다.

명세: dsl 0.22.0 §13, dsl 0.23.1

select: first 방식의 한 계기(occasion)에서 두 개 이상의 비트가 같은 priority를 가지고 동시에 자격을 얻을 수 있어, 어느 것이 선택되는지가 파일 순서에 따라 정해집니다.

명세: dsl 0.27.0 §11, dsl 0.22.0 §13

select: first 방식의 계기(occasion)에서, 더 앞 순서이며 항상 자격이 있고 소진되지 않는 같은(또는 지정 없는) 대상의 비트가 항상 먼저 선택되므로 이 비트는 결코 선택될 수 없습니다.

명세: dsl 0.21.0 §5

비트의 spentBy가 플레이 시작 시점(모든 상태 경로가 기본값이고 시드 팩트만 있으며, 각 퀘스트는 start가 성립할 때까지 unset인 때 — start="true" 퀘스트는 이미 active)에 이미 성립합니다. 흔히 spentBy를 “성립하는 동안 반복”으로 읽었거나, 예전 when의 뒤집힌 !holds(…)를 그대로 옮긴 경우입니다. spentBy 비트는 조건이 한 번 성립하면 소진된 채로 남으므로, 이 비트는 한 번도 제시되기 전에 소진됩니다. 메시지는 고쳐 쓸 형태를 알려 줍니다: 조건이 성립하지 않는 동안 재생할 비트라면 when: "!(…)"(반복하려면 once: false와 함께)로 씁니다.

명세: dsl 0.27.0 §5, dsl 0.28.0 §6

비트가 시계의 raise: 맵이 raise하는 계기에 응답하는데, 그 when은 시계가 그 계기를 raise하지 않는 곳에서만 참이 될 수 있습니다. 하루의 마지막 슬롯이 아닌 슬롯을 위한 dayEnd 비트나, 실행이 시작된 날의 뒤쪽 슬롯을 위한 dayStart 비트가 그렇습니다. 또는 마지막 dayEnd에서만 참이 될 수 있는데, 시계를 끝내는 advance는 clock.ended가 참이 된 뒤에 그것을 raise하므로, clock.ended와 함께 참이 되는 terminal:이 이미 게임을 끝낸 뒤입니다. 그래서 그 비트는 재생되지 않습니다. 그것이 참이 되는 곳에서 raise되는 계기에 응답하게 하거나 when을 바꾸세요. 마지막 dayEnd라면 시계가 끝나기 전에 raise하거나, 그 비트가 재생된 뒤에만 참이 되도록 terminal:을 쓰세요. 실행이 시작되는 위치에서 참이 되는 비트도 경고됩니다. 거기서는 어떤 advance:도 멈추지 않으므로 시계가 slot 계기도 dayStart도 raise하지 않지만, 엔진이 실행을 시작할 때 그 계기를 raise한다면 비트는 재생됩니다. 그렇다면 시계에 raiseAtStart: true를 선언하세요. 경고가 사라집니다. 그렇지 않다면 그것이 참이 되는 곳에서 raise되는 계기에 응답하게 하세요. 선언된 raise(지시문이나 보상 종류의 effects.raises가 그 계기를 그 비트의 대상으로, 또는 비트가 target:을 선언하지 않았다면 어떤 대상으로든 raise하는 것)가 닿는 비트는 어느 위치에서든 raise될 수 있으므로 보고하지 않습니다.

명세: dsl 0.28.0, dsl 0.51.0 §4.4

선언되었거나 사용된 프로젝트 스테이징 값, cast 구성원, 에셋 또는 flow 참조에 플레이어 바인딩이 없습니다.

명세: dsl 0.40.0 §5

플레이어 바인딩 키를 컴파일된 프로젝트 문서가 사용하지 않습니다.

명세: dsl 0.40.0 §5

플레이어 바인딩의 bindingsVersion이 툴체인 라인(툴체인 버전의 MAJOR.MINOR)과 다릅니다. 더 오래되었으면 그 라인으로 올리고(lute fix가 수행), 더 새로우면 스탬프를 낮추지 말고 툴체인을 업그레이드하며, MAJOR.MINOR 형식이 아니면 다시 스탬프합니다.

명세: dsl 0.47.0 §4.2

한 프로젝트의 두 문서가 각각 같은 id의 <branch>나 <hub>를 선언하고, 루트 아래의 플레이나 테스트 스크립트가 그 id를 choose: 키로 씁니다. id는 한 문서 안에서만 유일하면 되지만, choose:는 메뉴를 id만으로 가리키므로 그 키가 두 메뉴에 모두 답합니다(결정 목록을 쓰면 두 메뉴가 이어서 소비합니다). 어떤 스크립트도 쓰지 않는 id는 경고하지 않습니다.

명세: dsl 0.28.0 §7, dsl 0.49.0 §7.2

대사 줄의 화자에게 present: 조건을 선언한 캐스트 항목이 있지만, 그 줄을 감싸는 조건들이 해당 조건을 보장하지 않습니다.

명세: dsl 0.24.0 §4

providerRef id가 고정된 프로바이더 카탈로그에서 찾을 수 없으며, 이는 id 자체의 오류라기보다 스냅샷이 오래되었거나 오프라인이기 때문일 수 있습니다.

명세: dsl §7.2

select: sequence 계기에서는 프로젝트 chapters:의 체인이 한 번의 raise 안의 순서입니다. 그런데 나열된 장면이 자체 priority:를 써서, 체인이 정한 순서를 벗어난 자리에서 재생됩니다. 장면의 priority:를 지우거나, 체인의 scenes:에서 장면을 옮기세요.

명세: dsl 0.28.0 §4

프로젝트 chapters:의 체인에 나열된 장면의 자체 when:이 영영 거짓으로 남을 수 있습니다. 이야기가 끝내 쓰지 않을 수도 있는 state를 읽거나, 닫히는 시계 창을 읽는 경우입니다. 체인의 계기가 raise되는 어느 순간에도 맞지 않는 when(실행이 시작된 날이 필요한 dayStart 체인의 장면. 단, 엔진이 거기서 raise하므로 시계가 raiseAtStart: true를 선언했다면 제외)이나, 앞 장면이 늦게 재생된 뒤로는 이후 어떤 raise도 맞추지 못하는 when(끝나는 시계의 마지막 날의 슬롯)이 여기에 해당합니다. 그리고 다음 장면의 after:(체인이 쓴 것이든 장면이 직접 쓴 것이든)가 그 장면을 기다리므로, 장이 거기서 멈출 수 있습니다. 이후의 raise가 여전히 맞추는 시계 조건은 체인을 늦출 뿐이고, 다른 owner: engine state에 대한 조건은 엔진이 참으로 만들 몫이라 둘 다 보고하지 않습니다. 멈추는 것은 체인뿐입니다. chapters: 밖의 장면에 직접 쓴 after:는 그 자체가 “그 장면을 기다린다”는 진술이므로 경고하지 않습니다. 그 장면을 건너뛰어도 된다면 다음 장면이 그 앞 장면을 따르게 하세요(after: visited("<앞 장면>"); 건너뛸 수 있는 장면은 우선순위가 높아서 조건이 맞으면 여전히 먼저 재생됩니다). 반드시 재생되어야 한다면 이야기가 그 조건을 참으로 만들도록 하거나, 그 when이 이후의 raise에서도 참이 되게 하세요. 선언된 raise(effects.raises)가 닿는 장면은 어느 위치에서든 raise될 수 있습니다. 시계의 일정만이 맞추지 못하는 when은 보고하지 않지만, 앞 장면 이후의 모든 위치에서 이미 지나 버린 when은 여전히 보고합니다.

명세: dsl 0.28.0 §4, dsl 0.29.0 §3, dsl 0.51.0 §4.4

같은 직선 흐름의 본문 안에서 ::end 지시어 뒤에 콘텐츠가 이어지지만, 그 지점에서 이미 진행이 종료되어 이후 내용은 실행될 수 없습니다.

명세: dsl 0.8.0

같은 직선 흐름의 본문 안에서 max가 없는 조건 없는 ::jump 지시어 뒤에 콘텐츠가 이어지지만, 그 점프가 본문을 벗어나므로 이후 내용은 실행될 수 없습니다. max가 있는 ::jump{to max}는 본문을 끝내지 않습니다. 횟수를 다 쓰면 다음 내용으로 이어집니다.

명세: dsl 0.12.0, dsl 0.51.0 §3.4

::use에 명시적인 instance가 없어 과도기 위치 기반 폴백을 사용합니다.

명세: dsl 0.36.0 §2.2

단독 컴포넌트 검사에 범위 안의 호출자가 없습니다. 프로젝트가 해석되지 않았거나, 해석된 프로젝트 안에 이 컴포넌트를 ::use하는 문서가 없어서, 검사 결과가 컴포넌트 자신의 프런트매터와 본문만을 다룹니다.

명세: dsl 0.10.0 §9

on= 목표(objective)의 by= 마감(until= 없이)이 done 조건이 판정되기 전에 반드시 참이 되어, 완료되기 전에 마감으로 인해 목표가 실패 처리됩니다.

명세: dsl 0.24.0 §2.1

목표의 done이 by= 마감이 이미 성립한 시계 위치에서만 참이 될 수 있어(대개 visited로 읽는 비트의 when이 마감 뒤에 열림), 완료되기 전에 마감으로 인해 목표가 실패 처리됩니다.

명세: dsl 0.28.0

목표의 by= 마감이 결코 성립할 수 없어(대개 끝이 있는 시계의 끝을 지난 시점) 목표를 실패시키지 못합니다.

명세: dsl 0.24.0 §2.1

선언된 @def가 프로젝트의 콘텐츠, 다른 def, 규칙 가드 어디에서도 @이름 형태로 참조되지 않고, host: true로 선언되지도 않았습니다.

명세: dsl 0.24.0

잘못된 선언(또는 불러오지 못한 플러그인)을 쓰는 곳은 그 선언을 고칠 때까지 검사하지 않습니다. 잘못된 선언 하나당 첫 사용처에 안내 하나만 붙고, 나머지 사용처는 개수로 셉니다.

명세: dsl 0.41.0 §3.2

derive: true로 선언된 관계에 이를 생성하는 규칙이 없어서, 문법적으로는 유효하지만 항상 비어 있습니다 — 대개는 규칙 head 이름의 오타입니다.

명세: dsl 0.3.0 §7.1

서로 다른 두 화자가 같은 대사창 표시 이름(캐스트 항목의 name: 또는 컴포넌트 ::use{name=})을 사용하여 플레이어가 둘을 구분할 수 없습니다.

명세: dsl 0.26.0 §2.8

선언된 도메인을 어떤 활성 구성 요소도 읽지 않습니다 — 지시어 속성, 대사 슬롯, 플러그인 프런트매터 키, 상태 경로, relations: 인자, per:/subsetOf: 패밀리, 규칙·조건 질의 중 어느 것도 이를 참조하지 않아 아무것도 강제하지 않습니다.

명세: dsl 0.10.0 §11.1, dsl 0.53.0 §6.2

entry.<id>.read 참조가 프로젝트의 어떤 로어 문서도 선언하지 않은 엔트리 id를 가리킵니다.

명세: dsl 0.19.0 §5

한 실행에서 다시 읽힐 수 있는 엔트리(조회 엔트리, once가 없는 엔트리 비트, 실행보다 짧은 once, spentBy 엔트리, once: run|user가 없는 for= 엔트리)가 상태를 씁니다. 엔트리의 쓰기는 한 실행의 첫 읽기에만 적용됩니다. 메시지가 모양에 맞는 해결책(같은 속성의 <beat>, once="run", 또는 경고도 없애는 when="!entry.<id>.read" 가드)을 알려 줍니다.

명세: dsl 0.26.0 §8, dsl 0.19.0 §6

대사 줄의 action이 action 도메인에서 선언된 퇴장(exit) 값을 가리키지만, 대사 줄에서는 무대 연출 효과가 없어 캐릭터가 무대에 그대로 남습니다.

명세: dsl 0.10.0 §11.2

가드의 관계형 질의(holds/count)가 그 지점에 도달하는 모든 경로에서 항상 참이 되어, 해당 조건이 불필요합니다.

명세: dsl 0.20.0 §5

<choice> 항목이 경로를 ::set으로 쓰면서 동시에 같은 경로를 into=로도 기록하여 이중으로 기록됩니다.

명세: dsl 0.6.0 §2.2

컴파일된 대사 레코드에 로케일라이제이션 번들이 선언한 로케일의 텍스트가 빠져 있습니다.

명세: dsl 0.8.0 §7

병합된 번역이 레코드의 현재 원문과 다른 원문으로 만들어졌습니다 — 번역자가 작업한 lute loc export 이후 대사, 선택지 라벨 또는 프롬프트가 바뀌었습니다(저장된 sourceHash가 다릅니다). 번역은 그대로 병합됩니다. 다시 내보내고 번역을 갱신하세요.

명세: dsl 0.47.0 §3.2

identity.requireStable일 때 콘텐츠 라인(0.51.0부터는 text 속성이 있는 디렉티브 호출도)에 명시적인 code가 없어 컴파일러 할당을 사용하고 있습니다. lute tag로 기록하세요.

명세: dsl 0.36.0 §2.2, dsl 0.51.0 §5.3

문서 프런트매터의 luteVersion 값이 있지만 현재 툴체인의 DSL 버전과 달라서, 예전 예제에서 그대로 복사된 것으로 보입니다.

명세: dsl 0.6.1 §3

프런트매터 문서가 id:와 함께 예전 장면 식별 키(character, season, episode 등)를 작성했지만, 이제 장면 식별은 id:가 담당하므로 예전 키는 제거해야 합니다.

명세: dsl 0.15.0 §4

필수(!optional) 목표(objective)의 visibleWhen 표시 조건이 결코 참이 될 수 없어, 완료 판정에는 여전히 관여하면서도 결코 표시되거나 추적될 수 없습니다.

명세: dsl 0.4.0 §5.3

필수 목표가 같은 문서 비트들의 선언된 시계 창 안에서만 완료될 수 있는데 그 창이 모두 닫힐 수 있고, 목표에 until=이나 by= 기한이 없어 방치될 수 있습니다. 다시 열리는 퀘스트(run·season 계층, rearm=)나 다른 문서의 비트가 완료할 수 있는 목표는 보고하지 않습니다. 경로 탐색은 하지 않습니다.

명세: dsl 0.31.0 §3, dsl 0.41.0 §3.4

장면이나 항목, 묶음 비트가 raisedBy: declared로 선언된 계기 — 호스트가 지시문이나 보상 종류의 effects.raises로만 raise하는 계기 — 에 응답하는데, 프로젝트의 어떤 선언된 raise도 거기에 닿지 않습니다(그 target:으로도, occasion.target으로도, target:을 선언하지 않았다면 어떤 대상으로도 그 계기를 raise하지 않음). 그래서 재생되지 않습니다. 그곳으로 이어지는 지시문이나 보상 종류에 raises 항목을 추가하거나, 호스트가 그 계기를 스스로 raise한다면 raisedBy: declared를 지우세요. 프로젝트 시계의 raise: 맵이 raise하는 계기는 선언된 raise 밖에서 raise되므로 보고하지 않습니다. 그 계기를 raise하는 lute play/lute test 단계는 raise가 아닙니다(테스트는 게임이 아니라 테스트를 증명합니다). 프로젝트 전체 check에서만 보고합니다.

명세: dsl 0.51.0 §4.5

<match>의 <otherwise> 항목이, 앞선 무조건 is 항목들이 이미 주어의 전체 범위를 다 덮고 있어서 결코 도달할 수 없습니다.

명세: dsl 0.4.0 §5.2

두 <when> 항목이 같은 값에 대해 모두 일치함이 증명되어, 먼저 일치하는 항목이 우선하는 규칙상 나중 항목은 결코 도달할 수 없습니다.

명세: dsl §11.2, dsl 0.18.0 §4

단일 파일 check(와 언어 서버)가 문서와 그 import가 선언하지 않은 퀘스트 id의 quest.<id>.*를 읽었습니다. 퀘스트 참조는 전체 프로젝트 lute check(lute check --project <DIR>)만 해석하므로 이 검사는 그 참조를 판정하지 않았습니다. 심각도는 info이고 문서당 고유한 퀘스트 id마다 한 번 발생하며, ok는 달라지지 않습니다. 전체 프로젝트 check, compile, wasm 빌드는 이 코드를 내지 않습니다.

명세: dsl 0.49.0 §7.1

강제 지정된 --project 루트에서는 이 매니페스트가 적용되지 않으며 원래대로라면 다르게 해석되었을 것이므로, 그 설정이 어떤 문서에도 적용되지 않습니다.

퀘스트가 결코 실패할 수 없어서 <on event="questFailed"> 핸들러가 실행되지 않습니다 — fail 조건도, by= 마감이 있는 필수 목표도, 실패 가능한 필수 하위 퀘스트도, 실패를 전파할 상위 퀘스트도 없습니다.

명세: dsl 0.22.0 §7

수락 기반(accept-driven) 퀘스트를 어떤 ::accept{quest=…}도, 보상 kind의 accepts 효과도 지정하지 않고 accept="external"도 아니어서, 프로젝트 안에서 이 퀘스트를 수락하는 곳이 없습니다. 0.50.0부터 메시지는 “no ::accept or reward accepts in the project names it”라고 알려 줍니다.

명세: dsl 0.24.0 §2, dsl 0.25.0 §5, dsl 0.50.0 §5.4

퀘스트의 rearm= 조건이 상수입니다("true", "false", 또는 상수로 접히는 def나 비교). 거짓에서 참으로 바뀌는 일이 없으므로 퀘스트가 재무장되지 않습니다.

명세: dsl 0.27.0 §5, dsl 0.28.0 §5

예약된 quest.<id>.state / quest.<id>.objectives.<oid>.done 등의 참조가 프로젝트의 어떤 퀘스트 문서도 정의하지 않은 퀘스트 id나 목표 id를 가리킵니다.

명세: dsl 0.5.1 §1.4

퀘스트의 상태는 항상 값을 가지고 있어(활성화 전에는 unset, 이후에는 실제 상태) has(quest.<id>.state) 조건은 항상 참이므로 아무것도 검증하지 않습니다.

tier=를 지정하지 않아(기본값인 사용자 계층으로, 실행 간에도 유지되는) 퀘스트인데, start/fail/목표 조건이 모두 실행 계층 상태만 읽고 있어 매 실행마다 초기화될 의도였던 것으로 보입니다.

저장되는(derive: true가 아닌) 관계에 tier:가 없어 실행 계층이 됩니다. 그 사실은 새 실행마다 facts: 시드(있다면)에서 다시 시작하고, reserved: true 관계라면 엔진이 기록한 사실은 잊힙니다. 그대로 두려면 tier: run을 쓰고, 실행보다 오래 남길 사실이면 user, app, season:<name>을 씁니다.

명세: dsl 0.28.0 §5

선언된 비예약 관계가 쓰이기는 하지만(단언, 시드, 파생) 어떤 조건, 규칙 본문, def에서도 읽히지 않아 기록된 사실이 아무 영향도 주지 않습니다.

명세: dsl 0.24.0

퀘스트 핸들러의 ::set이 <reward kind="…" credits=…>가 지급 시 이미 적립하는 것과 같은 경로에 쓰고 있어 보상이 두 번 지급됩니다.

명세: dsl 0.23.0 §8

once: season:<name>인 비트(또는 start가 있는 tier="season:<name>" 퀘스트)의 when(또는 start)이 그 시즌의 live 조건을 함의하지 않습니다. once는 비트가 얼마나 오래 소진된 상태로 남는지만 정하므로, 시즌이 한 번도 열리지 않았어도 비트가 재생됩니다. 시즌의 live 조건(또는 그것을 읽는 def)을 when에 더하세요.

명세: dsl 0.28.0 §7

한 퀘스트 안의 두 필수 run 계층 목표가 같은 하나의 시계 위치에서만 완료될 수 있고, 두 목표를 완료하는 비트가 모두 시간을 전진시킵니다. 하나를 표시하면 다른 목표가 완료될 유일한 슬롯도 소비됩니다.

명세: dsl 0.31.0 §4

비트의 spentBy가 한 번 성립한 뒤 다시 거짓이 될 수 있습니다. ::retract / ::assert나 지시어가 선언한 효과가 되돌릴 수 있는 팩트, 시즌의 상태·팩트·퀘스트(시즌이 열릴 때마다 초기화됨), 또는 rearm이 unset으로 되돌리는 퀘스트를 읽는 경우입니다. 그런데 once를 쓰지 않았으므로 비트는 그 런이 끝날 때까지 소진된 채로 남아, 계기가 올 때마다 조건을 새로 판정하는 것과 다르게 동작합니다. 메시지는 고쳐 쓸 형태를 알려 줍니다: 매번 새로 판정하려면 once: false와 when: "!(…)", 시즌이라면 once: season:<name>, 일부러 소진 상태를 유지하려면 once: run을 씁니다(once를 쓰면 이 경고는 나오지 않습니다).

명세: dsl 0.28.0 §6

대사 줄이나 ::actor가, 이미 무대를 떠나(퇴장 지시어, ::bg 장면 전환, 또는 ::clear) 다시 등장하지 않은 캐릭터를 대상으로 하여 연출이 불가능합니다. 대사 줄의 메시지는 다시 등장시키는 두 방법을 함께 알려 줍니다: ::actor, 또는 actor 레코드로 낮춰지는 플러그인 지시어(lower: { record: actor, fields: { character: { fromAttr: character } } })입니다. 후자도 ::actor처럼 무대에 세웁니다.

명세: dsl 0.22.0 §12, dsl 0.50.0 §7

비트 템플릿의 when:이나 spentBy: 머리가 멤버를 param으로 쓴 경로 조각(user.bond.@who)으로 읽습니다. 머리에서는 동작하지만 컴포넌트 본문은 이 철자를 거부합니다. 둘 다 받아들이는 user.bond[@who]로 적으세요.

명세: dsl 0.28.0 §3

<beat use=…>가 자기 when=을 적어 템플릿의 when:을 통째로 대신하므로, 템플릿의 조건이 더 이상 비트를 막지 않습니다(그 조건만 읽던 인자는 쓰이지 않습니다). 두 조건을 모두 use의 when=에 적거나, 템플릿에 덧붙일 param을 두고(when: "<조건> && (@only)") when= 대신 그 param을 넘기세요.

명세: dsl 0.28.0 §3

스키마의 terminal:이 새 run이 유지하는 상태(visited(…), user.*, app.*, entry.<id>.everRead, user tier 퀘스트나 relation)를 읽습니다. 한 번 성립하면 어떤 새 run도 이어서 플레이할 수 없습니다. 결말이 의도적으로 run을 넘어 남는다면(로그라이크의 영구 결말) terminal: { when: "<condition>", persists: true }로 그렇다고 적으면 경고가 사라집니다.

명세: dsl 0.28.0 §2, dsl 0.29.0 §5

<choice> label 전체가 Ink의 대괄호 숨김처럼 […]로 감싸여 있습니다. Lute는 label을 적힌 그대로 보여 주므로 버튼에 대괄호가 나타납니다. 대괄호 없이 적으세요. 앞에 태그가 오고 텍스트가 이어지는 label([Persuasion] Step closer)은 경고하지 않습니다.

명세: dsl 0.28.0 §2

대사 텍스트나 선택지 label에 // … 주석이 있거나 Ink #tag로 끝납니다. : 뒤의 텍스트는 리터럴이라 플레이어에게 그대로 보입니다. 주석은 한 줄을 따로 쓰는 // …이고, Lute에는 줄 태그가 없습니다.

명세: dsl 0.28.0 §2

대사 텍스트나 선택지 label에 Ink 글루 <>가 있습니다. Lute는 줄을 잇지 않고 : 뒤의 텍스트는 리터럴이라 플레이어에게 <>가 보입니다. 문장 전체를 한 줄에 적으세요.

명세: dsl 0.28.0 §2

대사 줄 전체 텍스트가 선언된 def나 컴포넌트 매개변수의 @이름과 정확히 같아서, 값으로 해석되지 않고 리터럴 문자열 "@이름"으로 출력됩니다.

명세: dsl §7.6

대사 텍스트나 선택지 label에 다른 언어의 마크업으로 읽히는 한 겹 중괄호가 있습니다. 상태 경로나 def({run.oil}), Yarn {$var}나 {0} 자리표시자, Ink 조건부 텍스트({cond: text})나 대안({~a|b})입니다. 한 겹 중괄호는 언제나 리터럴이고 백슬래시로 이스케이프되지 않으므로(\{run.oil\}은 백슬래시까지 그대로 출하됨), 보여 줄 중괄호는 그대로 적습니다. 보간은 {{run.oil}}이고, 조건부 텍스트는 guard를 단 줄이나 <match>로 씁니다.

명세: dsl 0.28.0 §2

<timeline>의 한 트랙에 클립이 12개를 초과하여 있어, 검사기가 분리를 권장합니다.

명세: dsl §11.4

<timeline>의 전체 트랙을 합친 클립 수가 40개를 초과하여, 검사기가 분리를 권장합니다.

명세: dsl §11.4

<timeline>에 트랙이 8개를 초과하여 있어, 검사기가 분리를 권장합니다.

명세: dsl §11.4

주어진 --fact/모의 YAML 사실의 관계가 어떤 작성된 생성자로도 만들어질 수 없다고 판정되어, 이를 시드로 사용한 진행은 실제 도달 가능한 플레이에 대해 아무것도 증명하지 못합니다.

명세: dsl 0.6.1 §4

<when test="…"> 항목이 CEL 리터럴 비교로 작성되어 있는데, 같은 의미를 is= 패턴 형태로 더 명확히 표현할 수 있고 검사기도 이를 직접 분석할 수 있습니다.

명세: dsl 0.18.0 §3, dsl §7.3.1

프로젝트 전체 check --wip에서, 가드나 목표가 필요로 하는 관계를 만들어 내는 콘텐츠가 아직 쓰이지 않았다는 이유만으로 죽어 있습니다(시드, ::assert, 규칙, 예약 선언이 없거나, 바인딩되지 않은 @param을 가진 컴포넌트 ::assert만 있음). 메시지는 --wip 없이 붙을 오류 코드(E-ARM-DEAD, E-BEAT-UNREACHABLE, E-ENTRY-UNREACHABLE, E-OBJECTIVE-UNSATISFIABLE)를 밝힙니다.

명세: dsl 0.23.0 §10, dsl 0.26.0 §2.6