# Knowledge graph index

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

79 nodes.

## entity (19)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [cf-response](nodes/cf-response.md) | CFResponse - a student response stored by CF (one per admin/prompt/testId) with its text, box parts, client tags, embedded human and machine scores, LID/CE score, events and scoring bookkeeping; created by POST /v1/response. | 50 | 4 | entity, core |
| [cf-prompt](nodes/cf-prompt.md) | CFPrompt - CF's item/prompt configuration (one per admin+promptName) with aliases (client itemIds), state, prompt type, TDS trait definitions, scoring/CE configs, jobs (DEPLOYED gate) and RMS/LID/gaming policies; this API reads it on every call and auto-creates disabled placeholders for unknown itemIds. | 23 | 2 | entity, config, core |
| [cf-score](nodes/cf-score.md) | CFScore / CFResponseScore - a human or machine score on a response, stored in the scores collection and embedded in response.scores[]; QC and "true" scores also go to the common qc_scores collection. | 19 | 2 | entity, core, scoring |
| [ce-alert](nodes/ce-alert.md) | CEAlert - a learner-in-danger (child endangerment) judgement on a response by a scorer, supervisor or internal reviewer; created from human LID outcomes (POST /v1/outcome/lid, /v1/lid_lite/outcome). | 14 | 2 | entity, lid |
| [cf-client](nodes/cf-client.md) | CFClient - a CF API account (integration or person) in the common clients collection; accessKey/accessSecret are the clientToken/clientSecret exchanged at /v1/auth (for OSCAR, one per OSCAR tenant). | 14 | 1 | entity, auth |
| [active-workflow-record](nodes/active-workflow-record.md) | ActiveWorkflowRecord - a state-machine instance in active_workflows (Lid10PlusWorkflow per response for LID scoring, Rangefinding True Score Notifier per qc_rangefinding_true score) that CF's scheduler advances. | 13 | 2 | entity, workflow |
| [cf-admin](nodes/cf-admin.md) | CFAdmin - a CF test administration (OSCAR project ≈ admin) with aliases, active dates/data lock, customer (drives DB and priority routing), LID/CE scoring policy, RMS URL and delete permissions, sampling fractions. | 13 | 2 | entity, config, core |
| [client-session](nodes/client-session.md) | CFSession + AuthJSON/AuthResult - the X-Auth-Token session issued by POST /v1/auth (uuid token, 30-minute sliding idle expiry, stored in the common sessions collection). | 13 | 2 | entity, auth |
| [response-submission](nodes/response-submission.md) | ExternalClientAPIResponse - the JSON body of POST /v1/response (and /v1/plagiarism/response) - adminName, itemId, responseId, text or itemResponses[], storeOnly, tags, customLabels, validity, mock. | 11 | 2 | entity, payload, oscar-contract |
| [human-outcome](nodes/human-outcome.md) | ExternalClientScoreContainer + ExternalClientOutcome - an inbound human score (or LID review / smart-sort review) for a stored response - body of POST /v1\|v2/outcome and /v1\|v2/outcome/lid. | 8 | 2 | entity, payload, oscar-contract |
| [client-score-container](nodes/client-score-container.md) | ClientScoreContainer + ClientOutcome - the outbound machine-score (and LID) package CF POSTs to a client's outcomeEndpoint (OSCAR /iea/v1/outcome, /outcome/lid); built from APIOutboundScore by the notification side, also returned by GET /v1/responses/testResponses. | 7 | 2 | entity, payload, oscar-contract, outbound |
| [outcome-invalidation](nodes/outcome-invalidation.md) | ExternalClientInvalidateOutcome - body of PATCH /v1\|v2/outcome - marks one prior score (by outcomeId) INVALID, or invalidates prior QC scores when scoreType is a QC type. | 7 | 2 | entity, payload, oscar-contract |
| [test-responses-request](nodes/test-responses-request.md) | GetTestResponsesRequest / GetTestResponsesResponse - query for GET /v1/responses/testResponses, returning ready-made input payloads (PKT-BOULDER-TEST-prefixed, sendToMock-tagged) paired with the outcome CF would send, per trait score point and condition code, for a chosen front door. | 7 | 2 | entity, payload, testing |
| [responses-received](nodes/responses-received.md) | CFResponsesReceived - an append-only receipt (admin, prompt, testId, text sha256, time) written for every accepted POST /v1/response, independent of the response document. | 6 | 2 | entity, audit |
| [ack-response](nodes/ack-response.md) | AckResponse - CF's standard JSON reply envelope {message, code, detail} for every mutating route and every error. | 4 | 1 | entity, payload |
| [response-release-request](nodes/response-release-request.md) | ExternalClientMarkResponseReleased - body of POST /v1/response/release - tells CF the client has released/exported the score so CF stops re-sending outcomes; sets releaseDate. | 4 | 1 | entity, payload, oscar-contract |
| [test-sink-payload](nodes/test-sink-payload.md) | Loopback test-sink bodies - EPENScoreContainer (POST /v1/score), EPENRequestCEReviewJSON (POST /v1/alert), ExternalClientPlagiarismScoreContainer (POST /v1/plagiarism/outcome) - shapes CF itself sends to clients, accepted here only to be logged. | 4 | 1 | entity, payload, testing |
| [remove-responses-request](nodes/remove-responses-request.md) | ExternalClientAPIRemoveResponses - body of POST /v1/responses/remove - deletes up to 1000 responses by responseId under one admin/item, only if the admin allows deletion and every response is older than 60 days. | 3 | 2 | entity, payload |
| [lid-lite-request](nodes/lid-lite-request.md) | LidLiteResponse / LidLiteOutcome - bodies of POST /v1/lid_lite/response (text for LID-only scoring) and /v1/lid_lite/outcome (human adjudication). | 2 | 1 | entity, payload, lid |

