# Knowledge graph index

_Generated by `kg.mjs index` — do not edit. Start with [README](README.md)._

295 nodes.

## entity (77)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [bank](nodes/bank.md) | An item bank: the unit of content ownership, backed by an AD tenant with its own AD credentials. | 83 | 3 | banks |
| [user](nodes/user.md) | A person who signs in to Abigail; belongs to accounts and banks through role assignments. | 78 | 5 | accounts |
| [bulk-request](nodes/bulk-request.md) | A queued background job ("Queued Request", e.g. IC-1042) of one request_type — AI generation/translation/verification/test cases/form verification, exports, imports — with status, progress counters and S3 file keys; processed by the bulk_requests pgqueue consumer. | 71 | 8 | bulk |
| [form](nodes/form.md) | An AD form (test form assembling items into sections, with scoring map and delivery settings); owned by AD, edited through Abigail. | 56 | 6 | content, ad |
| [item](nodes/item.md) | An AD item (question, QTI-based); owned by AD, read and written by Abigail through the AD Data API with Abigail permission/scope/status/lock gates. | 54 | 7 | content, ad |
| [account](nodes/account.md) | A customer organisation (tenant) that owns users, account roles and banks. | 45 | 6 | accounts |
| [review](nodes/review.md) | A content review in a bank: a dated window in which assigned and/or join-code reviewers give a decision + comment on a fixed type of AD content, with reviewer configuration and optional weekly access schedule. | 39 | 8 | reviews |
| [user-bank-role](nodes/user-bank-role.md) | Assignment of a user to a bank role on a bank, scoped to one account (one role per user, bank and account). | 35 | 5 | rbac |
| [bulk-request-task](nodes/bulk-request-task.md) | One unit of work inside a bulk request (e.g. one item × verification type, one chunk of ≤3 generated items, one export batch); status tracked independently so retries only rerun failed tasks. | 33 | 2 | bulk |
| [stimulus](nodes/stimulus.md) | An AD shared stimulus (passage/shared content referenced by items); owned by AD, edited through Abigail with scope/status/lock gates. | 33 | 4 | content, ad |
| [bank-role](nodes/bank-role.md) | A named role defined per bank (and per account on a shared bank), granting bank-level permissions and status permissions. | 32 | 3 | rbac, banks |
| [account-settings](nodes/account-settings.md) | Per-account private settings row holding the account's AD Data API and AI content-agent connection credentials. | 30 | 2 | accounts, secrets |
| [test-profile](nodes/test-profile.md) | A bank-scoped test profile (formerly blueprint) - a JSON tree of eligibility/inclusion queries and count rules that a form or item pool must satisfy. | 30 | 4 | test-profiles |
| [user-account-role](nodes/user-account-role.md) | A user's membership of an account, with at most one (nullable) account role — the row that makes a user "in" an account. | 30 | 4 | rbac |
| [bulk-operation](nodes/bulk-operation.md) | A file-based bulk operation tracking row (bulk_operations, formerly bulk_imports) — legacy synchronous user import/export and item-metadata upload, plus the async Toni project duplicate — with status, row counters, errors and S3 keys. | 28 | 4 | bulk |
| [administration-test-form](nodes/administration-test-form.md) | A form slot in an administration test - optionally holds an AD form id and a test profile, plus plan-column values and a workflow status. | 25 | 4 | administrations |
| [media](nodes/media.md) | An AD media asset (image/audio/video/file) used by items and stimuli; owned by AD, uploaded and edited through Abigail. | 25 | 1 | content, ad |
| [account-role](nodes/account-role.md) | A named role defined at account scope, granting account-level permissions to users. | 24 | 3 | rbac |
| [bank-role-status-permission](nodes/bank-role-status-permission.md) | Per bank-role grant for one AD workflow state (status) of items, forms or shared stimuli - can view, can assign (transition into), can edit. | 24 | 2 | rbac, workflow |
| [review-external-user](nodes/review-external-user.md) | An anonymous reviewer (name + email, no Abigail account) registered on one review by redeeming a join code; identity is (review, lower(email)). | 23 | 5 | reviews, auth |
| [toni-element](nodes/toni-element.md) | A style rule/entry in a Toni guide's tree (max depth 3) with workflow state (wip/pending/approved/do_not_use), a draft head revision and an active approved version; soft-deletable. | 23 | 9 | toni |
| [user-auth](nodes/user-auth.md) | Credential/auth state for a user — sign-in email, bcrypt hash, password-reset token and throttle, login-lockout counters, SSO enforcement. | 22 | 2 | auth |
| [review-content](nodes/review-content.md) | One piece of AD content (item, form, stimulus or media, per the review's content_type) included in a review, with display position and active/hidden status. | 21 | 8 | reviews |
| [workflow-state](nodes/workflow-state.md) | An AD bank workflow state (status) for items, forms or shared stimuli, with allowed next-state transitions and optional metadata requirements; owned by AD, configured through Abigail. | 21 | 1 | content, ad, workflow |
| [bulk-generated-entity](nodes/bulk-generated-entity.md) | AI output of a bulk job — a generated item/passage staged for human review (pending_review → approved/rejected, QTI cleared after save to AD), or a record of a translation already saved into AD. | 20 | 5 | bulk, ai |
| [review-join-code](nodes/review-join-code.md) | A server-minted bearer code that lets anyone become an external reviewer of one review until it expires, is deactivated, or hits max_uses distinct participants. | 20 | 4 | reviews |
| [bank-metadata-field-restriction](nodes/bank-metadata-field-restriction.md) | Per-bank, per-account allowlist of bank roles that may edit one AD custom metadata field of items, forms or shared stimuli. | 19 | 4 | banks, rbac, metadata |
| [review-content-assignment](nodes/review-content-assignment.md) | Assignment of one reviewer (internal user or join-code external user) to one review-content row, with completion state driven by feedback. | 19 | 4 | reviews |
| [account-bank](nodes/account-bank.md) | Bank-sharing join row: which accounts have access to which bank. | 18 | 3 | banks, rbac |
| [administration](nodes/administration.md) | A test administration (testing window/event) in a bank that groups tests and their form slots, with a date-derived status and progress. | 18 | 4 | administrations |
| [bank-role-permission](nodes/bank-role-permission.md) | Join row granting one bank permission key (with optional scope/excluded-interaction params) to a bank role. | 18 | 2 | rbac |
| [resource](nodes/resource.md) | An AD resource (shared QTI reference content such as section intro screens and exhibits) used by forms; owned by AD. | 18 | 2 | content, ad |
| [review-template](nodes/review-template.md) | A named, bank-scoped preset of review settings (configuration and/or access_schedule sections) that coordinators save and apply when creating reviews; soft-deleted. | 18 | 3 | reviews |
| [toni-element-link](nodes/toni-element-link.md) | Directed element-to-element cross-reference edge in Toni (native or imported), resolved at read time so it survives forward refs, moves and target deletion. | 18 | 4 | toni |
| [toni-media](nodes/toni-media.md) | A media asset (image/audio/video) in a Toni project's library; row holds metadata + S3 key, bytes live in the Toni assets bucket; referenced from element markdown. | 18 | 4 | toni |
| [toni-project](nodes/toni-project.md) | A Toni style-guide project — the top-level container of guides and media, scoped to one account; unique name per account. | 18 | 5 | toni |
| [account-role-permission](nodes/account-role-permission.md) | Join row granting one account permission key (with optional JSONB params) to an account role. | 17 | 2 | rbac |
| [admin-plan](nodes/admin-plan.md) | An administration plan (admin_plan) - an account-owned JSONB column template describing which per-form metadata columns an administration tracks. | 17 | 2 | administrations |
| [review-feedback](nodes/review-feedback.md) | One immutable version of a reviewer's decision (vote) and comment on a review-content row; changed resubmissions add rows, withdrawal soft-deletes all versions. | 17 | 5 | reviews |
| [bank-gold-stat-set](nodes/bank-gold-stat-set.md) | A bank's single designated "gold" (canonical) AD historical statistics set, used as the authoritative item statistics. | 16 | 2 | banks, statistics |
| [toni-guide](nodes/toni-guide.md) | A guide inside a Toni project (formerly eStyle "Requirement Type") — groups a tree of elements; carries a linkable flag. | 16 | 4 | toni |
| [bulk-generated-test-case](nodes/bulk-generated-test-case.md) | An AI-generated scoring test case (candidate response + expected score) for one AD item, staged for review before the browser saves it as an AD item test case. | 15 | 5 | bulk, ai |
| [stimulus-template](nodes/stimulus-template.md) | A bank-local reference marking an AD shared stimulus as a reusable template; content is fetched live from AD when creating a stimulus from it. | 15 | 4 | content |
| [administration-test](nodes/administration-test.md) | A named, numbered test within an administration; parent of the form slots that hold AD forms. | 14 | 3 | administrations |
| [battery](nodes/battery.md) | An AD battery (BatterySTM) — a bank-scoped scoring configuration grouping forms into ordered units with reporting groups and objectives, scored together. | 14 | 2 | content, ad, scoring |
| [extract-job](nodes/extract-job.md) | One asynchronous extract run for a bank — selected AD forms, the runtime column config, status lifecycle and the S3 key/filename of the produced CSV or JSON. | 14 | 7 | extracts |
| [form-number](nodes/form-number.md) | One issued Paper ID (form number) - an append-only ledger row that is both the uniqueness record and the issuance history. | 14 | 4 | paper-ids |
| [setting-profile](nodes/setting-profile.md) | An AD form setting profile — a reusable, bank-scoped bundle of form delivery settings that forms attach to (ABIGAIL-1454 / AD-5995). | 14 | 1 | content, ad, forms |
| [toni-element-revision](nodes/toni-element-revision.md) | Append-only content snapshot of a Toni element (display/internal markdown + keywords) with a per-element revision_number and a full-text search vector. | 14 | 3 | toni |
| [bulk-verified-entity](nodes/bulk-verified-entity.md) | Result of one AI verification check (verification_type) on one AD item or passage within a bulk verification request, holding the agent's full JSON result. | 13 | 5 | bulk, ai |
| [project-code](nodes/project-code.md) | A globally unique Paper ID prefix owned by exactly one account (or a legacy program); required to mint SCANNABLE and NON_SCANNABLE numbers. | 13 | 3 | paper-ids |
| [review-response-viewer](nodes/review-response-viewer.md) | Per-review grant letting a user who holds reviews.view_responses (but not reviews.view) monitor that review's responses without reviewing anything. | 13 | 3 | reviews |
| [service-credential](nodes/service-credential.md) | A registered machine consumer ("service consumer") of Abigail - a svc_ client_id, fixed consumer scopes and an active flag; authenticates with up to two client secrets and acts only in the accounts it is granted. | 13 | 5 | auth, platform, consumer |
| [bank-ai-instruction](nodes/bank-ai-instruction.md) | Metadata for an AI instruction file uploaded for a bank to the content agent (file name, S3 URL, whether it is used for generation). | 12 | 2 | banks, ai |
| [toni-element-version](nodes/toni-element-version.md) | Immutable approval tag of a Toni element — points at the revision that was approved, numbered per element; the element's active_version_id selects the published one. | 12 | 4 | toni |
| [bulk-form-verification](nodes/bulk-form-verification.md) | The single report of an AI cross-form configuration verification run (RFC-011 sandbox analysis) — Markdown summary, artifacts and execution trace — one row per bulk request. | 11 | 5 | bulk, ai |
| [extract-template](nodes/extract-template.md) | Saved, bank-scoped form-extract configuration — name, output format, stats set, query config and an ordered list of columns; soft-deletable. | 11 | 5 | extracts |
| [historical-stat-set](nodes/historical-stat-set.md) | An AD historical statistics set — a named bank-level collection of per-item classical/IRT/DIF statistics (p-value, ptbis, ...) uploaded by CSV; one may be the bank's gold set. | 11 | 2 | content, ad, statistics |
| [scoring-stat-set](nodes/scoring-stat-set.md) | An AD scoring statistics set — per-item IRT parameters (a, b, c) keyed by item identifier, used by forms for IRT scoring. | 11 | 2 | content, ad, statistics, scoring |
| [test-profile-revision](nodes/test-profile-revision.md) | Immutable snapshot of a test profile's previous name/body/params, written automatically on every update or restore. | 11 | 3 | test-profiles |
| [user-platform-role](nodes/user-platform-role.md) | Assignment of a platform role to a user (who granted it, when); the source of a user's platform permissions. | 11 | 3 | rbac, platform |
| [bank-ai-translation-override](nodes/bank-ai-translation-override.md) | Metadata for a bank-level AI translation override file (JSON of bad-to-good translation mappings) stored with the content agent. | 10 | 2 | banks, ai, translation |
| [service-credential-account](nodes/service-credential-account.md) | Grant row letting one service credential act in one account (paper P7); every consumer data route checks the account against these grants. | 10 | 4 | auth, platform, consumer |
| [standard](nodes/standard.md) | An academic standard node from AD's standards tree (authority → publication → ... → standard), aligned to items and bank configuration; read-only in Abigail. | 10 | 1 | content, ad, standards |
| [extract-template-column](nodes/extract-template-column.md) | One column of an extract template — catalog key, header label, order, included flag and an optional modifier (text_transform, regex, conditional, expansion) over a source field. | 9 | 3 | extracts |
| [item-test-case](nodes/item-test-case.md) | An AD item scoring test case — a stored response plus expected score, runnable against the item's QTI scoring to catch regressions. | 9 | 1 | content, ad, scoring |
| [platform-role](nodes/platform-role.md) | Fixed, seeded platform-tier (cross-account) role and its raw-string permission grants (platform_roles + platform_role_permissions). | 9 | 2 | rbac, platform |
| [toni-import-batch](nodes/toni-import-batch.md) | One Toni package import run (analyze then commit) with lifecycle status and the full pre/post-ingest report as JSONB. | 9 | 4 | toni, import |
| [extract-job-form-result](nodes/extract-job-form-result.md) | Per-form outcome of an extract job — AD form id/name/identifier, success flag, error message and warnings. | 8 | 3 | extracts |
| [extract-notification](nodes/extract-notification.md) | In-app notification to the triggering user that an extract job completed; read/unread per user. | 8 | 3 | extracts |
| [service-credential-secret](nodes/service-credential-secret.md) | One bcrypt-hashed client secret of a service credential; its id is the secret_id claim of every consumer token issued against it, so revoking it kills those tokens on the next request. | 8 | 3 | auth, platform, consumer |
| [app-configuration](nodes/app-configuration.md) | Per-bank key/value runtime configuration row (JSONB value) adjustable without redeploy; today only metadata_export_batch_size. | 7 | 2 | config, banks |
| [bank-secret](nodes/bank-secret.md) | Per-bank credentials stored in AD for an external scoring service (OSCAR or MetaMetrics), managed by bank admins through Abigail. | 7 | 1 | ad, integration, scoring |
| [pgqueue-job](nodes/pgqueue-job.md) | One row in pgqueue_jobs (and, once attempts are exhausted, its copy in pgqueue_dead_jobs) — a typed JSON payload routed by the queue column. | 7 | 1 | queue |
| [toni-import-ref](nodes/toni-import-ref.md) | Importer idempotency/provenance row mapping a source-system (eStyle) entity id to the Toni row it became, per account; keeps legacy author email/username. | 6 | 6 | toni, import |
| [extract-template-view](nodes/extract-template-view.md) | Reserved table for a future "publishing" extract phase (named views/sheets grouping template columns); no code reads or writes it. | 4 | 2 | extracts |
| [token-usage-event](nodes/token-usage-event.md) | AI token usage event table (token_usage_events) created 2026-05-22 and dropped 2026-06-01; usage persistence moved to the Content Agent, Abigail only passes it through. | 3 | 6 | ai, dead |

## module (23)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [ad-content](nodes/ad-content.md) | AD content proxy: /api/ad handlers and the item/form/stimulus/media/setting-profile/stimulus-template services that enforce Abigail permissions, scope, status and locks before calling AD. | 101 | 48 | content, ad |
| [job-queue](nodes/job-queue.md) | In-house Postgres job queue library (pgqueue) plus every Abigail consumer/processor on it — the BulkProcessor for all bulk_requests job kinds and the two Toni consumers. | 92 | 46 | queue, bulk, ai |
| [account-admin](nodes/account-admin.md) | Account administration — accounts and their settings, users, account roles/permissions, user↔account and user↔bank role assignments (single and bulk), copy account roles, bulk user import/export, platform role assignment. | 71 | 41 | accounts, rbac |
| [bank-admin](nodes/bank-admin.md) | Bank administration - banks and bank sharing/sync, bank roles/permissions, status permissions, metadata field restrictions, gold stat sets, AI instruction toggles, copy bank config - plus the status/metadata gating helpers used by content saves. | 64 | 26 | banks, rbac |
| [web-client](nodes/web-client.md) | Vue 3 + PrimeVue + Pinia single-page client (client/src): shell, router + auth/permission guards, session-expiry tracking, i18n, generated Axios API client, design system. | 61 | 22 | client, shell |
| [auth](nodes/auth.md) | Authentication and authorization core — password/SSO login, the client_credentials token grant, JWT cookie sessions with sliding refresh and a per-request user-active check, impersonation (login-as), password reset, lockout, /me, and the account/bank/platform/Toni permission middleware every route uses. | 60 | 29 | auth |
| [review-service](nodes/review-service.md) | Content reviews: review CRUD, content reconcile, reviewer/response-viewer assignment, feedback (versioned), join codes + external reviewers, access schedules, review templates, history/results CSV exports. | 59 | 36 | reviews |
| [content-agent-proxy](nodes/content-agent-proxy.md) | server/agent + server/agentclient — authenticated proxy from Abigail to the per-account AI Content Agent (generation, translation, verification, chat/MCP, semantic search, instruction files) and the creator of most AI bulk jobs. | 52 | 27 | ai |
| [toni](nodes/toni.md) | Toni style-guide authoring: account-scoped projects, guides, element trees with draft revisions/approved versions, links, media, search, dead-link scan, project duplicate and the Content-Agent style-guide feed. | 43 | 27 | toni |
| [bulk-request-service](nodes/bulk-request-service.md) | Bulk requests ("Queued Requests") HTTP layer + repositories — list/track/cancel/retry bulk jobs, download their files, review staged AI output, verification feedback pass-through, item-metadata/metadata-export services and the three S3 bucket clients. | 41 | 23 | bulk |
| [db-migrations](nodes/db-migrations.md) | server/db package - GORM connection, embedded golang-migrate runners for three tracks (schema, global seeds, local dev fixtures), deployed fixture-backdoor remediation, and Content Agent secret rotation. | 36 | 25 | infra, database |
| [ad-client](nodes/ad-client.md) | Go HTTP client package for the AD Data API (server/ad) — typed models, OAuth client-credentials token cache, retry/re-auth, error classification. | 33 | 2 | ad |
| [administration-service](nodes/administration-service.md) | Administrations - CRUD of administrations, their tests and form slots, admin plans (column templates), progress/status derivation and bank-scoped access control. | 25 | 17 | administrations |
| [toni-import](nodes/toni-import.md) | Toni package importer (service/toniimport): two-stage analyze/commit ingestion of an eStyle export ZIP into Toni projects, guides, elements, media, links and versions, idempotent via toni_import_refs. | 25 | 20 | toni, import |
| [extracts](nodes/extracts.md) | Form extracts — per-bank saved column templates, a column catalog, and async extract jobs that hydrate AD forms and write a CSV (form_data) or JSON paper test maps (paper_testmap) to S3, with per-form results and in-app completion notifications. | 21 | 18 | extracts |
| [test-profile-service](nodes/test-profile-service.md) | Test profiles (formerly blueprints) - bank-scoped CRUD with automatic revisions, condition-field catalog for the query builder, and feasibility validation against the AD item pool. | 20 | 9 | test-profiles |
| [consumer-auth](nodes/consumer-auth.md) | Service-consumer (machine client) authentication - ES256 consumer-token signing/verification, the client-secret bcrypt pool, the ConsumerAuth/RequireServiceScope middleware, the consumer-scope registry and the ServiceCredentialRepository behind the platform service-credential routes. | 19 | 13 | auth, platform, consumer |
| [paper-ids](nodes/paper-ids.md) | Paper IDs - minting form numbers (ISD/SCANNABLE/NON_SCANNABLE) from global sequences under account-owned project codes, with history lookup; also hosts the paper test-map assembler. | 18 | 6 | paper-ids |
| [server-bootstrap](nodes/server-bootstrap.md) | Go server entrypoint (server/main.go + server/options): env loading/validation, logger, DB connect + migration mode, construction of every repo/service/handler/queue consumer, global middleware order, route registration, SPA static serving. | 18 | 26 | infra, bootstrap |
| [email](nodes/email.md) | Transactional email abstraction (email.Service with SES or no-op implementations) and the embedded, localised template engine. | 14 | 2 | infra |
| [helpdocs](nodes/helpdocs.md) | In-app documentation — Markdown pages embedded from server/helpdocs/content with YAML frontmatter, three nested visibility tiers (external/internal/technical) incl. inline ::: containers, and an in-memory BM25 section search. | 11 | 2 | docs |
| [logging](nodes/logging.md) | server/logger package - slog setup (JSON in prod, coloured console in dev), GORM query logger, and the AuditLogger that writes structured "AUDIT:" log lines for security-relevant actions. | 9 | 1 | infra, observability, audit |
| [dev-tools](nodes/dev-tools.md) | Developer and CI tooling - Makefile targets (build, test, lint, quality gate), server/tools Go checkers (migration order, ctx propagation, unused i18n keys, code assessor, release report), test helpers, local Docker stacks and GitHub Actions pipelines. | 7 | 2 | tooling, ci |

## interface (51)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [ad-content-api](nodes/ad-content-api.md) | REST proxy endpoints over AD content: items, forms, stimuli, media, resources, batteries, setting profiles, standards, statistics, OSCAR, XPRT, previews, imports/exports, plus bank stimulus templates. | 71 | 29 | content, ad, api |
| [banks-api](nodes/banks-api.md) | REST endpoints for banks, bank sharing/sync, settings, dashboard, AI instructions, gold stat sets, metadata field restrictions, copy bank config and copy-source reads. | 44 | 13 | banks, api |
| [users-api](nodes/users-api.md) | REST endpoints for users, account membership/role assignments (single and bulk), user bank-role assignments, the account roster, and bulk user CSV import/export. | 41 | 9 | accounts |
| [items-ui](nodes/items-ui.md) | Bank Items screens - server-side items list (search, filters, bulk tools/status/styles, metadata+standards import/export, QTI, AI bulk actions), the item editor embedding AD's ad-item-editor (edit lock, versioning, workflow status, test cases, OSCAR rubrics, translation, history revert), AI item generation and preview cards. | 38 | 12 | client, items, ad, versioning, ai |
| [accounts-api](nodes/accounts-api.md) | REST endpoints for the current account (info + AD/agent settings), account roles, account role permissions, the available-permission catalogue, role CSV export and copy account roles. | 34 | 8 | accounts |
| [agent-api](nodes/agent-api.md) | AI endpoints under /api/agent/ai/* (generation, translation, bulk AI jobs, instruction files, chat, search) plus public cookie-auth proxies (/api/chat, /api/verification/*, /api/apply-verification-suggestion, /api/token-usage, /api/conversations, /mcp) and the AD index-entity callback. | 34 | 5 | ai |
| [forms-ui](nodes/forms-ui.md) | Bank Forms screens - forms list (search, bulk export/import, clone, versioning, test maps), form editor (builder incl. adaptive/CAT pools, settings, paper print, scoring, metadata, history) and chrome-less previews/practice/preview cards. | 31 | 10 | client, forms, ad, scoring, versioning |
| [reviews-api](nodes/reviews-api.md) | Authenticated REST endpoints for reviews, review content, assignments, feedback, join-code management, review history, CSV exports and bank review templates. | 30 | 14 | reviews |
| [auth-api](nodes/auth-api.md) | REST endpoints for login (password grant, Microsoft SSO), logout, session keepalive, /me (identity, accounts, banks), account switch, login-as, password reset, self-service profile, plus small public endpoints (password policy, env, CSP reports, health). | 28 | 5 | auth |
| [toni-api](nodes/toni-api.md) | REST endpoints under /api/accounts/:account_id/toni for Toni projects, guides, elements (workflow, revisions, versions), links, media, search, dead-link scan, import, project duplicate, plus the service-token style-guide feed. | 27 | 14 | toni, api |
| [bulk-requests-api](nodes/bulk-requests-api.md) | REST endpoints (/api/banks/:bank_id/bulk-requests, /generated-entities, /generated-test-cases, /bulk-requests/my, bulk_operations, verification feedback) for tracking bulk jobs, downloading results and reviewing staged AI output. | 24 | 11 | bulk |
| [bulk-requests-ui](nodes/bulk-requests-ui.md) | Work Assignments screens - queued bulk requests list, per-type bulk request detail pages (generation, verification, translation, test cases, form verification, exports), bulk operations status, verification feedback review, plus the bulk AI modals and verification feedback control. | 20 | 4 | client, bulk, ai |
| [join-code-api](nodes/join-code-api.md) | Public, unauthenticated join-code redemption (POST /api/joincode/:join_code) that registers an external reviewer and returns an external_review JWT; join-code management itself lives on reviews-api. | 19 | 6 | reviews, auth |
| [bank-roles-api](nodes/bank-roles-api.md) | REST endpoints for bank roles, the bank permission catalog, unified role permissions, status permissions (per role, per state, per bank) and role CSV export. | 18 | 7 | rbac, api |
| [account-users-ui](nodes/account-users-ui.md) | Account user management screens - user roster (add/edit/deactivate/remove, password reset, login-as, single and bulk account+bank role assignment) plus Bulk User Upload (CSV import) and Bulk User Export. | 17 | 12 | client, account, users, ui |
| [administrations-api](nodes/administrations-api.md) | REST endpoints for administrations, administration tests, form slots (incl. test-profile validation) and admin plans. | 16 | 8 | administrations, api |
| [login-ui](nodes/login-ui.md) | Public sign-in screens - email/password login, Entra SSO button, forgot/reset password - under AuthLayout. | 15 | 2 | client, auth |
| [extracts-api](nodes/extracts-api.md) | Bank-scoped REST endpoints /api/banks/:bankID/extracts/* for the extract column catalog, extract templates, extract jobs (trigger, status, list, download) and the caller's unread extract notifications. | 14 | 9 | extracts, api |
| [paper-ids-api](nodes/paper-ids-api.md) | Versioned account-scoped REST endpoints for Paper ID (form number) generation, history/lookup, settings and project codes. | 14 | 4 | paper-ids, api |
| [reviews-ui](nodes/reviews-ui.md) | Content review screens - reviewer queue (My Reviews) and content detail, Manage Reviews list/detail/edit/content tallies, Request Review form, review templates, and the per-asset review history panel. | 14 | 5 | client, reviews |
| [service-credentials-api](nodes/service-credentials-api.md) | Platform REST endpoints (/api/v1/platform/service_credentials) for Pearson operators to register service consumers, rotate their secrets, grant accounts and deactivate them. | 14 | 5 | auth, platform, consumer, api |
| [stimuli-ui](nodes/stimuli-ui.md) | Bank Stimuli (shared stimulus / passage) screens - list with bulk status/styles/metadata/AI actions and stimulus templates, the editor embedding AD's ad-stimulus-editor with edit lock, status gate, translation and history revert, AI passage generation and preview cards. | 14 | 8 | client, stimuli, ad, ai |
| [bank-config-ui](nodes/bank-config-ui.md) | Bank configuration screen (/bank/:bankId/configuration) with sections for general settings, item/form/stimulus workflow+metadata, AI instructions, AI translation overrides, standards, bank roles/users, OSCAR and MetaMetrics credentials, debug info. | 13 | 6 | client, bank, permissions, ai |
| [copy-config-ui](nodes/copy-config-ui.md) | Account-level copy wizards - Copy Bank Configuration (metadata fields, statuses, bank roles, field restrictions, review templates from a source bank, possibly in another account, into a target bank) and Copy Account Roles (account roles from another account). | 13 | 13 | client, account, copy, ui |
| [toni-ui](nodes/toni-ui.md) | Toni style-guide authoring screens - project list (create/rename/duplicate/delete), project workspace (guide tree, Milkdown element editor, workflow status, versions, related links), media library, element search and package import wizard. | 13 | 14 | client, toni, ui |
| [consumer-api](nodes/consumer-api.md) | Machine-facing endpoints for service consumers - the client_credentials token endpoint (/api/v1/oauth/token) and consumer-token-only data routes (/api/v1/accounts, /api/v1/paper/accounts). | 12 | 3 | auth, consumer, api, paper |
| [platform-api](nodes/platform-api.md) | REST endpoints (/api/v1/platform) to list the fixed platform roles and assign/remove platform roles by user email. | 12 | 3 | rbac, platform |
| [system-ui](nodes/system-ui.md) | App chrome and system pages - layouts, header, bank sidebar, profile menu + My Profile modal, impersonation banner, session-expiry timer/modal, breadcrumbs, access-denied/oops/not-found pages, permission demo. | 12 | 5 | client, shell |
| [test-profiles-api](nodes/test-profiles-api.md) | REST endpoints for bank-scoped test profiles - CRUD, revision history and restore, condition fields for the query builder, and feasibility validation. | 12 | 3 | test-profiles, api |
| [workflow-metadata-editor-ui](nodes/workflow-metadata-editor-ui.md) | Per-content-type workflow and metadata editors embedded in Bank Configuration (items/forms/stimulus sections) - StatesEditor (workflow states, next-state rules, metadata requirements, per-state role permissions), WorkflowFlow diagram, MetadataEditor (AD bank custom fields, groups, bulk import/export, field edit restrictions) - plus the NextStatusChecklist used by the content editors. | 11 | 7 | client, workflow, metadata, bank-config |
| [form-settings-ui](nodes/form-settings-ui.md) | Form delivery settings - the Settings and Paper Print tabs of the form editor, the per-section settings modal, and the shared Form Setting Profiles list/editor (/bank/:bankId/form-settings) whose saves are live for every attached form. | 10 | 6 | client, forms, settings, ad |
| [administrations-ui](nodes/administrations-ui.md) | Test administration screens - list, create, detail (tests, form slots, inline edits, test-profile validation, progress), edit, and admin plan (custom column) editor. | 9 | 4 | client, administrations |
| [ai-token-budget-ui](nodes/ai-token-budget-ui.md) | Client side of the user's daily AI token budget (SCAPE-330) - header chip with remaining tokens, one shared token-limit toast, and disabling of every AI action until the reset; fed by X-Agent-Token-* headers, token_limit_exceeded 429 bodies, GET /api/token-usage and the content-agent widget's event. | 9 | 2 | client, ai, shell |
| [join-code-ui](nodes/join-code-ui.md) | Public join-code page where an external reviewer enters a review join code, name and email to start a time-boxed external review session. | 9 | 4 | client, reviews, auth |
| [docs-api](nodes/docs-api.md) | Authenticated REST endpoints /api/docs (index), /api/docs/search (BM25 section search) and /api/docs/:slug (page or one section), gated by the caller's documentation tier. | 8 | 0 | docs, api |
| [statistics-ui](nodes/statistics-ui.md) | Historical item statistics screens - statistics sets list, set detail (data and uploads tabs), CSV upload with polling, upload detail, per-item statistics across sets, and gold statistics set designation. | 8 | 3 | client, statistics |
| [account-ui](nodes/account-ui.md) | Account landing page (bank cards + admin action menu) and Account Settings screen (name/acronym/description, AD + agent credentials, bank sync). | 7 | 9 | client, account, ui |
| [platform-roles-ui](nodes/platform-roles-ui.md) | Platform Roles page (/platform/roles) for assigning and removing cross-account platform roles; needs platform.roles.manage and an SSO session. | 7 | 2 | client, platform, permissions |
| [test-profiles-ui](nodes/test-profiles-ui.md) | Test profile (blueprint) screens - list with matched-item counts, read-only view and editor with subtest tree, test settings, validation panel and revision history. | 7 | 3 | client, test-profiles |
| [extracts-ui](nodes/extracts-ui.md) | Form extract screens - run-extract wizard, extract templates list/editor, extract job list and job detail with CSV download. | 6 | 3 | client, forms, extracts |
| [account-roles-ui](nodes/account-roles-ui.md) | Account Roles screen (account role CRUD, permission matrix, duplicate, CSV export) plus the shared permission components (My Permissions modal, status/state/metadata-field permission dialogs, scope builder) reused by bank configuration. | 5 | 11 | client, account, permissions, ui |
| [batteries-ui](nodes/batteries-ui.md) | Bank Batteries screens - list of AD battery STMs and the three-tab battery editor (Setup units/forms, Scoring objectives, Test & Validate derived scoring) saved as one transactional upsert. | 5 | 5 | client, batteries, scoring, ad |
| [content-agent-chat-ui](nodes/content-agent-chat-ui.md) | AI chat surfaces - the global floating MCP chat (FAB window with saved threads, tool calls, list filter hand-off) and the per-asset content-agent-chat web component embedded in item, stimulus and media editors. | 4 | 3 | client, ai, chat |
| [docs-ui](nodes/docs-ui.md) | In-app Help & Documentation pages (/docs index and /docs/:slug) rendering server help docs with tier gating and a tier-preview switch. | 4 | 2 | client, docs |
| [media-ui](nodes/media-ui.md) | Bank Media Library screens - media list (upload, bulk delete with usage guard, categories), media detail/edit (rename, alt text, replace file, CSS stylesheet content, AI image edit) and AI image/audio/graph generation pages that save results as AD media. | 4 | 7 | client, media, ad, ai |
| [resources-ui](nodes/resources-ui.md) | Bank Resources screens - list (search, clone, single/bulk delete, preview), create and edit of AD resources (identifier, name, raw QTI with sanitized live preview); resources are used as form-section intro items. | 3 | 4 | client, resources, ad |
| [scoring-statistics-ui](nodes/scoring-statistics-ui.md) | Scoring statistics (IRT parameter) set screens - sets list, set detail (data and uploads tabs), CSV upload with polling and upload detail. | 3 | 2 | client, statistics, scoring |
| [service-consumers-ui](nodes/service-consumers-ui.md) | Platform "Service consumers" page (/platform/service-consumers) - register machine API consumers with scopes, show/rotate/revoke their client secrets, grant or remove account access, deactivate; view needs platform.service_credentials.view, every change platform.service_credentials.manage. | 3 | 2 | client, platform, permissions |
| [standards-ui](nodes/standards-ui.md) | Standards Explorer (/bank/:bankId/standards) - lazy tree browser of AD academic standards with per-publication CSV download. | 3 | 2 | client, standards, ad |
| [bank-home-ui](nodes/bank-home-ui.md) | Bank landing dashboard (/bank/:bankId/home) showing item/stimulus/form totals and an items-by-workflow-status bar chart. | 2 | 3 | client, bank |
| [public-pages-ui](nodes/public-pages-ui.md) | Static public pages under AuthLayout - privacy policy, terms, accessibility statement, learn more - plus the signed-in About/build-info page. | 2 | 2 | client, public |

## integration (7)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [ad-data-api](nodes/ad-data-api.md) | The Authoring & Delivery (AD / ADAM) platform HTTP Data API: system of record for items, forms, stimuli, media, resources, batteries, setting profiles, standards, workflow states and statistics. | 43 | 1 | ad, external |
| [content-agent](nodes/content-agent.md) | External AI Content Agent service (per-account AgentHost, OAuth2 client credentials) that does all LLM work — item/passage/media generation, translation, verification, test cases, sandbox form analysis, chat/MCP, semantic search, embeddings, verification feedback. | 36 | 1 | ai, external |
| [ad-web-components](nodes/ad-web-components.md) | AD-provided web components (ad-item-editor, ad-stimulus-editor, ad-media-picker, ad-standards-picker, ad-test-player) loaded at runtime from the bank's AD host and embedded in the client. | 18 | 1 | ad, client |
| [new-relic](nodes/new-relic.md) | New Relic APM - Go agent with nrecho request transactions, a custom GORM plugin emitting Postgres Datastore segments, and External segments on instrumented outbound HTTP clients. | 9 | 1 | infra, observability |
| [entra-sso](nodes/entra-sso.md) | Microsoft Entra ID (Azure AD) OIDC single sign-on, used via MSAL confidential client with auth-code + PKCE. | 6 | 1 | auth |
| [aws-ses](nodes/aws-ses.md) | AWS Simple Email Service (SES v2) used to send transactional email (password reset, bulk-import invitation/welcome). | 5 | 0 | infra |
| [ipify](nodes/ipify.md) | Public IP lookup service (api.ipify.org) called from the browser by the join-code page to record an external reviewer's IP. | 5 | 0 | client, external |

## datastore (6)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [postgres-main](nodes/postgres-main.md) | Abigail's PostgreSQL 17 database (GORM over pgx), schema managed by embedded golang-migrate migrations; also hosts the pgqueue job tables. | 73 | 1 | infra, database |
| [s3-exports-bucket](nodes/s3-exports-bucket.md) | S3 bucket named by ABIGAIL_EXPORTS_BUCKET holding generated export files (extract outputs, metadata exports, test-case status reports, user exports, review-history exports), served only via presigned GET URLs. | 22 | 0 | infra, s3 |
| [s3-imports-bucket](nodes/s3-imports-bucket.md) | S3 bucket named by ABIGAIL_IMPORTS_BUCKET holding user-uploaded source files (user-import CSVs, item-metadata CSVs, AI item-set files) and the error CSVs produced while processing them. | 19 | 0 | infra, s3 |
| [pgqueue](nodes/pgqueue.md) | Postgres-backed job queue tables (pgqueue_jobs / pgqueue_dead_jobs + NOTIFY trigger) inside the main database, carrying bulk_requests and Toni jobs. | 13 | 2 | queue |
| [toni-assets-bucket](nodes/toni-assets-bucket.md) | S3 bucket (TONI_ASSETS_BUCKET) holding Toni media objects under toni/{project_id}/{media_id}/{filename}, plus _temp upload staging keys. | 12 | 1 | toni, infra |
| [sandbox-artifacts-bucket](nodes/sandbox-artifacts-bucket.md) | S3 bucket named by SANDBOX_ARTIFACTS_S3_BUCKET used to stage large CSV inputs for the Content Agent's sandbox-analysis endpoint (form verification), passed to the agent as 15-minute presigned URLs. | 6 | 0 | infra, s3, ai |

## event (17)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [item-creation-job](nodes/item-creation-job.md) | Bulk AI item generation job (request_type item_creation, prefix IC): each task asks the Content Agent for ≤3 items and stages them as pending-review generated entities. | 10 | 3 | queue, bulk |
| [item-translation-job](nodes/item-translation-job.md) | Bulk AI item translation job (item_translation, prefix IT): one task per item × target language; the translated item is saved straight into AD and recorded as an approved generated entity. | 9 | 4 | queue, bulk |
| [form-verification-job](nodes/form-verification-job.md) | AI cross-form configuration verification job (form_verification, prefix FV, RFC-011): builds a CSV bundle describing the selected forms and runs the Content Agent sandbox analysis; stores one Markdown report. | 8 | 4 | queue, bulk, ai |
| [item-metadata-upload-job](nodes/item-metadata-upload-job.md) | Item metadata CSV upload job (item_metadata_upload, prefix MU): validates every row, then pushes all metadata to AD in one call; any invalid row makes the whole upload validation_failed with an error CSV. | 8 | 2 | queue, bulk |
| [item-verification-job](nodes/item-verification-job.md) | Bulk AI item verification job (item_verification, prefix IV): one task per item × verification type; each stores a passed/failed verified-entity result. | 8 | 3 | queue, bulk |
| [metadata-export-job](nodes/metadata-export-job.md) | Offline item metadata export job (metadata_export, prefix ME): tasks export batches of items' metadata from AD to CSV, then a merge phase writes one file to the exports bucket. | 8 | 2 | queue, bulk |
| [passage-creation-job](nodes/passage-creation-job.md) | Bulk AI passage/stimulus generation job (passage_creation, prefix PC): one passage per task, staged as pending-review generated entities. | 8 | 3 | queue, bulk |
| [toni-content-agent-sync-job](nodes/toni-content-agent-sync-job.md) | Toni → Content Agent style-guide sync notification (pgqueue queue toni_content_agent_sync): POSTs account id + triggering element to the agent's /api/toni/sync with a minted Toni service token so the agent pulls the style guide. | 8 | 2 | queue, toni, ai |
| [item-test-case-generation-job](nodes/item-test-case-generation-job.md) | Bulk AI item test-case generation job (item_test_case_generation, prefix TC): one task per item; candidate scoring test cases are staged for review. | 7 | 3 | queue, bulk |
| [item-test-case-status-export-job](nodes/item-test-case-status-export-job.md) | Item test-case status report job (item_test_case_status_export, prefix TR): per item, lists (and if needed runs) AD test cases and writes Item UIN / Total / Passed / Failed rows; merged into one CSV. | 7 | 2 | queue, bulk |
| [passage-translation-job](nodes/passage-translation-job.md) | Bulk AI passage translation job (passage_translation, prefix PT): translates one shared stimulus per task and saves it into AD. | 7 | 4 | queue, bulk |
| [toni-project-duplicate-job](nodes/toni-project-duplicate-job.md) | Async Toni project duplication (pgqueue queue toni_project_duplicate): copies a project's guides, elements, links and media into a new project, tracking progress on a bulk_operations row. | 7 | 2 | queue, toni |
| [passage-verification-job](nodes/passage-verification-job.md) | Bulk AI passage verification job (passage_verification, prefix PV): same as item verification but for shared stimuli. | 6 | 3 | queue, bulk |
| [review-history-export-job](nodes/review-history-export-job.md) | Queued review-history export (review_history_export, prefix RH): used when the selection's review history is too large for the synchronous CSV download; worker re-checks reviews.view and writes the CSV to the exports bucket. | 6 | 2 | queue, bulk |
| [user-export-job](nodes/user-export-job.md) | Account user export job (user_export, prefix UE): builds a CSV of the account's users, roles and bank roles and stores it in the exports bucket. | 6 | 4 | queue, bulk |
| [user-import-job](nodes/user-import-job.md) | Account user import job (user_import, prefix UI): re-downloads the uploaded CSV, creates/updates users and roles, writes an error CSV and sets its own terminal status. | 6 | 5 | queue, bulk |
| [form-creation-job](nodes/form-creation-job.md) | Bulk form creation job kind (form_creation, prefix F) — declared in the enum and accepted by the generic create endpoint, but the processor is a TODO stub that fails every task. | 4 | 1 | queue, bulk |

## config (22)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [session-config](nodes/session-config.md) | JWT signing secret, consumer-token signing key, session/refresh/external-review/consumer token lifetimes, session user check and auth-cookie SameSite/Secure policy (JWT_SECRET, CONSUMER_TOKEN_SIGNING_KEY, SESSION_TTL, SESSION_IDLE_TIMEOUT, SESSION_REFRESH_CADENCE, EXTERNAL_REVIEW_TTL, CLIENT_CREDENTIALS_TTL, SESSION_USER_CHECK_ENABLED, COOKIE_SAMESITE, COOKIE_SECURE). | 23 | 0 | config, auth, security |
| [bank-settings](nodes/bank-settings.md) | Per-bank feature flags stored in banks.settings JSONB - enable_versioning, enable_form_versioning - read by the client to switch editor behaviour. | 14 | 0 | banks, feature-flag |
| [app-base-url](nodes/app-base-url.md) | APP_BASE_URL - public base URL of this Abigail instance (default http://localhost:5173); validated at startup as a bare http(s) origin, sent to the Content Agent as the callback URL (queue worker and interactive agent calls) and used for links in password-reset/invite emails. | 9 | 0 | config |
| [paper-ids-issuance-enabled](nodes/paper-ids-issuance-enabled.md) | PAPER_IDS_ISSUANCE_ENABLED env var - global switch that allows Paper ID minting; false until the production cutover. | 9 | 0 | paper-ids, config |
| [sso-config](nodes/sso-config.md) | Env settings for Microsoft Entra SSO (SSO_DISABLED, SSO_CLIENT_ID, SSO_CLIENT_SECRET, SSO_TENANT_ID, SSO_REDIRECT_URI, SSO_SCOPES). | 8 | 0 | auth, config |
| [password-reset-config](nodes/password-reset-config.md) | Env settings for forgot/reset password and invitation links (APP_BASE_URL, RESET_TOKEN_EXPIRY_MIN, RESET_RATE_*, RESET_WORKER_TIMEOUT_SEC, RESET_MAX_CONCURRENT_WORKERS). | 7 | 0 | auth, config |
| [runtime-mode](nodes/runtime-mode.md) | Process/environment identity - MODE (dev\|prod), ENVIRONMENT (dev/smk/tst/prf/uat/prd), LOCAL_DEV, PORT; drive IsProdMode(), IsDeployed(), IsProdEnvironment(). | 7 | 0 | config, deploy, security |
| [toni-s3-config](nodes/toni-s3-config.md) | Env vars for Toni object storage — TONI_ASSETS_BUCKET, TONI_S3_REGION (falls back to AWS_REGION), TONI_S3_ENDPOINT, TONI_S3_PRESIGN_PUT_TTL, TONI_S3_PRESIGN_GET_TTL. | 7 | 1 | toni, config, infra |
| [database-config](nodes/database-config.md) | Postgres connection settings - DB_HOST, DB_PORT, DB_NAME, DB_USERNAME, DB_PASSWORD, and DB_CREDS (JSON username/password injected when deployed). | 6 | 0 | config, database |
| [login-lockout-config](nodes/login-lockout-config.md) | Env settings for password-login lockout (LOGIN_FAIL_WINDOW_MIN, LOGIN_FAIL_THRESHOLD, LOGIN_LOCKOUT_BASE_SEC, LOGIN_LOCKOUT_MAX_SEC). | 6 | 0 | auth, config |
| [aws-config](nodes/aws-config.md) | Shared AWS SDK settings - AWS_REGION (required for S3/SES clients), S3_ENDPOINT (MinIO/LocalStack override, path-style), and the standard SDK credential chain (AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY or task role). | 5 | 0 | config, infra, aws |
| [bulk-worker-config](nodes/bulk-worker-config.md) | BULK_WORKER_COUNT (goroutines dequeuing bulk jobs per instance, default 5) and BULK_TASK_CONCURRENCY (tasks processed in parallel within one batch, default 5). | 5 | 0 | config, queue |
| [client-vite-env](nodes/client-vite-env.md) | Build-time VITE_* variables for the web client - build metadata shown on /about, local AD staging host fallback, Vue devtools toggle. | 5 | 0 | client, config |
| [csp-config](nodes/csp-config.md) | CSP_AD_ORIGIN - AD origin added to the (report-only) Content-Security-Policy so embedded AD web components can load; defaults to https://*.adamexam.com. | 5 | 0 | config, security |
| [password-verify-config](nodes/password-verify-config.md) | Optional env overrides for the bcrypt verification bulkhead (PASSWORD_VERIFY_MAX_CONCURRENCY, PASSWORD_VERIFY_MAX_QUEUE). | 5 | 0 | auth, config |
| [run-migrations](nodes/run-migrations.md) | RUN_MIGRATIONS - startup migration mode; true/1 = migrate then exit (deploy task), dev = migrate then serve, empty/false/0/unknown = serve without migrating. | 5 | 0 | config, database, deploy |
| [toni-import-timeout-config](nodes/toni-import-timeout-config.md) | TONI_IMPORT_ANALYZE_TIMEOUT / TONI_IMPORT_COMMIT_TIMEOUT — per-stage request timeouts for Toni package import (defaults 60s / 300s). | 5 | 0 | toni, config |
| [agent-secret-rotation](nodes/agent-secret-rotation.md) | AGENT_KEY + AGENT_SECRET - deploy-time only; when both set in a deployed env, the migration run rewrites account_settings.agent_secret for every account whose agent_key matches. | 4 | 0 | config, ai, security |
| [fixture-credentials](nodes/fixture-credentials.md) | Local-only FIXTURE_* env vars (from gitignored server/.env) injected into dev fixture rows - super-admin login password and the Cassandra account's AD/Content Agent credentials. | 4 | 0 | config, dev, security |
| [new-relic-config](nodes/new-relic-config.md) | New Relic agent env vars read by newrelic.ConfigFromEnvironment (NEW_RELIC_LICENSE_KEY, NEW_RELIC_APP_NAME, NEW_RELIC_ENABLED, ...) plus ABIGAIL_DISABLE_NEWRELIC_DB_PLUGIN rollback lever. | 4 | 0 | config, observability |
| [internal-route-token](nodes/internal-route-token.md) | INTERNAL_ROUTE_TOKEN - shared secret sent/checked as X-Internal-Route-Token between Abigail and the Content Agent for trusted internal (MCP) callbacks. | 3 | 0 | config, security, ai |
| [logging-config](nodes/logging-config.md) | LOG_LEVEL (debug\|info\|warn\|error, default info) and LOG_FILE (append to file instead of stdout); read in options.init before the logger exists. | 3 | 0 | config, observability |

## flow (29)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [client-credentials-grant](nodes/client-credentials-grant.md) | A service consumer exchanges client_id + secret for a short-lived ES256 token at /api/v1/oauth/token, then calls a consumer route where ConsumerAuth reloads its credential, secret and account grants on every request. | 7 | 7 | auth, consumer, flow |
| [save-content](nodes/save-content.md) | Save an item/stimulus/form - client-side metadata/status checks, PUT to the AD proxy, server gates (scope, status edit, required metadata/actions, edit lock, field restrictions, JWT identity) then AD SaveItem; edit locks and form preview tokens ride alongside. | 7 | 6 | content, ad, items |
| [redeem-join-code](nodes/redeem-join-code.md) | External reviewer redeems a join code - one transaction creates/reuses the external user, consumes a code use and ensures assignments; then an external_review JWT bounded by review end, TTL and code expiry; content access is scoped to the review. | 4 | 6 | reviews, auth, external |
| [approve-ai-generated-content](nodes/approve-ai-generated-content.md) | Approve AI-generated items/passages/test cases from a bulk request - client saves each entity to AD (ai_generated), then PATCHes the staged row with the AD id, identifier and status=approved; client-driven and non-atomic. | 3 | 6 | ai, bulk, content |
| [password-login](nodes/password-login.md) | Email/password sign-in - OAuth password grant with lockout counters, current-account reconcile, JWT cookie, then /me and AD/content-agent bootstrap in the SPA. | 3 | 7 | auth, login |
| [validate-test-profile](nodes/validate-test-profile.md) | Validate a test profile (blueprint) against bank content or one administration form slot - batched AD count queries feed TestProfileValidationService; saving a profile snapshots the old row into test_profile_revisions in the same transaction. | 3 | 8 | test-profiles, administrations, ad |
| [approve-toni-element](nodes/approve-toni-element.md) | Toni element workflow transition - in one transaction the status changes, approval tags a new version and a content-agent sync job is enqueued; the consumer POSTs to the agent's /api/toni/sync and the agent pulls the style guide back. | 2 | 6 | toni, ai, queue |
| [bulk-import-users](nodes/bulk-import-users.md) | Bulk User Upload - CSV to S3, bulk_request(user_import) on pgqueue, processor creates users/roles and sends invites, error CSV; SPA polls Queued Requests. | 2 | 8 | users, bulk, queue |
| [copy-bank-config](nodes/copy-bank-config.md) | Copy Bank Configuration - source bank (possibly another account) to target bank in five independent phases (AD custom fields, AD workflow states, bank roles + permissions, metadata restrictions, review templates); preview first; partial success by design. | 2 | 7 | banks, copy, config |
| [login-as-user](nodes/login-as-user.md) | Login-as impersonation - pick a target user and account, server re-issues the JWT with an impersonated_by claim; ImpersonationBankGuard restricts bank access; end-login-as restores the actor. No DB writes, audit only. | 2 | 7 | auth, impersonation |
| [run-bulk-ai-request](nodes/run-bulk-ai-request.md) | Bulk AI verification / translation / test-case generation / form verification - list-page modal posts to the agent proxy, which creates a bulk_request + tasks and publishes to pgqueue; BulkProcessor calls the content agent per task; detail page polls every 20s. Small generations run inline instead. | 2 | 6 | ai, bulk, queue |
| [sso-login](nodes/sso-login.md) | Entra ID SSO sign-in - MSAL PKCE redirect, callback matches the user by email, marks them SSO-enforced, sets the JWT cookie; errors bounce to /login?sso_error=. | 2 | 5 | auth, login, sso |
| [submit-review-feedback](nodes/submit-review-feedback.md) | Reviewer submits feedback on one review content - scope + access-window checks, then a transaction that row-locks the assignment, writes a new versioned feedback row and marks the assignment COMPLETED. | 2 | 5 | reviews |
| [bulk-export-users](nodes/bulk-export-users.md) | Bulk User Export - bulk_request(user_export) on pgqueue, processor builds the CSV to the exports bucket and records result_file_key; client polls every 3s and downloads. | 1 | 6 | users, bulk, queue |
| [copy-account-roles](nodes/copy-account-roles.md) | Copy Account Roles wizard - pick a source account the user can copy from, select roles, server copies each role and its permissions into the current account, skipping name collisions; per-role, not one transaction. | 1 | 5 | accounts, roles, copy |
| [create-administration](nodes/create-administration.md) | Create a test administration - one transaction inserts a default admin plan, the administration (code unique per bank), its tests and form slots; audited. | 1 | 4 | administrations |
| [duplicate-toni-project](nodes/duplicate-toni-project.md) | Duplicate a Toni project asynchronously - handler records a bulk_operations row and enqueues; processor copies S3 media first, then all rows in one transaction; client polls duplicate-status every 1.5s. | 1 | 7 | toni, queue |
| [export-review-history](nodes/export-review-history.md) | Review history CSV export for selected (or select-all) content - small exports return inline, oversized ones become a review_history_export bulk request whose processor writes the CSV to the exports bucket. | 1 | 6 | reviews, export, bulk, queue |
| [generate-paper-ids](nodes/generate-paper-ids.md) | Mint Paper IDs (form numbers) - API-only; issuance switch, quantity validation, active project codes locked FOR SHARE, nextval per type, legacy WING format, insert form_numbers, all in one transaction; audited by the handler. | 1 | 3 | paper-ids |
| [handle-api-request](nodes/handle-api-request.md) | The path of every HTTP request - New Relic, request logger, recover, CSP (report-only) headers, no-store, then /api OAuthMiddleware (sliding refresh, session-expiry headers, per-request user-active check) and ImpersonationBankGuard, then per-module route permissions; the SPA tracks session expiry from the response headers. | 1 | 5 | auth, middleware, ops |
| [import-export-item-metadata](nodes/import-export-item-metadata.md) | Item metadata CSV upload and export - upload stores the file in S3 and runs an item_metadata_upload bulk request that pushes rows to AD; select-all export runs a metadata_export bulk request that writes a CSV to the exports bucket. | 1 | 8 | content, metadata, bulk, queue |
| [import-toni-package](nodes/import-toni-package.md) | Import an eStyle export ZIP into Toni - analyze stores a batch with findings; commit re-validates, uploads media to S3 outside the transaction, writes guides/elements/links/versions in one transaction with in-tx QA, then enqueues one content-agent sync. | 1 | 7 | toni, import |
| [invite-user](nodes/invite-user.md) | Add a user to an account from the roster - three separate client-driven calls (register user, assign account role, assign bank roles); no transaction, and the register endpoint has no permission check. Also covers removing a user. | 1 | 6 | users, accounts |
| [request-review](nodes/request-review.md) | Request a content review - client assembles reviewers/viewers, server creates review, content, assignments (content x reviewers), response viewers and join codes in sequential non-transactional writes with best-effort rollback; later content edits go through reconcile. | 1 | 8 | reviews |
| [reset-password](nodes/reset-password.md) | Forgot/reset password - forgot-password always 200s and does the work in a detached goroutine (rate-limited reset slot, SES email); reset-password consumes the token and writes the new hash. | 1 | 7 | auth, password |
| [run-form-extract](nodes/run-form-extract.md) | Run a form extract - handler creates an extract_jobs row and starts an in-process goroutine that hydrates forms from AD, builds a CSV or paper test maps, uploads to S3 and notifies; client polls every 10s; downloads via presigned redirect. Not durable across restarts. | 1 | 7 | extracts, forms, export |
| [sync-and-share-banks](nodes/sync-and-share-banks.md) | AD bank sync and bank sharing - sync lists the account's AD banks and upserts one canonical bank row per ad_banks_id plus this account's membership; assign/remove manage account_banks for shared banks, adoption authorized against the home account. | 1 | 7 | banks, accounts, ad |
| [upload-historical-statistics](nodes/upload-historical-statistics.md) | Historical statistics - CSV upload into an AD historical stat set (client polls the upload every 3s), and apply-favored-to-gold which resolves/creates the bank's gold set and bulk-replaces it with favored rows. | 1 | 8 | statistics, ad |
| [deploy-and-migrate](nodes/deploy-and-migrate.md) | CI build and deploy - dev_pipeline builds and tests Go + client, pushes the Docker image, triggers the manifest workflow; a migration task runs the same image with RUN_MIGRATIONS=true (migrate, seed, fixtures, agent-secret rotation, exit) before app pods start. | 0 | 4 | ops, deploy, migrations |

## concept (31)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [permission-scope](nodes/permission-scope.md) | Glossary - a scope narrows a bank permission to content matching metadata conditions (or to content the user created, selfScoped); excluded interactions further bar certain question types. | 7 | 1 | glossary |
| [consumer-scope](nodes/consumer-scope.md) | Glossary - a consumer scope is an OAuth scope string (paper:read, paper:issues:write, accounts:read) a service consumer holds and its tokens carry; unrelated to bank permission scopes. | 5 | 1 | glossary, auth, consumer |
| [home-account](nodes/home-account.md) | Glossary - a bank's home account is the one account that owns it; member accounts are other accounts the bank is shared with. | 3 | 2 | glossary |
| [pub-state](nodes/pub-state.md) | Glossary - pub_state is a version's publication state D / P / R (Draft, Published, Retired), separate from workflow status. | 3 | 2 | glossary |
| [work-assignments](nodes/work-assignments.md) | Glossary - Work Assignments is the bank menu group for tracking background jobs and reviewing AI output, not task assignment to people. | 3 | 1 | glossary |
| [current-account](nodes/current-account.md) | Glossary - the account a signed-in user is currently working in; drives which account roles, banks and settings apply. | 2 | 2 | glossary |
| [edit-lock](nodes/edit-lock.md) | Glossary - an edit lock is a one-hour, refreshable claim one user holds on an item or stimulus while editing, so others open it read-only. | 2 | 2 | glossary |
| [external-reviewer](nodes/external-reviewer.md) | Glossary - an external reviewer is a person with no Abigail account who joined one review with a join code; not a user. | 2 | 1 | glossary |
| [join-code](nodes/join-code.md) | Glossary - a join code is a bearer code that admits anyone holding it to one review as an external reviewer, until expiry or max uses. | 2 | 1 | glossary |
| [oscar](nodes/oscar.md) | Glossary - OSCAR is an external scoring service for open-response items; MetaMetrics is a second one. Credentials per bank are bank secrets. | 2 | 2 | glossary |
| [required-actions](nodes/required-actions.md) | Glossary - required actions are the metadata fields a workflow transition requires before content may move to the next status. | 2 | 1 | glossary |
| [revision](nodes/revision.md) | Glossary - a revision is one recorded save; Abigail has item/stimulus revisions (AD history), Toni element revisions and test profile revisions - none of them are versions. | 2 | 3 | glossary |
| [workflow-status](nodes/workflow-status.md) | Glossary - status and state both mean an item, form or stimulus's position in the bank's workflow; distinct from publication state and from review status. | 2 | 1 | glossary |
| [administration-term](nodes/administration-term.md) | Glossary - administration means a test administration (a testing window/event), never an admin user or an ADAM test session. | 1 | 1 | glossary |
| [blueprint](nodes/blueprint.md) | Glossary - blueprint is the old name for a test profile. | 1 | 1 | glossary |
| [cat-form](nodes/cat-form.md) | Glossary - a CAT (computer adaptive test) form is an adaptive AD form (type a) whose items are chosen at delivery time from pools and CAT files. | 1 | 1 | glossary |
| [doc-tier](nodes/doc-tier.md) | Glossary - a doc tier (external, internal, technical) is the visibility level of a help page or block. | 1 | 1 | glossary |
| [extract-term](nodes/extract-term.md) | Glossary - an extract is a column-templated spreadsheet of form contents; an export is any other file download (metadata, QTI, users, review history). | 1 | 2 | glossary |
| [form-slot](nodes/form-slot.md) | Glossary - a form slot is a position in an administration test that may hold one AD form and a test profile. | 1 | 1 | glossary |
| [gold-stat-set](nodes/gold-stat-set.md) | Glossary - the gold stat set is the one historical statistics set a bank marks as authoritative; replaced the per-row favored flag. | 1 | 2 | glossary |
| [paper-id-term](nodes/paper-id-term.md) | Glossary - a Paper ID (form number) is a unique number printed on a paper form, minted by type ISD, SCANNABLE or NON_SCANNABLE; replaces WING. | 1 | 2 | glossary |
| [protected-role](nodes/protected-role.md) | Glossary - a protected role is the account super-admin role (is_protected); only holders of a protected role may edit, delete or assign it. | 1 | 2 | glossary |
| [queued-request](nodes/queued-request.md) | Glossary - a queued request (bulk request) is a background job with a prefixed code like IC-1042; a bulk operation is the older file-based tracking row. | 1 | 2 | glossary |
| [shared-stimulus](nodes/shared-stimulus.md) | Glossary - stimulus, shared stimulus and passage all mean the AD shared stimulus: content several items refer to. | 1 | 2 | glossary |
| [stm](nodes/stm.md) | Glossary - STM (scoring test map) is a form's scoring configuration; a BatterySTM is the same idea across several forms (a battery). | 1 | 2 | glossary |
| [bank-term](nodes/bank-term.md) | Glossary - bank means an Abigail item bank row that wraps one AD bank; it has two ids (Abigail id and AD bank id) that are easy to mix up. | 0 | 1 | glossary |
| [identifier](nodes/identifier.md) | Glossary - identifier is the human item/form/stimulus code shared across versions; id is the AD version-specific UUID. | 0 | 2 | glossary |
| [resource-term](nodes/resource-term.md) | Glossary - a resource is an AD QTI content piece attached to forms (section intro screens, exhibits), not a general file. | 0 | 1 | glossary |
| [response-viewer](nodes/response-viewer.md) | Glossary - a response viewer may watch a review's responses without being a reviewer. | 0 | 1 | glossary |
| [review-decision](nodes/review-decision.md) | Glossary - vote, decision, feedback and response all name a reviewer's answer on one piece of content in a review. | 0 | 1 | glossary |
| [temporary-user](nodes/temporary-user.md) | Glossary - a temporary user is an ordinary user with an expiration date; after it passes they cannot sign in or use their roles. | 0 | 1 | glossary |

## capability (32)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [mre-reserved-metadata](nodes/mre-reserved-metadata.md) | Math items (Math Entry or Scaffolded Math interactions) cannot be saved without a Grades value stored under the reserved bank custom field key `grades` (selectmany), which the machine-scoring (MRE) team reads off the AD item; a one-click "Set up MRE metadata" action creates the field on a bank. | 7 | 5 | workflow, metadata, capability |
| [service-consumers](nodes/service-consumers.md) | Letting other Pearson systems call Abigail as registered "consumers" with their own client ID and secret, limited to chosen scopes and accounts, managed by platform operators. | 4 | 6 | platform, consumer, capability |
| [ai-chat](nodes/ai-chat.md) | Chatting with the AI content agent - a global floating chat with saved threads that can search and act on bank content, and per-item / per-passage chat inside the editors, grounded in help docs. | 2 | 6 | ai, capability |
| [content-workflow](nodes/content-workflow.md) | Moving items, forms and shared stimuli through a bank's workflow statuses, with role-based limits on which statuses each role may see, edit or move into, and required metadata ("required actions") that must be filled before a move. | 2 | 8 | workflow, capability |
| [bank-configuration](nodes/bank-configuration.md) | The per-bank Configuration screen and dashboard - general settings and feature flags, metadata fields, workflow statuses, OSCAR/MetaMetrics scoring credentials, AI instruction files and translation overrides. | 1 | 9 | banks, capability |
| [bank-roles-and-permissions](nodes/bank-roles-and-permissions.md) | Per-bank roles that decide what each person may do inside a bank, narrowed by content scope (metadata filters), excluded interaction types, per-workflow-state permissions and per-metadata-field edit restrictions. | 1 | 7 | permissions, banks, capability |
| [battery-scoring-maps](nodes/battery-scoring-maps.md) | Configuring batteries - scoring maps (BatterySTMs) that group forms into ordered units and define how combined scores are produced, with a validation test. | 1 | 3 | forms, scoring, capability |
| [bulk-ai-generation](nodes/bulk-ai-generation.md) | Build with Abigail - AI generation of new items and passages, one at a time in the editor or in bulk as queued jobs whose output is staged for human review before it becomes real content. | 1 | 12 | ai, capability |
| [external-reviewer-join-codes](nodes/external-reviewer-join-codes.md) | Letting people without an Abigail account review content by entering a review join code with their name and email, limited to that review, its time window and a maximum number of uses. | 1 | 8 | reviews, capability |
| [historical-statistics](nodes/historical-statistics.md) | Uploading and browsing historical item statistics sets (classical, IRT and DIF statistics from past administrations) and choosing a bank's gold set, so authors and reviewers see how items performed. | 1 | 6 | statistics, capability |
| [scoring-statistics](nodes/scoring-statistics.md) | Managing scoring statistics sets - per-item IRT parameters uploaded by CSV and used by AD to score forms. | 1 | 3 | statistics, scoring, capability |
| [test-administrations](nodes/test-administrations.md) | Planning test administrations (testing windows) - their tests, form slots holding AD forms and test profiles, admin plans (column templates for per-slot data) and test-profile validation of slotted forms. | 1 | 8 | administrations, capability |
| [account-roles-and-permissions](nodes/account-roles-and-permissions.md) | Defining account roles and their permission matrix (what each role may do across the account), including the protected super-admin role, duplicating roles and copying roles from another account. | 0 | 7 | permissions, capability |
| [ai-verification-and-translation](nodes/ai-verification-and-translation.md) | AI quality checks and translation of existing content - bulk item/passage verification, translation, scoring test-case generation, cross-form configuration verification, and human review of the AI's verification findings. | 0 | 10 | ai, capability |
| [bank-sharing-and-sync](nodes/bank-sharing-and-sync.md) | Sharing a bank with other accounts and syncing the account's bank list from AD so every AD bank the account's credentials can see appears in Abigail. | 0 | 6 | banks, capability |
| [bulk-content-tools](nodes/bulk-content-tools.md) | Bulk actions on many items, forms or stimuli at once - metadata CSV upload and export, QTI import/export, bulk status change, bulk styles and bulk tools. | 0 | 9 | bulk, capability |
| [content-reviews](nodes/content-reviews.md) | Content reviews - requesting a review of items, forms, stimuli or media, assigning reviewers, collecting decisions and comments in a time window, templates, response viewers, and exporting results and review history. | 0 | 10 | reviews, capability |
| [content-versioning](nodes/content-versioning.md) | Versions of items and forms with Draft / Published / Retired states, plus per-save revision history with revert for items and stimuli. | 0 | 5 | authoring, versioning, capability |
| [copy-bank-configuration](nodes/copy-bank-configuration.md) | Copying a bank's setup (metadata fields, workflow statuses, bank roles, field restrictions, review templates) from a source bank, even in another account, into a target bank, with a preview of differences. | 0 | 6 | banks, capability |
| [form-authoring](nodes/form-authoring.md) | Assembling items into test forms (online, adaptive/CAT or paper) with sections, resources, scoring and delivery settings, setting profiles, preview/practice, paper print and XPRT PDF export. | 0 | 9 | authoring, forms, capability |
| [form-extracts](nodes/form-extracts.md) | Exporting spreadsheets of form contents and item data from a bank - saved extract templates choose the columns, extract jobs run in the background, and a paper test map is assembled for paper forms. | 0 | 6 | forms, exports, capability |
| [help-documentation](nodes/help-documentation.md) | In-app Help and Documentation - searchable help pages with three visibility tiers (everyone, internal staff, technical) so customers and Pearson staff each see the right depth. | 0 | 5 | docs, capability |
| [item-authoring](nodes/item-authoring.md) | Creating, editing, previewing, cloning and deleting test questions (items) in AD's embedded item editor, with edit locks, standards and metadata, scoring test cases, OSCAR rubrics, preview cards and review history. | 0 | 9 | authoring, capability |
| [media-library](nodes/media-library.md) | The bank media library - uploading, categorising, replacing and deleting images, audio, video and files used by items and stimuli, plus AI-generated images, audio and graphs. | 0 | 5 | authoring, media, capability |
| [paper-ids-issuance](nodes/paper-ids-issuance.md) | Issuing unique Paper IDs (form numbers) for paper test forms under account-owned project codes, with history lookup - replacing the legacy WING generator; API-only and switched off until production cutover. | 0 | 5 | paper, capability |
| [platform-role-management](nodes/platform-role-management.md) | Assigning fixed cross-account platform roles (for Pearson operators who work across every account) from the Platform Roles page. | 0 | 5 | permissions, platform, capability |
| [sign-in](nodes/sign-in.md) | Signing in to Abigail with email and password or Microsoft single sign-on, resetting a forgotten password, switching between accounts, and staying signed in. | 0 | 15 | auth, capability |
| [standards-alignment](nodes/standards-alignment.md) | Browsing academic standards in the Standards Explorer and aligning items and forms to them, including CSV upload and export of standards alignments. | 0 | 4 | authoring, standards, capability |
| [stimulus-authoring](nodes/stimulus-authoring.md) | Authoring shared stimuli (passages and other shared content several items use), cloning them and creating new ones from bank stimulus templates. | 0 | 6 | authoring, capability |
| [test-profile-authoring](nodes/test-profile-authoring.md) | Writing test profiles (formerly blueprints) - rule trees that say which items are eligible for a form and what content mix it must have - with live matched-item counts, revision history and validation of forms against them. | 0 | 6 | test-profiles, capability |
| [toni-style-guides](nodes/toni-style-guides.md) | Toni - authoring editorial style guides as projects, guides and rule elements with drafts, approvals, versions, cross-links, media, search, dead-link checks, eStyle import and project duplication, fed to the AI content agent. | 0 | 13 | toni, capability |
| [user-management](nodes/user-management.md) | Account admins add, invite, edit, deactivate and remove users, give them roles, upload or export users in bulk, reset passwords and sign in as another user to troubleshoot. | 0 | 15 | users, capability |
