docs(build): pin the deploy tooling, correct the hook macro-scope note #18

Merged
allan merged 2 commits from docs/pin-deploy-and-hook-scope into main 2026-10-15 18:56:57 +00:00
Showing only changes of commit 8a22e28a46 - Show all commits
@@ -102,9 +102,9 @@ From that moment the changeset is an approval against `ORDERS.ORDERS`. The appro
![A change submitted against the mirror, raised against the real table](/img/approval-routed.png) ![A change submitted against the mirror, raised against the real table](/img/approval-routed.png)
### The detail that will bite you ### Reassigning LIBREF and DS
Use `call symputx`, not `%let`. `LIBREF` and `DS` are not declared `%local` in `mpe_loader`, and the hook is included into that scope - so `call symputx` finds the existing variable and updates it, while a `%let` creates a new variable in the hook's own scope and is silently discarded. The hook runs, the log looks clean, and the changeset goes to the mirror anyway. `LIBREF` and `DS` are ordinary macro variables inside `mpe_loader`, which creates them with `%let` and then updates them from the staged row. A `%let libref=ORDERS;` reassigns them just as well as the `call symputx` above: both statements assign to the *existing* variable, because it lives in an enclosing symbol table (`mpe_loader`'s local table) and SAS only creates a new local when the name is absent from every enclosing table. `call symputx` is used above because it is explicit about which variable is being set, and because it does not depend on the enclosing scope still holding the name - a wrapper macro that declared `%local libref` would turn a bare `%let` into an assignment to that shadow instead.
### Other things to watch ### Other things to watch