Ir al contenido principal
Prototipo solo para evaluación. Use datos sintéticos. No ingrese información real de pacientes.

Evaluator Guide

This page is the accompanying documentation for the prototype. Print it (or save it as PDF) to produce the attachment referenced in the proposal.

A twenty-minute walkthrough of this prototype, organised by the six areas the technical approach is scored on, plus the bilingual standard Amendment 2 added. Every section names what to click and what it demonstrates.

Synthetic data only

Everything in this system is invented for evaluation. No real patient, provider, or Government information is present, and none should be entered. Reports filed here are never sent to VAERS.

Before you start

Access details
Administration console/admin
Demo credentialsUsername cdc-evaluator. The password is given in the proposal attachment that accompanies this prototype.
Published form schemaversion 1
Browsers testedEdge and Chrome on Windows, Safari on macOS and iOS, Chrome on Android, at widths from 320 to 1440 pixels.

What is real and what is simulated

Real versus simulated capabilities
AreaStateDetail
Form, branching, validation, completenessRealDriven by a versioned schema and a documented condition language.
Persistence of reports, drafts, surveys, eventsRealPostgreSQL through a data-access layer; Azure SQL Managed Instance is the documented production alternative.
VAERS-compatible output and exportsRealGenerated from each submission using the public data-set headers.
Transmission to VAERSSimulatedPosted to a mock intake endpoint with retry and a receipt. The real interface specification is furnished at kickoff; only configuration changes.
UploadsRealStored in Azure Blob Storage with server-generated names. Malware scanning is a documented seam; Microsoft Defender for Storage is the production path.
AI assistantRealLive model behind a provider adapter, grounded in published content, with guardrails, logging and a kill switch. It runs on Azure OpenAI, the same service CDC operates: a GPT-5.4-mini deployment in a Sweent Azure subscription. Moving it to a CDC subscription, or to EDAV, changes three environment variables and no code.
Symptom coding (VAERSSYMPTOMS)Out of scopeRequires MedDRA licensing and coding; documented rather than built.
Single sign-on for administratorsSimulatedDemo credentials for evaluation. Microsoft Entra ID is the production path.
All data in the systemSimulatedSynthetic only. No real patient, provider, or Government information is present.

1. Understanding of the problem and objectives about 3 minutes

  1. Open the home page. Report, FAQ, and Data are each one tap away, and the emergency notice is above the fold.
  2. Select Report. The first screen asks who is reporting, which is the distinction the solicitation introduces.
  3. Choose "a patient, parent, caregiver" and continue. Note the plain-language wording.
  4. Go back and choose "a healthcare professional". The same items now use clinical wording and the facility step appears.
  5. Switch the language to Español in the header. The whole site, including form labels and help, changes language.

What this shows. PRS#3 access paths, plain-language and clinical wording, the existing follow-up tool preserved as a link.

2. Soundness and feasibility about 4 minutes

  1. Complete a healthcare-professional report with two vaccines on the same date.
  2. Sign in to the admin console with the credentials above.
  3. Open Submissions, then the report you just filed.
  4. Read the VAERSDATA and VAERSVAX rows, then download either as CSV. The headers are the public data-set headers.
  5. Check the transmission status: the report was posted to the intake adapter and acknowledged with a receipt.

What this shows. PRS#6 VAERS-compatible output, a working data layer, and a real deployment on the Azure services CDC already operates.

Request flow from the browser through Azure App Service to the database, storage, key vault, model provider and intake adapter.
Evaluator browserHTTPS 443, HSTSAzure App ServiceNext.js pages + API routesstateless, scale-outPostgreSQL FlexibleBlob StorageKey VaultApplication InsightsModel providerVAERS intake (mock)
How each prototype service maps to the CDC target environment
CapabilityIn this prototypeIn the CDC environment
Web application (Next.js, Node 20)Azure App Service (Linux)Azure Web Apps
Relational dataAzure Database for PostgreSQL Flexible ServerAzure SQL Managed Instance
Uploaded documentsAzure Blob Storage (private container)Azure Blob Storage
SecretsAzure Key Vault via managed identityAzure Key Vault
Logs, metrics, uptimeAzure Monitor and Application InsightsAzure Monitor
Language modelAzure OpenAI (GPT-5.4-mini deployment)Azure OpenAI in EDAV
VAERS intakeMock endpoint behind an adapter interfaceThe real intake interface, furnished at kickoff

