Changelog

What we shipped.

A quiet log of the work as it merges. Written by Ken Lannon.

May 31, 2026

Advanced Studio superset engine + live checkout

Six days across two fronts. The Advanced canvas advances toward a true superset of the Basic scan: a parallel findings ledger runs alongside the joined master, per-parent primary file designation ships with a visual picker, and the board becomes plug-and-play with outcome-first entry. Simultaneously the marketing funnel goes live end-to-end — /pricing connects to Stripe checkout, beta pricing rounds to clean numbers, and a P2 UX fleet pass closes friction ahead of broader beta.

  • Advanced superset engine — findings ledger runs alongside the joined master (ADV-SUPERSET-01); AdvancedFile→AnalysisSession bridge wired; per-parent primary file designation with visual picker ships (Phase 1 of ADV-SUPERSET-05).
  • Advanced Studio plug-and-play — outcome-first entry, board wiring, and layout fix make the canvas operable without setup friction; canvas-primary layout lands with a review-connection modal and single center action.
  • Advanced canvas fixes — before_after intent runs with one confirmed node; containment score and scoped helper-key suggestions corrected; drop target trusted when file carries own role discriminators; auth gate copy and authGateAction state type corrected.
  • Live checkout/pricing wired to Stripe end-to-end; tripwire pricing pass; beta pricing rounded to $250/mo (Studio) and $30/mo (Advanced) with copy synced sitewide.
  • Feedback screenshots — screenshot attachments accepted via paste, click, or drag on the feedback widget.
  • Ingest hardening — unparseable .xls rejected before SheetJS produces garbage output; .xlsx converted in the Advanced Studio path before Papa.parse; recommended-fields CTA routes to /workspace/scan; hr_snapshot_diff surfaced in commissions dept pack.
  • UX fleet + copy — P2 fixes: 8-second findings teaser delay, session-persist dismiss, upload hover, signup click target, real scan count in Verify teaser; manager/owner cross-column suggestions suppressed in Compare; audit-driven marketing copy sweep; VERA dead code removed and live chat disabled pending AI tier funding.
May 24, 2026

Finance Ops AR engine + Advanced canvas Drift Check

Three days of parallel work. A Finance Ops department launches end-to-end — XLSX ingestion, CRM↔ERP AR reconciliation, multi-currency exposure, and synthetic Salesforce exports — while the Advanced canvas is rebuilt around a Drift Check hub with an Intent Modal, parent/child node hierarchy, and schema-mismatch intercept before node drops. Verify tier clarity and funnel fleet issues close out the sprint.

  • Finance Ops department — XLSX upload support added; Finance Ops/AR-AP selectable at signup via grouped department picker (Finance / People / Revenue / Audit); magic-link routing sends finance_ops users to the AR workspace.
  • AR reconciliation engine — CRM vs. ERP/AR scan module ships with CRM↔ERP join-detection edge, ar_netsuite module dispatch, and AR + Benefits events wired into EvidenceLog; external_id auto-detected as CRM_OPPORTUNITY_ID.
  • AR synthetic data — CRM sample files rebuilt as real Salesforce opportunity exports; customer RACM ref column added to evidence CSV; Finance Ops magic-link crash fixed by adding ERP to TemplatesRail system tones.
  • Multi-currency exposure — Financial Exposure KPI now renders a per-currency breakdown; hardcoded $ replaced with formatCurrency() throughout ExposureProjection.
  • Advanced canvas Drift Check redesign — left rail dropped; hub is now click-to-run; Intent Modal ships with 4-phase staggered exit choreography; parent nodes and nested workspace modal land (PRs 1–3); schema-mismatch intercept fires on per-node drops; accordion closes by default with tighter cards.
  • Dept-aware Advanced canvasfinance_ops users see CRM + ERP rails only; 'Master' renamed 'Primary' across all customer-facing copy; RACM jargon replaced with plain-language control reference labels sitewide.
  • ODIS expansions — feature flags wired; ODIS hero card and system inventory cards (ODIS-06, ODIS-07, ODIS-09) ship.
  • Funnel + Verify polish — 13 UX fleet issues closed (payment, hydration, discoverability); Verify sidebar, verdict hero, and redirect corrected in P0 clarity pass; speculative pricing anchors removed from Remediate + Govern tiers; SignupGatePanel wired to pricing.ts.
May 21, 2026

Advanced canvas cockpit + closed-beta launch

