A verification layer for AI-era learning.
Universities are losing the AI-detection arms race. Acta replaces detection with evidence: after every submission, students answer short concept checks generated from their own work, and every interaction is captured in a cryptographically signed ledger that defends grades on appeal and supports accreditation review.
The wedge is verification — not tutoring, not detection.
The screenshots below trace one assignment end-to-end through the live demo. Run pnpm dev:frontend + pnpm dev:backend with SEED_DEMO_DATA=true and you'll see the same data.
The instructor-facing pitch: Allow AI help. Verify understanding. Four-step flow: instructor sets the rules → student submits → Acta checks understanding → instructor reviews evidence.
Verification mode is the hero choice — Confidence score, Required gate, or Fail-only escalation. Every policy versions on save, so older submissions keep the policy that scored them.
The edit form makes versioning explicit: "Saves a new version. Older submissions keep their original policy." This is how Acta keeps grading defensible months after the fact.
V1 CURRENT policy badge, CONFIDENCE SCORE verification badge, live status (Assignment policy: Done v1, Student AI help: Enabled, Instructor Solution Guide: Done v1, Student submissions: 1), the actual submission text, and the Instructor Solution Guide with its referenceHash (4e79d584…). Editing the Guide creates a new version — students never see Guide content.
Numbered phases: [01] Read the task (Instructions, Rubric, AI Help Rules) and [02] Ask for help (the in-line Acta TA with Hint / Explanation / Example / Debugging / General modes — instructor-restricted modes are visibly disabled). Speak replies aloud toggle is built in.
Voice-enabled tutoring with the same instructor-policy guardrails. SESSION ACTIVE indicator, READ OFF / VOICE toggles, help-mode buttons that honor the assignment's AI HELP RULES. The mic input notes: "Audio is used for transcription and is not retained by Acta."
Per-assignment policy badges show the verification mode, the policy hash (#1f4d445, #7a0a17d), and any restrictions (Final answer restricted) so students see the contract before they start.
Toggle between STUDENT VIEW / INSTRUCTOR VIEW. Three concept-check questions auto-generated from the student's own writing, tagged with the concept under test ([glycolysis], [ATP synthase], [role of oxygen]). Verification attempts show NEEDS REVIEW · 2 of 3 sufficient.
Live metrics, outcomes (PASSED / NEEDS REVIEW / FAILED / PENDING VERIFICATION), and a "Needs attention" table with stale items first. Each row links to the full submission + the evidence report.
This is what defends a contested grade. Print/Save as PDF built in. Captures the policy version ID, policy hash, verification mode, full AI Help Rules snapshot (Hints: Allowed · Debugging guidance: Not allowed · Restrict final answer: Enabled HARD RULE), instructions, rubric, and the verification outcome. Months later, an instructor can hand this to a dean or an accreditor.
Every assignment_policy_versions row, submissions row, and assignment_reference_solutions row carries a hash today. The full signed ledger ships next.
Plain-English explainer written for pilot conversations: synthetic-data-only today (backend refuses to boot with ALLOW_REAL_STUDENT_DATA=true without a signed FERPA DPA reference), per-tenant scope (cross-tenant reads return 404, asserted by defense-in-depth tests), no training on student data.
- All three verification modes in the data model — confidence score, required gate, fail-only escalation
- Policy versioning — edit creates a new version; older submissions keep their original policy + hash
- Hash-pinned provenance on every policy version, submission, and reference solution
- AI help policy as a hard contract — instructor-set rules (hints / debugging / final-answer-restricted) propagate to the student's TA, the TA Lab, and the evidence report
- Concept checks generated from the student's own writing — tagged with the concept under test
- Evidence reports that capture the policy version + outcome together — printable, accreditor-ready
- FERPA-first architecture — synthetic-data-only guard enforced at backend boot; no real data without a signed DPA
- Voice-enabled TA Lab with transcription-only audio (not retained)
- Two LLM provider paths — deterministic stub (default) and OpenAI gated behind
USE_REAL_LLM=true+OPENAI_API_KEY, with zero-data-retention settings
- Language: TypeScript (strict)
- Runtime: Node.js 20
- Backend: Fastify on
:4000 - Frontend: Next.js 14 on
:3000 - Database: Postgres (local via Docker)
- Package manager: pnpm workspaces
- Tooling: Biome, Vitest
nvm use # picks up Node from .nvmrc
pnpm install
cp .env.example .env # keep ALLOW_REAL_STUDENT_DATA=false
pnpm db:up # local Postgres via Docker
SEED_DEMO_DATA=true pnpm dev:backend # Fastify on :4000, seeds demo tenant
pnpm dev:frontend # Next.js on :3000Open http://localhost:3000 for the demo flow. Walk through:
/instructor— assignment list, click into one/instructor/dashboard— the review surface/student— student workspace/student/<assignment-id>/ta-lab— voice TA Lab/submissions/<submission-id>/evidence-report— the defensible artifact
Health checks: http://localhost:3000/healthz, http://localhost:4000/healthz
A handful of hard rules shape every decision in this codebase:
- Verification is the wedge — not tutoring
- The signed ledger ships in v1
- All three grading modes ship in MVP
- No AI-detection features, ever — that's the paradigm Acta replaces
- Student data is FERPA PII at every layer
- Any feature that adds instructor burden requires explicit approval
src/
backend/ # Fastify API, ledger, AI provider selection, FERPA guards, demo seeder
frontend/ # Next.js — instructor + student workspaces, TA Lab, evidence reports
ai/ # provider abstraction + stub/anthropic implementations
docs/ # architecture, decisions, FERPA scoping, design specs, screenshots
prompts/ # AI pipeline prompt sources
evals/ # eval harness
scripts/ # foundation checks
tests/ # foundation + defense-in-depth suite
.claude/ # multi-agent operating system (10 role-scoped agents + policy files)
The .claude/ directory is a custom multi-agent system that drives this build — research, scope, design, implementation, security, and demo each run as their own specialized agent with hard constraints they cannot override.











