v1.1April 15, 2026AGPL-3.0ekdoti.co
Design · §10

Risk register

Every risk identified during the design phase, classified by severity and paired with a concrete mitigation. Reviewed at the start of each implementation sprint.

Approach

A risk is anything that could cause Ekdotico to fail to meet its commitments to users, partners, or the wider academic community. Risks are tracked here with a stable identifier, a severity classification, and a specific mitigation strategy that can be evaluated against during implementation.

Severity levels:

  • High — The platform's core value proposition or legal standing is at stake. Mitigation must be in place before launch.
  • Medium — The platform's quality, cost, or scalability is materially affected. Mitigation is required but may be iterative.
  • Low — The risk is contained but worth documenting. Lightweight mitigation is acceptable.

Register

IDRiskSeverityMitigation
R-01Citation hallucination in AI Research synthesisHighSystem prompt explicitly forbids inventing sources; Claude may only cite from injected abstracts; all citations verified via CrossRef before chip rendering; unverified chips show a warning badge.
R-02Academic integrity framing of AI writing featuresHighAll features labelled as assistance tools; the word "humanize" never appears in UI copy; export metadata includes AI disclosure; Terms of Service explicitly defers to the institution's AI use policy.
R-03Provenance gaming — student writes elsewhere and pastes at the endHighLarge paste events over 500 characters are flagged and weighted heavily in the AI contribution score; paste velocity and word count velocity are independent signals; disclosure is a probabilistic breakdown, not a binary pass or fail.
R-04Ed25519 private key compromiseHighKey stored only in environment variable; never logged or transmitted; key rotation procedure documented; old signatures remain verifiable using versioned public keys.
R-05Google Docs extension privacy overreachHighExtension captures only event type, timestamp, and byte length; no raw keystroke values; no clipboard content; reviewed against Chrome Web Store privacy policies prior to submission.
R-06GDPR compliance for writing event logsHighRaw keystroke values never stored; only aggregate metrics and event types; per-document opt-in or opt-out; full data deletion via self-service route; lawful basis documented as legitimate interest.
R-07pgvector query performance degradation at scaleMediumHNSW index on embedding column; chunk size tuned to approximately 512 tokens; source document count per document capped at Free tier; Pro tier gets expanded quota.
R-08Mini-chat context window exceeding model limitsMediumContext payload capped: selectedText 500 chars, surrounding 1,000 chars, top 3 chunks 1,500 chars total, document thesis 200 chars; total always under 4k tokens for Haiku.
R-09Anthropic API cost from mini-chat at scaleMediumClaude Haiku for all mini-chat inference; per-user daily token budget enforced via Redis; mini-chat capped at 5 messages before user is prompted to promote to Source Chat where Sonnet handles deeper context.
R-10URL-to-citation accuracy varies by siteMediumPrioritise DOI over URL resolution; show pre-filled form for user correction; URL-derived citations marked as unverified until DOI confirmed via CrossRef.
R-11React Flow mind map collaborative sync complexityMediumMind map stored as JSON in PostgreSQL, not as Yjs CRDT; optimistic local updates plus server reconciliation on tab switch; Yjs reserved exclusively for the Write editor.
R-12PDF storage costs at scaleMediumFree tier provides link-only PDFs via Unpaywall open-access URLs; PDF upload gated to Pro tier; per-user storage quota enforced at API layer.
R-13verify.ekdoti.co impersonation or fake signaturesMediumSignatures verifiable only against published public key; HTTPS enforced; publicIds are non-guessable cuid values; rate limiting applied to all verification endpoints.
R-14Novel fork diverging from upstream security patchesLowAcademic extensions isolated in separate Tiptap extension files; upstream security patches cherry-picked; all divergence points documented in FORK.md.
R-15Retraction Watch external dependency at runtimeLowDatabase cached as a weekly-refreshed CSV in PostgreSQL via BullMQ cron; zero external dependency at citation-check query time.
R-16Source Chat embedding cost at scaleLowEmbedding runs once per source document chunk and is cached indefinitely in pgvector; no re-embedding unless source is removed and re-added; processing via BullMQ batch workers.
R-17False positive task auto-completion eroding student trustHighAmber confirmation state (confidence 0.5–0.85) gates all uncertain completions; only high-confidence signals above 0.85 auto-complete silently; full TaskEvent audit trail; one-click revert always available.
R-18Research Journal generation cost at scaleMediumDelta generation rather than full regeneration as the default path; delta jobs run on Claude Haiku using only new activity since last update, typically under 1k tokens per update; full regeneration rate-limited to once per 30 minutes per document.
R-19Task extraction noise producing too many irrelevant tasksMediumExtraction prompt includes existing pending task titles to prevent duplication; Claude instructed to extract only clearly actionable items, not generic advice; extraction output validated as JSON before any database writes; student can dismiss individual tasks without affecting the extraction pipeline.

Review cadence

The risk register is reviewed at three checkpoints:

  1. Start of each implementation sprint. New risks discovered during the previous sprint are added; mitigations are checked for effectiveness.
  2. Before each major release. Severity classifications are re-evaluated against the current state of the platform.
  3. Annually for ongoing operational risks such as vendor pricing changes, GDPR enforcement updates, and academic integrity policy shifts at partner institutions.