ADR 0018 ACCEPTED • VISUAL LOGIC CHAIN • 2026-04-21

Campaign Logic Chain

End-to-end map from brief input through cell selection, lander routing, tool completion, dynamic post-result monetization, and Stage R signal capture. Visualizes the two-axis model (6-path monetization_path × 4-mode lander_mode) accepted in ADR 0018.

Current State — 2026-04-30

ADR 0018 Accepted 2026-04-21. Phase 5 SKILLs deployed against the 6-path × 4-mode taxonomy.

6Paths
4Lander Modes
9/9SKILLs Regen
4Hybrid Cells Dormant
Active for MVP

Path 1 only

affiliate_aggregator_portal routing to edu.degreesources.com at $35 CPL flat. ContentForge tracking contract uses s1-s5 sub-mapping. Lander modes archetype_tool_embedded + content_site_tool_direct.

Implemented but dormant

Path 6 + Worker

hybrid_dynamic + tool-level routing_rules[] + Cloudflare Worker at workers/tool-router/. 4 hybrid cells (S3.F4 / S5.F3 / S6.F8 / S7.F1) authored with placeholder routing — activates per-cell as partners land.

Designed — awaiting partner

Paths 2, 3, 4

affiliate_direct_online_school, organic_campus_school_redirect, aggregator_marketplace_ping_post. Empty school-list scaffolds shipped. Hosted-post variant of path 3 is operator's intended model — not just generic ping/post.

Always available

Path 5

content_only for SEO + platform quality signal. Lander mode content_site_article_direct only valid here. No paid traffic; no monetization claims.

📖 This page below: Visual reference for the accepted taxonomy. Section 1 is the full Mermaid logic chain. Compatibility matrix shows which lander modes are valid per path. Original "Why this exists" callout preserved as historical scoping record (the conversation that led to ADR 0018).

Why this exists (scoping conversation, preserved as historical record)

ADR 0013’s monetization_path enum (Accepted 2026-04-19) had 4 values: affiliate_online / direct_school / content_only / hybrid. Operator 2026-04-21 clarification surfaced two material expansions: (1) the economic-endpoint enum needs 6 values, not 4, to distinguish aggregator-portal vs direct-online-school vs ping/post-marketplace vs organic-campus-school vs content-only vs hybrid-dynamic; and (2) lander mode is a separate orthogonal axis (4 values) that describes how the ad enters the funnel, not where the money comes from. ADR 0018 captured all 10 OQ rulings + 3 pre-walkthrough pivots + 2 renames. Worker 3.5-C migrated the 32-cell corpus; Phase 5.1-5.8 SKILL regen ran against the new taxonomy. This page remains the visual reference for the accepted taxonomy.

