Skip to Content
Functional Requirements

Functional Requirements Catalog

Derived, not authored. Every requirement below is extracted from an existing concept doc or its cited source (proto/controller/entity) — nothing here is new scope. Treat this as a BA-style index into the specs, not a replacement for them — each row cites where to read the full contract.

Audience: anyone who needs “what must the system do” as a flat, actor-organized list — product planning, test-case derivation, or onboarding a new contributor to the behavior surface before the architecture surface.

How to read this

  • FR ID — stable identifier, grouped by domain (FR-ISS-* issuer, FR-HLD-* holder, etc.). Not the same numbering as the concept docs’ own guardrail letters (C1, G1, H1, V1) — those are constraints on how, these are what the system does.
  • Status — Built, In Progress, or Planned, taken from the source doc at time of writing. Not automatically kept in sync — re-check the source doc if this page’s date is old.
  • Source — the authoritative doc/section. Disagreements resolve in the source’s favor.
  • Functional requirements only. Cross-cutting non-functional constraints (mTLS, rate limits, encryption-at-rest) are listed once at the end rather than repeated per domain.

Actors

ActorDefinition
IssuerAn accredited institution issuing credentials — custodial (Attest ID holds the key) or BYOK (issuer holds it).
HolderThe credential subject — owns a wallet, claims/shares/proves credentials.
VerifierChecks a credential’s authenticity — anonymous by default, optionally a registered organization.
CustodianA fourth role: attests to a document it collected but did not originally issue (Tier-2).
AdminPlatform operator — approves issuers/custodians/verifiers, manages config, audits.
SystemAutomated actors: schedulers, the LLM client, background jobs.

FR-ISS: Issuer Onboarding & Identity

Source: System Design §8.3, §9.3.1; BYOK Signing Spec §5.1; Issuer API Keys

FR IDRequirementActorStatus
FR-ISS-1An institution shall be able to self-register as an issuer (POST /issuer/register), custodial or BYOK, without prior admin action.IssuerBuilt
FR-ISS-2Every new issuer registration shall land PENDING_APPROVAL unconditionally — no path to ACTIVE straight out of registration, for either signing mode.Issuer, AdminBuilt
FR-ISS-3A PENDING_APPROVAL or REJECTED issuer shall be able to sign in but reach only a holding-bay status page — no business functionality — until an Admin approves it.Issuer, AdminBuilt
FR-ISS-4An Admin shall be able to approve or reject a pending issuer, and suspend/reinstate/revoke an active one.AdminBuilt
FR-ISS-5An issuer shall be able to rotate its signing key, with version history retained for historical verification.IssuerBuilt
FR-ISS-6An issuer shall be able to configure SSO (OIDC or SAML 2.0) for its own portal sign-in.IssuerBuilt
FR-ISS-7A custodial issuer shall be able to issue and manage server-to-server API keys (create, list masked, revoke) for headless integrations, without needing an interactive session.IssuerBuilt
FR-ISS-8A revoked API key shall stop authenticating on the very next request — no propagation delay.SystemBuilt

FR-BYOK: BYOK Signing

Source: BYOK Signing Spec; BYOK Reference SDK & Oxford Demo Issuer

FR IDRequirementActorStatus
FR-BYOK-1An issuer shall be able to register a public key only (BYOK) and sign every credential itself; Attest ID shall never receive or store the private key.IssuerBuilt
FR-BYOK-2The platform shall verify a BYOK-submitted signature against the issuer’s registered public key before accepting a credential, rejecting an invalid one with 400.SystemBuilt
FR-BYOK-3A BYOK issuer shall generate credential_id, issuanceDate, and the proof’s created timestamp itself and submit them with the signed request.IssuerBuilt
FR-BYOK-4A reference SDK and demo issuer shall exist so a third party can implement or validate a from-scratch BYOK client against the same contract.IssuerBuilt

FR-CRED: Credential Issuance & Lifecycle

Source: System Design §8.1, §6.1

