Unlock Content Brain — How Content Is Managed

Current-state reference. All V2 schema decisions approved. Signals Belief System live across all renderings. Tier B class registry formalised. Werner architectural review incorporated.
23 atoms 20 renderings 8 pillars 10 surfaces 17 belief signals 7 Tier B classes

Overview

The Unlock Content Brain is the canonical content substrate for the Unlock HNW decision-support platform. All content is atomic, curated by Tom, indexed by Werner's classifier, and deployed via surface-specific renderings.

23
ACUs (atoms)
20
Renderings
8
Pillars
5
Belief stages
10
Surfaces
12
Signal moments
7
Tier B classes
28
Recipes

ACID Principles

Architecture

TierWhat it containsManaged bySupabase table?
Tier AACUs, renderings, personas, pillars, channels, belief stages, compliance, recipes — the canonical ACID content rowsTom curates, Werner seeds to SupabaseYes — all 8 Tier A classes
Tier BStrategy docs, methodology frameworks, campaign configs, indexes, plus 7 registered classes (AUD, CSE, DEC, GLO, PER, REG, RES)Tom authors, referenced via backed_by string IDs11_campaigns/ only (tenant-scoped, ADR-013). Others: references-only.

The Four Design Principles (all implemented)

Design moveWhat it meansStatus
Context is first-classStrategy, methodology, campaigns, and indexes each have a dedicated folder (09–12). No more orphaned docs in legacy folders.Live
Funnel is routableRenderings carry resolves_signal — the investor belief they address (C1, S2, etc.). Werner routes on signal code, not static BS1–BS5 declaration. Delivery routing (surface + moment) is a separate dimension. Belief signal system spec: 546_SPEC_Signal_System_V1. Schema card: BS-027 (Werner, in progress).Live — resolves_signal + surface + moment
Backing is self-declaringEvery Tier A entity declares backed_by (upstream). Methodology docs declare cascades_into (downstream). Impact analysis from frontmatter, not classifier re-run.Phase 2 — in progress
Lifecycle is explicitSeparate lifecycle_stage axis (concept → drafted → ratified → deployed → retired) distinct from curation status (LOCKED/APPROVED).Phase 4 — queued

Folder Structure

157 files across 12 numbered subfolders + utility folders. Tier A folders (01–08) hold canonical ACID content. Tier B folders (09–12) hold context and meta-content. Utility folders hold working state.

Tier A — Canonical ACID content

Tier B — Context and meta-content

Utility folders

Root files

Three root files: CLAUDE.md (folder index, Werner entry point), WERNER-START-HERE.md, WERNER-COWORK-SETUP.md. These may migrate to 10_methodology/onboarding/ in Phase 5 but are intentionally stable until then.

Schema V2 — Frontmatter Reference

Full frontmatter field set. All new fields are additive — existing entities without them continue to work. Werner's parser reads fields only when present; no breaking change.