Five days across two major tracks. The Advanced associative-model surface was torn down to the frame and rebuilt — per-tile drawer discarded in favor of a pinned 3-rail cockpit with a linear 3-step flow that keeps users oriented without page scroll. Simultaneously, the closed-beta program shipped end-to-end: seat tracking, one-click admin approval, and a Drift Hunters v2 landing. Earlier in the week, hero copy went through three positioning passes and quota tracking moved off cookies onto Upstash Redis for durability.

  • Advanced mode cockpit — 3-rail pinned workspace with a linear Upload → Join → Preview flow replaces the per-tile drawer; accordion Join step tightens height; founder bypass and tier gate wired; canvas-level paywall removed so demo users can explore. (/advanced)
  • Advanced canvas fixes — wrapper flex collapse corrected (nodes were not rendering), cockpit rail pinned to grid-row height to stop page growth, accordion auto-expand effect no longer re-opens a user-collapsed step.
  • Closed beta page/beta ships with Drift Hunters v2 positioning, Studio Advanced hover popover, confidentiality agreement, and a FOMO teaser strip with seat counter.
  • Beta seat management — seat counter automated via Upstash Redis; one-click admin approve endpoint sends welcome email and grants Studio Unlimited; check-user endpoint verifies individual access status.
  • GTM Engine — Kanban Project Board (localStorage-backed, drag-and-drop between columns); Daily Focus gains a Work Log tab with milestones; live metrics dashboard ships with BHAG KPIs and editorial redesign.
  • Redis quota durabilityscansUsed counter migrated from cookies to Upstash Redis so scan quota survives cookie clears; KV_REST_API_* env-var aliases supported for Vercel Upstash integration.
  • Hero copy + mobile — curiosity-first H1 and Hormozi-reviewed single-CTA rewrite with dollar proof; mobile hero tightened above the fold with 7-section scroll reduction; OrgDrift LLC legal rename applied sitewide.
  • Engine fixes — COMMISSION↔ICM_QUOTA conflation corrected across fixtures and equivalence seed; CSV cohort findings now show teaser detail for Studio tier instead of a blank row; FinalCta invite form wired and ICM_TARGET_INCENTIVE exclusions added.
May 16, 2026

ODIS modal + branded PDF report + Verify bridging

The ODIS hover card is replaced with a persistent educational modal across every tier, and the score itself becomes visible to all users — non-Verify users see the contributing factors blurred with a clear upgrade path. The first branded Drift Analysis Report ships as a downloadable PDF for Studio paid users. A bridging layer lands across five product surfaces connecting Studio-tier users to the Verify value proposition in context.

  • ODIS educational modal — hover card replaced with a full modal any tier can open; ODIS score is now visible at every level. Non-Verify users see the five contributing factors blurred, with a teaser for what unlocks at Verify.
  • Branded PDF report — Drift Analysis Report available for download by Studio paid users; cream cover page, corrected 月影 mark geometry, and ODIS score section included.
  • Control_ID in CSV export — each finding row in the CSV download now carries a Control_ID that maps directly to its entry in the control catalog, making the export audit-ready out of the box.
  • Studio-to-Verify bridging — five product surfaces now surface the Verify value proposition in context; Schema Drift KPI chip and Verify-teaser links added to the results delivery email.
  • Engine fix — non-sales job titles (administrative, coordinator, support roles) excluded from ICM MISSING_RECORD findings; finding text sharpened for precision.
  • Tour fix — guided tour modal steps no longer render with an overlay scrim; ghost-record exposure calculation corrected to use OTE rather than quota.
  • Copy fix — CER lifecycle tier attribution corrected in the Controls Awaiting Sign-Off tooltip.
May 16, 2026

Schema drift + controls catalog + Verify tier restructure

Three days of compounding Verify-tier work. Schema drift ships as a first-class detection type, the prepopulated controls catalog grows from 13 to 29 controls across four department packs, and the Verify vs. Remediate tier boundary is redrawn — while a parallel hero-repositioning campaign cycled through Data Referee and operator-first framings before landing on a simpler proof-of-drift narrative.

  • Schema drift detection ships as a new engine capability — structural field changes detected and surfaced in Verify controls as a dedicated finding type.
  • Controls catalog expanded from 13 to 29 prepopulated controls across four department packs; ELGB-09, ACCR-12, ACCR-13 comparators wired into engine dispatch; /verify/controls wired to the full catalog.
  • Verify tier restructured: ODI score gated to Verify+, owner routing and CER phases 3–5 moved to Remediate, Drift Insights nav entry gated with dept-agnostic copy.
  • Verify tabs renamed — Lineage → Drift Alerts, Propagation → Drift Timeline — and full-motion locked-state demos replace the static placeholder screens.
  • Hero repositioning cycled through Data Referee framing, operator-first copy across seven sections, and a final simplification pass; fraud-risk framing and a WeCallItDrift bridge section added to marketing.
  • Checkout hardened: TOS acceptance required at payment; clickwrap wired via Stripe custom_text parameter.
  • Pricing raised post-beta across all tiers; beta banner removed; packdepartment terminology standardized throughout plans and pricing surfaces.
  • UX fleet rounds 13 + 15 closed 18 blockers; /explore tour updated to match current product surface; spotlight selectors restored so steps 2–3 advance correctly.
May 12, 2026

Round-7 value gaps closed + funnel rounds 8 + 10

Round-7 fleet surfaced that paying users were converting on a promise — real names, joinable IDs, full evidence — that the engine wasn't fully delivering after the unlock. Two engine fixes plus auth stability and post-pay landing trust.

  • Raw EMPLOYEE_ID preserved end-to-end through hashing — paid users get the joinable key they were promised. FULL_NAME stays [REDACTED] so the GDPR posture holds.
  • Benefits engine ships as a first-class finding type — ghost-enrollment detection with its own exposure math, aggregated into the per-currency exposure totals.
  • Resend email send is timeout-guarded — a slow third-party API can no longer take down /api/auth/send-magic-link and silently kill conversion on the signup step.
  • /explore no longer crashes on stale persisted results — missing array fields normalized at load so users returning via stale localStorage don't hit a blank render.
  • Scan-workspace workbench claims remaining viewport height; the scrollbar that had drifted below the fold is back in view.
  • Funnel round 8: six trust polish items from the round-7 fleet (CER positioning, CRM-mapped exposure, control completeness signals).
  • Funnel round 10: post-pay landing rewritten to confirm the unlock instead of burying it.
  • Unreachable RelationshipMapDiagram fallback removed — orphaned by the canvas redesign.
