Update for the Links-strip move (#1068) Equipment and CMDB objects are pills in the Links bar now, not sections below the thread. Both pages updated to match. The dev guide gains section 9 on why: the strip already carried a comment, written for the Jira work, saying a link belongs in the strip rather than a panel of its own. Equipment qualifies by that definition and the original card was the deviation. Also records what the space problem actually was - a section cost a bordered card whether or not it had contents, so an empty ticket paid six times to say "nothing here yet" six times - and why the two are still shown distinctly rather than merged, since a broken mouse will never be a configuration item. Plus the trap: the picker host must be a CHILD of .problem-strip, because mobile.js relocates the strip into a phone sheet by selector and a sibling would be left behind where the user cannot see it. Notes the two loose ends left behind (dead .cmdb-* CSS, and a dead SECTIONS entry in mobile.js) so neither looks intentional later.
Add "Linking equipment — Developer Guide" (discussion #57) Completes the pair. The user page said what it does; this says why the code looks the way it does. Sections that exist because someone will otherwise undo them: - Why ticket_assets has TWO creator columns where ticket_cmdb_objects has one - analyst 7 and user 7 are different people. - The three gates on the write path, and specifically that gate 3 (same-company) is the one that matters for the exact role which can satisfy gates 1 and 2 together. It is also the one easiest to talk yourself out of. - Why the portal re-checks ownership when the dropdown is already scoped, cross-referenced to the get_users.php leak in #54: a scoped list is not a check. - Why the location clause in the picker's WHERE is load-bearing rather than a nicety, and that an empty result may be missing location data rather than a broken query. - The MERGE_MOVE_DEDUPE trap that produced #1064, written up as the general rule: a wrong column name in a table-driven loop is a silent no-op, not a mismatch. Plus the forged-session recipe (no trailing newline, or PHP reports what looks like an auth failure) and the control set, including that the CASCADE has to be proven functionally because db_verify creates FKs inside an empty catch. Records that the neighbouring .cmdb-* CSS has no dark-mode handling at all - left alone rather than changed as a side effect, but real. Every file named in the table verified to exist; every wiki link resolves.