FieldType / ValuesRequired?Notes
IDENTITY (unchanged from ADR-014)
idstringYesEquals filename stem minus -Vn suffix. Classifier flags drift.
typestringYesEntity class (acu, rendering, pillar, persona, compliance, recipe, etc.)
statusLOCKED | APPROVED | PENDING | DRAFT | DEPRECATEDYesImmutability + curation gate. Distinct from lifecycle_stage.
tenant_idstringYesAlways unlock until Cloudworkz OS multi-tenant (2027).
VERSIONING (unchanged)
versionintegerYesIncrements on each supersede. V1 on first write.
is_currentbooleanYesOnly one version per entity is true. Superseded versions stay in place with false.
superseded_bystring (filename)ConditionalSet when is_current flips to false.
PROVENANCE (unchanged)
decision_idstringRecommendedLinks ACU back to the decision record that authorised it.
sourcestringRecommendedPrimary source for the claim (regulatory doc, research, etc.).
AUDIT (unchanged)
last_modifiedYYYY-MM-DDYesSet on every write. Classifier uses for freshness.
modified_bystringYesWho last edited.
LIFECYCLE (new — V2)
lifecycle_stageconcept | drafted | ratified | deployed | retiredRecommendedWhere in the build-deploy pipeline. Separate axis from status.
next_review_dateYYYY-MM-DDRecommendedComputed by classifier. LOCKED ACU +180d; APPROVED +90d; DRAFT +30d.
review_ownertom-king | werner-snyman | claudia-chavez | fiorella-fogliniRecommendedWho is accountable for the next review. Distinct from modified_by.
ROUTING — BELIEF SIGNAL SYSTEM + DELIVERY (new — live in Supabase)
resolves_signalSignal code: C1, C2, C3, C4, G1–G3, L1–L2, P2–P3, S1–S6Required for renderingsPrimary routing key. Which investor belief this rendering addresses. Werner queries by this field. Source: 546_SPEC / BS-027.
surface10 codes — follow-up-email, pdf-download, outbound-email, etc.Required for renderingsWHERE the content is delivered. Delivery routing dimension — independent of belief resolution.
primary_moment12 codes — cold-first-touch, mid-funnel-nurture, etc.Required for renderingsWHEN delivered — the observable prospect signal at send time. Delivery routing only.
secondary_momentsarray of moment codesRecommended for renderingsAdditional send-time signals this rendering serves.
belief_stageBS1 | BS2 | BS3 | BS4 | BS5Kept as overlayCoarse derived overlay. Not the primary routing key — resolves_signal is. Never merged with signal codes.
campaign_roleawareness | engagement | decision | commitment | cross-funnel | not-in-campaignComputedClassifier writes back on each run. Werner queries Supabase directly.
in_campaignsarray of campaign slugsOptionalExplicit campaign membership. e.g. [eis-oct-2026].
BACKING (new — V2, Phase 2)
backed_byarray of entity IDsPhase 2 — in progressUpstream methodology / strategy / framework IDs that authorise this entity.
cascades_intoarray of entity IDsPhase 2 — in progressDownstream Tier A entities this doc cascades to. Impact analysis without re-run.
supersedesstringConditionalID this entity replaces (alongside superseded_by on the old file).
OWNERSHIP (new — V2)
tom_curatedboolean (default true)OptionalTom approved this entity. Default true for all curated content.
werner_seedablebooleanOptionalParser includes in Supabase seed. False for strategy, methodology, indexes.
fiorella_ownedbooleanOptionalFiorella's content. Currently on CP1 only.
claudia_ownedbooleanOptionalClaudia's brand / design content.
QUALITY (new — V2)
craft_resultPASS | FAIL | DEFERREDRenderings onlyTom's craft review gate.
uat_resultPASS | FAIL | DEFERREDRenderings onlyUser acceptance test result.
coverage_qualityhigh | medium | lowComputedHigh = 3+ ACUs + 1 pillar + 1+ personas. Medium = 2. Low = 1 or fewer.

Example — Rendering frontmatter (current standard)

--- id: 360_CONTENT_PensionTimeBomb type: rendering status: LOCKED tenant_id: unlock version: 2 is_current: true last_modified: 2026-06-01 modified_by: tom-king # Lifecycle (V2) lifecycle_stage: deployed next_review_date: 2026-09-01 review_owner: tom-king # Signals routing (live) surface: pdf-download primary_moment: cold-first-touch secondary_moments: [awareness-build, list-warm-reach] campaign_role: awareness in_campaigns: [eis-oct-2026] # Quality craft_result: PASS uat_result: PASS coverage_quality: high ---

Belief Signal System

The belief signal system tracks the 17 beliefs an investor needs to hold before they commit. Each signal has a state. After every call, Werner's routing rule finds the highest-priority unresolved signal with a mapped artifact and sends it. Spec source: 546_SPEC_Signal_System_V1_CURRENT.md. Schema card: BS-027 (Werner, in progress).

Two separate routing dimensions. resolves_signal (which belief a rendering addresses) is the primary routing key. belief_stage (BS1–BS5) is a coarse derived overlay — kept but not used as the routing key. surface + primary_moment handle delivery routing (where and when to send). Never merged.

The one routing rule

After every call: find the highest-priority signal that is not green, not red, and not N/A, and has a mapped artifact. Send that artifact. Priority order: QT → QL → C1 → C2 → C3 → C4 → [persona cluster] → S1 → S2 → S3 → S4 → S5 → S6

Signal categories