3. Innovation and originality about 3 minutes

  1. Open the assistant from any page and ask "Where do I download data?". It answers with a citation and a link.
  2. Ask "What is a lot number?". The answer is grounded in the published form instructions.
  3. Ask "Should I take my child to the ER?". The assistant refuses, redirects to a clinician or 911, and the refusal happens before any model call.
  4. On the review step, watch the essential-items meter and the list of what is still missing.
  5. On a healthcare-professional report with a hospitalisation, note the suggested documents.

What this shows. Grounded assistance with guardrails and a deterministic fallback, the completeness meter, and rule-driven document suggestions.

4. Technical risks and mitigation about 3 minutes

  1. Read the risk register below. Each row names where the mitigation is visible in the running system.
  2. Open Admin → Feature flags and turn the AI assistant off.
  3. Reload a public page and open the assistant: it now serves FAQ search results instead, with no error.
  4. Turn the flag back on.

What this shows. Risks are mitigated by design decisions you can see and toggle, not only by narrative.

Risk register
RiskMitigationWhere you can see it
The real VAERS intake interface specification is not available until kickoffAll transmission goes through one adapter interface with retry and status; the mock endpoint implements it todayAdmin → Submissions → transmission status
Environment and access approvals can lag the scheduleThe application runs on the same Azure services CDC operates and is deployable into a CDC subscription without code changes; configuration is entirely environment variables and Key VaultThis page, Architecture section
An AI assistant could give unsafe or ungrounded answersThe model runs on Azure OpenAI rather than a third-party service. Answers are grounded in published FAQ and form instructions only, medical advice and causation questions are refused before any model call, prompts are injection-filtered, exchanges are logged without form values, and an admin kill switch disables the feature instantlyAssistant panel; Admin → Feature flags
Accessibility regressions appear lateAutomated accessibility checks run against every route in the test suite, and manual assistive-technology passes are recorded before each releaseAccessibility section below
No baseline exists for abandonment or completion on the current formThe same first-party instrumentation used here can be deployed against the legacy form at kickoff to establish the baselineAdmin → Metrics
Paperwork Reduction Act clearance may delay survey deploymentSurvey instruments are configuration and can be edited or disabled without a releaseAdmin → Surveys, Admin → Feature flags
Phase 2 image uploads arrive after launchThe accepted file types are an allow-list behind a feature flag; enabling images is a configuration changeAdmin → Feature flags
Spanish wording needs professional reviewEvery string, including form labels and help, lives in editable catalogues and the form schema, so a reviewed translation replaces the draft without a releaseAdmin → Content, Admin → Form schema

5. Alignment with performance requirements about 4 minutes

  1. Read the requirements table below and follow any row to the feature it names.
  2. Run the four low-code scenarios in the next section. None of them requires a developer or a deployment.

What this shows. Every performance requirement in scope has a place to click, with its status stated plainly.