May 11, 2026

ImpactMath rebuild + UX fleet funnel campaign

Two parallel tracks on the same day. The marketing landing got rebuilt around a single visceral number ($132K), and a multi-round UX-fleet campaign worked through every blocker between landing and checkout — conversion ceiling moved from 67% toward 100% by end of day.

Marketing — lead with the loss, not the score

  • Hero leads with $132K LOSS · 6 MONTHS · ONE OPERATOR instead of ODIS jargon. KPI tiles go value-only (no deltas); AUDIT renamed to AUDIT READINESS so the % has a frame; drift duration reconciled with the $132K / 6-month narrative.
  • New ImpactMath section lands below Caroline: scales to 5 reconciliation departments, cites input assumptions, asymmetric 2/3 + 1/3 hero with a 4×2 evidence wall, live calculator inside the Annual Exposure Caught card, self-documenting tooltips + interactive chart hover on every figure.
  • FAQ + WhyOrgDrift compressed to cut scroll fatigue between hero and pricing.

UX fleet — close every funnel blocker

  • /explore first-load hang killed; hero jargon stripped; explicit "Sign Up" nav entry added.
  • /auth/continue no longer blank-screens — a magic-link redirect was landing users on an empty page mid-signup.
  • Rounds 3, 5, 6, 7 closed in succession: remaining blockers from each fleet run resolved, including a Benefits-flow blocker, an inspector PII leak, and an /explore strict-mode double-mount race.
  • Evidence tile links re-pointed at their primary sources (no more interstitial detours).
  • Fleet budget cap bumped to $150 / 200 turns so later rounds can run to completion.
  • CSP script-src widened to *.clarity.ms so the Clarity tag (allowlisted yesterday) loads on all subdomains.
May 10, 2026

Microsoft Clarity CSP allowlist

Clarity session replay had been silently blocked by the page CSP — the script never loaded, so the recording fixture (permanent observability layer for marketing + app) went dark. Allowlist Microsoft Clarity domains so the tag actually loads.

May 9, 2026

ODGF v0.2 + pricing tier restructure

The sprint addressed two product-definition gaps in parallel: the governance framework's PII classifier needed precision fixes, and the pricing tier shape had drifted from the actual product structure.

  • ODGF v0.2 fixes Step 3 PII misclassification, narrows restricted-PII patterns, adds user override acknowledgement, and redacts relational PII (emergency contact, dependents) from scan inspector output.
  • Hard-block PII / GDPR columns from Stage 2 reconciliation list; comp-sensitive columns are tagged but no longer hidden from the context picker — ODGF disclosure banner added alongside.
  • Pricing value ladder rewritten — Studio Basic / Advanced / Subscription positioned as the path to Verify; custom-control authoring re-anchored to Govern tier (Verify keeps its prepopulated controls).
  • Drift Studio Advanced workspace ships; reconciliation stage nav restyled as accessible tabs.
  • Post-scan + Generate Report flow unified on /verify; free demo CSV route added for demo runs.
  • Public /changelog page ships; footer restructured into named columns.
  • Sidebar explore mode preserved across subpages so Today correctly returns to /explore.
May 8, 2026

/verify/download into AppShell + editorial reskin

The Drift Reports surface used to render outside the (app) route group, so users clicking the sidebar item landed on a full-screen card with no sidebar, no top bar, and no escape — only the browser back button got them out.

  • Move src/app/verify/download/page.tsx under (app)/verify/download/ so it inherits the AppShell sidebar + chrome.
  • Migrate DownloadContent off raw hex to --ed-* tokens — flips with the app theme. PDF/CER HTML generators keep hardcoded hex on purpose (print artifacts ship without editorial.css).
  • Collapse the duplicate Sample CSV + Full CSV cards into one focal unlock card with the sample preview as a quiet text link inside.
  • Replace the dimmed opacity: 0.72 placeholder PDF tile with an explicit Verify-tier lock: lock icon, VERIFY TIER chip, navigates to /configure/plans-access.
  • Swap "Review with Ken" CTA off the legacy #5b5bd6 gradient onto ink-on-cream — matches every other primary CTA in editorial.
May 7, 2026

Drift Studio + cohort evidence

Guided Review becomes the primary scan workspace surface. Variable mapping ships proof previews so users see the field-equivalence evidence before approving a relationship, and reconciliation compare gets a real explain-the-score layer.

  • Default Drift Studio to Guided Review — replaces the empty-canvas hub with a workbench that walks users from sources → goal → relationship setup → reconciliation.
  • Variable mapping proof previews show normalized examples, sample row matches, and field-equivalence rationale before approval.
  • Relationship map workspace + map-native reconciliation builder land. Reconciliation evidence scores get explainable surfacing.
  • HR DNA cohort eligibility detection — infer sales-eligible cohort from job-title + plan-history signals when no explicit eligibility column exists.
  • Cohort evidence + reports download entry tied into the verified-scan paid path.
  • Vendor-agnostic copy on payroll scan source. Removed the Japanese brand label.

2026-05-05–06 — Verification Studio + per-runId unlocks