CategoryCodesWhat it answersPriority
QualificationQT QLCan this person participate? (factual gates — tax rate, liquidity)Highest — checked first
Core BeliefsC1 C2 C3 C4Is the problem real, is the market broken, is EIS worth it, is the risk understood?Second — must be green before persona or situational
Problem BeliefsG1–G3 L1–L3 P1–P3Does Unlock solve their specific version of the problem? (varies by persona)Third — only the relevant persona cluster activates
Situational BeliefsS1–S6Is this team, product, valuation, and opportunity worth backing?Lowest — only after core and problem are resolved

Five signal states

StateMeaningRouting behaviour
greenBelief established — investor holds itSkip — no artifact needed
amberRaised but unresolved — uncertainty or partial agreementActive — highest priority amber gets the artifact
greyNot yet surfaced — topic hasn't come upActive — treated as unresolved; artifact sent when it's the highest priority
redFirm negative — not uncertainty, a clear noRe-routing trigger — see Red Signal Logic. Never try to move red to green.
n_aNot applicable to this investor (persona or explicit)Skip entirely — excluded from routing

Signal registry — Qualification

CodeNameStatesSurfaced on
QTTax Rateconfirmed / not_confirmed / unknownCall 1 — "Are you paying higher or additional rate?"
QLLiquidityconfirmed / not_confirmed / unknownCall 1 — "Do you have capital to deploy, or is it tied up?"

Signal registry — Core Beliefs

CodeNameSequence ruleSurfaced on
C1Problem RecognisedFirst core beliefCall 2 — "Can you see everything you own in one place?"
C2Scarce Assets InsightAfter C1. Established by narrative, not by question.Call 2 — detected by listener reaction to EIS scarcity narrative
C3EIS Worth UnderstandingAfter C2Call 2 — "Does EIS make sense as a mechanism?"
C4Risk UnderstoodAfter C3. COMPLIANCE GATE.Call 2 — "How comfortable with illiquid, capital at risk?"

Signal registry — Problem Beliefs (persona-specific)

CodeNamePersonaActive when
G1Fee Awarenessgrowth_seekerPersona = growth_seeker
G2Deal Flow Gapgrowth_seekerPersona = growth_seeker
G3Early Entry Valuegrowth_seekerPersona = growth_seeker
L1IHT Exposurelegacy_builderPersona = legacy_builder
L2BPR Awarenesslegacy_builderPersona = legacy_builder
L3BLOCKEDlegacy_builderNever — pending legal
P1BLOCKEDpreserverNever — pending legal
P2Concentration RiskpreserverPersona = preserver
P3Visibility ValuepreserverPersona = preserver

Signal registry — Situational Beliefs

CodeNameActive whenSurfaced on
S1Unlock CredibleAfter C4 greenCall 2 — "Did the demo make sense for your situation?"
S2InvestableAfter S1 greenCall 2 or 3 — "Consider backing as well as using?"
S3Valuation FairAfter S2 greenCall 3
S4Team Can ExecuteAfter S2 greenCall 3
S5Terms ProtectAfter S2 greenCall 3
S6Timing RightAfter S2 greenCall 3

The five gates

GateConditionEffect
C4 Compliance GateC4 != greenNo content below C4 may be sent. Only artifact: 140_access_explainer
Pack 1 GateS2 == green AND C4 == green AND demo_score ≥ 70Pack 1 eligible. All three conditions required.
Persona Gatepersona == undeterminedOnly core and qualification signals are actionable. Problem beliefs not activated.
S-Cluster GateS1 != greenS2–S6 not activated.
S2 Routing GateS2 stateGreen → Book 1 (investor track). Grey → Nurture. Amber → send one-pager, revisit. Red → nurture only, no further situational beliefs.

Call sequence — what surfaces when

CallTypeSignals surfaced
Call 1Cold CallQT, QL, persona signals, C1
Call 2Demo + Fact FindC1–C4, persona beliefs (G/L/P cluster), S1, S2, needs/problems/angles
Call 3OpportunityS2–S6, resolves remaining beliefs, closes or routes to adviser

Delivery routing — separate dimension

Surface and moment codes handle WHERE and WHEN content is delivered. These are independent of which belief the rendering resolves.

