Repository navigation
Conversation
chore: merge v1.7.0 release back to develop
Strict token discovery scanned every identifier in a statement, so the statement's own tag name (autoescape, endautoescape, with, ...) and the test name after `is` / `is not` (defined, none, divisibleby, ...) were reported as undeclared tokens, along with the `is` operator itself. Discovery now drops the leading tag name of a statement, treats `is` and the capitalised True/False/None literals as keywords, and masks test names the same way filter names are masked. Refs #784 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The strict token walker matched expression and statement delimiters
anywhere in the body, including inside `{# ... #}` comments and
`{% raw %}` blocks, so a comment such as `{# bd uses {{name}} #}`
failed strict render and validate with ERR_VAL_UNDECLARED_TOKEN. The
walker now skips comments and raw blocks, which render no references.
Refs #785
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tput The JSON output check lived only in the CLI adapter, so the wheel's compose(), compose_file() and render_loaded_template() returned malformed JSON bodies that `sc-compose render` rejects. The check metadata (format by extension, JSON mode from policy over front matter) moves into sc-composer as RenderCheckMeta::for_request, the CLI uses it, and the wheel now runs the same check and raises ScRenderError with the CLI's diagnostic code (ERR_RENDER_JSON_MALFORMED). Refs #787 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix(python): wheel applies the CLI checked-render contract to JSON output (#787)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
chore: install atm-bd-orchestration 0.14.0
No render can silently skip a variable. Undeclared referenced tokens and referenced-but-unbound variables are always errors in the library, the CLI, the Python package and bead rendering, and every renderer refuses to print an undefined value (minijinja SemiStrict), so templates rendered without validation fail closed too. - Remove ComposePolicy.strict_undeclared_variables and unbound_variable_policy (Rust and Python) and Renderer::refusing_undefined. - --strict is hidden and accepted as a no-op; --unknown-var-mode governs only extra caller variables. - A declared path covers its parents and children; per-pass caller values count as bindings; a missing required variable is reported once. - Discovery skips block names, Jinja globals and keyword-argument names. - templates init ignores unbound variables (no caller input). - Add frontmatter declarations to shipped skill templates, Beads formulas, release templates and test fixtures. Refs #783 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat(bead): support bd-owned variable rendering
docs: correct Beads request contract details
The second `{{ }}` pass re-parsed the `{{{ }}}` pass's output, so values,
raw blocks and expression output could form or hide template syntax
(FUZZ-171-01..09), include defaults were dropped (11), each pass dropped a
trailing newline (12) and a name in both variable maps silently resolved
to the compose value (14).
Source `{{ expr }}` (outside comments, statements, raw blocks and
`{{{ }}}`) is now folded lexically into `{{{ expr }}}` and the formula is
validated strictly and rendered once against one context. In bd mode no
folding happens, so `{{ }}` is plain text and byte-exact. The private-use
marker machinery is deleted. A name in both maps is refused with
BEADS_VARIABLE_KEY_DUPLICATE. sc-composer gains the additive
`validate_expanded_with_context`.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fold ended an expression at the first `}}` outside strings, but the
renderer's lexer only closes a tag while no `(`, `[` or `{` is open, so
`{{ {"a": {"b": 1}} }}` folded into a syntax error. Track bracket depth
and match `}}`, `}}}` and `%}` only at depth zero. Adds fold cases and
end-to-end nested-brace and whitespace-control render tests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Re-fuzz of #804 (T-02..T-06): - `{{%` and `{{#` are a literal `{` before a statement or comment, as the renderer lexes them, instead of a folded expression (T-02, T-03). - An unterminated or malformed `{{` keeps the folded opener, so the render fails with a syntax error instead of copying the rest unfolded (T-04). - `raw`/`endraw` are recognized with minijinja's skip_basic_tag rules (one `-`/`+`, ASCII whitespace), so `{%-- endraw %}` and NBSP forms no longer end a raw block early (T-05). - bead.md qualifies bd-mode byte-exactness for expression text holding `{%`, `{#` or `{{{` (T-06). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
chore: prepare 1.7.1 release
rand-lee
previously approved these changes
Oct 12, 2026
fix: preserve strict scanner scope frames
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release 1.7.1
Candidate:
release-candidate-v1.7.1@362cfbbe(develop head). Branchrelease/1.7.1is identical to the candidate (empty diff).CHANGELOG [1.7.1] summary
bead_variable_rendering: "bd"/--true-bd-renderpreserves ordinary{{ variable }}expressions for Beads while composing triple-brace expressions;sc-composer::validate_expanded_with_context; strict-rendering, Beads request and diagnostics work (Strict must be the only render mode: no lenient default, no strict=False #783, validate --strict reports Jinja keywords as undeclared tokens (autoescape, endautoescape, is, defined) #784, bead render copies template front matter into the rendered formula; strict reads tokens inside {# #} comments #785, Python wheel has no checked render: malformed JSON output renders without error #787, bead render ignores front matter for undeclared variables; validate --strict cannot see {{{ }}} tokens #791, Strict discovery treats Jinja filter and call names as variables #792, bead_variables are not substituted at pour (bd ignores {{ key }} despite --help claim) #618).{% raw %}stays literal,set/forlocals shadow caller values, private-use characters render as themselves, attach re-run no longer reportsBEADS_GRAPH_CONFLICT, duplicatecompose_variables/bead_variablesnames refused withBEADS_VARIABLE_KEY_DUPLICATE;rendered_formula== template refused before any write; NUL/control characters in Beads ids rejected.Full notes: CHANGELOG.md
[1.7.1].Readiness preflight: PASSED — Release Preflight run 38200438840 on
release/1.7.1@362cfbbe,failed=[] blocked=[]. All six channels (crates_io, github_release, pypi, homebrew, winget, scoop) ready; onlyrelease_authorizationoutstanding (readiness-only). No TestPyPI rehearsal run.