## module (10)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [external-client-api](nodes/external-client-api.md) | The CF External Client API binary (Go/gin, package main in external_client_api/) - token-authenticated REST front door at client.<env>.ktscoringservices.com where clients such as OSCAR post responses, human outcomes, invalidations, LID reviews and release/remove requests. | 31 | 29 | module, api, intake |
| [client-common](nodes/client-common.md) | api_contexts/client_common - ClientAPIContext, the shared intake logic behind the External Client API - auth/session creation, admin/prompt de-aliasing with auto-created placeholder prompts, scoring dispatch to SCORE_RESPONSE or priority queues, LID workflow kickoff, EPEN-state invalidation and random sampling. | 30 | 16 | module, intake, shared |
| [system-integration](nodes/system-integration.md) | OUT OF SCOPE boundary node - the separate system_integration binary (cmd/system_integration) at oscar.<env>.ktscoringservices.com that serves OSCAR's tenant/project/item/TOD/smart-sort/field-test provisioning and modeling routes plus ABBI lookups; listed so the OSCAR contract can be mapped route by route. | 16 | 4 | module, out-of-scope, oscar-contract, provisioning |
| [external-client-driver](nodes/external-client-driver.md) | OUT OF SCOPE boundary node - driver/external_client_driver.go and driver/oscardriver, the code that sends CF outcomes back to clients (to tags.outcomeEndpoint, e.g. OSCAR /iea/v1/outcome, /outcome/lid, /score/request, /plagiarism/outcome) and TOD workflow-state changes to OSCAR /iea/v1/workflow/state. | 15 | 4 | module, out-of-scope, oscar-contract, notification |
| [lidlite](nodes/lidlite.md) | api_contexts/lidlite - the LID Lite API mounted into the External Client API router in live mode - stores text-only learner-in-danger responses under the lid-lite admin, starts a Lid10PlusWorkflow, and accepts human LID adjudications; JWKS system auth or token auth only when API_AUTH_ENABLED. | 14 | 9 | module, lid |
| [active-workflow](nodes/active-workflow.md) | service/active_workflow - CF's state-machine scheduler; this API only creates records in active_workflows (Lid10PlusWorkflow for LID scoring, Rangefinding True Score Notifier Workflow for qc_rangefinding_true scores) for the scheduler to run. | 8 | 2 | module, workflow |
| [api-common](nodes/api-common.md) | api_contexts/api_common + api_contexts/binding - CF's shared gin plumbing - GetKTGinRouter (ping/health/auth_test/internal config/liveness, metrics + logging middleware), APIContext.GetActiveClient, BindAndLog / DecodeAndMockRequest, Ack helpers. | 7 | 4 | module, shared, http |
| [workflow-event-sender](nodes/workflow-event-sender.md) | workflow/workflow_event_sender.go - process-wide sender of prompt workflow transition messages to the PROMPT_WORKFLOW SQS queue; initialised in main.go, used when a response arrives for an unconfigured prompt. | 7 | 2 | module, workflow |
| [cf-service-layer](nodes/cf-service-layer.md) | The shared service package (service/*.go) as this API uses it - ResponseService, ResponsesReceivedService, PromptService, AdminService, AlertService, QCScoreService, ScoreService, ClientService, Lid10ResponseContextService - the Mongo data-access layer behind every handler. | 6 | 11 | module, data-access |
| [scoring-service](nodes/scoring-service.md) | service/scoring as used here - the queue event types (ScoreResponseEvent, RequestLidReviewEvent, ArchiveResponseEvent) and the PRE_RANGE_FINDING_SCORE_NOTIFICATION_CONSUMER queue accessor; the scoring consumers themselves run in other CF binaries. | 6 | 5 | module, scoring |

## interface (2)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [client-api](nodes/client-api.md) | The routes the External Client API binary serves at client.<env>.ktscoringservices.com - /v1\|/v2 auth, response intake, human outcomes and invalidations, LID outcomes, release/remove, test-response generator and loopback test sinks; X-Auth-Token session auth. | 40 | 13 | api, interface, intake, oscar-contract |
| [lid-lite-api](nodes/lid-lite-api.md) | /v1/lid_lite/{health,response,outcome} plus JWKS system-auth routes, served by the External Client API process via the lidlite module; auth only when API_AUTH_ENABLED. | 11 | 3 | api, lid |

## integration (5)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [oscar](nodes/oscar.md) | OSCAR (Pearson's human-scoring platform) - the main external client of this API (it calls it "IEA"/"CF"/"KT") and the receiver of CF outcomes on its /iea/v1/* callback routes. | 12 | 2 | integration, oscar-contract |
| [prometheus](nodes/prometheus.md) | Prometheus metrics via common/ktmetrics - a /metrics server on :2112 plus request middleware; this API counts score requests and human scores received. | 5 | 1 | integration, observability |
| [aws-secrets-manager](nodes/aws-secrets-manager.md) | AWS Secrets Manager via common/ktsecrets - source of outbound client callback credentials (CFClientApiConfig_<endpoint>), OSCAR credentials, Slack tokens and other service secrets; never read for inbound auth. | 4 | 1 | integration, aws, secrets |
| [slack](nodes/slack.md) | Slack notifications via common/ktnotifier - client_common posts to the | 4 | 1 | integration, notification, lid |
| [aws-xray](nodes/aws-xray.md) | AWS X-Ray tracing via common/ktxray - PostResponse opens an ExternalClient.PostResponse segment whose trace/segment ids are stored on the response so downstream scoring and notification continue the trace. | 3 | 1 | integration, aws, observability |

## datastore (2)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [cf-mongo](nodes/cf-mongo.md) | CF's MongoDB (Atlas) via common/db - a common database (<env>_scorearchive) holding clients, sessions, admins, prompts, ce_alerts, qc_scores, responses_received, active_workflows, and per-prompt or per-customer databases holding responses and scores. | 14 | 1 | datastore, mongo |
| [sqs-queues](nodes/sqs-queues.md) | AWS SQS via common/messaging - the queues this API writes - SCORE_RESPONSE plus per-customer priority queues, REQUEST_LID_REVIEW, ARCHIVE_RESPONSE, REQUEST_ADDITIONAL_SCORE, PROMPT_WORKFLOW and PRE_RANGE_FINDING_SCORE_NOTIFICATION_CONSUMER. | 10 | 1 | datastore, queue, aws |

## event (5)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [score-response-event](nodes/score-response-event.md) | ScoreResponseEvent - "score these response ids" message put on SCORE_RESPONSE (or a customer priority queue) after POST /v1/response when ktScore is set, the prompt is not DISABLED and a job is DEPLOYED. | 12 | 2 | event, scoring |
| [request-lid-review-event](nodes/request-lid-review-event.md) | RequestLidReviewEvent - asks for a supervisor LID review of a response (alertType "Child Endangerment", destination Supervisory); put on REQUEST_LID_REVIEW when an internal reviewer proposes an alert or a mockReturnCEAlert tag is present. | 8 | 2 | event, lid |
| [pre-range-finding-score-notification](nodes/pre-range-finding-score-notification.md) | PreRangeFindingScoreNotificationEvent {adminName, promptName, testId} pushed to PRE_RANGE_FINDING_SCORE_NOTIFICATION_CONSUMER after a pre_range_finding human score is saved. | 7 | 2 | event, rangefinding |
| [workflow-transition-event](nodes/workflow-transition-event.md) | CFWorkflowTransitionMessage {adminName, promptName, newState, timestamp, reason} sent to PROMPT_WORKFLOW when a response or outcome arrives for an unconfigured prompt (CONFIG_ERROR or DATA_ONLY). | 7 | 2 | event, workflow, provisioning |
| [archive-response-event](nodes/archive-response-event.md) | ArchiveResponseEvent - {response, score} sent to ARCHIVE_RESPONSE by POST /v1/plagiarism/response with a fake UNSCORABLE score, so the archive consumer stores the response and triggers a plagiarism outcome. | 6 | 2 | event, plagiarism |

## config (1)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [external-client-api-config](nodes/external-client-api-config.md) | Configuration of the External Client API - external_client_api/default.json overlaid by CF_-prefixed environment variables (common/config) - port, env, Mongo, queues, priority routing, password hashing, API_AUTH_ENABLED, mock creds, logging. | 15 | 1 | config |

## flow (8)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [lid-review](nodes/lid-review.md) | Learner-in-danger (LID / child endangerment) handling - on intake CF starts a Lid10PlusWorkflow when LID scoring is enabled; alerts go to the client for supervisor review; humans report back via POST /v1/outcome/lid (OSCAR LidReviewed) or /v1/lid_lite/outcome, creating CEAlerts and forwarding internal-reviewer proposals to supervisors. | 7 | 6 | flow, lid, oscar-contract |
| [human-outcome-intake](nodes/human-outcome-intake.md) | A client reports a human score (OSCAR ReportHumanScore / SmartSortCodeReviewed) via POST /v1/outcome, or invalidates one (NotifyScoreInvalidated) via PATCH /v1/outcome; CF validates against the prompt's traits, invalidates superseded reads, routes QC/true/pre-range-finding scores, and stores the score for training and stats. | 6 | 6 | flow, scoring, oscar-contract |
| [provision-tenant-project-item](nodes/provision-tenant-project-item.md) | How OSCAR tenants, projects and items become CF clients, admins and prompts - explicit provisioning goes to the separate system_integration API (out of scope); the External Client API only provisions implicitly, auto-creating a DISABLED placeholder prompt (CONFIG_ERROR or DATA_ONLY) when a response or outcome names an unknown itemId. | 5 | 6 | flow, provisioning, oscar-contract |
| [response-intake-and-scoring](nodes/response-intake-and-scoring.md) | A client (OSCAR RequestScore) posts a response to /v1/response; CF validates, de-aliases, stores it, acks 200, queues a ScoreResponseEvent (and LID workflow), scoring consumers score it, and the external client driver POSTs the outcome back to the response's outcomeEndpoint (OSCAR /iea/v1/outcome). | 4 | 9 | flow, scoring, oscar-contract |
| [rms-media-response-intake](nodes/rms-media-response-intake.md) | Handling of RMS (Pearson response media service) content in response text - CF rejects RMS error dumps always, and RMS clip-image URLs unless the prompt or admin sets allowRmsImageUrls (default false); also rejects raw PNG bytes. | 4 | 4 | flow, intake, rms |
| [plagiarism-check](nodes/plagiarism-check.md) | POST /v1/plagiarism/response stores a response (ktScore false, tag plagiarismApi) and sends it with a fake UNSCORABLE score to ARCHIVE_RESPONSE; the archive consumer runs plagiarism matching and the outcome (nearest match + cosine) is posted to the client's /plagiarism/outcome. | 3 | 4 | flow, plagiarism |
| [rangefinding-score-intake](nodes/rangefinding-score-intake.md) | Rangefinding and TOD-related scoring through this API - pre_range_finding human scores replace earlier pre-RF scores and notify a consumer that returns a pre_range_finding outcome; qc_rangefinding_true scores start a workflow that pushes true scores to ARCHER. TOD item creation and modeling are not in this API (system_integration). | 3 | 6 | flow, rangefinding, tod |
| [response-export-release](nodes/response-export-release.md) | When OSCAR exports a response it sends NotifyResponseExported → POST /v1/response/release; CF sets releaseDate so it stops re-sending outcomes. Clients can also delete old responses with POST /v1/responses/remove. | 2 | 3 | flow, lifecycle, oscar-contract |

## concept (16)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [data-only-prompt](nodes/data-only-prompt.md) | DATA_ONLY / CONFIG_ERROR placeholder prompts - CF's auto-created, DISABLED prompt records for itemIds it has never been configured for; data is stored but never scored until configured and deployed. | 3 | 2 | concept, glossary |
| [scored-response-text](nodes/scored-response-text.md) | tags.scoredResponseText - the exact text the IEA2 model scored, which score-explanation span offsets refer to; set by CF scoring (tds/scoring_driver.go) from ScoreExplanation, persisted on response tags, echoed in outcome tags; OSCAR (AD-6322) stores it and passes it to AD. Not produced by the External Client API. | 3 | 2 | concept, glossary, oscar-contract |
| [iea](nodes/iea.md) | IEA (Intelligent Essay Assessor) is what OSCAR calls this service; inside CF the product is Continuous Flow (CF) / KT (Knowledge Technologies, ktscoringservices.com), and IEA/IEA2 also names CF's scoring engine behind it. | 2 | 2 | concept, glossary |
| [box-prompt](nodes/box-prompt.md) | Box prompt = composite/multi-part item - the response arrives as itemResponses[] (identifier, value, attemptedStatus) and CF joins the mapped parts into text with \x03\|\x03 delimiters; the prompt must have a responseOutcomeList. | 1 | 2 | concept, glossary |
| [epen-state](nodes/epen-state.md) | epenState - per-score validity marker (INVALID, UNUSED, IEA_RESET) named after ePEN, set when a client invalidates a score or a newer read replaces it; invalid scores are excluded from training. | 1 | 2 | concept, glossary |
| [mock-field](nodes/mock-field.md) | The "mock" request field (success, error, error-not-found, …) - a CF-wide convention where a request carrying mock gets a canned reply without side effects; honoured only by handlers that use DecodeAndMockRequest. | 1 | 1 | concept, glossary |
| [qc-score](nodes/qc-score.md) | QC score - a human score given on a quality-control response (practice/qualification/validity/calibration attempts, true scores, rangefinding true) that CF keeps in qc_scores for scorer-quality analytics rather than on the response. | 1 | 2 | concept, glossary |
| [response-id](nodes/response-id.md) | responseId (client) = testId (CF) - the response key within a prompt; free-form string; OSCAR sends "<ref>#<oid>" (QC scores "<oid>#<ref>"), test responses are prefixed PKT-BOULDER-TEST-. | 1 | 1 | concept, glossary |
| [admin-name](nodes/admin-name.md) | adminName = a CF test administration (CFAdmin); clients send an alias (incomingAdminName) that CF resolves to the internal adminName; for OSCAR it is the project's IEA admin name. | 0 | 1 | concept, glossary |
| [front-door](nodes/front-door.md) | Front door = the client-facing interface a response arrives through (ePen, externalClientAsynch = this API, externalClientSynch = sync scoring API); used by GetTestResponses to shape sample payloads. | 0 | 2 | concept, glossary |
| [item-alias](nodes/item-alias.md) | itemId (client) vs promptName (CF) - the client's item identifier is an alias in CFPrompt.aliases; /v2 routes call it promptId; unknown aliases auto-create a placeholder prompt. | 0 | 1 | concept, glossary |
| [kt-score-flag](nodes/kt-score-flag.md) | ktScore / storeOnly - whether the client wants a machine score; storeOnly=true stores data only (training, rangefinding), validity=true forces scoring. | 0 | 2 | concept, glossary |
| [lid](nodes/lid.md) | LID = Learner In Danger, called CE (child endangerment) in much CF code - a safeguarding alert on response text, produced by a LID model and adjudicated by humans (scorer, internal reviewer, supervisor). | 0 | 2 | concept, glossary |
| [outcome-endpoint-tag](nodes/outcome-endpoint-tag.md) | tags.outcomeEndpoint (+ optional outcomeEndpointKey/Secret, sendToMock, outcomeNotificationQueueURL, scoringEndpoint) - response tags that tell CF where to send the outcome, overriding the prompt's clientApiConfig; OSCAR sets outcomeEndpoint to its /iea/v1 callback base. | 0 | 2 | concept, glossary, oscar-contract |
| [priority-routing](nodes/priority-routing.md) | Priority routing - per-customer (or per-admin) scoring queues (SCORE_RESPONSE_ASPIRE, _PARCC, _PTE, …) chosen from PRIORITY_ROUTING config so one customer's volume cannot starve another's. | 0 | 2 | concept, glossary |
| [score-type](nodes/score-type.md) | scoreType - the CF vocabulary for who/why a score was given (kt, first_read, second_read, third_read, back_read, resolution, validity, QC *_attempt, true, qc_rangefinding_true, pre_range_finding, smart_sort_code_accepted/rejected, lid_*), validated on every human outcome. | 0 | 2 | concept, glossary |

## capability (11)

| node | summary | in | out | tags |
|---|---|---|---|---|
| [automated-response-scoring](nodes/automated-response-scoring.md) | Clients send student written responses and CF returns machine scores (trait scores, condition codes, confidence, optional explanations) to the client's callback. | 0 | 5 | capability, scoring |
| [composite-item-scoring](nodes/composite-item-scoring.md) | Multi-part (box/composite) items can be submitted part by part; CF assembles the parts for scoring. | 0 | 1 | capability, intake |
| [human-score-passback](nodes/human-score-passback.md) | Clients report human scores (first/second reads, resolutions, QC and true scores) back to CF so it can measure agreement and train models. | 0 | 2 | capability, scoring |
| [image-response-support](nodes/image-response-support.md) | Responses can be links to scanned/handwritten response images (RMS clip URLs) instead of typed text, when enabled for the item or test administration. | 0 | 2 | capability, intake |
| [integration-test-responses](nodes/integration-test-responses.md) | Clients can fetch ready-made test responses (with the outcome to expect) and use mock flags or test tags to exercise their integration without real scoring. | 0 | 2 | capability, testing |
| [learner-in-danger-alerts](nodes/learner-in-danger-alerts.md) | CF screens responses for signs a student may be at risk and routes alerts to human reviewers and supervisors; humans' decisions come back to CF. | 0 | 4 | capability, lid |
| [lid-lite-screening](nodes/lid-lite-screening.md) | Any client can submit text purely for learner-in-danger screening (no content scoring) and later submit a human verdict. | 0 | 3 | capability, lid |
| [plagiarism-detection](nodes/plagiarism-detection.md) | A client can ask CF to compare a response against the scoring archive and get back its nearest match and similarity. | 0 | 1 | capability |
| [rangefinding-support](nodes/rangefinding-support.md) | Rangefinding and pre-rangefinding scores from expert sessions are accepted, replace earlier ones, and trigger notifications or ARCHER updates. | 0 | 1 | capability, rangefinding |
| [response-release-and-removal](nodes/response-release-and-removal.md) | Clients tell CF when a score has been released/exported (so CF stops re-sending it) and can delete old responses where the program allows it. | 0 | 1 | capability, lifecycle |
| [score-invalidation](nodes/score-invalidation.md) | Clients can withdraw a previously reported human score (e.g. scorer retrained) so CF stops using it for training and statistics. | 0 | 2 | capability, scoring |