FieldCodesWhat it controls
resolves_signalQT, QL, C1–C4, G1–G3, L1–L2, P2–P3, S1–S6WHICH belief this rendering addresses. Primary routing key in Werner's parser.
surface10 codes (follow-up-email, pdf-download, outbound-email…)WHERE it is delivered — the physical medium
primary_moment12 codes (cold-first-touch, mid-funnel-nurture…)WHEN it is delivered — the observable prospect signal at send time
belief_stageBS1–BS5Coarse overlay. Derived from signal state. Not used as primary routing key.

Lifecycle

Two separate axes: status (immutability + curation gate) and lifecycle_stage (where in the build-deploy pipeline). A LOCKED ACU can still be retired. A DRAFT ACU can be in the ratified stage. They are independent.

Lifecycle stages

Concept
Entry: idea logged in draft or scratch
Exit: first substantial draft written
Review: TTL 30d before abandonment flag
Drafted
Entry: substantial draft with frontmatter
Exit: Tom ratifies (APPROVED or LOCKED)
Review: 30d
Ratified
Entry: Tom approval; enters classifier ledger
Exit: Werner seeds + rendering deploys
Review: 60–90d by class
Deployed
Entry: live in campaign + Supabase served
Exit: Tom retires or supersedes
Review: 90–180d by class
Retired
Entry: Tom marks deprecated
Exit: moved to _archive/ on next restructure
Review: n/a

Status vocabulary (curation gate — separate axis)

StatusMeaningEditable?Supabase-seedable?
LOCKEDTom-approved, wording verbatim-locked. ACU verbiage cannot change without supersede event.No — must supersedeYes
APPROVEDTom-approved, editable in place. Typically renderings and recipes.Yes (minor edits)Yes
PENDINGAwaiting Tom review. Classifier flags for action.YesNo
DRAFTWork in progress. Not yet reviewed.YesNo
DEPRECATEDNo longer in use. Retained for history. Maps to lifecycle_stage: retired.NoNo

Review cadence by class

ClassLOCKED / APPROVEDDRAFT / PENDING
ACU180 days30 days
Rendering90 days30 days
Recipe90 days30 days
Pillar90 days30 days
Compliance180 days30 days
Persona180 days30 days

Campaigns

Campaigns are first-class entities in 11_campaigns/. Each campaign is a markdown config file that declares funnel rules, included personas, target pillars, and surface/moment routing per funnel stage. Entities opt in via in_campaigns: frontmatter.

Q6 confirmed. Campaigns are tenant-scoped per ADR-013. One Unlock tenant per campaign file. Campaign query structure confirmed live in Supabase.

Campaign file schema

campaign_id: eis-oct-2026 launch: 2026-10-01 target: first 50 subscribers status: active target_pillars: [CP1_AdviceGap, CP2_AlternativesImperative, CP4_TaxArchitecture, CP6_DecisionSupport] target_personas: [P3, P5, P9] funnel_rules: awareness: belief_stages: [BS1, BS2] surfaces: [outbound-email, linkedin-dm, linkedin-feed] moments: [cold-first-touch, list-warm-reach, post-ad-engagement, awareness-build] engagement: belief_stages: [BS2, BS3] surfaces: [pdf-download, live-webinar, platform] moments: [pre-qualification, mid-funnel-nurture, post-call-nurture] decision: belief_stages: [BS3, BS4] surfaces: [pdf-download, sales-pack, platform] moments: [pre-demo, post-demo, decision-support] commitment: belief_stages: [BS4, BS5] surfaces: [follow-up-email, outbound-call, voicemail] moments: [urgency-close, objection-recovery] owner: tom-king collaborators: [fiorella-foglini, werner-snyman]

How entities connect to campaigns

DirectionHowExample
Campaign → entitiesCampaign file declares funnel rules; classifier resolves which entities match per funnel stageeis-oct-2026.md funnel rules match 12 renderings automatically
Entity → campaignEntity frontmatter carries in_campaigns: [eis-oct-2026] for explicit membership override360_PensionTimeBomb explicitly in EIS campaign
OverrideCampaign file supports include_entities_explicit and exclude_entities for edge casesExclude a rendering from a campaign even if rules would include it

Campaign roles (computed by classifier)

