Files
rootnode-academy/platform/api/migrations/005_scenario_attempts.sql
T
ced4568 6b52c9e1d2 feat(platform-api): split lightweight platform service from Lab image
New platform/api/ service owns students, cohorts, curriculum, progress,
scenario attempts, and student/admin sessions. No k3s, no --privileged,
no terminal runtime — starts instantly, unlike the old identity service
which booted an unused k3s cluster just to serve roster/progress APIs.

Provisioner calls (student and admin) are consolidated here too, in
provisioner-client.js, so it's the only service that talks to the
Provisioner directly.
2026-08-18 12:22:58 -05:00

30 lines
1.7 KiB
SQL

-- scenario_attempts — new capability, did not exist before Phase 2B. The old model only ever
-- kept aggregate progress (status + a bare attempts counter); this is a per-attempt log,
-- giving instructors real "validation outcomes where recorded" visibility instead of just a
-- final status.
--
-- hint_count is deliberately nullable and unpopulated: the existing Lab engine's hints are
-- static UI content only (frontend/src/components/ScenarioPanel.jsx renders them from the
-- scenario JSON) — nothing server-side ever records a hint being viewed. Do not invent a
-- number here. If hint-view tracking is added to the Lab engine later, this column is ready
-- for it without a schema change.
CREATE TABLE IF NOT EXISTS scenario_attempts (
attempt_id BIGSERIAL PRIMARY KEY,
student_id TEXT NOT NULL REFERENCES students(student_id),
scenario_id TEXT NOT NULL,
environment_id UUID REFERENCES environments(environment_id),
started_at TIMESTAMPTZ,
completed_at TIMESTAMPTZ,
result TEXT NOT NULL, -- 'passed' | 'failed'
validation_count INTEGER, -- number of validation checks run this attempt
hint_count INTEGER, -- NULL — not measurable today, see note above
metadata JSONB,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_attempts_student ON scenario_attempts(student_id);
CREATE INDEX IF NOT EXISTS idx_attempts_scenario ON scenario_attempts(scenario_id);
CREATE INDEX IF NOT EXISTS idx_attempts_environment ON scenario_attempts(environment_id);
CREATE INDEX IF NOT EXISTS idx_attempts_created ON scenario_attempts(created_at);