AIOHM platform 2.9.0
A white-label core. The founder's own brand site left the platform as a separate Composer package, and nothing in the core names it any more. A brand plugs in through extension points instead of edits to shared code.
For brand packages
- Approval handlers:
ApprovalHandlerRegistryhands approve and reject decisions to a handler registered per tool name. A failing handler puts the request back to pending. - Workflow engine:
ExecuteWorkflowJob::registerServiceClass()beside the static allowlist;WorkflowQueueResolverpicks a queue frommetadata.dispatch_queueor registered rules. - Video:
HyperFramesVideoService::registerTemplate(); the genericavatar_presentertemplate takes avatar, background and logo from options. - Mautic journey rules:
config/journey_rules.php(points, log type, segments, stage owner, custom fields, tags per lead source). The core ships no rules. - Question catalogue:
echo_intake.questionsandcurrent_question, or a registered source. - CSRF: a package exempts its own public endpoints with
ValidateCsrfToken::except().
Platform features under their own names
- Audience echo at
/echofor every tenant inECHO_INTAKE_TENANTS; brand line fromECHO_INTAKE_BRAND_NAME/_TAGLINEor the tenant name; review gateECHO_REVIEW_ENABLED. - Echo moderation:
EchoModerationAgent(agent nameecho_review),ReviewEchoAnswer,EchoApprovalHandler(toolecho_human_answer). Older approvals keep working through legacy names a package registers. - Living answer:
echo:synthesize-questionhourly for every tenant with the intake enabled, in a voice fromECHO_SYNTHESIS_VOICEor the Brand Book. - Follower barometer at
/barometerwithconfig/barometer.php(BAROMETER_*), milestones and the AIOHM Social scoreboard.
Settings that moved from code to config
WHITE_LABEL_FACEBOOK_PAGE: the Facebook page the white-label proof post goes to. Blank leaves it as a draft. admin.aiohm.org must set it.WHITE_LABEL_SCOUT_FALLBACK_CSV: optional fallback lead CSV.MAUTIC_SEGMENT_ALIAS_*for the journey lead sources default to blank; the brand package that uses them sets them.
Migrations
- Tenant: the founder brand's legacy daily-journey table is dropped on installs without the brand package. It is empty on every client tenant.
Upgrade notes
- A per-agent model override saved under the previous moderation agent name does not carry over to
echo_review. - Servers that run a brand package install it after the core sync; the fleet script ships the package as a Composer artifact built from its checkout.
- bella-luna stays on 2.6.1 until its host runs PHP 8.4.
