- Shipped
- September 6, 2026 at 3:14 AM UTC
- Author
- Kamo
- Commit
- 9105292
Fourteen columns on `orgs`, and two small records to keep their shapes honest. RIBBON_MSG_* carry the corner-ribbon wording for the five public pane screens — the sign-in site, kamo-register's landing, member and team-member routes, and the loan application on kamo-apps — each with the *_SYNCED flag the label columns beside them already use, so a branch can inherit its parent's greeting. They resolve through `resolveTitle`, the same parent walk the branch titles use, but into their own `RibbonMessageResolution` rather than onto `BranchTitleResolution`. That record is copied into the signed-in member's Redis session; these five are read by people who have no session, and on kamo-apps by people who have never heard of this platform. The resolution hands back NULL for a wording nobody set, where the branch titles substitute a default. That difference is load-bearing: kamo-apps's ribbon is a next-intl key translated into twenty-two locales, so baking the English source into every org's config.json would silently un-translate that line for every non-English visitor with nothing to report it. Absent means "use the wording the site ships", and no screen can be given a blank ribbon from here — an empty box normalises back to NULL on the way in. `updateRibbonMessages` is a new two-argument method rather than five more pairs on `updateBranchTitles`, which already takes seventeen positional arguments; `RibbonMessages` pairs each wording with its own flag so transposing the two is not expressible. TAB_ICON_* are the browser-tab icon, per brand. An org's favicon set has always been generated from img/logo.svg — a fine default and a poor requirement, since a mark legible on a masthead is often a smudge at 16px. *_EXT is written only by the upload endpoint and doubles as the "an icon exists" marker; *_ENABLED is the switch, and NULL or FALSE both mean "use the simple logo", which is what every existing row means today. DDL ships with securityservice as **************** and must be applied by hand — ddl-auto is none everywhere and the initializer is not deployed. Every column's absent state is already its correct one, so there is no backfill and nothing changes until an org chooses.