HockeyStick AI platform

Renaming Jo, Sam, Alex and Riley

Assessment of what changes across front end, back end, API, data and integrations to present the four agents as Onboarding, Discovery, Opportunity and Strategy. Based on hockeystickai main at 24 Sep 2026 (commit 43d4704b) and a logged-in crawl of platform-test as both a consultant and a client.

The rename is two different jobs wearing one name. The job clients need is a display rename: every label, heading, sentence, email and PDF that says Jo, Sam, Alex or Riley says Onboarding, Discovery, Opportunity or Strategy instead. It is one agentic pass over about 80 files, needs no database migration, and breaks nothing outside the platform. The job that looks like the same thing is an identifier rename: URLs, API paths, database values, event types, test ids, file and folder names. That is a chain of data migrations across six tables and a telemetry cut-over, and clients never see any of it.

RecommendationDo the display rename now as one release. Keep the internal ids jo, sam, alex, riley as they are and treat them as opaque keys, the way the engagement stage enum already works. Add permanent redirects for the handful of client-facing URLs that carry an agent name. Decide the five naming questions below before build starts, because they change copy across the whole platform.
1,350files in the repo mention at least one agent name (14,763 matches)
~80files carry user-visible copy (about 30 client-facing, 50 consultant-facing)
0agent names in the MCP server, Slack manifest, public v1 API, PartnerStack or Zoom config
28migrations with live SQL that stores an agent name as data if ids were renamed

What clients see today

Logged in to platform-test as the Space X client user, the agent names appear in four places: the welcome screen ("Meet Jo, your onboarding guide"), the intake chat and its NDA and review tabs, the dashboard ("Continue your intake with Jo", "Sam → Alex → Riley"), and the pipeline page shown below. Deliverable packs and the Activate surfaces are already named after outputs, not agents. Emails follow the same pattern: "Your workshop pack is ready", "Your Opportunity Mapping Pack is ready", "Your Business Alignment Pack is ready".

Client portal pipeline page showing Workshop with Sam, Opportunity Mapping with Alex, Alignment with Riley
Client portal, Pipeline. Stage cards carry the agent name in the title, the first word of the description, and the avatar initial.

Two client-facing artefacts also carry the names in a way that cannot be recalled: single-page PDF downloads from the board pack are named sam-…pdf, alex-…pdf, riley-…pdf, and some generated deliverable text refers to agents by name ("These deliverables translate Alex's prioritised partner shortlist…" on a Business Alignment Pack overview). Files clients have already downloaded and packs already published keep the old wording until regenerated.

Where the names live

LayerWhat carries the nameClient sees itChange type
Front end copyPortal welcome, intake, dashboard, pipeline, data intake, provenance tooltips ("From Jo intake"), print and PDF cover pages, admin workspaces, toasts, empty states, activity feedYesDisplay
Label registriesOne canonical map in frontend/src/shared/types/domain.ts plus about ten local copies that shadow it; a backend duplicate in engagement events; per-pack packLabel and stageLabel; portal and admin pack metadataYesDisplay
Avatars and iconsAvatar renders the first letter of the label (J, S, A, R); a lucide icon per agent; four CSS colour tokensYesDesign decision
EmailsTemplates are parameterised on agentLabel; two hardcoded "with Jo" strings; deep links embed /packs/alex/ and /packs/riley/YesDisplay plus URL alias
PDF filenamesSingle-page downloads prefixed with the agent slugYesDisplay
Generated contentOne DB-stored prompt (alex-a2) and template copy that names agents inside deliverables; RAG corpus prose mentions "Sam agent" and "Jo intake"Yes, in packsPrompt edit + regenerate
Browser URLs/admin/{sam,alex,riley}/:id, /portal/…/packs/{alex,riley}/current, /deliverable/…/packs/{alex,riley}/current, /print/riley-board-pack/:idPortal and deliverable links, yesRedirect
Internal API pathsAbout 45 route patterns: /api/agents/{sam,alex,riley}/…, /api/admin/engagements/:id/{alex,riley}/…, /api/portal/jo/…, one Caddyfile handleNoIdentifier
Wire enumsagent and owner values in shared contracts, source enums (riley, alex), reason codes, source-probe ids, event types, template names, contract version stringsNoIdentifier
Databaseagent_id text in six tables with default 'sam', two named CHECK constraints, five source CHECK constraints, JSONB keys, event type strings, two tables and their RLS policies, one stored prompt rowNoIdentifier
Storage and jobsObject keys riley-board-packs/…, BullMQ job kinds sam-pack and riley-board-pack, dedupe job idsNoIdentifier
TelemetryNew Relic HsaiAgentRun.agentId facet, APM route templates, six dashboard descriptionsNoDescriptions Display, facet Identifier
Env and configALEX_LLM_*, ALEX_A9_LLM_TIMEOUT_MS, RILEY_LLM_* (the Riley set is not in any env example)NoIdentifier
Tests363 agent-prefixed test ids, e2e catalog files named per agent with hundreds of pack: "alex" literals, spec titles, fixture emailsNoIdentifier
Docs316 of 1,167 docs files; the canonical agent README, field matrix, handoff records, intake mapping pipeline, three agent-named foldersNoProse Display
ExternalMCP server, Slack app manifests, public v1 API and OpenAPI, PartnerStack, Zoom, Auth0, Resend config, CI workflow namesn/aNothing to change