FR IDRequirementActorStatus
FR-CRED-1An active issuer shall be able to issue a single W3C Verifiable Credential, custodial or BYOK-signed.IssuerBuilt
FR-CRED-2An issuer shall be able to batch-issue credentials via a single JSON request (/credentials/batch), each record optionally carrying its own BYOK signature.IssuerBuilt
FR-CRED-3An issuer shall be able to revoke a credential it issued, changing its lifecycle status.IssuerBuilt
FR-CRED-4A revocation shall optionally capture and classify a reason (MISCONDUCT/DATA_CORRECTION/EXPIRED_ACCREDITATION/ADMINISTRATIVE/OTHER).Issuer, SystemBuilt
FR-CRED-5A credential shall be retrievable by ID, returning its current status and metadata.Verifier, HolderBuilt

FR-VER: Credential Verification

Source: System Design §8.2

FR IDRequirementActorStatus
FR-VER-1Any party shall be able to verify a credential’s Ed25519 signature and status without authentication (POST /credentials/verify).VerifierBuilt
FR-VER-2A shareable verification link shall resolve a credential, verify it, and log the access for the holder’s transparency trail, in one request (GET /verify/{share_token}).Verifier, HolderBuilt
FR-VER-3Verification shall be stateless and resolve issuer keys via the Issuer Registry rather than local storage, so it scales independently.SystemBuilt
FR-VER-4Every verification event shall be recorded in an immutable audit trail, queryable by the holder and by admins.System, Holder, AdminBuilt

FR-HLD: Holder Authentication & Wallet

Source: Holder Authentication

FR IDRequirementActorStatus
FR-HLD-1A holder shall be able to sign in passwordlessly via magic-link email.HolderBuilt
FR-HLD-2A holder shall be able to register and sign in with a WebAuthn passkey.HolderBuilt
FR-HLD-3A holder shall be issued a 24-word recovery code as a fallback when both magic-link and passkey are unavailable.HolderBuilt
FR-HLD-4No sign-in attempt shall reveal whether an email/account exists (no enumeration) on any auth endpoint.SystemBuilt
FR-HLD-5A holder’s session shall be delivered as an HttpOnly cookie, never a JS-readable token.SystemBuilt

FR-VFR: Verifier/Employer Identity

Source: Verifier / Employer Identity

FR IDRequirementActorStatus
FR-VFR-1An organization shall be able to self-register as a verifier, landing PENDING_APPROVAL.VerifierBuilt
FR-VFR-2An Admin shall be able to approve or reject a pending verifier registration.AdminBuilt
FR-VFR-3A registered, approved verifier shall be able to sign in via magic link and have its organization name attributed automatically and authoritatively on every verification it performs.VerifierBuilt
FR-VFR-4Anonymous, account-free verification shall remain available and unaffected by the registered-verifier feature.VerifierBuilt

FR-CAT: Master Data Registry (Catalog & Learner Records)

Source: Master Data Registry

FR IDRequirementActorStatus
FR-CAT-1The platform shall maintain a jurisdiction-agnostic catalog of qualifications, units, skill sets, micro-credentials, identity documents, and licences, versioned so a superseded entry is never deleted.Admin, SystemBuilt
FR-CAT-2Each jurisdiction shall be independently configurable (frameworks, code sets, document types) without a schema change — onboarding a new market is a data change.AdminBuilt
FR-CAT-3The platform shall record a learner’s identity, national identifiers (encrypted at rest), enrolments, and outcomes, and link them (softly) to issued credentials.Issuer, SystemBuilt
FR-CAT-4An issuer shall be able to register its accreditation scope against a jurisdiction’s regulator (issuer_scheme_registration) with a registration number and scoped catalog entries.Issuer, AdminBuilt
FR-CAT-5The platform shall support generating a regulator-specific export (e.g. AVETMISS NAT files) by mapping core fields to that scheme’s export fields via a small, extensible resolver strategy set.Admin, SystemBuilt

FR-CST: Custodian Onboarding & Attestation

Source: Custodian Onboarding