RoleMeaningFunnel position
awarenessServes BS1/BS2 signalsTop of funnel
engagementServes BS2/BS3 signalsMid funnel
decisionServes BS3/BS4 signalsLower funnel
commitmentServes BS4/BS5 signalsClose
cross-funnelServes 3+ funnel stages (acceptable when primary_moment is clear)All stages
not-in-campaignNot yet assigned to any active campaignn/a

Naming Convention

Class-code prefix scheme adopted opt-in for new files. Existing files keep their current names and IDs. Every entity (new or existing) carries a class_code: frontmatter field for self-declaration without rename.

No mass rename. Existing wikilinks are not broken. A batch-rename utility is available for when the team decides to migrate, but it is not part of any current phase.

Class-code prefix reference

ClassCodeNew file patternExisting file example
ACUACU-ACU-topic-modifier.mdacu_eis_30_percent_relief.md
RenderingREN-REN-NNN-TYPE-Name.md360_CONTENT_PensionTimeBomb.md
Persona archetypePER-PER-PN-Archetype.mdP3_Archetype.md
Persona cellCEL-CEL-PN-EN-Archetype-Engine.mdP3_E1_Archetype_Engine.md
PillarPIL-PIL-CPN-Name.mdCP1_AdviceGap.md
ChannelCHN-CHN-name.mdcold-email.md
Belief stageBSG-BSG-BSN-Name.mdBS1_Unaware.md
ComplianceCMP-CMP-topic.mdcomp_capital_at_risk.md
RecipeREC-REC-category-subcategory.mdrecipe_funnel_ic_walkthrough.md
StrategySTR-STR-domain-topic-Vn.md(new class, no legacy files)
MethodologyMET-MET-framework-name-Vn.md00_PERSONA_FRAMEWORK.mdMET-persona-framework-V1.md
CampaignCAM-CAM-campaign-slug.md(new class)
IndexIDX-IDX-view-name.mdINDEX.md files

Version suffix rule

SituationConvention
First versionNo suffix, or -V1 (both valid; be consistent per class)
Subsequent versions-V2, -V3, etc. Mandatory on every supersede.
ID fieldEquals filename stem minus -Vn suffix. e.g. file ACU-eis-30-V2.mdid: ACU-eis-30

Tier B Classes

7 Tier B classes formally registered. Each carries a class code, folder path, ID pattern, and backing role. Tier B entities are not seeded to Supabase as canonical rows (except campaigns, which have their own table). They are referenced from Tier A via backed_by string IDs.

Q7 answered. All 7 Tier B classes confirmed and registered with folder paths and id patterns.

Tier B vs Tier A — key differences

Tier ATier B
Supabase tableYes — all 8 classes have canonical tables11_campaigns/ only (ADR-013). Others: references-only.
Werner seedsYes — werner_seedable: trueNo — werner_seedable: false
Classifier runs onYes — full integrity + freshness passStructural check only (folder + frontmatter)
Reference mechanismWikilinks + Supabase FKbacked_by: string IDs in Tier A frontmatter
Tom curationRequired — every LOCKED/APPROVED entityRequired — but lighter gate (no verbatim-lock on prose)

Migration Status

Werner's revised 6-phase migration plan. Phase 0 (answering Q1–Q7) is complete. Phase 1 is ready to start mid-June 2026.

Questions resolved: Q1 (surface + moment worked example — answered by live implementation), Q6 (campaign tenant scoping — confirmed ADR-013), Q7 (Tier B classes — 7 registered). Q2, Q3, Q4, Q5 resolved through implementation choices.

Reversibility notes

PhaseReversible?How
Phase 1 — schema + folder additionsFully reversibleNew fields are optional; empty folders remove without data loss
Phase 2 — backing passReversibleClear backed_by + cascades_into fields
Phase 3 — surface + momentPartially reversibleOnce Werner's parser reads surface + moment, rollback requires parser revert. ADR required before starting.
Phase 4 — lifecycleReversiblelifecycle_stage field removable without data loss
Phase 5 — namingclass_code frontmatter: reversible. Filename rename: one-way (wikilink-rewriter pass required)Do frontmatter-only pass first; commit to rename separately
Phase 6 — campaignsReversibleSupabase versioning preserves prior seed; table add is reversible