scripts/whp-stack-converge.d/ -- per-area converge hooks for the stack switch.
Prep Task 6 (Fable, 2026-10-24).

    <NN>-<area>.sh      NN = two digits, area = the ledger area (lower case,
                        digits, "-"); e.g. 40-backups.sh, 50-email.sh

Run as root, `bash <file> go|php`, sorted by name (LC_ALL=C):
  go   by whp-stack-converge-go.sh, after its own steps and after
       ensure-whp-jobs.sh (so whp-jobs and whp-state exist), before the Go
       target starts;
  php  by whp-stack-converge-php.sh, after the copy-back (or when there was
       nothing to copy back), before the PHP units start.

A non-zero exit aborts the switch; the runner names the file and its exit
code. Rules for a hook:
  - #!/usr/bin/env bash and set -euo pipefail; absolute paths only;
  - idempotent (it runs on every `whp-stack go`, also go -> go);
  - no `chown ... root:` (chown the user, then chgrp);
  - never follow a symlink you did not create; refuse instead;
  - the file is root-owned, a regular file, not group/other-writable, or the
    runner refuses it (and the switch aborts). Names that do not match
    <NN>-<area>.sh are refused too; this README is the only other entry.

Plain directories shared between whp-panel and whp-jobs are NOT hooks: list
them in configs/whp-state.d/<area>.list.
