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.
ACID Principles
Architecture
| Tier | What it contains | Managed by | Supabase table? |
|---|---|---|---|
| Tier A | ACUs, renderings, personas, pillars, channels, belief stages, compliance, recipes — the canonical ACID content rows | Tom curates, Werner seeds to Supabase | Yes — all 8 Tier A classes |
| Tier B | Strategy docs, methodology frameworks, campaign configs, indexes, plus 7 registered classes (AUD, CSE, DEC, GLO, PER, REG, RES) | Tom authors, referenced via backed_by string IDs | 11_campaigns/ only (tenant-scoped, ADR-013). Others: references-only. |
The Four Design Principles (all implemented)
| Design move | What it means | Status |
|---|---|---|
| Context is first-class | Strategy, methodology, campaigns, and indexes each have a dedicated folder (09–12). No more orphaned docs in legacy folders. | Live |
| Funnel is routable | Renderings 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-declaring | Every 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 explicit | Separate 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
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.
| Field | Type / Values | Required? | Notes |
|---|---|---|---|
| IDENTITY (unchanged from ADR-014) | |||
id | string | Yes | Equals filename stem minus -Vn suffix. Classifier flags drift. |
type | string | Yes | Entity class (acu, rendering, pillar, persona, compliance, recipe, etc.) |
status | LOCKED | APPROVED | PENDING | DRAFT | DEPRECATED | Yes | Immutability + curation gate. Distinct from lifecycle_stage. |
tenant_id | string | Yes | Always unlock until Cloudworkz OS multi-tenant (2027). |
| VERSIONING (unchanged) | |||
version | integer | Yes | Increments on each supersede. V1 on first write. |
is_current | boolean | Yes | Only one version per entity is true. Superseded versions stay in place with false. |
superseded_by | string (filename) | Conditional | Set when is_current flips to false. |
| PROVENANCE (unchanged) | |||
decision_id | string | Recommended | Links ACU back to the decision record that authorised it. |
source | string | Recommended | Primary source for the claim (regulatory doc, research, etc.). |
| AUDIT (unchanged) | |||
last_modified | YYYY-MM-DD | Yes | Set on every write. Classifier uses for freshness. |
modified_by | string | Yes | Who last edited. |
| LIFECYCLE (new — V2) | |||
lifecycle_stage | concept | drafted | ratified | deployed | retired | Recommended | Where in the build-deploy pipeline. Separate axis from status. |
next_review_date | YYYY-MM-DD | Recommended | Computed by classifier. LOCKED ACU +180d; APPROVED +90d; DRAFT +30d. |
review_owner | tom-king | werner-snyman | claudia-chavez | fiorella-foglini | Recommended | Who is accountable for the next review. Distinct from modified_by. |
| ROUTING — BELIEF SIGNAL SYSTEM + DELIVERY (new — live in Supabase) | |||
resolves_signal | Signal code: C1, C2, C3, C4, G1–G3, L1–L2, P2–P3, S1–S6 | Required for renderings | Primary routing key. Which investor belief this rendering addresses. Werner queries by this field. Source: 546_SPEC / BS-027. |
surface | 10 codes — follow-up-email, pdf-download, outbound-email, etc. | Required for renderings | WHERE the content is delivered. Delivery routing dimension — independent of belief resolution. |
primary_moment | 12 codes — cold-first-touch, mid-funnel-nurture, etc. | Required for renderings | WHEN delivered — the observable prospect signal at send time. Delivery routing only. |
secondary_moments | array of moment codes | Recommended for renderings | Additional send-time signals this rendering serves. |
belief_stage | BS1 | BS2 | BS3 | BS4 | BS5 | Kept as overlay | Coarse derived overlay. Not the primary routing key — resolves_signal is. Never merged with signal codes. |
campaign_role | awareness | engagement | decision | commitment | cross-funnel | not-in-campaign | Computed | Classifier writes back on each run. Werner queries Supabase directly. |
in_campaigns | array of campaign slugs | Optional | Explicit campaign membership. e.g. [eis-oct-2026]. |
| BACKING (new — V2, Phase 2) | |||
backed_by | array of entity IDs | Phase 2 — in progress | Upstream methodology / strategy / framework IDs that authorise this entity. |
cascades_into | array of entity IDs | Phase 2 — in progress | Downstream Tier A entities this doc cascades to. Impact analysis without re-run. |
supersedes | string | Conditional | ID this entity replaces (alongside superseded_by on the old file). |
| OWNERSHIP (new — V2) | |||
tom_curated | boolean (default true) | Optional | Tom approved this entity. Default true for all curated content. |
werner_seedable | boolean | Optional | Parser includes in Supabase seed. False for strategy, methodology, indexes. |
fiorella_owned | boolean | Optional | Fiorella's content. Currently on CP1 only. |
claudia_owned | boolean | Optional | Claudia's brand / design content. |
| QUALITY (new — V2) | |||
craft_result | PASS | FAIL | DEFERRED | Renderings only | Tom's craft review gate. |
uat_result | PASS | FAIL | DEFERRED | Renderings only | User acceptance test result. |
coverage_quality | high | medium | low | Computed | High = 3+ ACUs + 1 pillar + 1+ personas. Medium = 2. Low = 1 or fewer. |
Example — Rendering frontmatter (current standard)
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).
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
Signal categories
| Category | Codes | What it answers | Priority |
|---|---|---|---|
| Qualification | QT QL | Can this person participate? (factual gates — tax rate, liquidity) | Highest — checked first |
| Core Beliefs | C1 C2 C3 C4 | Is the problem real, is the market broken, is EIS worth it, is the risk understood? | Second — must be green before persona or situational |
| Problem Beliefs | G1–G3 L1–L3 P1–P3 | Does Unlock solve their specific version of the problem? (varies by persona) | Third — only the relevant persona cluster activates |
| Situational Beliefs | S1–S6 | Is this team, product, valuation, and opportunity worth backing? | Lowest — only after core and problem are resolved |
Five signal states
| State | Meaning | Routing behaviour |
|---|---|---|
green | Belief established — investor holds it | Skip — no artifact needed |
amber | Raised but unresolved — uncertainty or partial agreement | Active — highest priority amber gets the artifact |
grey | Not yet surfaced — topic hasn't come up | Active — treated as unresolved; artifact sent when it's the highest priority |
red | Firm negative — not uncertainty, a clear no | Re-routing trigger — see Red Signal Logic. Never try to move red to green. |
n_a | Not applicable to this investor (persona or explicit) | Skip entirely — excluded from routing |
Signal registry — Qualification
| Code | Name | States | Surfaced on |
|---|---|---|---|
QT | Tax Rate | confirmed / not_confirmed / unknown | Call 1 — "Are you paying higher or additional rate?" |
QL | Liquidity | confirmed / not_confirmed / unknown | Call 1 — "Do you have capital to deploy, or is it tied up?" |
Signal registry — Core Beliefs
| Code | Name | Sequence rule | Surfaced on |
|---|---|---|---|
C1 | Problem Recognised | First core belief | Call 2 — "Can you see everything you own in one place?" |
C2 | Scarce Assets Insight | After C1. Established by narrative, not by question. | Call 2 — detected by listener reaction to EIS scarcity narrative |
C3 | EIS Worth Understanding | After C2 | Call 2 — "Does EIS make sense as a mechanism?" |
C4 | Risk Understood | After C3. COMPLIANCE GATE. | Call 2 — "How comfortable with illiquid, capital at risk?" |
Signal registry — Problem Beliefs (persona-specific)
| Code | Name | Persona | Active when |
|---|---|---|---|
G1 | Fee Awareness | growth_seeker | Persona = growth_seeker |
G2 | Deal Flow Gap | growth_seeker | Persona = growth_seeker |
G3 | Early Entry Value | growth_seeker | Persona = growth_seeker |
L1 | IHT Exposure | legacy_builder | Persona = legacy_builder |
L2 | BPR Awareness | legacy_builder | Persona = legacy_builder |
L3 | BLOCKED | legacy_builder | Never — pending legal |
P1 | BLOCKED | preserver | Never — pending legal |
P2 | Concentration Risk | preserver | Persona = preserver |
P3 | Visibility Value | preserver | Persona = preserver |
Signal registry — Situational Beliefs
| Code | Name | Active when | Surfaced on |
|---|---|---|---|
S1 | Unlock Credible | After C4 green | Call 2 — "Did the demo make sense for your situation?" |
S2 | Investable | After S1 green | Call 2 or 3 — "Consider backing as well as using?" |
S3 | Valuation Fair | After S2 green | Call 3 |
S4 | Team Can Execute | After S2 green | Call 3 |
S5 | Terms Protect | After S2 green | Call 3 |
S6 | Timing Right | After S2 green | Call 3 |
The five gates
| Gate | Condition | Effect |
|---|---|---|
| C4 Compliance Gate | C4 != green | No content below C4 may be sent. Only artifact: 140_access_explainer |
| Pack 1 Gate | S2 == green AND C4 == green AND demo_score ≥ 70 | Pack 1 eligible. All three conditions required. |
| Persona Gate | persona == undetermined | Only core and qualification signals are actionable. Problem beliefs not activated. |
| S-Cluster Gate | S1 != green | S2–S6 not activated. |
| S2 Routing Gate | S2 state | Green → Book 1 (investor track). Grey → Nurture. Amber → send one-pager, revisit. Red → nurture only, no further situational beliefs. |
Call sequence — what surfaces when
| Call | Type | Signals surfaced |
|---|---|---|
| Call 1 | Cold Call | QT, QL, persona signals, C1 |
| Call 2 | Demo + Fact Find | C1–C4, persona beliefs (G/L/P cluster), S1, S2, needs/problems/angles |
| Call 3 | Opportunity | S2–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.
| Field | Codes | What it controls |
|---|---|---|
resolves_signal | QT, QL, C1–C4, G1–G3, L1–L2, P2–P3, S1–S6 | WHICH belief this rendering addresses. Primary routing key in Werner's parser. |
surface | 10 codes (follow-up-email, pdf-download, outbound-email…) | WHERE it is delivered — the physical medium |
primary_moment | 12 codes (cold-first-touch, mid-funnel-nurture…) | WHEN it is delivered — the observable prospect signal at send time |
belief_stage | BS1–BS5 | Coarse 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
Status vocabulary (curation gate — separate axis)
| Status | Meaning | Editable? | Supabase-seedable? |
|---|---|---|---|
LOCKED | Tom-approved, wording verbatim-locked. ACU verbiage cannot change without supersede event. | No — must supersede | Yes |
APPROVED | Tom-approved, editable in place. Typically renderings and recipes. | Yes (minor edits) | Yes |
PENDING | Awaiting Tom review. Classifier flags for action. | Yes | No |
DRAFT | Work in progress. Not yet reviewed. | Yes | No |
DEPRECATED | No longer in use. Retained for history. Maps to lifecycle_stage: retired. | No | No |
Review cadence by class
| Class | LOCKED / APPROVED | DRAFT / PENDING |
|---|---|---|
| ACU | 180 days | 30 days |
| Rendering | 90 days | 30 days |
| Recipe | 90 days | 30 days |
| Pillar | 90 days | 30 days |
| Compliance | 180 days | 30 days |
| Persona | 180 days | 30 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.
Campaign file schema
How entities connect to campaigns
| Direction | How | Example |
|---|---|---|
| Campaign → entities | Campaign file declares funnel rules; classifier resolves which entities match per funnel stage | eis-oct-2026.md funnel rules match 12 renderings automatically |
| Entity → campaign | Entity frontmatter carries in_campaigns: [eis-oct-2026] for explicit membership override | 360_PensionTimeBomb explicitly in EIS campaign |
| Override | Campaign file supports include_entities_explicit and exclude_entities for edge cases | Exclude a rendering from a campaign even if rules would include it |
Campaign roles (computed by classifier)
| Role | Meaning | Funnel position |
|---|---|---|
awareness | Serves BS1/BS2 signals | Top of funnel |
engagement | Serves BS2/BS3 signals | Mid funnel |
decision | Serves BS3/BS4 signals | Lower funnel |
commitment | Serves BS4/BS5 signals | Close |
cross-funnel | Serves 3+ funnel stages (acceptable when primary_moment is clear) | All stages |
not-in-campaign | Not yet assigned to any active campaign | n/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.
Class-code prefix reference
| Class | Code | New file pattern | Existing file example |
|---|---|---|---|
| ACU | ACU- | ACU-topic-modifier.md | acu_eis_30_percent_relief.md |
| Rendering | REN- | REN-NNN-TYPE-Name.md | 360_CONTENT_PensionTimeBomb.md |
| Persona archetype | PER- | PER-PN-Archetype.md | P3_Archetype.md |
| Persona cell | CEL- | CEL-PN-EN-Archetype-Engine.md | P3_E1_Archetype_Engine.md |
| Pillar | PIL- | PIL-CPN-Name.md | CP1_AdviceGap.md |
| Channel | CHN- | CHN-name.md | cold-email.md |
| Belief stage | BSG- | BSG-BSN-Name.md | BS1_Unaware.md |
| Compliance | CMP- | CMP-topic.md | comp_capital_at_risk.md |
| Recipe | REC- | REC-category-subcategory.md | recipe_funnel_ic_walkthrough.md |
| Strategy | STR- | STR-domain-topic-Vn.md | (new class, no legacy files) |
| Methodology | MET- | MET-framework-name-Vn.md | 00_PERSONA_FRAMEWORK.md → MET-persona-framework-V1.md |
| Campaign | CAM- | CAM-campaign-slug.md | (new class) |
| Index | IDX- | IDX-view-name.md | INDEX.md files |
Version suffix rule
| Situation | Convention |
|---|---|
| First version | No suffix, or -V1 (both valid; be consistent per class) |
| Subsequent versions | -V2, -V3, etc. Mandatory on every supersede. |
| ID field | Equals filename stem minus -Vn suffix. e.g. file ACU-eis-30-V2.md → id: 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.
Tier B vs Tier A — key differences
| Tier A | Tier B | |
|---|---|---|
| Supabase table | Yes — all 8 classes have canonical tables | 11_campaigns/ only (ADR-013). Others: references-only. |
| Werner seeds | Yes — werner_seedable: true | No — werner_seedable: false |
| Classifier runs on | Yes — full integrity + freshness pass | Structural check only (folder + frontmatter) |
| Reference mechanism | Wikilinks + Supabase FK | backed_by: string IDs in Tier A frontmatter |
| Tom curation | Required — every LOCKED/APPROVED entity | Required — 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.
Reversibility notes
| Phase | Reversible? | How |
|---|---|---|
| Phase 1 — schema + folder additions | Fully reversible | New fields are optional; empty folders remove without data loss |
| Phase 2 — backing pass | Reversible | Clear backed_by + cascades_into fields |
| Phase 3 — surface + moment | Partially reversible | Once Werner's parser reads surface + moment, rollback requires parser revert. ADR required before starting. |
| Phase 4 — lifecycle | Reversible | lifecycle_stage field removable without data loss |
| Phase 5 — naming | class_code frontmatter: reversible. Filename rename: one-way (wikilink-rewriter pass required) | Do frontmatter-only pass first; commit to rename separately |
| Phase 6 — campaigns | Reversible | Supabase versioning preserves prior seed; table add is reversible |