Performance requirements and where to see each one
RequirementWhat it asks forWhereStatus
PRS#1Branching logic for public and healthcare-professional reporters, and for vaccine administration errors
Branching is data in the form schema, not code. Choosing "vaccine administration error" removes items 5, 18, 19, 20, 21 and 23 and requires the error narrative instead.
Report → first screen; then the vaccine-error branchDemonstrated
PRS#2Intelligent validation, tooltips, and informational pop-ups
Field and cross-field rules with plain-language messages, an error summary with anchors, tooltips on every item, and keyword nudges that never block.
Every step; try an onset date before the vaccination dateDemonstrated
PRS#3Redesigned navigation: report, FAQ, and data within two taps
All three paths are one tap from any page. Emergency notice sits above the fold.
Landing page and headerDemonstrated
PRS#4Performance and analytics instrumentation
First-party events only. Median submission time, abandonment, step entries, validation errors by field, and Core Web Vitals at the 75th percentile.
Admin → MetricsDemonstrated
PRS#5Completeness of essential items
The meter counts only the essential items visible in the current branch, so the vaccine-error branch is scored against its own shorter set.
Review step: the essential-items meterDemonstrated
PRS#6VAERS-compatible data capture and transmission
Exact public data-set headers for VAERSDATA and VAERSVAX. Transmission is simulated against a mock intake endpoint with retry and a receipt; the real interface is a configuration change.
Admin → Submissions → a report → CSV and JSON downloadsDemonstrated
PRS#7Customer satisfaction surveys
Both instruments are editable in the admin console. Results are summarised under Admin → Surveys.
Footer survey and the survey shown after submittingDemonstrated
PRS#8Low-code updates to content and to form fields and branching
Four scripted scenarios below change wording, a field’s visibility, a vaccine brand, and a suggestion rule with no code and no deployment.
Admin → Content, Form schema, Suggestion rules, VaccinesDemonstrated
PRS#9Medical record upload
PDF, DOC, DOCX and TXT up to 25 MB. Images are refused with the Phase 2 explanation; a feature flag turns them on. Files are stored under server-generated names.
Report → Review step → DocumentsDemonstrated
PRS#10Supplemental-document suggestions
Deterministic rules over workflow data only, never over free text. Rules are editable in the admin console.
Report → Review step, healthcare-professional reportsDemonstrated
PRS#11Free-text supplemental information
Maps to the continuation page of the VAERS 2.0 form and is carried in the canonical JSON.
Report → last stepDemonstrated
PRS#12Section 3 tasks (help desk, correspondence)
Out of scope for the prototype; addressed in the technical volume.
Documented only
PRS#13Security and privacy controls
HTTPS with HSTS, a content security policy with no third-party origins, CSRF protection, rate limiting, an audit log, and secrets in Key Vault. FedRAMP boundary work and ATO artefacts are post-award.
This page, Security section; response headersPartially demonstrated
PRS#14Section 508 / WCAG 2.1 AA
Automated axe checks run on every route in both languages as part of the test suite, with zero critical or serious findings. Manual assistive-technology results are listed below.
Every page; Accessibility section belowDemonstrated
PRS#19Bilingual support: English and Spanish for the report form, the satisfaction surveys, the landing page and navigation (PWS 1.13, added by Amendment 2)
Every label, help text, option, validation message, nudge, step title, survey question and FAQ entry has an English and a Spanish text, and the same schema rules drive presentation and suppression in both languages. Switching language in the middle of a report keeps the draft. The Spanish text is complete and machine-drafted; a professional linguistic review is scheduled at kickoff.
The Español button in the header and footer of every page; the note under the home-page heading; walkthrough 7 below; Admin → Dashboard, Spanish coverageDemonstrated

Low-code scenarios

Each of these is a change a programme office would make on its own. None needs a developer, a release, or a restart.

L1. Add a vaccine brand

  1. Admin → Vaccines.
  2. Under Influenza (FLU4), add brand "Example Vax (brand)" with manufacturer "Example Biologics Inc.".
  3. Open a new report, reach the vaccine step, and type "Example" in the brand field.

Expected result. The new brand appears in the type-ahead and is exported as VAX_NAME. Adding it published a new schema version.

L2. Change the public wording of item 18 in both languages

  1. Admin → Form schema → the field ae.description.
  2. Change the public English label and the public Spanish label, and edit the tooltip.
  3. Publish the new version, then open a new report as a member of the public.

Expected result. The public sees the new wording in both languages, the clinical wording is unchanged, and a report already in progress keeps the old version.

L3. Hide item 24 (race) from public reporters

  1. Admin → Form schema → the field patient.race.
  2. Under "Show this field when", add the condition: ctx.audience is hcp.
  3. Publish, then open a new report as a member of the public.

Expected result. Race no longer appears for public reporters but still appears for healthcare professionals, and it is absent from the exported record for public reports.

L4. Add a suggestion rule for disability

  1. Admin → Suggestion rules → Add a rule.
  2. Set the document type, the label in both languages, and the condition: ae.outcomes.disability is answered / checked.
  3. File a healthcare-professional report that selects "Disability or permanent damage".

Expected result. The new document appears in the suggested-documents checklist on the review step.

6. Scalability and extensibility about 3 minutes

  1. Open Admin → Form schema. Every field, label, help text, visibility rule and requiredness rule is data, versioned on publish.
  2. Note the version history and the ability to roll back.
  3. Open Admin → Suggestion rules and read a condition in the builder, then switch it to JSON.
  4. A report already in progress keeps the schema version it started on, so publishing never disturbs a reporter mid-form.
  5. Read the capacity table below. It sets the volumes CDC stated in Amendment 2 (Q116) against how this prototype is sized and how the production deployment scales.

What this shows. Versioned schema, a documented condition language, rules in tables, feature flags, locale catalogues, and a stateless application tier sized against stated volumes.

