Database Verification: document the column drift guard (#884) Rewrites the section that said columns were unguarded — accurate when written yesterday, made false by building the guard. Now covers why columns are the harder case (both files hand-maintained, so drift runs in two directions and each direction breaks a DIFFERENT install), the #879 bug that prompted it, how the check works, and where $schema now lives. Emphasises that the comparison is deliberately forgiving — base type, length and nullability only, ignoring DEFAULT/case/whitespace — because a guard that cries wolf gets ignored. The noise-resistance test is called out as load-bearing rather than incidental. Records what is STILL unguarded: foreign keys, built from explicit FK groups with nothing comparing them to freeitsm.sql. Flagged as the next self-check. Also notes you can run the whole of Database Verification headlessly against a scratch database ($_SESSION['setup_access'], DB_NAME override) and that php -l proves nothing here, since a fatal in this endpoint is served as HTTP 200. Multi-Tenancy dev guide + CMDB case study: file maps updated for $schema's move to includes/db_verify_schema.php, and the "columns have no guard yet" line in the case study corrected — written an hour before the guard existed.
Two new multi-tenancy dev pages, and make file involvement explicit Ed's feedback: the CMDB/Network Mapper work was substantial enough to deserve proper documentation, and dev guides should make it much clearer WHICH php/js files are involved. Fair - the guide named files in prose but had no scannable map, so it couldn't actually be worked from. NEW Multi-Tenancy-CMDB-Case-Study: the worked example for a module whose rows LINK to each other. Why a graph differs from a list (three link mechanisms, all separate holes); the no-shared-CIs decision and what it forced; the core lesson that a same-company invariant must bind ALL-ACCESS actors because a scope check cannot help someone who legitimately reaches both sides; a full colour-keyed file map; the Network Mapper boundary and why get_diagram.php is deliberately unfiltered; what stayed shared and why; the move-between-companies gap. NEW Multi-Tenancy-Test-Harness: the reusable verification kit, roughly 20 lines from module-agnostic. Leads with ALWAYS INCLUDE A POSITIVE CONTROL, because breaking that rule produced a green suite that proved nothing. Also the three tricks that make CLI testing work (DB_NAME defined first, session established before the endpoint's own session_start, php:// wrapper override for the empty php://input), the static tenant-count cache forcing separate processes, the fixture shape, and what to assert. Developer guide gains section 1a "The files you will touch" - a colour-keyed table of the ~10 places every module needs, each with what you do and whether it is skippable. Plus the point that a correctly-scoped module needs NO JavaScript changes at all (CMDB changed zero lines), and if you are editing JS to hide rows you are filtering in the wrong layer. The Reference section is now a "copy from these" table pointing at shipped examples per shape. Also fixed a pre-existing broken link (db-verify) and pointed two #882 references away from the user-facing Pitfalls page.