Data model
All Helix tables live in the main Hub database, modelled as dare ORM models in api/db/models/ (camelCase file names, e.g. helixMeeting.js, mapping to snake_case tables, e.g. helix_meeting). These model files are the authoritative schema reference for the helix_* tables.
Tables
| Table | Model file | Purpose |
|---|---|---|
helix_meeting | helixMeeting.js | One row per analysed meeting: transcript (JSON), raw LLM response (raw_analysis, JSON), model/temperature/reasoning_effort used, platform, organiser email |
helix_meeting_skill | helixMeetingSkill.js | Which skills (and which prompt) were assessed for a given meeting |
helix_user_meeting | helixUserMeeting.js | One row per user per meeting: links to the meeting and to the user's weekly helix_user_analysis bucket |
helix_user_meeting_skill | helixUserMeetingSkill.js | Per-user, per-skill scoring detail for one meeting — pos_count/neg_count, context_indicator/sentiment_indicator/keyword_indicator, raw_score/score, skill_usage (JSON quotes), summary, suggestion |
helix_user_analysis | helixUserAnalysis.js | Weekly summary bucket per user/domain (analysis_week_commencement_date) |
helix_user_analysis_skill | helixUserAnalysisSkill.js | Average score/summary/suggestion per skill for the week |
helix_skill | helixSkill.js | A scorable soft skill: name, synonyms, description, prompt_id → helix_prompt, helix_agent_id → helix_agent, hierarchical via parent_id (self-reference) |
helix_skill_content | helixSkillContent.js | Links a skill to a piece of learning content (content_id) |
helix_prompt | helixPrompt.js | Prompt text (prompt, negative_prompt) plus the 3Q weights: w1_keyterms, w2_context, w3_sentiment |
helix_agent | helixAgent.js | A named agent (e.g. '3Q' or 'open') — its name selects which response schema/scoring path is used, and it has its own helix_prompt_id (the overall system prompt for the analysis call) |
helix_set | helixSet.js | A named group of skills, targeted at audience: 'all' or audience: 'teams' |
helix_set_skill | helixSetSkill.js | Join table: helix_set → helix_skill |
helix_set_team | helixSetTeam.js | Join table: helix_set → team_id, used only when helix_set.audience = 'teams' |
See Scoring engine for how helix_set/helix_skill/helix_prompt/helix_agent combine to decide which skills get analysed for a given user, and how the 3Q weight columns are used.
Key relationships
users.helix_domain_id
A user can belong to multiple domains/hubs, so users.helix_domain_id designates which one domain is "their" Helix domain — i.e. where their Helix meeting/skill data is authoritative. It defaults to the domain a new user is first created in — set on federation (SAML/LinkedIn) login for new users (auth/modules/auth.js, see SSO Login: Shared verify function) and on bulk/CSV user import (api/modules/users/processUsers.js, api/modules/importUsers/db/users.js) — and can be changed explicitly via PATCH /me/settings with is_helix_hub: true (api/routes/me/settings/patch.js). It's used throughout helixProcessing and the access-check helpers described in Admin config, permissions & frontend.