Current state (active today)
Future state (partnership pending)
Organic-only (no paid traffic)
Always available (content/brand)
Not applicable / nonsensical combo
1 The Full Logic Chain
Brief → cell selection → copy+creative → lander → tool completion → dynamic monetization routing → Stage R. Color-coded by current vs future state. Persona-v2 tool-as-proof thesis holds at every routing node.
flowchart TD
  classDef input fill:#0d0d1a,stroke:#2a3a6a,color:#6a8cf7,stroke-width:1px
  classDef engine fill:#12121a,stroke:#4a2a4a,color:#af6adf,stroke-width:1px
  classDef stage fill:#0d1a0d,stroke:#1a3a1a,color:#4acf4a,stroke-width:1px
  classDef landing fill:#1a1a0d,stroke:#3a3a1a,color:#cfcf4a,stroke-width:1px
  classDef current fill:#0a2a0a,stroke:#1a4a1a,color:#4acf4a,stroke-width:2px
  classDef future fill:#1a1a0d,stroke:#3a3a1a,color:#cfcf4a,stroke-width:1px,stroke-dasharray:4 4
  classDef organic fill:#0d0d1a,stroke:#2a3a6a,color:#6a8cf7,stroke-width:1px,stroke-dasharray:4 4
  classDef always fill:#1a0d1a,stroke:#3a1a3a,color:#cf4acf,stroke-width:1px
  classDef signal fill:#1a0d0d,stroke:#3a1a1a,color:#cf8a4a,stroke-width:1px

  A["Campaign Brief
vertical_tag · intends_paid_traffic
projected_spend_usd · persona_segments · goal"]:::input A --> B["Strategy Engine — Cell Selection
32-cell corpus walk per ADR 0013 rule_12
For each selected cell, resolve:
• monetization_path (1 of 6)
• lander_mode (1 of 3) NEW
• archetype_tag (only for archetype_* modes)
• proof_mechanism_id (FK to tool_registry)
• paid_traffic_eligible (derived + persona AND school gate)"]:::engine B --> C["Stage 3 + 4 — Copy × Creative
Angle-per-cell copy matrix
Creative variants per angle × platform
Ads route to lander per lander_mode"]:::stage C --> D{"Lander Mode"}:::landing D -->|"content_site_tool_direct"| E["Tool on content site
Long-form content surrounds tool
Primary for organic + high-quality signal"]:::landing D -->|"archetype_tool_embedded"| F["Archetype lander
Tool embedded inline
Bridges between ad aggression + tool proof"]:::landing D -->|"archetype_prequalifier"| G["Archetype pre-qualifier
2-3 Q quick qualification
→ then routes to Tool"]:::landing E --> H F --> H G --> H H["Tool Completion — Dynamic Routing Decision
User sees RESULT + options
System evaluates:
• HHI · location · intent · vet status · credit · school preference
• Available partner routes (current state)
• Consent state (for ping/post compliance)"]:::engine H --> I1["★ affiliate_aggregator_portal
$35 CPL external partner
CURRENT primary revenue today"]:::current H --> I2["affiliate_direct_online_school
SNHU · Purdue Global · WGU · Strayer
FUTURE — pending direct deals"]:::future H --> I3["aggregator_marketplace_ping_post
Education Dynamics · Archer · LeadHoop · PX
FUTURE — multi-buyer with consent"]:::future H --> I4["organic_state_school_redirect
UT · OU · UF · UM · Bama · state flagships
ORGANIC ONLY (no paid traffic)"]:::organic H --> I5["content_only
Deep educational dive
ALWAYS AVAILABLE — brand + SEO moat"]:::always I1 --> S["Stage R — Signal Capture
Which monetization_path × lander_mode × archetype_tag × proof_mechanism_id combos converted?
Feeds Winners Vault + exploration vault
Closes the loop to next campaign's Strategy Engine"]:::signal I2 --> S I3 --> S I4 --> S I5 --> S S -.->|"winners_vault_readback v0.4.0"| B
Reading the chart: the dynamic routing decision at tool completion is the new load-bearing concept. In today’s ADR 0013 shape, each cell binds to exactly one monetization_path up-front. In the proposed shape, most cells are hybrid_dynamic — the cell emits a tool that gathers the data, and the routing-endpoint decision is deferred to tool-completion time based on that data. The operator called this out explicitly: “The tool produces the data that determines the routing.”
2 The Two-Axis Decision Matrix
monetization_path (6 values) × lander_mode (3 values) — which combinations are valid, which are strategically preferred, which are nonsensical. Current state vs future state labeled per cell.

2.1 — monetization_path (proposed 6 values)

Enum value Paid-traffic eligible State Description
affiliate_aggregator_portal Yes CURRENT Today's $35 CPL external partner (LeadAmplify-style matching portal that accepts a degree sub-param). Primary revenue channel.
affiliate_direct_online_school Yes FUTURE SNHU · Purdue Global · WGU · Strayer direct relationships. Cuts aggregator middleman, preserves paid-traffic eligibility, richer framing allowed (“matched with SNHU”).
aggregator_marketplace_ping_post Yes FUTURE Education Dynamics · Archer · LeadHoop · PX.com ping/post or host/post marketplaces. Multi-buyer lead distribution from our tools with explicit consent capture.
organic_state_school_redirect No (organic only) ACTIVE ORGANIC Texas State · OU · UF · UM · Alabama · state flagships. UTM-tracked outbound to school application portals. Brand-building + potential future direct rev-share.
content_only No ALWAYS AVAILABLE Deep educational article or tool with no immediate monetization hook. CPM-reduction on parallel paid campaigns + topical authority.
hybrid_dynamic Per sub-route OPERATIONAL TARGET Tool completes → result + dynamic options routed by HHI · location · intent · vet status · school preference. Most cells will live here.

2.2 — lander_mode (proposed 3 values, NEW orthogonal axis)

Enum value Entry point Tool placement Best for
content_site_tool_direct Ad → content-site tool page Tool IS the lander; surrounded by long-form educational content High-quality-signal campaigns · organic-path cells · state-school redirect · content-heavy audiences
archetype_tool_embedded Ad → archetype lander Tool embedded inline in the lander Bridges ad-aggression to tool-proof. Advertorial or authority-notice framing + tool below the fold.
archetype_prequalifier Ad → archetype pre-qualifier 2-3 quick questions → routes to tool Vet-eligibility gates · HHI disqualifier · employer-tuition filter · high-qualification-value campaigns

2.3 — monetization_path × lander_mode combinations

↓ monetization_path \ lander_mode → content_site_tool_direct archetype_tool_embedded archetype_prequalifier
affiliate_aggregator_portal ✓ CURRENTTool on site → $35 CPL partner after completion. Primary today. ✓ CURRENTArchetype advertorial/authority + tool inline → partner. Also primary today. ✓ Some cellsQuick qualifier (HHI/age) → tool → partner. Used for filtering.
affiliate_direct_online_school FUTUREPost direct deal: tool on site → SNHU/WGU branded flow. FUTUREBranded archetype + tool inline → direct school. FUTUREVA-eligibility or HHI qualifier → tool → matched direct school.
aggregator_marketplace_ping_post FUTUREPost-consent: tool collects data → ping/post to multi-buyer marketplace. ✓ Strongest fitArchetype lander with embedded tool + explicit TCPA/consent capture → ping/post. Pre-qualifier doesn't fit ping/post economics (marketplaces want full intake before buying).
organic_state_school_redirect ✓ Primary pathContent SEO + tool → UTM-tracked outbound to state school portal. Persona B traffic today. Archetype framing is overkill for organic; users arrive via SEO not paid. Organic doesn't need pre-qualification — user is already segmented by search intent.
content_only ✓ DefaultArticle or tool page with no monetization hook. CPM-reduction + authority. Archetype-style aggression doesn't fit brand-signal-only intent. No conversion endpoint to qualify for.
hybrid_dynamic ✓ Most flexibleTool on content site → result + dynamic routing per user profile. Default target. ✓ SecondaryArchetype lander + tool inline → dynamic routing at completion. ✓ When gating mattersPre-qualifier filters first → tool → dynamic routing. Adds friction but richer data.
Hot takes from the matrix: (a) content_site_tool_direct × hybrid_dynamic is the operational target for most cells going forward — it's the cleanest expression of the persona-v2 tool-as-proof thesis. (b) aggregator_marketplace_ping_post × archetype_tool_embedded is the only natural fit for ping/post because marketplaces price on full intake + consent, not on qualified-only leads. (c) organic_state_school_redirect is content-site-only by construction — no paid traffic means no archetype-lander use case. (d) content_only only exists in the content-site lane; it's an anti-pattern to wrap brand-signal content in an archetype lander.

2.4 — How this maps onto the current 32-cell corpus

Migration implication (non-binding, for ADR 0018 drafting): today all 32 cells carry monetization_path: affiliate_online post-ADR-0013 migration (except Persona B–targeted cells which flipped to direct_school or hybrid). Under the proposed expansion, the bulk of cells should reclassify as hybrid_dynamic × content_site_tool_direct, with select cells reclassified per the operator's persona/cell mapping work (BR-2 of ADR 0013 is the precedent). Worker 3.5-C scope amendments would land in a Phase 5 follow-up session.
3 Worked Examples
Three representative campaign briefs walked through the full chain — brief → cell → lander → tool → dynamic monetization → Stage R.

Example 1 — S1.F6 · Parent of HS senior · HHI $140K · TX resident

Brief: vertical_tag=edu, intends_paid_traffic=true, persona_segment includes Persona B (parent-of-HS-senior), goal=lead_gen. Operator reserves budget for exploration on parent segment. Cell selected: S1.F6 (aid-letter-decoder-adjacent). Strategy Engine resolves monetization_path: hybrid_dynamic, lander_mode: content_site_tool_direct, proof_mechanism_id: edu_efc_calculator. Copy + Creative: Stage 3 emits ad variants framing “see your actual combined aid in 2 minutes” with tool-backed credibility. Creative matches UGC library for parent demographic. Lander: Ad clicks to content_site_tool_direct — EFC Calculator tool page on degreesources.com, surrounded by long-form aid-decoding content. Tool completion: User enters HHI $140K, TX location, “kid attending traditional college” signal. Dynamic routing evaluates: HHI > $100K + TX + on-campus preference → NOT a fit for $35 CPL portal (portal doesn't serve this segment). Monetization routing: Tool result screen shows: (a) calculated aid breakdown + sources, (b) organic_state_school_redirect dynamic option to UT Austin / Texas State application portals (UTM-tracked), (c) optional “also consider an online program” path to the $35 CPL partner if user self-selects that. Stage R signal: Logs which sub-route converted (state-school click-out vs partner conversion vs content_only exit) — feeds Winners Vault per-cell readback.

Example 2 — S6.F8 · Post-9/11 veteran · exploring online graduate programs

Brief: vertical_tag=edu, persona_segment=Persona D (veteran), goal=lead_gen, intends_paid_traffic=true. Cell selected: S6.F8 (full veteran picture: Ch33 + MHA + Yellow Ribbon + VR&E + TEB). Strategy Engine resolves monetization_path: hybrid_dynamic, lander_mode: archetype_prequalifier, proof_mechanism_id: edu_gi_bill_calculator. Pre-qualifier filters VA status and service era before surfacing the calculator. Copy + Creative: Archetype lander with vet-identity-first framing; 2 pre-qual questions (“Post-9/11 status?” and “Active / discharged?”) route to tool. Lander + Tool: User answers qualifier → GI Bill Calculator computes MHA + Ch33 coverage + Yellow Ribbon match based on target school tier. Tool completion: Tool identifies Yellow Ribbon match with $18K annual gap coverage. Dynamic routing evaluates: veteran + graduate + Yellow Ribbon eligible + online preference. Monetization routing: Two sub-routes offered: (a) affiliate_direct_online_school if SNHU or Purdue Global graduate program matches (FUTURE — falls back to aggregator portal today), OR (b) organic_state_school_redirect to a TX State or Alabama Yellow Ribbon program if user prefers on-campus. Stage R signal: Logs which sub-route converted. Yellow Ribbon school attribute is captured separately from monetization_path — it's a SCHOOL attribute, not a path.

Example 3 — S7.F1 · Employer tuition reimbursement eligible

Brief: vertical_tag=edu, persona_segment=Persona C (career changer with employer benefits), goal=lead_gen. Cell selected: S7.F1 (dual-§127 household / employer tuition). Strategy Engine resolves monetization_path: hybrid_dynamic, lander_mode: content_site_tool_direct, proof_mechanism_id: edu_employer_tuition_checker. Copy + Creative: “See what your employer covers in 3 minutes” — §127 anchor tied to tool-backed proof. Lander + Tool: Tool on content site surrounded by employer-tuition explainer content. User enters employer, household status, spouse employer. Tool completion: Tool shows $10,500 combined cap (dual-§127 household stacking). Dynamic routing evaluates: employer benefit eligible + explicit “yes, I consent to being contacted” checkbox. Monetization routing: If consent captured + profile fits multiple buyers → aggregator_marketplace_ping_post to Education Dynamics / Archer / PX multi-buyer distribution (FUTURE — falls back to $35 CPL portal today). If user prefers direct-online path → affiliate_direct_online_school route instead. Stage R signal: Captures consent-state + which buyer(s) accepted the ping + final CPL distribution per buyer.
4 What Changes in the Research Layer ✓ All implemented — Sessions #41–#46 (2026-04-21 to 2026-04-27)
Originally authored as the scope ADR 0018 would define. Every item below has shipped.
✓ Implementation summary: ADR 0018 Accepted 2026-04-21 (commit 1cb13fc) ruling all 10 OQs + 3 pivots + 2 renames. Worker 3.5-C shipped cell-angle-rules.json v0.3.0 at commit 8488d5f (2026-04-22). Phase 5.1–5.8 SKILL regen + Worker 3.5-D cell-assignments shipped through 2026-04-27 (commit 62058f7). Phase 5 deployment loop CLOSED 2026-04-27. Original section content preserved as historical record.

4.1 — ADR footprint ✓ Done

4.2 — Schema bumps ✓ All shipped

4.3 — Skill implications ✓ 9 of 9 SKILLs deployed

4.4 — Worker 3.5-C implications ✓ Shipped

✓ Worker 3.5-C shipped 2026-04-22 at commit 8488d5f — walked the 32-cell corpus, set monetization_path + lander_mode + archetype_tag per cell; added routing_override[] field (default empty on non-hybrid_dynamic cells); migrated all hybrid cells to hybrid_dynamic with operator input on paid_subset + direct_school_subset resolution; created school_attributes.schema.json v0.1.0; folded direct-school-partners.json fields into shared sub-schema; created campus-school-partners.json + aggregator-portal-school-roster.json scaffolds. Worker 3.5-D Task 2 cell-assignments shipped 2026-04-27 at commit 62058f7.
5 Open Questions for Operator ✓ All 10 RULED 2026-04-21 (Session #41 walkthrough)
All 10 OQs ruled in operator walkthrough. Verdicts captured in docs/adr/ADR-0018-OQ-VERDICTS.md + ADR 0018 (Accepted 2026-04-21). Per-OQ verdict tags shown below; original OQ content preserved as historical record of the deliberation.
OQ-1How is hybrid_dynamic routing logic itself defined per cell?
✓ RESOLVED — Page recommendation accepted with specifics
Verdict: Routing rules live on tool (tool_registry.json → routing_rules[]); cell-level routing_override[] replaces (not merges) defaults. Predicate is safe-expression grammar (comparison + logical + in + partner_live(partner_id)); priority-ordered, first match wins; fallback_on_partner_unavailable chain. Halt: [HYBRID_DYNAMIC_NO_ROUTING_RULES].
hybrid today (ADR 0013) uses a hybrid_routing block with paid_subset_segment_match[] and direct_school_subset_segment_match[] — a 2-way fork. hybrid_dynamic is an N-way fork across up to 4 active monetization paths plus a content-only fallback. Proposal: new dynamic_routing_rules[] array per cell where each entry is {predicate, target_monetization_path, priority} and the engine evaluates them at tool-completion time. Who owns authoring these rules? The cell-angle-rules author, or a separate per-tool routing config? (Recommend: per-tool because the tool knows what data it collects; operator decides cell overrides.)
OQ-2Does lander_mode live on the cell, or on the angle, or on both?
✓ RESOLVED — Option (c) accepted
Verdict: Cell-level allowed_lander_modes[] (array, ordered by author preference) + angle-level lander_mode (scalar, optional). Default: angle inherits first element of cell's allowed set. Halt: [ANGLE_LANDER_MODE_NOT_IN_CELL_ALLOWED_SET].
Cells can have multiple angles; angles could plausibly use different lander_modes (e.g., a “just-show-me-the-math” angle routes to content_site_tool_direct, while a “quick-qualifier” angle on the same cell uses archetype_prequalifier). Three options: (a) lander_mode is cell-level, all angles inherit; (b) lander_mode is angle-level, cell enumerates allowed set; (c) both — cell declares allowed set, angle picks one. Recommend (c) — matches how monetization_path already works on the cell with per-angle override potential.
OQ-3What's the consent/tracking model for organic_state_school_redirect?
✓ RESOLVED — Zero PII outbound + server-side decision log (Pivot 3)
Verdict: Zero PII leaves our domain on organic_campus_school_redirect (renamed from organic_state per Pivot 1). UTM extends ADR 0013 BR-4 with new utm_id=<tool_session_id> (16-char anonymous random, GA4 campaign_id standard). Server-side decision log on our side: {tool_session_id, cell_id, routing_decision_path, target_school_id, tool_result_anonymized_summary_hash, decision_timestamp}. No PII persisted beyond ~15min rate-limit window. Partnership conversations correlate tool_session_id back to anonymous decision-log without PII exchange.
ADR 0013 BR-4 established utm_source=degreesources · utm_medium=organic · utm_campaign=<cell_id> · utm_content=<tool_id> · utm_term=<persona_id> for direct-school outbound. Is that still correct for organic_state_school_redirect? And specifically: zero PII leaves our domain (pure UTM) or do we capture email on our side before redirect? Recommend zero PII + UTM only for organic path — preserves “we didn't sell your data” credibility that's structurally different from aggregator marketplace.
OQ-4Minimum volume threshold for aggregator_marketplace_ping_post to make sense?
✓ RESOLVED — Schema-governed auto-flip with default 100 leads/month
Verdict: Config at config/validation-rules.json → platform_requirements.aggregator_marketplace_ping_post.min_monthly_lead_volume (default 100). Brief field: brief.yaml → projected_monthly_lead_volume required for ping/post-target briefs. Strategy engine auto-flips sub-threshold cells to affiliate_aggregator_portal for that campaign. Tier-2 halt: [MONETIZATION_PATH_AUTOFLIPPED_VOLUME] (emit + continue). Per-partner override deferred to v2.
Ping/post marketplaces typically require 100+ leads/month to open an account. Cells with sub-threshold volume shouldn't route here — they'd either fail account-opening or get deprioritized by marketplaces. Does the strategy engine need a min_monthly_volume_for_path[] config, or is this an operator-manual decision? Recommend config with default so the engine auto-flips to affiliate_aggregator_portal fallback when projected volume is below the marketplace threshold.
OQ-5Should affiliate_aggregator_portal and affiliate_direct_online_school coexist on the same cell, and if so, how does the engine choose?
✓ RESOLVED — Option (c) accepted; hybrid_dynamic swallows this naturally (Pivot 1)
Verdict: Cells set monetization_path: hybrid_dynamic + tool's routing_rules[] handles direct-vs-portal as sub-routes. Pattern: priority-1 rule with partner_live('snhu') && user.degree_interest in snhu.accepted_programs → SNHU direct, fallback portal; catch-all rule → portal. New fields on partners: is_currently_accepting_leads (required) + daily_quota_remaining (nullable). Partner-status is data, not code — flip availability without schema migration.
A cell serving the adult-returner persona could route to either SNHU direct OR the $35 CPL portal, depending on whether direct partnerships are live. Options: (a) cell declares a single path, operator flips when direct deals close; (b) cell declares a preference order [direct, portal] and the engine uses whichever is active; (c) hybrid_dynamic swallows this naturally as sub-routes. Recommend (c) — this is exactly what hybrid_dynamic is for. Direct and portal are sub-routes, not separate monetization_path assignments.
OQ-6Yellow Ribbon as a school attribute — where does it live in the schema?
✓ RESOLVED — Pivot 2 expanded: shared school_attributes.schema.json v0.1.0
Verdict: NEW shared sub-schema with required fields: modality, yellow_ribbon_participant, yellow_ribbon_annual_gap_coverage_usd, institutional_type, title_iv_eligible, accreditation_body, hbcu, hispanic_serving_institution, religious_affiliation. Applied via $ref to 3 school-list files (existing direct-school-partners + new campus-school-partners + new aggregator-portal-school-roster). Routing predicates may reference target_school.<attribute>. Halt: [SCHOOL_ATTRIBUTE_FK_UNRESOLVED].
Operator clarified: Yellow Ribbon is a SCHOOL attribute (eligibility to participate in the YR program), not a monetization_path. Both online direct schools (SNHU, Purdue Global) and state/private universities can participate. Proposal: add yellow_ribbon_participant: boolean + yellow_ribbon_annual_gap_coverage_usd: integer|null to the direct-school-partners.json schema AND to a new state-school-partners.json schema. Routing logic reads the attribute at tool completion, not the monetization_path. Does this match operator intent, or should YR be its own sub-route type?
OQ-7Does content_only × content_site_tool_direct need a distinct label?
✓ RESOLVED — MODIFIED: 4th lander_mode value added (content_site_article_direct); no nulls anywhere
Verdict: Operator pushed back on null-lander_mode approach. New 4th value content_site_article_direct (ad → article page, no tool flow; TOFU/native use case). 4-mode enum: content_site_tool_direct / content_site_article_direct / archetype_tool_embedded / archetype_prequalifier. Validator-enforced compatibility matrix (see Section 2.3 above — updated to 6×4). Halt: [LANDER_MODE_INCOMPATIBLE_WITH_MONETIZATION_PATH].
Matrix row shows content_only is only valid with content_site_tool_direct lander_mode. If the combination is unique, the two fields carry redundant information on content-only cells. Alternative: content_only implies content_site_tool_direct by default and the lander_mode field is null/inapplicable. Recommend allow null lander_mode on content_only cells + validator enforces the constraint. Clean schema; no redundant data.
OQ-8Where does the dynamic routing decision logic physically execute?
✓ RESOLVED — Cloudflare Worker at workers/tool-router/
Verdict: Server-side endpoint /api/route/<tool_id>. TypeScript Cloudflare Worker mirroring workers/capi-relay/ pattern. Hot config via Cloudflare KV (~60s cache) for routing_rules + partner status. Decision log: Analytics Engine real-time + D1 persistent (Stage R feed). Safe-fallback to affiliate_aggregator_portal on engine error. A/B cohort override hook for routing-rule experiments. Halt: [ROUTING_ENGINE_ERROR].
At tool completion, the system evaluates user profile + available partner routes + consent state and picks a monetization_path. This logic can live: (a) in the tool's JavaScript on the content site; (b) in a server-side /route endpoint on degreesources.com; (c) in FourthRight (the offer platform). Options trade off latency vs ops visibility vs A/B test control. Recommend (b) — server-side endpoint on our domain, with FourthRight ping/post happening downstream of that decision. Lets us log the decision + outcome for Stage R even when the final click leaves our domain.
OQ-9Naming: is the 6-value enum the right final shape, or should we collapse any pair?
✓ RESOLVED — Keep all 6 values separate
Verdict: All 6 paths remain distinct. Modality-in-the-label pattern retained (_online_school / _campus_school_) — explicit beats implicit. Future affiliate_direct_campus_school flagged for 18-24 months out (Pivot 3). Reasoning: each path wires to materially different plumbing (partner config shapes, consent language, A/B dimensions, Stage R attribution).
Argument for collapsing affiliate_aggregator_portal + aggregator_marketplace_ping_post into one aggregator_* path with a sub-type: both go through aggregators, just different economic models. Counter: economics ARE materially different ($35 CPL single-buyer vs per-lead ping/post multi-buyer), compliance posture is different (portal: standard affiliate disclosure; ping/post: explicit TCPA + multi-buyer consent), and operational setup is different. Recommend keep separate — collapsing them loses the economic-regime distinction the enum exists to capture.
OQ-10Does hybrid_dynamic replace the current hybrid value, or coexist?
✓ RESOLVED — Option (a) accepted: rename + delete legacy hybrid_routing block
Verdict: Rename hybrid → hybrid_dynamic; delete legacy hybrid_routing block; logic moves to tool-level routing_rules[] or cell-level routing_override[]. Per-cell migration of existing hybrid cells required operator input (cannot be automated due to pre-Pivot-1 ambiguity on direct-school modality). Migration absorbed into Worker 3.5-C expanded scope. Halts: [LEGACY_HYBRID_VALUE_UNMIGRATED], [ROUTING_OVERRIDE_ON_NON_HYBRID_CELL].
ADR 0013's hybrid is a 2-way fork (paid_subset vs direct_school_subset). hybrid_dynamic is N-way. Options: (a) rename hybridhybrid_dynamic and expand its semantics — clean migration, no dual concept; (b) keep both with hybrid as legacy 2-way fork and hybrid_dynamic as N-way — ugly but lossless. Recommend (a) — the 2-way fork is a degenerate case of the N-way fork.

All Next Actions Completed

Originally this section listed 5 next actions for ADR 0018 + Worker 3.5-C + Phase 5 regen. All 5 actions shipped between 2026-04-21 and 2026-04-27:

Pipeline validator: 329/337 pytest passing post-regen. Halt-markers: HALT-MARKERS v1.3.0 shipped 2026-04-27 with all 7 tier-1 + 1 tier-2 markers from ADR 0018 OQ rulings registered. Two non-blocking follow-ups deferred: 5.6.1 routing_quality_metrics populator (blocked on first Phase 7 close per ADR 0015 BR 15-3); 5.9.1 build-export-package.py (operator-runnable manually).