Capacity: the volumes CDC stated (Amendment 2, Q116) against the prototype and the proposed production path
MeasureCDC, Q116This prototypeProduction, proposed and not yet load-tested
Site visits2,256,501 a year (2025), about 6,183 a dayOne App Service P1v3 instance serving server-rendered pages; no third-party requestsAutoscale to 2–4 instances on CPU; Azure Front Door with WAF in front
Report submissions22,016 a year, about 60 a dayPostgreSQL Flexible Server B2s; each submission is one transaction and one VAERS ID from a database sequenceGeneral Purpose tier with high availability; the same data layer
Concurrent usersAbout 64 on average (15-minute sessions); real peak "several times higher", so we plan for five timesRate limits are enforced in the application process, per instanceRate limiting moves to the edge or a shared store, because per-instance limits do not add up across instances
Existing performance baselineNot availableAdmin → Metrics records page load, time to submit and abandonment from the first visitThe same instrumentation establishes the PWS 1.10 baseline at kickoff; the 30 percent abandonment reduction is measured against it

7. Bilingual support (PRS#19, PWS 1.13) about 2 minutes

  1. On the home page, select Español in the header (or in the footer). The page, the navigation and the note under the heading are now in Spanish, and the note offers English.
  2. Select Report as a patient and complete the first two steps in Spanish. Every label, hint, option and error is Spanish; the items shown and hidden are the same ones the English form shows and hides.
  3. Now select English in the header. You are on the same step of the same report, with your answers intact: the language control carries the draft with it.
  4. Switch back to Español, finish the report and submit. The confirmation and the satisfaction survey that follows are in Spanish, and the survey response is stored with its language.
  5. Open Admin → Form schema and any field. English and Spanish sit side by side for the public wording, the clinical wording and the help text, and publishing changes both at once.
  6. Open Admin → Dashboard. The Spanish coverage panel counts every string in the schema, the site content, the FAQ, the surveys and the interface, and shows how many lack a Spanish text.

What this shows. PRS#19 asks for correct field presentation and suppression in both languages for both submitter types. The same schema and rules produce both languages, so the branching scenarios run in Spanish exactly as they do in English, and the test suite runs them that way.

Accessibility

The prototype targets WCAG 2.1 AA. Automated checks with axe run against every route in both languages on desktop and mobile viewports as part of the test suite, and the build fails on any critical or serious finding. Automated checking is not sufficient on its own. A keyboard-only submission of a complete report, a 320 pixel reflow check with no horizontal scrolling, a 200 percent zoom check, and a simulated screen-reader pass (a specification-driven virtual reader, not VoiceOver or NVDA, whose transcripts are committed with the tests) are part of the automated suite. A human VoiceOver pass in Safari and an NVDA pass in Firefox on Windows are scheduled and their outcome is recorded in the scenario record; neither has been completed at the time of writing, and this guide does not claim otherwise.

Specific choices worth noting: a skip link, one label per control, fieldsets and legends for grouped questions, an error summary that takes focus and links to each field, live-region announcements on step changes, focus moved to the step heading, focus trapped in dialogs and returned to the opener on close, no reliance on colour alone, and reduced-motion support.

Security and privacy

  • HTTPS only, TLS 1.2 or higher, HTTP Strict Transport Security in production.
  • A content security policy with no third-party script origins. There is no third-party analytics, advertising, or tracking anywhere in the application.
  • Cross-site request forgery protection on every state-changing request, and rate limits on drafts, submissions, uploads, surveys, and the assistant.
  • Secrets in Azure Key Vault, read through a managed identity. No secret is present in the code or in logs.
  • Uploads are stored under server-generated names; the file name a person chose never becomes a storage path.
  • Administrative changes are written to an audit log with the previous and new values.
  • The assistant never receives anything typed into the form, and assistant logs contain no form values.

What changes after kickoff

  • The VAERS intake interface specification replaces the mock adapter.
  • The Government data dictionary and business rules replace the seeded schema and rule tables, using the same editors.
  • Azure OpenAI in EDAV replaces the prototype model provider by configuration.
  • Microsoft Entra ID replaces demo credentials for administrators.
  • A professional linguistic review of the Spanish text, which is complete across the site, the form, the surveys and the FAQ (PWS 1.13, PRS#19).
  • Paperwork Reduction Act clearance governs when the surveys are enabled.