# `zerodds-lang-rules`
Maps the common AST onto the language CSTs.
The rules are **data**, not code. A rule is a `RuleV2` value: it names an
L-side pattern over the model, an R-side pattern over a language CST, and
the correspondences between them. It can be compared, serialised, and
checked for completeness. Two languages' treatment of `@optional` is a
diff between two values, not a reading of two emitters three thousand
lines apart.
Rules are minimal and positive: small rules that compose, monotone and
add-only, with no negative application conditions. One rule maps a struct
to a type declaration; a second maps a member to a field; a third adds a
derive. A single rule doing all three could not be reused for the members
of a union.
The engine is seesaw's v2 layer — `seesaw_core::v2`. The crate carries
both rule layers side by side until the 1.1.0 cut, so binding the crate
is not by itself enough to land on the right one.
See `docs/specs/zerodds-lang-cst-1.0.md` §2 to §4.