Skip to content

Rebuild GaugeGap for strangers and client conversion#91

Merged
slavazeph-coder merged 9 commits into
mainfrom
feature/gaugegap-client-conversion
Jul 12, 2026
Merged

Rebuild GaugeGap for strangers and client conversion#91
slavazeph-coder merged 9 commits into
mainfrom
feature/gaugegap-client-conversion

Conversation

@slavazeph-coder

Copy link
Copy Markdown
Owner

Why

The public experience had strong experiments but weak product clarity. A stranger could play, yet still not know what GaugeGap is, how BrainSNN relates to it, where to start, or what an organization can buy.

What this changes

Stranger-first journey

  • Makes the GaugeGap/BrainSNN relationship explicit in the hero
  • Adds four intent-based starting paths for curious visitors, educators, researchers and organizations
  • Defaults the arcade to four recommended experiments instead of presenting twelve equal choices
  • Adds filters for physics, life, complex systems and society
  • Adds keyboard navigation and proper tab/tabpanel relationships
  • Lazy-loads only the selected experiment to reduce first-load cost

Client conversion

  • Adds public pathways for education, media, brand and research clients
  • Explains likely pilot outputs without inventing case studies or unsupported claims
  • Adds prefilled pilot-brief email actions to hello@brainsnn.com
  • Adds a clear pilot process and deliverables strip
  • Adds client CTAs to the hero, navigation, final CTA and footer

Trust and product clarity

  • Adds Play / Teach / Verify framing so educational models are not mistaken for validated research
  • Replaces the duplicated second wall of twelve experiments with three deeper tools
  • Clarifies GaugeGap as the interaction surface and BrainSNN as the analysis/publishing engine
  • Aligns canonical and social metadata to the www host

Measurement

  • Fixes the analytics allowlist so GaugeGap events are no longer silently discarded
  • Adds events for pathways, filters, lab selection, surprise and client CTA clicks

Documentation

  • Adds docs/STRANGER_CLIENT_PASS.md with the end-to-end audit, funnel metrics and remaining P0/P1/P2 backlog

Validation requested

  • TypeScript/noEmit
  • deterministic tests
  • production Vite/Express build
  • MCP smoke test
  • dynamic-import chunk validation
  • mobile layout and keyboard navigation review
  • mailto pilot brief review

@slavazeph-coder slavazeph-coder merged commit ce14a75 into main Jul 12, 2026
1 check passed

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors the GaugeGap landing page and arcade to optimize the user journey for first-time visitors and potential clients. Key changes include introducing intent-based audience pathways, lazy-loading individual experiments to improve performance, adding topic filters, and detailing a strategic product funnel in a new documentation file. The review feedback focuses on improving code maintainability and robustness by passing the lab-opening handler as a prop to eliminate duplicate logic, adding defensive checks for the daily lab state, and correcting invalid HTML nesting of paragraph tags inside buttons.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines +115 to +121
export function VisitorRoutes({ onResearch }) {
function chooseRoute(route) {
track('gaugegap_pathway_selected', { pathway: route.id });
if (route.lab) openLab(route.lab);
if (route.route === 'research') onResearch?.();
if (route.target) document.getElementById(route.target)?.scrollIntoView({ behavior: 'smooth', block: 'start' });
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Accept onOpenLab as a prop and use it instead of the duplicated module-level openLab helper. This allows us to completely remove the duplicated openLab function from this file, improving maintainability.

Suggested change
export function VisitorRoutes({ onResearch }) {
function chooseRoute(route) {
track('gaugegap_pathway_selected', { pathway: route.id });
if (route.lab) openLab(route.lab);
if (route.route === 'research') onResearch?.();
if (route.target) document.getElementById(route.target)?.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
export function VisitorRoutes({ onResearch, onOpenLab }) {
function chooseRoute(route) {
track('gaugegap_pathway_selected', { pathway: route.id });
if (route.lab) onOpenLab?.(route.lab);
if (route.route === 'research') onResearch?.();
if (route.target) document.getElementById(route.target)?.scrollIntoView({ behavior: 'smooth', block: 'start' });
}

<button type="button" className="gg-scroll-cue" onClick={() => scrollTo('gg-start-heading')} aria-label="Choose a starting path"><span>Choose your path</span><ChevronDown size={17} /></button>
</section>

<VisitorRoutes onResearch={openResearch} />

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Pass the openLab function as a prop to VisitorRoutes to avoid duplicating the lab-opening and URL-updating logic in AudiencePathways.jsx.

Suggested change
<VisitorRoutes onResearch={openResearch} />
<VisitorRoutes onResearch={openResearch} onOpenLab={openLab} />

</div>

<ArcadeProgress progress={progress} level={level} levelProgress={levelProgress} achievements={achievements} dailyLab={dailyLab} onOpenDaily={() => selectExperiment(dailyLab.id)} />
<ArcadeProgress progress={progress} level={level} levelProgress={levelProgress} achievements={achievements} dailyLab={dailyLab} onOpenDaily={() => { setFilter('all'); selectExperiment(dailyLab.id); }} />

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Enforce defensive programming by adding a null/undefined check for dailyLab before accessing its id property in the onOpenDaily callback to prevent potential runtime crashes if dailyLab is not available.

Suggested change
<ArcadeProgress progress={progress} level={level} levelProgress={levelProgress} achievements={achievements} dailyLab={dailyLab} onOpenDaily={() => { setFilter('all'); selectExperiment(dailyLab.id); }} />
<ArcadeProgress progress={progress} level={level} levelProgress={levelProgress} achievements={achievements} dailyLab={dailyLab} onOpenDaily={() => { if (dailyLab?.id) { setFilter('all'); selectExperiment(dailyLab.id); } }} />

<span className="gg-route-icon"><Icon size={22} /></span>
<small>{route.eyebrow}</small>
<strong>{route.title}</strong>
<p>{route.text}</p>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using a <p> element inside a <button> is invalid HTML5, as <button> elements should only contain phrasing content. Consider changing <p> to a <span> with a class name (e.g., className="gg-route-desc") and updating the corresponding CSS selector in audience-pathways.css to use display: block.

Suggested change
<p>{route.text}</p>
<span className="gg-route-desc">{route.text}</span>

Comment on lines +76 to +81
.gg-route-card p {
margin: 11px 0 18px;
color: var(--bsn-text-secondary);
font-size: 0.88rem;
line-height: 1.55;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Update the selector from .gg-route-card p to .gg-route-card .gg-route-desc and add display: block; to ensure valid HTML semantics while maintaining the block-level layout.

.gg-route-card .gg-route-desc {
  display: block;
  margin: 11px 0 18px;
  color: var(--bsn-text-secondary);
  font-size: 0.88rem;
  line-height: 1.55;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant