MVP Definition of Done — Roadmap Reference¶
Definition¶
A team of 5–9 developers using GitHub (repositories + Projects v2 + Pages), Terraform, and Kubernetes can do all of the following with a single self-hosted Substrate instance running on a NVIDIA DGX Spark node.
This definition is the governing contract for the v1.0 release. A release is not MVP-complete until every one of these 12 criteria is verified against a real team setup — not a synthetic test, not a mocked connector, not a pre-populated database. Real repositories, real PRs, real infrastructure state, real team membership.
12 Acceptance Criteria¶
| # | Criterion | Measured By | Pass Threshold |
|---|---|---|---|
| 1 | Connect all 6 priority connectors in under 30 minutes | Wall-clock time from docker compose up completion to first graph node written in Neo4j |
≤ 30 minutes from startup to first node |
| 2 | See a full dependency graph within 1 hour of connection | Time to 80% Observed Graph population — at least 80% of services discoverable from GitHub + Terraform + K8s are present as Service nodes with edges | ≤ 60 minutes from connector activation |
| 3 | PR blocked with ADR reference | GitHub Checks API blocks the PR; violation comment contains the specific ADR identifier and a working link to the ADR source document | Block + comment within 2 seconds of PR webhook receipt |
| 4 | Ask a structural question in natural language in under 8 seconds | API response time p95 for RSN endpoints; measured on RSN-UC-01 ("What does X depend on?") and RSN-UC-02 ("Who owns X?") | p95 ≤ 8 seconds (simpler queries must be ≤ 1 second) |
| 5 | "Why was this decision made?" returns sourced rationale | RSN-UC-05 query returns a DecisionNode with source URL linking to the original ADR or post-mortem document | Response includes source link; latency ≤ 5 seconds |
| 6 | SSH host inspection detects undeclared services | SSH Runtime Connector identifies a service running on a host that is not declared in the Observed Graph; alert appears in UI | Detection and alert within 15 minutes of inspection cycle |
| 7 | Simulation returns before/after policy delta in under 15 seconds | SIM-UC-01 through SIM-UC-04 measured end-to-end from simulation trigger to before/after delta table rendered in UI | p95 ≤ 15 seconds |
| 8 | Daily structural digest delivered by 9am | PRO-UC-11 digest confirmed as delivered via Celery Flower task log; digest contains violation delta and top 3 action items | Delivered by 09:00 on all weekdays |
| 9 | Sprint retro structural insight generated on sprint close | PRO-UC-02 triggered by GitHub Projects v2 iteration close webhook; structural debt report with violation delta generated and displayed | Report generated within 5 minutes of sprint close webhook |
| 10 | Memory gaps visible in UI | Verification Queue populated with services that have no ADR coverage (no WHY edges), no ownership (no OWNS edges), or no test coverage data | ADR gap list present in UI; updated nightly |
| 11 | Team member onboarded via SCIM creates correct graph nodes | IdP SCIM POST /Users event triggers creation of Developer node in Neo4j with correct properties; MEMBER_OF edge created to correct team | Neo4j write confirmed within 5 seconds of SCIM event |
| 12 | Member offboarded triggers key-person risk scan and alert | Keycloak user deactivation (SCIM PATCH active:false) triggers immediate key-person risk scan; any services with no remaining active owner are flagged CRITICAL in UI within 30 seconds | CRITICAL flag in Verification Queue within 30 seconds of deactivation event |
Connector Set for MVP Verification¶
The 6 priority connectors that must be live for MVP acceptance testing:
| # | Connector | Primary Data | Trigger |
|---|---|---|---|
| 1 | GitHub (repos) | Repository structure, PRs, branches, CODEOWNERS, ADRs, post-mortems | Webhooks (push, pull_request) + poll |
| 2 | GitHub Projects v2 | SprintNode, IntentAssertion, project item status | Webhook (projects_v2_item) + poll |
| 3 | GitHub Pages | Documentation staleness, doc coverage | 6-hour poll |
| 4 | Terraform | InfraResource nodes, HOSTS edges, declared ports, region | Post-apply webhook + state file poll |
| 5 | Kubernetes | Running pods, services, deployments; reconciliation with Terraform state | 15-minute API poll |
| 6 | Jira (basic) | IntentAssertion nodes from tickets; sprint close events | Webhook (issue_created, sprint_closed) |
Persona Coverage for MVP Verification¶
12 personas must be tested against the acceptance criteria, representing all roles and access patterns:
| Persona | Role | Primary Criteria Tested |
|---|---|---|
| Alice (Backend Developer) | Developer | AC-3 (PR blocked), AC-4 (NL query), AC-10 (memory gaps visible) |
| Bob (Frontend Developer) | Developer | AC-3 (PR blocked), AC-4 (NL query), AC-11 (SCIM onboarding as Bob) |
| Carol (Platform Architect) | Architect | AC-5 (ADR rationale), AC-7 (simulation), AC-3 (ADR reference in block) |
| Dan (DevOps Engineer) | DevOps/SRE | AC-6 (SSH detection), AC-2 (dependency graph), AC-7 (blast radius) |
| Emma (Scrum Master) | Scrum Master | AC-8 (daily digest), AC-9 (sprint retro), AC-10 (memory gaps) |
| Frank (Engineering Manager) | Viewer | AC-4 (NL query), AC-2 (dependency graph), AC-10 (memory gaps) |
| Grace (New Hire) | Developer | AC-11 (SCIM onboarding as Grace), AC-4 (NL query as first user experience) |
| Hiro (Departing Employee) | Developer | AC-12 (SCIM offboarding as Hiro, triggering key-person risk) |
| Iris (CI/CD Service Account) | Service Account | AC-3 (GitHub Checks API integration), AC-1 (connector setup) |
| Jack (External Contractor) | Viewer | Read-only access verification; cannot trigger governance actions |
| Karen (VP Engineering) | Viewer | AC-8 (daily digest delivery), executive dashboard access |
| Liam (Security Architect) | Architect | AC-6 (SSH drift), security controls verification, audit log integrity |
Measurement Protocol¶
For Latency Criteria (AC-3, AC-4, AC-5, AC-7)¶
Latency is measured end-to-end from the triggering event to the result being available: - AC-3: From GitHub webhook receipt timestamp to GitHub Checks API result posted - AC-4: From HTTP request received at FastAPI gateway to HTTP response sent - AC-5: From HTTP request to full response body sent (including source URL in payload) - AC-7: From simulation trigger (HTTP request) to before/after delta rendered in UI (measured with browser DevTools)
p95 is measured over a minimum of 20 test runs per criterion. The p95 requirement means 95% of runs must meet the target; occasional outliers above the threshold do not constitute a pass failure.
For Coverage Criteria (AC-1, AC-2)¶
- AC-1: Clock starts when
docker compose upreturns healthy status on all services. Clock stops whenMATCH (n:Service) RETURN count(n)in Neo4j returns a non-zero result. - AC-2: Coverage is computed as:
(services in Neo4j) / (services discoverable from GitHub + Terraform + K8s repos manually counted). 80% threshold means we allow for some entity resolution failures, private services not accessible to connectors, and services in flight at the time of ingestion.
For Event-Driven Criteria (AC-6, AC-8, AC-9, AC-11, AC-12)¶
These criteria are verified by triggering the event and observing the outcome within the specified window: - AC-6: Add an undeclared service to a test VM (start a process on a new port); observe SSH Runtime Connector alert in UI within 15 minutes - AC-8: Observe Celery Flower task completion log for PRO-UC-11 at or before 09:00 - AC-9: Close a GitHub Projects v2 iteration; observe sprint retro report in UI within 5 minutes - AC-11: Provision a new user in Keycloak (triggering SCIM push); verify Developer node in Neo4j within 5 seconds - AC-12: Deactivate a user in Keycloak; verify CRITICAL flag on orphaned services in Verification Queue within 30 seconds
Non-Negotiable Pre-Conditions for MVP Acceptance Testing¶
The following must be true before MVP acceptance testing begins. These are not acceptance criteria — they are prerequisites for a meaningful test:
- Flyway migrations have run clean: No pending migrations; all PostgreSQL schemas are at the latest version
- neo4j-migrations have run clean: All graph constraints and indexes are applied
- All 4 databases are healthy: Neo4j, PostgreSQL, Redis, NATS all pass their health checks
- All 5 vLLM endpoints are running: bge-m3, bge-reranker, Dense 70B (all 4 LoRA adapters loaded), Llama 4 Scout
- Keycloak substrate realm is configured: 3 clients, SCIM plugin installed, Group Membership Mapper configured
- At least one real GitHub organization is connected: Not a test repository with synthetic data — a real organization with at least 5 repositories, 3 developers, and at least 2 months of commit history
- At least one Terraform state file is accessible: Representing at least 3 InfraResource nodes
- At least one ADR exists in the connected repository: So AC-3 can cite a real ADR rather than a synthetic one