# EFTL verification matrix ## Core matrix | Area | Positive cases | Negative and recovery cases | | --- | --- | --- | | Roots | one and multiple EFTL fragments with surrounding user text | close without open, missing close, nested roots if forbidden by confirmed grammar | | Blocks | correctly nested VAR, IF, WHILE, functions, expressions, comments | crossing closes, incomplete close, unexpected close, unfinished or unknown `[` construct; assert termination | | Attributes | documented required and optional attributes in varied order | missing required, duplicate, unknown, unquoted, invalid enum/boolean/number | | IF | condition + then, repeated else-if, optional final else | missing condition/then, else before then, duplicate else, branch after else | | WHILE | condition + do, confirmed threshold boundaries | missing child, reversed order, invalid threshold, incomplete body | | FOR | iterable variable and scoped loop variable | missing attributes, unknown iterable when statically knowable, reference after scope | | Expressions | assignment, evaluation, output, supported literals/operators | unterminated block, malformed operator, missing semicolon where required | | Functions | bodyless and block variants, precedence rules | mutually exclusive inputs, wrong body shape, invalid literal regex | | TAG payload | minimal and full positional forms | missing mandatory position, invalid literal enum, preserved empty positions | | Variables | declaration, reference, shadowing policy, iterable index | invalid type, duplicate declaration policy, undefined reference, invalid index type | For every tag keyword, test the exact boundary after its name so a longer unknown name such as `[VARIABLE]` is not classified as `[VAR ...]`. Only assert rules confirmed by the PDFs or runtime grammar. Keep ambiguous rules as pending cases rather than opinionated errors. ## Range matrix Exercise each diagnostic at: - first character and end of file; - after ASCII and non-ASCII text; - on a later line with LF and CRLF; - inside a multiline token or comment; - after an incremental edit that changes preceding line lengths. LSP positions are zero-based UTF-16 line/character pairs. Prefer storing source offsets internally and converting with the current `TextDocument` at publication time. ## Editor matrix When syntax changes, inspect: - language activation and file association; - TextMate scope on open name, close name, attributes, strings, and delimiters; - bracket matching and auto-closing; - folding start/end markers; - snippet insertion and tab stops; - go-to-definition selection range; - consistency of examples and README syntax. ## Release evidence Record: 1. exact commands executed; 2. automated pass/fail totals; 3. Extension Development Host scenarios checked; 4. known baseline failures reproduced independently; 5. unverified runtime semantics or ambiguous documentation.