The Constellation Verification Studio replaces the old wizard-style mapping flow with a guided cockpit. Stripe becomes the source of truth for entitlements, with each $10 paid scan unlocking exactly one runId.

  • Constellation Verification Studio — guided field-match review with hierarchy-aware ordering, optional field linking, and verification-complete next-step routing.
  • Schema observations surfaced in scan workspace; field mapping review simplified.
  • ICM missing records limited to eligible HR cohort (no more flagging non-comp-eligible roles).
  • Move access enforcement to Stripe source-of-truth via metadata.run_id. AccessContext exposes isRunIdUnlocked().
  • Paid CSV export wired to the verified real-scan path; demo runs never trigger Stripe.
  • Reactflow canvas added to Visual Mapping; cross-source files rejected from role auto-assignment.
  • Reconciliation candidate scoring + fallback logic fixes; HRIS payroll pay-rate fallback removed.
May 4, 2026

月影 brand mark system + scan-workspace audit

The canonical OrgDrift mark — moon + horizon + reflection geometry, four states (aligned / drift / scanning / sealed), Canvas-animated with PNG fallback — ships across every surface. Same release: a major scan-workspace audit pass.

  • Ship <OrgDriftMark /> Canvas system with .odm-* CSS hooks. PNG static + Canvas animated, FICO 300–850 ODIS scale baked into the visual.
  • Roll the mark across app surfaces, navbar, scan engine, CER seal; full favicon set.
  • Slim OrgDriftLogo + LogoStatic; drop unused legacy mark variants.
  • Department packs defined; HR split into its own pack. Editorial header unified across scan workspace.
  • Scan-workspace audit: anchor on specialized population, redact PII in inspector dropdowns for free-tier, ubiquitous tooltips, plain-English metrics, custom cohort columns, transparency methodology page.
  • Inferred sales-eligibility from ICM matches; structurally-1:N join fields no longer flagged as duplicate-ID risks.
  • App shell simplified — full-height sidebar, utility-only header.
May 1, 2026

Shibui pass + click-through wiring

Site-wide Shibui (deliberate quietness, asymmetry over symmetry, color only on the true anomaly) sweep across DriftBoard, Live Verification, Scan Workspace, marketing landing, /controlops, PropagationMap, ODIS gauge, OdisBreakdownModal, /explore, and /wireframes/operator-dashboard. Typography discipline pass. Dark-theme palette purge.

  • Typography: max weight 700, demote 800/900. var(--font-sans) wins consistently. Slashed-zero numerics on data surfaces.
  • Dark-theme animation keyframe palette purge — no Tailwind colors leak into the editorial system.
  • Bidirectional propagation cycle + brand mark + click drill on EditorialDriftBoard. Multi-file holding chip placed.
  • Role-aware AI column suggestions + field-equivalence module land in the mapping pipeline.
  • Live Verification becomes data-driven (no more hardcoded mocks). Shibui scan handoff. /explore migrated to the editorial DriftBoard.
  • Click-through wiring across DriftBoard → Findings → global feedback. Marketing NavDropdown explicit-state with delayed close.
  • Animated DriftBoard hero mock on marketing aligned to the canonical dual-payroll story with finding-detail click-through.
  • VERA pronoun fix (gender-neutral throughout); editorial sidebar shared across app shell.
  • Shibui guided tour for the editorial DriftBoard with anchor + pointer-events rescue for stranded states.
April 30, 2026

Editorial reskin Phase 1+2: design system + DriftBoard

The locked editorial design language — ivory paper × sumi ink × cool slate × champagne gold (Apple × Rolex × Japanese DNA) — ships as a token system, an operator-dashboard wireframe, and a working /workspace rebuild.

  • Phase 1a: editorial design system foundation. src/styles/editorial.css with --ed-* tokens for paper, ink, line, signal (risk/warn/ok/info/brand), shadows, type scale, animation choreography.
  • Phase 2: editorial DriftBoard live at /workspace. Edge-to-edge layout, no floating-card framing.
  • Phase 3 + 3b: responsive + mobile drawer + light/dark theme toggle wired with persistence.
  • Tooltip primitive rebuilt — JS-driven, viewport-aware, portals to document.body.
  • ODIS hover: rich card with 5-factor breakdown + viewport-aware right-edge alignment. Click opens editorial-styled modal with expandable factor accordions.
  • Live Verification: expand-to-modal pattern with full propagation map + recent-activity log. Solid lines + traveling dots (replaced broken-looking dash trace).
  • Ask VERA editorial right-side drawer with placeholder conversation flow.
  • Two-layer card shadows for cream-on-cream lift. Dark mode: lift card surfaces + 1px top-edge highlight. Cream-on-cream tile palette = Japanese tonal hierarchy.
  • Editorial palette migration: site-wide coherency sweep. --ed-inset-* signal tokens migrated across results / editorial / analyze surfaces. FieldMappingEditorModal redesigned in editorial composition.

2026-04-22–23 — Workspace consolidation + dept packs

