docs/knowledge-graph/vault-wml-3/work-items/wml-302.md
Variable store and substitution closure
Generated from canonical repository manifests. Do not edit this note directly.
Relationships
contains← [[sprints/WML-3|WML-3]]covers-family→ [[source-families/wml|wml]]owned-by→ [[owner-layers/engine-wasm|engine-wasm]]owned-by→ [[owner-layers/qa|qa]]planned-by← [[clauses/WML-CL-GO-ASSIGNMENT-ORDER|WML-CL-GO-ASSIGNMENT-ORDER]]planned-by← [[clauses/WML-CL-GO-SETVAR-SNAPSHOT|WML-CL-GO-SETVAR-SNAPSHOT]]planned-by← [[clauses/WML-CL-GO-TARGET-RESOLUTION|WML-CL-GO-TARGET-RESOLUTION]]planned-by← [[clauses/WML-CL-HISTORY-RESOLVES-VARIABLES|WML-CL-HISTORY-RESOLVES-VARIABLES]]planned-by← [[clauses/WML-CL-PREV-ASSIGNMENT-ORDER|WML-CL-PREV-ASSIGNMENT-ORDER]]planned-by← [[clauses/WML-CL-REFRESH-ASSIGNMENTS|WML-CL-REFRESH-ASSIGNMENTS]]planned-by← [[clauses/WML-CL-SETVAR-INVALID-NAME-IGNORED|WML-CL-SETVAR-INVALID-NAME-IGNORED]]planned-by← [[clauses/WML-CL-SETVAR-STRUCTURE|WML-CL-SETVAR-STRUCTURE]]planned-by← [[clauses/WML-CL-SETVAR-TASK-SIDE-EFFECT|WML-CL-SETVAR-TASK-SIDE-EFFECT]]planned-by← [[clauses/WML-CL-VARIABLE-COMMIT-BEFORE-TASK|WML-CL-VARIABLE-COMMIT-BEFORE-TASK]]planned-by← [[clauses/WML-CL-VARIABLE-CONVERSION-MODES|WML-CL-VARIABLE-CONVERSION-MODES]]planned-by← [[clauses/WML-CL-VARIABLE-DEFAULT-CONVERSION|WML-CL-VARIABLE-DEFAULT-CONVERSION]]planned-by← [[clauses/WML-CL-VARIABLE-DOLLAR-ESCAPE|WML-CL-VARIABLE-DOLLAR-ESCAPE]]planned-by← [[clauses/WML-CL-VARIABLE-NAME-GRAMMAR|WML-CL-VARIABLE-NAME-GRAMMAR]]planned-by← [[clauses/WML-CL-VARIABLE-PARSE-PRECEDENCE|WML-CL-VARIABLE-PARSE-PRECEDENCE]]planned-by← [[clauses/WML-CL-VARIABLE-REFERENCE-VALIDATION|WML-CL-VARIABLE-REFERENCE-VALIDATION]]planned-by← [[clauses/WML-CL-VARIABLE-SET-DEFINITION|WML-CL-VARIABLE-SET-DEFINITION]]planned-by← [[clauses/WML-CL-VARIABLE-SUBSTITUTION-LOCATIONS|WML-CL-VARIABLE-SUBSTITUTION-LOCATIONS]]planned-by← [[clauses/WML-CL-VARIABLE-TASK-SNAPSHOT|WML-CL-VARIABLE-TASK-SNAPSHOT]]planned-by← [[clauses/WML-CL-VARIABLE-UNDEFINED-EMPTY|WML-CL-VARIABLE-UNDEFINED-EMPTY]]relates-to→ [[legacy-tickets/C5-04|C5-04]]
Data
{
"status": "done",
"ownerLayers": [
"engine-wasm",
"qa"
],
"sourceFamilies": [
"wml"
],
"followUpWorkItems": [
"WML-301",
"WML-304",
"WML-305"
],
"notes": [
"All 20 directly mapped WML-302 clauses have source-derived native fixtures, WASM parity, and an executable host/Waves story. The focused WML-302 context pack is generated from the effective base -> SIN 102 -> SIN 104 -> SIN 105 source order with no zero-clause or family mapping gaps.",
"HISTORY-RESOLVES-VARIABLES is explicitly adjudicated across WML-301/WML-302/WML-304: WML-302 resolves WML-authored target and variable data before the engine records same-deck history or publishes an external navigation intent; WML-301 retains ownership of the broader deck/card history model; WML-304 retains request construction and GET/POST/postfield serialization. No unresolved WML variable reference crosses the WML-302 engine history or navigation boundary.",
"WML-302 preserves WML-202 newcontext reset, WML-204 control/vdata commit, WML-205 atomic failure rollback, and WML-303 task/action/BACK ordering. It makes no wml-engine.ts or browser debug-contract change; D0-01 remains the exclusive contract lane. Native timer lifecycle remains WML-305 and is the next engine baton."
],
"specReferences": [
"WAP-191_104-WML sections 9.2, 9.4, 10.3 through 10.3.5, and 12.5.1, 12.5.2, and 12.5.4"
],
"existingTickets": [
"C5-04"
],
"outputs": [
"Variable store and substitution closure"
],
"acceptance": [
"Initialization, escaping modes, substitution contexts, setvar ordering, and invalid references match effective WML rules."
],
"evidence": [
"cargo test --manifest-path engine-wasm/engine/Cargo.toml wml_302",
"wasm-pack test --node engine-wasm/engine",
"pnpm test:story WML-302",
"node scripts/wap-context-pack.mjs WML-302",
"pnpm wap-compliance:check",
"pnpm wap-graph:check"
],
"source": "docs/waves/wap-1.2.1-compliance-program.json"
}