# 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.