Multiple scan entry points (/scan, /workspace/scan, /explore) collapse onto a single /workspace shell. Department-scoped templates land. Magic-link signup gates access to the workspace.

  • Friction-free CSV upload pass — silent-failure fixes, discoverability improvements.
  • Canvas-based /workspace/scan with benefits module, snapshot-diff templates, mapping editor.
  • 4-corner layout, themed canvas, rich edge labels, progressive disclosure, compact edge labels.
  • Unified /workspace shell + tier-gate teasers. Single scan entry. Collapsible DriftBoard sidebar.
  • Magic-link signup wired through to scan-required gate; Work Items 404 fixed.
  • Department-scoped templates + snapshot diffs + dedicated mapping editor.
  • Skip-aware post-demo nudge; mobile KPI grid fix; ODIS KPI grid stops cramping at lg widths.
  • Report badge bumped to ODR-2026-0408.
April 21, 2026

Persona-aware demo + magic-link auth + scan quotas

Demo gets persona-aware ODIS gauge / artifacts / controls. Magic-link signup with department selection ships. Per-finding currency + 5-scan quota cap with upgrade-to-Team modal land.

  • Persona-aware ODIS gauge + artifact content + controls findings.
  • VERA chat expansion + DashboardShell refactor (DriftAgent removed).
  • Mobile touch targets, tab scroll, responsive layout fixes on the demo.
  • Plans & Access tab + theme toggle fix; moved Plans & Access into its own route. Drop Appearance from Settings.
  • Tier differentiation + feature tooltips on the value ladder. Replace GTM pricing panel with full compare-plans matrix (Free–Pro only).
  • Magic-link signup with department selection (homegrown HMAC, not Clerk/NextAuth).
  • Per-finding currency tag → propagated into VeraPanel + CSV preview + grouped exposure in ReportsPanel/PDF export.
  • 5-scan quota for drift_scan with capability previews + quota nudges. 5-scan hard cap with upgrade-to-Team modal.
  • Connectors roadmap copy + pass-rate tooltip. Caroline copy polish.
  • Curated test datasets to ≤5 findings with the Jordan Okafor dual-payroll ghost scenario. ACME 5k-row dataset with Ken Lannon anchor.
  • Workspace: hide LENS selector in header, render Pass Rate KPI from live-derived control statuses.
  • UI: feedback pill clears VERA panel; /scan hrefs in demo replaced with AuthGateModal.
April 20, 2026

Smart Mapping + Engine v2 + RACM controls + access engine

The biggest engineering day of the sprint: scan moves into the app shell, Smart Mapping gets a major intelligence pass, RACM-aligned controls land, and Stripe + access integration goes live.

  • Move scan into app shell + migrate all components to useTheme().
  • ACME test dataset rebuilt with real ADP + SuccessFactors schemas; zip codes + tenure decimals normalized.
  • autoDetect: EMPLOYEE_ID tie-breaking fix + missing field patterns. Pattern coverage expanded for Workday, Oracle, Ceridian, HubSpot, Varicent.
  • Smart Mapping Phase 1.5: intra-file ID disambiguation + cross-file value overlap. Auto-applies winning EMPLOYEE_ID to fieldMap. AI field suggestions auto-apply on every file load.
  • Field mapping confidence + join key inference + BASE_SALARY payroll comparison.
  • Category grouping + value normalization + auto-normalize badges. Embedded cost-center codes extracted from concatenated dept fields.
  • Currency inference from work location + country when no CURRENCY column exists.
  • CSV bundle drop with smart role detection and extra columns; unmapped recommended fields made clearly interactive.
  • Field def arrays expanded to cover any real-world export schema; jurisdiction + org fields added to payroll defs.
  • Dropdown visibility + transparency fixes (elevated row stacking context when open).
  • RACM-aligned, department-scoped controls with SOX/PCAOB framework refs.
  • Access control + Stripe integration + DriftBoard findings-to-CER pipeline shipped.
April 17, 2026

V4 light-first marketing rebuild + insights migration

Marketing landing flips from dark-first to V4 light-first. Insights/blog migrate to the V4 design system with NavbarMinimal. Typography pass.

  • V4 light-first homepage rebuild. About rebuild, signup form, navbar polish.
  • All public pages migrated to V4 light. Animated brand logo restored with hover effect.
  • Insights index + slug pages added. Insights/blog migrated to V4 design system.
  • HTML reference font styles applied globally; h1/h2 base rules moved into @layer base so Tailwind utilities override correctly.
  • Instrument Serif breathing room restored on .font-serif.
  • Linter fixes for unused imports/vars blocking Vercel build.
April 16, 2026

Tooltip system + dashboard widget overhaul

Discoverable info tooltips ship on 7 dashboard widgets. ODIS Waterfall is replaced by a more useful Top Drift Vectors widget. Findings ROI banner + per-finding remediation card + two-tier upsell land.

  • Shared TooltipCard component with dark-mode contrast fix + X close button + responsive width.
  • 7 dashboard widgets get info tooltips; sidebar count + AlertCard priority badges fixed for light mode.
  • Replace ODIS Waterfall with Top Drift Vectors widget; theme-aware, click-wires to Findings.
  • ROI banner, per-finding remediation card, two-tier upsell on Findings.
  • Persona-scoped propagation counts reconcile map with ODIS.
  • VERA: lead with Intelligence Artifacts, demote Workflow Handoff. Info icon next to Ask VERA nav. Clickable intelligence artifact previews.
  • Sticky DriftBoard header during scroll (fully opaque, header outside scrolling main).
  • Tour modal cutoff fix on short viewports.
  • Export: honor paid access instead of always showing paywall.
April 16, 2026

