diff --git a/AGENTS.md b/AGENTS.md index 81a98d5..2440f80 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -137,8 +137,8 @@ into sub-items in `todo.md` before starting it. Per chunk: 1. Fresh worktree off updated `origin/main`; implement tests-first (§10). 2. Run the larv-review flow until it passes and CI is green. A reviewer launch states the latest gate result (commit and outcome); a reviewer does not re-run `ci.sh` or the tests when a - result for the commit under review already exists — re-run only what its own findings or - fixes invalidate. + result exists for the commit under review, or when the diff since that result cannot affect + it (docs-only) — re-run only what its own findings or fixes invalidate. 3. Merge the PR (standing authorization, this repo only), check the box in `todo.md`, report, stop. The next chunk gets a fresh session. diff --git a/spec/flavour.md b/spec/flavour.md index 8d4e4e8..b6bed7a 100644 --- a/spec/flavour.md +++ b/spec/flavour.md @@ -76,17 +76,18 @@ valid — no attributes. A bare value matches `[A-Za-z0-9_-]+`; any other value with JSON string escaping (`\"` `\\` `\n` `\t` `\uXXXX`, …) — total over Unicode, and raw newlines never appear inside quotes. All values are strings at the grammar level; each node's section assigns types. Canonical form orders keys alphabetically, spells -values bare wherever allowed, and inside quotes escapes only what it must, using the shortest -escape form. +values bare wherever allowed, inside quotes escapes only what it must using the shortest escape +form, and omits empty `{attrs}` except where the `{` itself claims the directive +(`:hardBreak{}`). **Escaping**: the emitter backslash-escapes whatever literal text would otherwise parse as directive syntax — the leading `:` of a would-be directive, `]` inside content; a backslash before `:` in input always yields a literal colon. **Malformed directives are error results**, named: an unclosed container at end of input, a body -fence line of the container's length or longer, a bare colon-run line outside any container, an -inline `[content]` or `{attrs}` left unclosed at end of line, unparseable or duplicate-keyed -attrs, invalid JSON in an opaque carry. Never a silent literal-text fallback — a typo that +fence line of the container's length or longer, a bare colon-run line outside any container or +shorter than the fence it would close, an inline `[content]` or `{attrs}` left unclosed at end of +line, unparseable or duplicate-keyed attrs, invalid JSON in an opaque carry. Never a silent literal-text fallback — a typo that reparses as prose is the silent loss §2 refuses. ## The opaque carry (AGENTS.md §3)