Ideas — Proposed Data Model
← tree index · see open issues in data & integration
A first-pass entity sketch derived from the flows. Not authoritative — a starting point for plan-eng-review. Names are illustrative.
Core entities
School ──< Engagement >── InstructionalStrategist
│ │
│ ├──< Cohort (CohortSnapshot) >──< Participant
│ │
└── SchoolContextProfile (1 per school, reusable, versioned/timestamped)
School & context
- School — the durable account.
- SchoolContextProfile —
readiness (1–5),change_tags[](enum),priorities[](≤3, enum),narrative_note (≤500c),updated_at. One per school; applies to future engagements unless overridden. → context layer
Engagement
- Engagement —
topic,date,school_id,strategist_id,workshop_type (half/full), source = HubSpot pull or manual PM entry. → HubSpot questions - Cohort / CohortSnapshot —
attendee_group(enum),cohort_note (≤300c),expected_count. Per engagement.
People
- Participant + LearnerProfile [F1] —
grade,experience,content_area,role. Aggregates into the cohort summary [F2]. - Role assignment — Participant / LA / IS / PM / Content Creator.
Behavioral entities (the metric backbone)
ApplicationEvent
The most important table — powers time-to-apply metrics.
ApplicationEvent {
participant_id, engagement_id, strategy_id,
occurred_at, // → time-to-first-application, 24/48/5d windows
evidence_type, // artifact | observation | self_report
outcome, // success | attempted_failed
attempt_number // → repeat-application rate, applications-to-mastery
}
- Window anchor (mark-complete vs per-participant) is an open question.
ActionPlan (Practice commitment)
participant_id, engagement_id, what, when, with_whom, created_at. The object the Apply gate checks for absence (→ intervention layer).
PulseResponse
participant_id, engagement_id, likert (1–5), mcq_answers[3]. Never exposes individual scores downstream; only aggregates ([C3] enforced at query level). → pulse check
Reflection / Survey
participant_id, engagement_id, evidence, obstacles, next_try, survey_complete (bool). Survey completion gates the Certificate.
Content entities
ContentAsset (+ visibility state machine)
ContentAsset {
type, // pre_work | workshop_material | slide_deck | post_resource | microlearning
engagement_id?, // null for reusable microlearning
visibility_state, // draft | pre_engagement | day_of | post_released
default_rule_owner = PM,
...
}
VisibilityTransition { asset_id, from, to, actor_id, at } // audit log
IntroVideo
strategist_id, url, duration (≤45s), approval_state (pending/approved/rejected), watched_pct. Auto-associates via assignment. → intro video
Microlearning + tags
Reusable ContentAsset with a gap taxonomy so the IS recommendation engine and the intervention layer can match item → participant gap. Taxonomy shape is an open question.
Signal / loop entities
InterventionTrigger
phase, participant_id, signal_type (missing_prework | no_action_plan | no_application_24/48/5d | no_survey | drift | at_risk_cohort), fired_at, response_type, channel. → intervention layer
NextEngagementSignal (business loop)
cohort_id, gap_summary, routed LA → PM → HubSpot (LA-first rule). at_risk / high_perf flag drives case-study capture. → business loop
GapSignal (Content Creator backlog)
Cross-engagement pattern (e.g., “40% miss Q2”) fed from PM + IS to prioritize microlearning.
Cross-cutting
- Audit/log everything stateful: visibility transitions, resource releases, individual-data surfacing (§6.4 “patterns, not individuals”), nudge sends.
- Enums are canonical: cycle phases (6), readiness (1–5), change tags, priorities, attendee groups, evidence types — freeze these. → cycle naming