Synthetic Data: Skip Every Paywall

Paying $197 to "unlock" fake employee names from the bundled demo CSVs is absurd and erodes trust. From this commit forward, paywalls only apply to scans run on the user's real data (orgdrift_data_mode === 'own').

  • New useIsSyntheticScan() hook (src/lib/driftboard/dataMode.ts) — single source of truth.
  • New SyntheticDataBanner (src/components/driftboard/SyntheticDataBanner.tsx) — sticky top bar that flips the conversion ask from "$197 unlock" to "Run on YOUR data".
  • /workspace (live results surface): when synthetic, passes isPaid=true to GeminiDriftBoard, suppresses upgrade modals, sets tier label to DEMO DATA · SYNTHETIC, hides upsell pill.
  • /scan/results (legacy): when synthetic, every row reads as unlocked, anonymization is skipped (raw hashedId shown), CER pill renders as CER · DEMO (green, non-clickable), wallet-moment panel does not mount, every CTA swaps from See the names — $197 / Unlock all — $197 to Run on YOUR data → (links to /scan and clears orgdrift_data_mode).
  • The real tier in AccessContext stays untouched — synthetic only affects rendering — so any future paid-data scan still flows through the access engine normally.
April 16, 2026

DriftBoard Conversion Redesign (PLG funnel)

Why

Free tier was a paywall trailer, not a product — 2 visible findings + 4 blurred + Controls 100% locked. Bottom-of-funnel UX created loss aversion but no self-driven value. Multiple competing CTAs (Stripe checkout, /pricing, mailto, Calendly, email capture) fragmented intent. Wallet-moment modal fired on a 10s timer before buying emotion had formed. UpgradePrompt and WalletMomentPanel both raced at the same trigger.

Changes — src/app/scan/results/ResultsDriftBoard.tsx

  • PLG findings model: show ALL findings with anonymized employee codes (EMP-XXXX), not blurred-and-hidden. The map of the problem is free; the names + remediation are paid.
  • One free CER-style unlock per scan: clicking any finding row claims a single full-detail unlock (sessionStorage scoped to runId). Creates the "aha moment" that converts to $197.
  • Behavioral wallet-moment trigger: clicking a non-unlocked row or a locked CER opens the upgrade modal. Replaces the indiscriminate 10s timer.
  • Hero rebuild: Total Exposure ($) is the dominant tile (the dollar figure that drives the buy). ODIS gets a percentile pill ("Bottom 32% vs peers") to anchor the score against industry benchmarks.
  • Controls tab unblurred: show real PASS/FAIL diagnostic + failure counts (the urgency lever). Lock only the SHA-256 sealed evidence (CER) per failure.
  • CTA consolidation: every surface now offers exactly two paths — self-serve $197 checkout, or Talk to Ken (Calendly). Removed /pricing link conflict via ConversionCard removal.
  • Outcome-led copy: "Get Full Report — $197" → "See the names — $197"; "Stay in the loop" newsletter capture replaced with TrustStrip (SOC 2, money-back guarantee, founder credibility).
  • 7-day money-back guarantee surfaced inline on every CTA cluster — kills the dominant first-time-buyer objection.

Changes — src/components/analyze/WalletMomentPanel.tsx

  • New triggered prop drives behavioral trigger; built-in 60s fallback (was 10s timer).
  • Headline "See who's exposed. Get the fix." (outcome-led; was "Your scan found N findings").
  • Unlock list reordered to lead with names + remediation; PDF demoted to proof-of-fidelity.
  • Negative dismiss "Stay on free plan" replaced with relationship CTA "Or talk to Ken first →".
  • Exit-intent panel keeps both paths visible (Calendly primary, $197 self-serve still accessible) instead of forcing one.
March 18, 2026

Sprint: Design System, Logo, SEO & Site-Wide Alignment

New: Design System Primitives (src/components/primitives/)

  • Container, Section (4 tones: base / lift1 / lift2 / light), FloatPanel
  • Eyebrow, StatusDot, StatusBadge (5 semantic tones each)
  • ButtonPrimary (Von Restorff blue — only place bg-blue-500 appears), ButtonSecondary (ghost, dark/light variants)
  • IconVessel, ProofPill, TelemetryStat, SystemNodeCard, DataRow
  • OrgAccordion (Radix UI @radix-ui/react-accordion accordion, OrgDrift-styled)
  • Barrel export index.ts