FR IDRequirementActorStatus
FR-CST-1An organization shall be able to register as a Custodian (a fourth role, distinct from Issuer) with its own DID/key custody.CustodianBuilt
FR-CST-2A Custodian shall be able to upload a batch of third-party credential documents for intake, with no document bytes ever persisted in the platform’s own storage beyond cold storage.CustodianBuilt
FR-CST-3The system shall extract structured fields from an uploaded document via on-demand LLM vision, suggesting (never auto-committing) a holder match and a catalog-entry match.SystemBuilt
FR-CST-4A human reviewer shall confirm or correct the holder match and extracted fields before any attestation is created.CustodianBuilt
FR-CST-5A confirmed review shall produce a Tier-2 CustodianAttestationCredential, signed with the Custodian’s own key, distinguishable from a Tier-1 original issuance in every verification response (provenance block).Custodian, SystemBuilt
FR-CST-6A reviewer shall be able to view a watermarked, non-downloadable preview of the source document when extracted fields are insufficient to review confidently, gated by a second-level authorization check for elevated-sensitivity documents.CustodianBuilt
FR-CST-7A holder shall be able to claim a Custodian-attested credential into their wallet, and it shall display distinctly from a Tier-1 credential.HolderBuilt

FR-CMP: Custodian Compliance

Source: Custodian Compliance

FR IDRequirementActorStatus
FR-CMP-1A custodian attestation’s expiry shall be derived from the source document’s actual expiry (or the catalog’s validity rule), not a flat 365-day default from attestation time.Custodian, SystemBuilt
FR-CMP-2A Custodian shall have a cross-batch register of every credential it has attested, with live status (VALID/EXPIRING_SOON/EXPIRED/REVOKED) computed at read time.CustodianBuilt
FR-CMP-3A Custodian shall have a roster of the people its attestations belong to.CustodianBuilt
FR-CMP-4The system shall send pre-expiry and post-expiry reminders to both the holder (claimed or unclaimed) and the Custodian, on a configurable offset schedule, without double-sending.SystemBuilt
FR-CMP-5The system shall track re-performance obligations (a credential that must be redone) as a scheduled lifecycle (DUE → SCHEDULED → COMPLETED/CANCELLED/derived OVERDUE), closed only by a fresh attested document — never a manual “renew”.Custodian, SystemBuilt
FR-CMP-6A holder shall be able to consent to sharing their wallet profile data with a Custodian for roster/compliance purposes.Holder, CustodianBuilt
FR-CMP-7 (Phase 7)A Custodian shall be able to manage its own credential catalog directly and attest without requiring an intake batch (direct attestation, evidence uploaded or system-generated).CustodianIn Progress

Source: Custodian Portal Search

FR IDRequirementActorStatus
FR-SRC-1A custodian user shall be able to jump to any record (person, credential, batch, document, group) from a global, app-bar search.CustodianBuilt
FR-SRC-2A custodian user shall be able to filter People, Credentials, or Intake lists by a per-scope, server-enforced allow-list of filters.CustodianBuilt
FR-SRC-3A custodian team shall be able to save a search (text + filters) and share it across the team, and set a personal default per scope.CustodianBuilt
FR-SRC-4A saved search referencing a group shall never leak cross-organization data — a foreign or unknown group id resolves as not-found, never as data.SystemBuilt

FR-WFC: Custodian Workforce & Compliance Gap Analysis

Source: Custodian Workforce Compliance

FR IDRequirementActorStatus
FR-WFC-1A Custodian shall be able to define groups (e.g. by site/role/contractor status) and per-group credential requirements.CustodianBuilt
FR-WFC-2The system shall derive, at read time, each person’s requirement state (MET/EXPIRING_SOON/EXPIRED/REVOKED/MISSING/NOT_YET_DUE) and a per-person roll-up, without storing or caching a gap state.SystemBuilt
FR-WFC-3A Custodian shall be able to bulk-import people into the roster/groups.CustodianBuilt
FR-WFC-4The system shall forecast upcoming lapses by group/role so training capacity can be planned ahead.CustodianBuilt
FR-WFC-5A Custodian shall be able to grant a time-boxed waiver against a specific gap, distinct from and never counted as “met”.CustodianBuilt
FR-WFC-6A holder shall be able to consent to disclose specific requirement states to a Custodian via a scoped proof link, without exposing group membership or other people’s data.HolderBuilt
FR-WFC-7A holder shall be able to push evidence to a Custodian unprompted (consented share), in addition to responding to a Custodian’s ask.HolderBuilt

FR-CLM: Holder Claim Integrity

Source: Holder Claim Integrity

