Reloading a pack is not a check.
$ uvx ljos-policyd check -- uv run pytest allow
A Janet pack can deny more after that verdict:
(defn check [argv]
(when (has-prefix? (get argv 0) "sudo")
(deny "sudo")))
ljos-policyd check -- argv is the TCB when the binary is on PATH
(or POLICYD_BIN). It prints allow or deny. The harness hook and
ljos policy call it. The Janet pack cannot allow what the binary denied.
ljos policy -- argv prints the line, then the TCB verdict if the
binary answered, then any pack rule that matches, then what the pack
knows that bears on it. It does not reload a Janet pack. Absence of
the binary is not a deny. Doctor names the row.
ljos hook is the same answer for a policy layer or a runner: pipe the action about to happen (the runner's hook JSON, or the plain argv) and the memories it activates come back, standing preferences first, as the runner's additionalContext or as plain lines. Nothing to say is no output; the hook never blocks an action. ljos onboard installs it on a runner's tool-call and prompt events. Memory reaches the agent at the point of action, without being asked for. When the session ends, the memories the hook injected during it fire together, so what served one sitting is wired for the next.
Law can live in the pack: ljos rule 'PATTERN' --verdict deny|ask --why "..." writes a glob over the command line with a verdict, and the hook returns it as the runner's permission decision while ljos policy prints it beside the line. A rule is memory: dated, supersedable, exported in handovers.
Edit a pack rule only when argv law itself changes. Do not write comments, dates, ticket ids, or sitting notes into it. If the binary is down, leave the pack rules alone.
Other projects may speak one habitat and ignore ljos.