The documented evolution policy is additive (the context-build error
arm lands with the first engine-owned template set); non-exhaustive-
ness keeps that addition non-breaking for downstream match sites.
Decided in the wave-3 freeze inventory (review-wave-1 reminder (a)).
No behavior change: in-crate matching is unaffected.
- public TemplateSet::render (String sink) and
TemplateSet::render_to_write (io::Write sink), synchronous and
deterministic, both surfacing the wave-1 Error enum
- render-name rule enforced behaviorally: the entry resolves names
against the set-level bookkeeping before the substrate is
consulted, so a partial's name or an unknown name is a typed
Error::Render (substrate TemplateNotFound reason), never a
rendered partial
- strict-mode missing variable is a typed error in both sinks,
never silently-empty output; the write sink's streaming
(non-atomic) semantics on mid-render failure documented
- determinism pinned by tests: byte-identical repeated renders,
byte-identical output across registry rebuilds in opposite
registration order, and byte-for-byte agreement between sinks
Verification: cargo test (19 passed), cargo clippy --all-targets
-- -D warnings, cargo fmt --check, cargo doc --no-deps, and
cargo build --target wasm32-unknown-unknown --release all green.
- TemplateSet: one strict handlebars registry per template set; strict
mode forced at construction, unparameterizable; enforcement test pins
missing-variable renders as Error::Render, never empty output
- EscapePolicy::{Html, NoOp}: explicit per-set escaper choice; Html
leaves the substrate default html_escape, NoOp registers
handlebars::no_escape; both postures pinned by golden render tests
- typed fallible registration of templates and partials; malformed
text is Error::Registration, never a panic; failed registration
leaves bookkeeping untouched
- set-level bookkeeping of template vs partial names (decision 1,
flagged for the gate): the substrate's register_partial is identical
to template registration, so the render-name rule cannot delegate to
it; TemplateSet::is_template exposes the tracking for the
w1-render-entry rejection
- per-set helper registration seam; zero custom helpers by default,
pinned by test (unknown helper is a typed render error)
- naming conveventions enforced by tests only, not at registration
(decision 2, flagged for the gate): consumer-facing engine API
stays naming-neutral per ADR-001/008
Verification: cargo test (15 pass), clippy -D warnings, fmt --check,
wasm32-unknown-unknown release build
Verification: cargo test (15 pass), clippy --all-targets -D warnings, cargo fmt --check, wasm32-unknown-unknown --release
- src/error.rs: pub enum Error via thiserror with Registration
(#[from] TemplateError) and Render (#[from] RenderError) variants;
substrate errors stay reachable through the source chain
- src/lib.rs re-exports alkgen::Error per convention 10
- six unit tests pin variant mapping, source-chain reachability, and
operation-naming Display strings
- no catch-all; no context-build arm in this scope (recorded
interpretation, flagged for the wave-1 gate)
Verification: cargo test, clippy -D warnings, fmt --check, cargo doc,
wasm32-unknown-unknown release build, taskgraph validate (14 tasks)
all green
- pin handlebars = "6.4" on default features; tree verified free of walkdir and rhai
- remove alktype from deps: no consuming code in v0.1.0, so an optional
entry would be a dead feature; re-add lands with bast-rust-codecs as
bast-codegen = ["dep:alktype"] (flagged for the wave-1 gate)
- declare [features] bast-codegen = [] (name reserved per ADR-009, gates nothing)
- package metadata to the text-generation framing (ADR-001): description,
keywords, and the src/lib.rs crate doc; version stays 0.1.0
Verified: cargo test, clippy -D warnings, fmt --check,
wasm32 release build, taskgraph validate, dep-tree inspection
- AGENTS.md: adopt alkssh conventions (conventional commits, small
focused commits, taskgraph section, lifecycle status, verification
grep gate); add convention 12 (no em dashes in prose, U+2014)
- README.md: note the unpaused status and the alkforge SSR consumer
- phase-0.md: alkforge SSR enters as branch 0 (in-library HTML
rendering, two target classes bound the core generality), new
OQ-GN-09 for the SSR library posture, unpause context section,
alktype 0.4.0 revalidation notes
- reader-poc-summary.md: re-validation note for alktype 0.4.0
(parity + bench unchanged); em dashes restructured repo-wide