FR IDRequirementActorStatus
FR-CLM-1A name-only fuzzy match between a document and a holder account shall never auto-bind a credential — it shall be a suggestion only, requiring the claimant to prove ownership.SystemBuilt (Phase 1)
FR-CLM-2The system shall generate a document-derived knowledge challenge the claimant must answer correctly to claim a Tier-2 credential, never LLM-judged.Holder, SystemBuilt (Phase 2)
FR-CLM-3A repeated wrong answer to a knowledge challenge shall back off, then lock, requiring fresh authentication to retry.SystemBuilt (Phase 4)
FR-CLM-4The system shall compute an identity-check risk signal at claim time; an uncertain/false result shall escalate to a hold, never auto-deny.SystemBuilt (Phase 3)
FR-CLM-5A claim placed on hold shall auto-clear or escalate to an admin per defined risk criteria, rather than blocking indefinitely.System, AdminBuilt (Phase 5)
FR-CLM-6Every step of the claim flow shall be recorded in a tamper-evident, audit-chained log, never a bare log line.SystemBuilt (Phase 6)
FR-CLM-7A holder shall be able to dispute a claim after the fact (“this wasn’t me”) and trigger a reversal path.HolderPlanned (Phase 7)
FR-CLM-8An unclaimed placeholder-DID credential shall be claimable via either a claim link or a fresh onboarding invite.HolderPlanned (Phase 5c onboarding-invite path)

FR-CNV: Cross-Custodian Attestation Convergence

Source: Cross-Custodian Attestation Convergence — spec only, no code yet

FR IDRequirementActorStatus
FR-CNV-1A credential’s VC shall embed the issuer’s display name so a second custodian can recognize a prior attester directly from the presented credential.SystemPlanned
FR-CNV-2When a second custodian, or the real issuer, later touches the same underlying record, the system shall auto-link the two attestations when the match is unambiguous — no admin click required.SystemPlanned
FR-CNV-3An admin shall be pulled in only for a genuinely ambiguous match, to resolve it or to oversee/undo an automatic link — never to approve every match.AdminPlanned

FR-DSC: Verifier Provenance Disclosure

Source: Verifier Provenance Disclosure — spec only, no code yet

FR IDRequirementActorStatus
FR-DSC-1When a verifier checks a credential that has since been superseded by a more authoritative record, the verification response shall disclose that fact, reusing the existing live status check with no extra round trip.Verifier, SystemPlanned
FR-DSC-2Provenance disclosure shall be advisory only — it shall never change the credential’s own validity outcome.SystemPlanned

FR-LLM: LLM-Assisted Features

Source: LLM Integration

FR IDRequirementActorStatus
FR-LLM-1A verifier shall see a plain-language summary and cross-border equivalency note alongside a verification result.VerifierBuilt
FR-LLM-2An admin shall see a plain-English anomaly narrative on the network dashboard, and be able to search audit logs using natural language (translated to structured filters, never executed directly by the model).AdminBuilt
FR-LLM-3An issuer shall get an AI-suggested CSV column mapping for bulk issuance, and an AI-classified revocation reason at revoke time — both reviewed/editable before being applied.IssuerBuilt
FR-LLM-4An admin configuring a regulatory export field map shall get an AI-suggested mapping from a plain-language description, constrained to fields the platform can actually source.AdminBuilt
FR-LLM-5An issuer’s KYC document and a holder’s ID-check photo shall be analyzed by vision extraction, informationally only — never gating approval or blocking any action.Issuer, HolderBuilt
FR-LLM-6Every LLM-assisted feature shall degrade cleanly to “unavailable” when the model endpoint is unset, disabled, or unreachable — no feature is load-bearing for core issuance/verification correctness.SystemBuilt
FR-LLM-7A user shall be able to semantically search the catalog and ask a plain-language support question, answered from an in-memory embedded index of catalog/docs content.Issuer, AdminBuilt

FR-ADM: Admin Console

Source: System Design §6.4; Admin Console

FR IDRequirementActorStatus
FR-ADM-1An admin shall be able to manage admin users with role-based access (ADMIN/OPERATOR/VIEWER).AdminBuilt
FR-ADM-2An admin shall be able to view and update global system configuration (thresholds, feature flags, notification settings).AdminBuilt
FR-ADM-3Every administrative action shall be recorded in an immutable audit trail, queryable and natural-language-searchable.Admin, SystemBuilt
FR-ADM-4An admin shall be able to view aggregate network-wide platform statistics and system health.AdminBuilt
FR-ADM-5An admin with the ADMIN role shall be able to live-tail a running service’s container logs as a stream, from the Admin Console itself.AdminBuilt