New: Drift Orbit Logo System (src/components/brand/)

  • OrgDriftLogo — animated ('use client', framer-motion); orbit ring + pulse on hover
    • States: neutral (white center dot), healthy (#0EA5E9 orbit dot collapses center), drift (#FFB300)
    • Pulse: scale [0.7 → 1.5 → 0.7], opacity cycle, 0.9s infinite
  • OrgDriftLogoStatic — server-safe, same SVG geometry, no animation
  • Brand SVGs: public/brand/orgdrift-mark.svg, orgdrift-mark-healthy.svg, orgdrift-mark-drift.svg
  • SVG viewBox tightened "0 0 64 64""10 10 44 44" to fill container; orbit ring opacity=0.55 strokeWidth=1.25

New: Full Landing Page Rebuild (src/components/landing/, src/components/shared/)

  • Tonal rhythm: dark hero → dark-lift band → dark proof → light propagation → dark solution → light how-it-works → dark control record → light cases → dark founder → light FAQ → dark final CTA → dark footer
  • Sections: AnnouncementBar (dismissible), Navbar (scroll-aware sticky), Hero, HeroSystemVisual, SystemsCredibilityBand, ProofBlock, PropagationNarrative, WhereOrgDriftFits, HowItWorks, ControlRecord, UseCases, FounderCredibility, FAQ, FinalCTA
  • Shared: EmailCapture, FrictionReducer, Footer
  • GateModal preserved and wired through EmailCapture → Hero/FinalCTA
  • All CTAs: "Get Your Free Drift Scan" / "See Sample Control Record"

New: SEO Infrastructure

  • public/robots.txt — blocks /analyze, /analyze/results, /api/; allows all; Sitemap pointer
  • src/app/sitemap.ts — dynamic sitemap (all static routes + blog posts)
  • src/app/opengraph-image.tsx + twitter-image.tsx — 1200×630 dynamic OG/Twitter images (Satori/ImageResponse); fixed <br/> → flex divs for Satori compatibility
  • src/app/icon.tsx (512×512) + apple-icon.tsx (180×180) — Next.js file-convention app icons
  • src/app/layout.tsx — full OG + Twitter Card metadata, JSON-LD Organization + WebSite schemas, metadataBase, title template
  • Per-page metadata added: /about, /verify, /council, /sample-report, /pricing, /blog/[slug]
  • Layout files for 'use client' pages: council/layout.tsx, sample-report/layout.tsx, pricing/layout.tsx

New: EmailModal (src/components/ui/EmailModal.tsx)

  • Lightweight email capture modal for button-only CTAs (no name/company fields)

New: Control Event Record section on /sample-report

  • Sealed, timestamped, tamper-evident CER artifact panel for one termination drift event
  • Shows Record ID, Change Type, Propagation Path, Verification Status, Timestamp, Event ID, Record Hash

Changed: Font System

  • Migrated from IBM Plex Sans/Mono → Geist + Geist Mono (next/font/google)
  • CSS aliases --font-display: var(--font-sans) and --font-body: var(--font-sans) in globals.css — retrofits all pre-existing pages without individual file changes
  • tailwind.config.tsfontFamily.sans and fontFamily.mono mapped to CSS vars

Changed: Color System (color blind safe)

  • Healthy/verified: #0EA5E9 (sky blue) replaces #10B981 (green) — amber + blue is the gold-standard color blind safe pair
  • Warning/drift: #FFB300 (amber) — unchanged
  • All signal colors in OrgDriftLogo, StatusDot, StatusBadge, ProofPill updated

Changed: Founding Council page (/council)

  • Removed $20K gating fee entirely
  • Reframed as no-fee advisory board with LOI approach for pre-launch revenue
  • Submit CTA: "Submit My Application — No fee, no obligation"
  • Success state accent: #10B981#0EA5E9
  • Fixed: <img> logo tag → OrgDriftLogoStatic component

Changed: Header + Footer

  • Header.tsx — replaced LogoWithFallback (<img> of old bracket mark) with OrgDriftLogo component
  • Footer.tsx — rebuilt with Section/Container primitives and OrgDriftLogoStatic; added Founding Council nav link

Changed: "See Sample Control Record" CTAs

  • ProofBlock.tsx + ControlRecord.tsx — now <Link href="/sample-report"><ButtonSecondary> instead of opening email modal

Changed: Site-Wide Button Alignment

  • /about — Council CTA: custom <Link> inline styles → <Link href="/council"><ButtonPrimary>
  • /verify — Hero CTA → <ButtonPrimary>, secondary → <ButtonSecondary dark>, final CTA → <ButtonPrimary>
  • /sample-report — banner CTA → <ButtonSecondary dark>, main CTA → <ButtonPrimary>

Fixed

  • Blog page displaying old bracket logo: Header now imports OrgDriftLogo
  • OG/Twitter image build failure: Satori <br/> unsupported → explicit flex <div> per line
  • Hex color inconsistencies standardized: #0A0E1A#0A0E17, #0D1529#101827, #1B2A4A#131D2E
March 12, 2026

Sprint: Content & Brand Polish

Modified Components

  • src/components/sections/SocialProof.tsx — Replaced two stat blocks (20% E&Y → 46% PCAOB 2023; $12.9M Gartner → 27% Gartner audit fees). Fixed all source URLs (Xactly, PCAOB, Gartner). Made url prop optional on StatCard; 2–3 wk Gartner entry renders as plain text (no public URL). Source label names corrected.
  • src/components/sections/OrgDriftPlatform.tsx — Added KPMG 2025 SOX Survey 3-stat bar between PE callout and logo strip ($2.3M / 16 hrs / 17%). All three source labels link to the KPMG survey. Mobile-responsive via scoped CSS class.
  • src/components/layout/Footer.tsx — Removed "Founding Council" and "FAQ" links from footer nav.
  • src/app/about/page.tsx — Full rewrite. New copy: self-doubt paragraph removed, wife credit removed, agency-forward. SOX Director section heading changed to "Question." Mission section tightened. Founding Council close leads with scarcity, ends with mutual qualification. Fixed 5x as React.ReactNode[] type casts (React not imported — would have failed build).
  • src/app/layout.tsx — Updated favicon declarations: SVG favicon set as primary icon, apple-touch-icon registered.
  • content/posts/your-comp-controls-are-working.mdx — Major rewrite: SOX standards → bullet list + blockquote attribution; PCAOB AS 2201 authority paragraph added; 5-question block replaced with StatCallout (25×) + RunScenarioCTA; "What staying manual actually costs" H2 added with 2 StatCallouts + prose; InlineCTA replaced with markdown blockquote; pull quote removed; internal/external citation links applied; LinkedIn comment updated.

Public Assets

  • public/favicons/favicon-16x16.svg — Background rect removed (transparent)
  • public/favicons/favicon-32x32.svg — Background rect removed (transparent)
  • public/favicons/apple-touch-icon.svg — Background changed from dark navy (#0B1220) to brand blue (#2563EB)
  • public/favicons/android-chrome-192x192.svg — Background changed to brand blue (#2563EB)
  • public/favicons/android-chrome-512x512.svg — Background changed to brand blue (#2563EB)

Hard Constraints Verified

  • [x] No retired language
  • [x] No amber on non-drift elements
  • [x] IBM Plex Sans / IBM Plex Mono only
  • [x] Hero H1 unchanged
  • [x] No SOC 2 claims
  • [x] Source URLs verified and corrected
March 11, 2026

Sprint: Zero-Friction Demo Mode + LiveSystemMap + Results Rebuild

New Components

  • src/components/analyze/DataModeModal.tsx — Full-screen modal shown on first visit to /analyze; presents "Try with OrgDrift sample data" (primary) vs. "Use my own CSV files" choice
  • src/components/analyze/SampleModeIndicator.tsx — Slim banner rendered below PrivacyBanner when in synthetic mode; shows SAMPLE DATA badge and "Use my own data →" exit link
  • src/components/analyze/SyntheticFileSidebar.tsx — Sticky sidebar with draggable file chips (loading / draggable / inzone states) gated on scan type selection; includes expected-findings panel for ICM scans
  • src/components/results/LiveSystemMap.tsx — Interactive system-node visualization on the results page showing live drift propagation between HRIS, ICM, and CRM nodes with critical-pulse animation
  • src/components/results/AuditSummaryPdf.tsx — Audit summary PDF export component for results page

Modified Components

  • src/components/analyze/ScanTypeSelector.tsx — Added demoHighlight prop + internal interacted state; scan type toggles pulse via scanPulse CSS animation until first user click
  • src/components/analyze/UploadZone.tsx — Added onSyntheticDrop prop; handles synthetic chip drag-drop by matching orgdrift/synthetic-role data transfer key before normal file handling
  • src/components/layout/Header.tsx — Removed "Verify" nav link (not yet ready for public); removed /verify route and LIVE badge from nav array
  • src/components/ui/Popover.tsx — Significant rework (158 lines changed) for positioning and z-index behavior
  • src/components/ui/Tooltip.tsx — Reworked (28 lines) for consistent hover behavior
  • src/components/ui/Badge.tsx, Button.tsx — Minor polish
  • src/components/ui/ScrollFade.tsx — Added delay prop; raised IntersectionObserver threshold 0.08 → 0.18 for more precise scroll-fade timing
  • src/components/results/DriftPropagationMap.tsx — Updated to integrate with LiveSystemMap; 23 lines changed
  • src/app/analyze/page.tsx — Full demo mode state machine: dataMode, prefetchedRoles, demoHighlight, demoScanSelected, scanResetKey; prefetchSyntheticFiles() + injectSingleFile(); "or try with OrgDrift sample data →" link in own-data mode
  • src/app/analyze/results/page.tsx — Major rebuild: sample data banner with "Use My Data →" button; LiveSystemMap integration; severity/system/category filter state
  • Multiple blog, results, and section components — Minor changes (line endings, small copy/style fixes)

New Pages / Routes

  • src/app/verify/page.tsx/verify product tier page (not yet linked from nav; held for future release)

Public Assets

  • public/synthetic/hr_previous.csv — Synthetic HR snapshot, previous period (52 rows, SuccessFactors format)
  • public/synthetic/hr_current.csv — Synthetic HR snapshot, current period (56 rows, SuccessFactors format)
  • public/synthetic/icm_previous.csv — Synthetic ICM export, previous period (33 rows, Xactly Incent format)
  • public/synthetic/icm_current.csv — Synthetic ICM export, current period (34 rows, Xactly Incent format)
  • public/synthetic/crm_previous.csv — Synthetic CRM export, previous period (21 rows, Salesforce format)
  • public/synthetic/crm_current.csv — Synthetic CRM export, current period (20 rows, Salesforce format)

Bug Fixes

  • Fixed: auto-run fired immediately after synthetic file injection without user interaction — removed autoRun state and effect; sidebar "Run Sample Analysis →" button is now the only trigger
  • Fixed: ScanTypeSelector internal active state persisted stale after "Use my own data" exit — added scanResetKey forcing remount with clean state

Hard Constraints Verified

  • [x] No retired language (Contain / Pulse tier / Monitor tier / $15M / locked for life)
  • [x] No localStorage used for scan state (sessionStorage only)
  • [x] Amber used only on drift/warning elements
  • [x] IBM Plex Sans / IBM Plex Mono only (no Inter, DM Sans, Nunito)
  • [x] Hero H1 unchanged ("Your org changed." / "Nobody told your data.")
  • [x] No SOC 2 claims