Risk-tiered governance for AI-assisted tools at scale
Score risk across 7 dimensions, route to the right review track, and run a uniform
5-model agent pipeline that produces structured findings no human could replicate alone.
AIF Demo
Universities are drowning in AI-built tools. Faculty spin up chatbots, students ship dashboards with FERPA data, departments deploy scripts that talk to third-party APIs with no DPA. Nobody knows what's running, what data it touches, or who's responsible when it breaks.
Traditional IT governance doesn't fit: a faculty member's internal grading helper shouldn't require the same review as a student-facing AI that handles HIPAA data. But ignoring it isn't an option either.
AIF is proportional governance. Low-risk tools register and go. High-risk tools get formal review. Everything in between gets exactly the scrutiny its risk profile demands — scored automatically, analyzed by five independent AI models, and documented for compliance.
The portal is the enforcement layer: builders submit tools via a 21-question intake form, the system scores them on seven weighted dimensions, routes them to a Track (1-4), runs a uniform 5-model agent pipeline, and produces structured reports with auto-generated documentation. Reviewers approve or request changes; admins manage users and audit activity.
Built by the CIO's office at the University of Montana. Designed for portability to other institutions.
Submit tool --> Score 7 dimensions --> Route to Track --> 5-model pipeline --> Review
- Intake: Builder answers 21 questions about the tool — what it does, who uses it, what data it touches, how it authenticates, whether users know it's AI
- Scoring: Seven dimensions scored 0-3, weighted by artifact type (public site, internal app, AI agent, etc.), producing a risk percentage
- Track routing: Risk percentage maps to a governance track. Nine escalation conditions can force Track 4 regardless of score
- Agent pipeline: Five independent AI models analyze the codebase using the same prompt. Deterministic tools (Semgrep, ESLint, npm audit) run in parallel. Claude synthesizes everything with dispute resolution
- Review: Track 1 auto-activates. Track 2 lets builders self-certify. Tracks 3-4 require reviewer approval. All decisions are audit-logged
| Dimension | What It Measures |
|---|---|
| Security | Secrets, auth, input validation, dependencies, encryption |
| Accessibility | Semantic HTML, ARIA, keyboard, contrast |
| Data Sensitivity | No data through HIPAA/FERPA/export-controlled |
| Blast Radius | Builder only through institution-wide exposure |
| Autonomy | Fully manual through autonomous decisions |
| Comprehension | Builder understands fully through can't explain AI code |
| Maintenance | Test coverage, docs, dependency freshness, error handling |
Each artifact type has a different weight profile. A public website weights accessibility and security heavily; an AI agent weights autonomy and blast radius.
| Artifact Type | SEC | A11Y | DATA | BLAST | AUTO | COMP | MAINT |
|---|---|---|---|---|---|---|---|
| Public Site | 4 | 4 | 3 | 3 | 1 | 2 | 3 |
| Internal App | 3 | 3 | 4 | 2 | 1 | 2 | 3 |
| Script/API | 3 | 0 | 3 | 2 | 2 | 2 | 3 |
| AI Agent | 3 | 1 | 3 | 4 | 4 | 4 | 3 |
| Data Pipeline | 3 | 0 | 4 | 2 | 2 | 2 | 3 |
| Other | 3 | 2 | 3 | 2 | 1 | 2 | 3 |
Weighted % = Sum(score x weight) / (3 x Sum(weight)) x 100
| Weighted % | Track | What Happens |
|---|---|---|
| < 22% | Track 1 — Register & Go | Register in institutional registry. Auto-activates on pipeline completion. |
| 22-42% | Track 2 — Self-Certify | Builder reviews pipeline findings, signs off. |
| 42-65% | Track 3 — IT Review | Reviewer examines findings, approves or requests changes. |
| >= 65% | Track 4 — Formal Project | Formal IT project governance with full review cycle. |
Nine conditions force Track 4 regardless of weighted percentage:
- Regulated data (HIPAA/IRB/export-controlled/tribal) present
- FERPA data in a public-facing tool: unauthenticated, or authenticated without campus SSO
- Institutional data in personal accounts
- AI model without approved DPA
- Authentication outside campus SSO
- No version control
- Students unaware they're interacting with AI
- Payment card data (PCI DSS)
- Autonomous decisions without human review
FERPA behind campus SSO on an internet-reachable deployment doesn't escalate to Track 4 — it applies a Track 3 floor instead, guaranteeing IT review without forcing formal-project governance on every SSO-protected campus web app.
AI models are good at reasoning about architecture, intent, and context. They're bad at exhaustive mechanical checking — verifying that every <input> has a <label>, that every dependency is free of known CVEs, that no file contains a SQL injection pattern.
The pipeline exploits both strengths:
- Layer 0 — Deterministic Tooling: SAST scanners, linters, and dependency auditors that mechanically check every element against known rule sets. High precision, exhaustive coverage, zero hallucination. Runs in parallel with model passes — no added latency.
- Layer 1 — Multi-Model AI: Five AI models reason about what tools can't — business logic flaws, architecture concerns, auth flow correctness, and "does this actually make sense?" judgment calls. Claude synthesizes with filesystem access for dispute resolution.
Three confidence tiers in output:
| Tier | Source | Meaning |
|---|---|---|
| Tool-Verified | Semgrep, ESLint, npm audit | Deterministic scanner with known rule match |
| Confirmed | 3+ AI models agree | Independent convergence — high confidence |
| Potential | 1-2 models flagged | Needs human review |
| Tool | Agent | What It Checks |
|---|---|---|
| Semgrep | 1 | OWASP Top 10 + default SAST rules (SQLi, XSS, command injection) |
| npm audit / pip-audit | 1 | Known dependency CVEs against advisory databases |
| Snyk Agent Scan | 1 | MCP config and SKILL.md security threats |
| eslint-plugin-jsx-a11y | 2 | Static React/JSX accessibility (34 rules: alt text, labels, ARIA, keyboard) |
| ESLint QA | 3 | Dead code, unused variables, unreachable code, async bugs, type safety |
Five different AI models receive the same prompt and independently analyze the entire codebase. No model reviews its own work. Claude only synthesizes — it never runs a pass.
| Pass | Model | Method | Why This Model |
|---|---|---|---|
| 1 | GPT-5.4 | Codex CLI (filesystem access) | Structured reasoning, logical vulnerability detection |
| 2 | MiniMax M2.5 | Direct OpenRouter API | Large-context reasoning, cross-file analysis |
| 3 | MiMo-V2-Flash | Direct OpenRouter API | Fast reasoning model, code optimization |
| 4 | Kimi K2 | Direct OpenRouter API | 1T MoE architecture, edge case detection |
| 5 | GLM-5 | Direct OpenRouter API | Agent-optimized, deep code understanding |
| Synthesis | Claude Opus 4.6 | Claude Code CLI (filesystem access) | Dispute resolution with full codebase access |
Pass 1 (Codex) has full filesystem access and explores the codebase autonomously. Passes 2-5 receive a pre-bundled codebase (deterministic file selection, 400K char budget) with structured JSON output enforcement. Synthesis uses Claude Code CLI so it can read source files to resolve disputes.
| Agent | Type | What It Does |
|---|---|---|
| 1: Code & Security | 5 models + synthesis + stack deep dive | 10-section security rubric. Integrated tools: Semgrep, npm audit, Snyk. Second Claude pass runs framework-specific checklists (React, Express, Django, etc.) |
| 2: Accessibility | 5 models + synthesis | WCAG 2.2 Level AA audit across every component, template, and stylesheet. Integrated tool: eslint-plugin-jsx-a11y |
| 3: QA / Bug Detection | 5 models + synthesis | Logic bugs, error handling, async/concurrency, edge cases, type safety. Reads Agent 1+2 output for context. Integrated tool: ESLint QA |
| 4: Documentation + HECVAT | 3 parallel passes (Gemini + GLM-5 + Claude) | Generates User Guide, Admin Guide, Compliance Summary (.docx via Pandoc). HECVAT 4.15 self-assessment (87 questions, official XLSX template) |
All tracks run all agents. The pipeline is uniform — track determines governance requirements, not analysis depth.
- 21-question form with live scoring sidebar showing dimension scores and track assignment as you answer
- localStorage auto-save (5s debounce) + server draft auto-save (60s) with recovery prompt on return
- Progress bar with field validation hints and focus-to-first-error on submit
- 6 artifact types with distinct weight profiles driving proportional governance
- SSE live streaming of agent progress, pass completions, and CLI output in real time
- Cancel button with AbortController propagation to all child processes (SIGTERM + SIGKILL fallback)
- Retry with dead letter queue (max 2 total attempts before permanent failure)
- Per-model timeouts tuned to observed performance (Codex 15min, MiniMax 8min, etc.)
- Partial results synthesis — synthesis proceeds with whatever passes completed (minimum 1 of 5); such runs are flagged partial_analysis and Track 1 auto-activation is blocked for them
- Pass metrics recorded per-pass: timing, JSON parse status, output size, error category
- Structured findings with severity, file:line evidence, and confidence tier (tool-verified / confirmed / potential)
- 7-dimension scores with weighted percentage and track recommendation
- Tabbed agent results — Code & Security, Accessibility, QA, Documentation
- Findings review — triage findings as open/resolved/won't fix with debounced persistence
- File tree view — browse findings organized by source file
- HECVAT 4.15 XLSX — official EDUCAUSE template pre-filled (~65% of 87 questions answerable from code analysis)
- Document export — User Guide, Admin Guide, Compliance Summary as .docx
- Track-appropriate governance — Track 1 auto-activates, Track 2 self-certifies, Track 3-4 requires reviewer
- Approve / request changes with comment thread
- Track override — reviewers/admins can escalate or de-escalate with documented reason
- Sandbox mode — builder-only visibility until ready for review
- Dashboard — submission stats, active pipelines, review queue depth
- Pipeline analytics — per-model performance (avg/median/max timing, success rate, parse failures), cost tracking, daily/weekly trends
- User management — role assignment, activation/deactivation
- Audit log — every status change, review decision, and admin action with actor, timestamp, and IP
- Data retention — configurable cleanup (pass results 90d, notifications 30d, audit log report-only)
- Dark mode — instant theme switching via
[data-theme="dark"]CSS selectors - WCAG 2.2 AA — 4.5:1 contrast ratios, keyboard navigation, ARIA labels, focus indicators
- In-app + email notifications — pipeline completion, review needed, status changes, per-user preferences
- Pluggable SSO — CAS, header-based (Shibboleth), OIDC/SAML stubs. Set
AUTH_PROVIDERenv var. - Institution portability —
INSTITUTION_NAME,INSTITUTION_DOMAIN,AUTH_PROVIDERenv vars, one config to switch
| Layer | Technology |
|---|---|
| Frontend | React 19 + Vite, CSS design system (light + dark mode), WCAG 2.2 AA, lucide-react icons |
| Backend | Node.js (ESM), Express 4, raw SQL with pg, Zod request validation |
| Database | PostgreSQL 16 (Alpine), 14 migrations, performance indexes |
| Auth | Pluggable SSO (CAS, header, OIDC/SAML stubs), JWT cookies (jose), RBAC |
| Security | Helmet CSP/HSTS, CSRF double-submit cookie, rate limiting, non-root Docker |
| AI Pipeline | Codex CLI (GPT-5.4) + 4 models via OpenRouter direct API + Claude Code CLI (synthesis) |
| Deterministic Tools | Semgrep (SAST), npm/pip audit (CVEs), Snyk (MCP security), ESLint (a11y + QA) |
| Documents | Pandoc (Markdown to .docx), xlsx (HECVAT template export) |
| Deployment | Docker Compose (2 containers: app + postgres), multi-stage build, health checks |
+-----------------+
| Browser |
| React + Vite |
+--------+--------+
|
+--------+--------+
| Nginx Proxy |
| (reverse proxy)|
+--------+--------+
|
+------------+------------+
| |
+--------+--------+ +--------+--------+
| Express API | | Agent Pipeline |
| /auth | | |
| /intake | | Codex CLI |
| /registry | | OpenRouter API |
| /pipeline | | Claude Code CLI |
| /review | | Semgrep |
| /reports | | ESLint |
| /admin | | npm audit |
| /analytics | | Snyk |
+--------+--------+ +--------+--------+
| |
+------------+------------+
|
+------------+------------+
| |
+--------+--------+ +--------+--------+
| PostgreSQL | | File System |
| 16-alpine | | /data/output |
| 14 migrations | | /data/codebases|
+-----------------+ +-----------------+
Browser ---> Nginx ---> Express (JWT verify + RBAC) ---> Route handler
|
+---> PostgreSQL (data)
+---> Pipeline queue (SSE streaming)
|
+---> Agent 1 (5 models + tools + synthesis)
+---> Agent 2 (5 models + tools + synthesis)
+---> Agent 3 (5 models + tools + synthesis)
+---> Agent 4 (3 parallel passes)
|
+---> Results to DB + filesystem
AIF/
├── docker-compose.yml # App + PostgreSQL (2 containers)
├── Dockerfile # Multi-stage build (frontend + backend + CLI tools)
├── hecvat415.xlsx # HECVAT 4.15 official template
├── backend/
│ ├── migrations/ # 14 SQL migrations
│ ├── .env.example # All env vars documented
│ └── src/
│ ├── server.js # Express API (helmet, CSRF, rate limiting, routes)
│ ├── index.js # CLI entry point (node src/index.js <path> [track])
│ ├── config.js # Institution-specific configuration
│ ├── scoring.js # 7-dimension scoring engine (weights, tracks, escalations)
│ ├── validation.js # Zod schemas for all state-changing routes
│ ├── logger.js Scan report · 2026-09-18
- ✓ Prohibited terms or links
- ✓ Repository eligibility
- ✓ slopscore.md paperwork
- ✓ Content policy
- ✓ Risk review


0 comments
log in to comment.