FR-IDV: Identity Verification — Liveness & Facial Match

Source: IDV Liveness & Facial Verification — named gap only, not scoped, not built

FR IDRequirementActorStatus
FR-IDV-1The system shall confirm a live, physically-present human (anti-spoofing/liveness) at the moment of a holder claim.HolderPlanned — unscoped
FR-IDV-2The system shall match the live face against a reference image tied to the claimed identity.Holder, SystemPlanned — unscoped

No API shape, vendor, or data-retention design exists for either row — see the source doc before treating these as actionable.

FR-LMS: Course Delivery & Retakes

Source: Course Delivery & Retakes (LMS) — design spec, no code/schema/service built

FR IDRequirementActorStatus
FR-LMS-1A holder shall be able to retake an online-deliverable course/assessment in credential-wallet, assigned by a custodian’s re-performance schedule or taken self-serve.HolderPlanned
FR-LMS-2A custodian/issuer shall be able to connect their own LMS (LTI 1.3, SCORM/xAPI, or a signed webhook) so a completion there closes the loop in Attest.Custodian, IssuerPlanned
FR-LMS-3A custodian/issuer with no existing LMS shall be able to author and publish a minimal native course (lessons + one assessment) in Attest.Custodian, IssuerPlanned
FR-LMS-4A course with a practical component shall never auto-close a re-performance schedule or auto-issue a credential from the online portion alone.SystemPlanned

FR-WFP: Workforce Platform Expansion (Payroll & Rostering)

Source: Workforce Platform Expansion — named direction only, not scoped, not built

FR IDRequirementActorStatus
FR-WFP-1The custodian platform shall process payroll (wages, tax withholding/remittance, banking) for workforce members.CustodianPlanned — unscoped
FR-WFP-2The custodian platform shall support shift/labor rostering, gated by workforce compliance state.CustodianPlanned — unscoped

No jurisdiction, licensing, data-residency, or build-vs-integrate design exists for either row — see the source doc before treating these as actionable.

Cross-Cutting Non-Functional Requirements

These aren’t separate user-facing features — constraints every FR above is built under.

NFRRequirementSource
NFR-1Every internal gRPC connection shall require mutual TLS with no plaintext fallback.Internal gRPC mTLS
NFR-2The API Gateway shall rate-limit every route independently (Redis-backed, per authenticated user/issuer or per IP).API Gateway
NFR-3No sign-in flow across any actor (holder, verifier, issuer, custodian) shall allow account enumeration.Holder/Verifier/Custodian identity docs
NFR-4Custodial private keys shall be encrypted at rest (AES-256-GCM at the application layer today; target design is HSM/KMS before onboarding an external issuer whose custody isn’t otherwise trusted).System Design §9.1
NFR-5A Custodian shall never persist the original bytes of a collected document beyond cold storage; extraction reads are transient, in-memory, single-use.Custodian Onboarding
NFR-6Every schema change shall go through Flyway migrations, in-place edits to each service’s V1__schema.sql/V2__seed_data.sql only (no V3+ files).CLAUDE.md, Database Schema Ownership

Summary

StatusCount (approx., FR rows only)
Built~64
In Progress1 (FR-CMP-7)
Planned18 (FR-CLM-7/8, FR-CNV-1..3, FR-DSC-1..2, FR-IDV-1..2, + IDV unscoped, FR-LMS-1..4, FR-WFP-1..2 + unscoped)

The overwhelming majority of this platform’s functional surface is built, not aspirational — the genuinely open functional work clusters almost entirely in one arc (chain-of-custody: the holder-claim dispute path, cross-custodian convergence, and verifier provenance disclosure in full) plus one entirely unscoped idea (IDV liveness/facial match). See Chain of Custody Overview for that arc’s own launch-blocking assessment, and CLAUDE.md’s “Roadmap Context” for the authoritative current backlog — this catalog is a map of what, not a substitute for either’s when.