Decisions needed before build

These are product calls, not engineering ones. Each one changes copy in dozens of places, so settle them first.

  1. Agent names versus stage names. The pipeline today reads "Workshop with Sam", "Opportunity Mapping with Alex", "Alignment with Riley", and the stage vocabulary Intake, Workshop, Mapping, Alignment is used across admin and portal. If the agents become Onboarding, Discovery, Opportunity, Strategy, do the stages follow? "Discovery with Discovery" does not work. The natural resolution is that the agent name becomes the stage name and the "with X" construction goes.
  2. Pack titles. Current titles are Workshop Pack (Align Phase Workshop Pack in the portal), Opportunity Mapping Pack, Business Alignment Pack, Partnership Growth Roadmap. Opportunity already fits. "Strategy" for Riley sits next to the Activate side's Strategy Anchor and the "Partnership Strategy Playbook" PDF, which is coherent but means Business Alignment Pack probably becomes Strategy Pack. Discovery has no pack title today.
  3. Avatars. Initials become O, D, O, S. Onboarding and Opportunity collide. Either switch to the existing icon set (message, sparkles, target, users), give each stage a numeral, or pick distinct glyphs.
  4. Whether agents keep any persona at all. Copy like "Jo will walk you through a guided conversation" and "Riley produces your 90-day activation playbook" is written in the third person about a character. Onboarding and Discovery are nouns, so those sentences need rewriting as things the platform does, not things a person does. Roughly 60 sentences.
  5. Generated content already published. Packs on client portals contain the old names inside deliverable text. Decide whether to regenerate current packs after the release or let them roll over on the next run.

Front end

Display rename

Left alone under the recommendation

Back end

Display rename

Identifier rename, if ever pursued

Listed so the size is clear. None of it is needed for the client outcome.

API and routes

Integrations and things outside the repo

SurfaceFindingAction
MCP server (hockeystick-mcp)No agent names in server name, tools, descriptions, scopes or schemasNone
Slack appManifests and all user-visible text agent-agnostic; six type imports in code onlyNone, no re-install or review
Public v1 API and OpenAPINo agent-derived path, field or schemaNone
PartnerStack, Zoom, Auth0, Resend, Mailosaur, HubSpotNo webhook, template id, custom field or app metadata references an agentNone
Resend email templatesParameterised on agentLabel; two hardcoded "with Jo" stringsDisplay rename
New RelicHsaiAgentRun.agentId facet values are historical data; dashboard descriptions name agentsEdit descriptions; keep the id values
CI/CDNo workflow, job or secret name carries an agent name; one commentNone
Sent emails and downloaded PDFsAlready delivered with old names in subjects, bodies and filenamesComms note to active clients
Jira, Google Docs, Slack threadsTicket titles, handoff docs and branch names use the old namesLeave; add a glossary line to the agent README

Sequenced plan

StepScopeExecution
0. DecisionsThe five naming questions above, written into the agent README as a glossary with old and new names side by sideHuman. Product call, written down once so every agent pass reads the same glossary
1. RegistrySingle display registry in shared types, backend duplicate removed, shadow maps deletedAgent pass, one PR. Type-checked, so the compiler catches every missed consumer
2. Client copyPortal, print, emails, PDF filenames, avatarsAgent pass with the glossary, one PR. Human reads the rewritten sentences before merge
3. Consultant copyAdmin workspaces, client detail, Activate wizard, activity feed, lock reasons, dashboardsAgent pass, one PR. Screenshot diff on Test for review
4. Generated contentPrompt migration for alex-a2 and agent-naming template copy, corpus edit and re-ingest, regenerate current packs on Test and verifyAgent pass, one PR plus a regeneration run on Test. Human checks one regenerated pack per agent
5. Tests and docsUpdate copy assertions in unit and e2e specs (test ids unchanged), agent README and canonical docsAgent pass, folded into PRs 2 and 3 so CI stays green per PR
6. ReleaseTest soak with a client account, client comms note, productionPlaywright crawl as a client account asserting zero old names, then the normal PR-protected release

The display rename is four PRs that can run as parallel agent passes off the same glossary, with two human gates: the naming decisions before, and a read of the rewritten copy after. The identifier rename, if the team wants it as tech-debt work later, is a separate run with different risk: directory and symbol renames, about 45 route aliases, a chain of data migrations across the tables and constraints listed above, e2e catalog rewrite, a telemetry cut-over, and env var rotation. Agents can do the mechanical work, but the migrations touch every historical row and the hash prefixes cannot move at all, so it needs staged rollout and rollback plans a copy change does not. It should never be bundled with the client-facing release.

Risks in the display rename

Method: three code sweeps over frontend, backend/API/DB/shared contracts, and integrations/docs/e2e on main at 43d4704b; Playwright crawl of 20 admin pages as a consultant and 40 portal pages as the Space X client on platform-test; Gmail check of platform notification emails since May 2026. No code was changed.