- Shipped
- November 14, 2026 at 10:26 PM UTC
- Author
- Kamo
- Commit
- 39906c0
- MlosProgramsController (/api/security/mlos/config, market-setup right, audited, undoable): GET /programs (the one catalog with display names, offered today, variant, channels, version in force, scheduled), GET /programs/{id}/history, GET|PUT /product-enablements (basedOnVersion → 409 STALE), GET /channels (program x channel grid + exceptions), channel-rules CRUD (structured — free-form predicates refused; scope derived), scenario-support CRUD + check ("Loan Types Kamo Handles", MlosScenarioSupportService: at least one dimension, no duplicate rule). - MlosCompanyLicensesController: the ONE Company Licenses list (Print on disclosures + disclosure sentence, state optional for the NMLS company row, ISO state normalization, NMLS row fills the profile's legal name / primary NMLS), /licensing/needs-you and /licensing/coverage (License Map data) for every settings right holder. - Enforcement: setSelectedProgram refuses a program not offered or not offered on the loan's channel; a loan-file channel change re-checks it; the lead program picker, the LOE scorer **************** MLOS_TAKE_APPLICATION switch endpoint removed) and a new public offered-programs-by-host read follow the catalog. - Licensing gate (once a state license is entered): create-from-lead, property state changes (staff + borrower), portal promotion and the public application refuse a property in an unlicensed state with a plain sentence (409 STATE_NOT_LICENSED); BaseLosController.error renders MLOS refusals instead of a 500. - LicenseRenewalReminderJob: 60/30/7-day reminders for company (market setup) and officer (own) licenses, one alert per event through the notification centre (LICENSE_RENEWAL_COMPANY / LICENSE_RENEWAL_OWN), singleton-locked. - OrgStateLicenseController deleted; the public footer reads the merged list.
