This entire site follows a strict schema-first rule. All structured data contracts across the website must be defined by schema first, then implemented in data, APIs, UI adapters, and docs.
Schema-first applies to all structured website data, including:
- Content registries
- API response payloads
- Enums, patterns, and status values
- Any UI behavior that depends on structured fields
If a field is added, removed, renamed, or has enum/pattern/required changes:
- Update the relevant schema first.
- Then update data files and code.
- Then validate.
- Then update SOP/docs examples.
No exceptions.
For every registry schema in web/src/lib/data/**:
- Maintain a public read-only API endpoint (
/api/<domain>.jsonor documented equivalent). - Maintain a matching API response schema in
web/src/lib/data/api/schemas/. - Maintain a matching API payload builder in
web/src/lib/data/api/. - Maintain admin SOP documentation in a relevant
/admin/sop*route.
If no existing SOP page fits the domain, add a new route under /admin/sop-<domain>.
web/src/lib/data/events/events.schema.jsonweb/src/lib/data/campaigns.schema.jsonweb/src/lib/data/catalog.schema.jsonweb/src/lib/data/training/training.schema.jsonweb/src/lib/data/tools.schema.jsonweb/src/lib/data/testimonials.schema.json
web/src/lib/data/api/schemas/events-api.schema.jsonweb/src/lib/data/api/schemas/campaigns-api.schema.jsonweb/src/lib/data/api/schemas/enums-api.schema.jsonweb/src/lib/data/api/schemas/catalog-api.schema.jsonweb/src/lib/data/api/schemas/training-api.schema.jsonweb/src/lib/data/api/schemas/tools-api.schema.jsonweb/src/lib/data/api/schemas/testimonials-api.schema.json
web/src/lib/data/events/events.jsonweb/src/lib/data/campaigns.jsonweb/src/lib/data/catalog.jsonweb/src/lib/data/training/training.jsonweb/src/lib/data/tools.jsonweb/src/lib/data/testimonials.json
web/src/lib/data/api/events.tsweb/src/lib/data/api/campaigns.tsweb/src/lib/data/api/enums.tsweb/src/lib/data/api/catalog.tsweb/src/lib/data/api/training.tsweb/src/lib/data/api/tools.tsweb/src/lib/data/api/testimonials.ts
web/src/lib/view-models/events.tsweb/src/lib/view-models/campaigns.ts
Run these before merge:
npm --prefix web run validate:eventsnpm --prefix web run validate:campaignsnpm --prefix web run validate:registriesnpm --prefix web run validate:trainingnpm --prefix web run validate:apinpm --prefix web run validate:schema-governancenpm --prefix web run validate:ui-adapters
When changing schema/data contracts:
- Update registry schema(s)
- Update registry JSON (if needed)
- Update API schema(s)
- Update API payload builder(s)
- Update affected API route handler(s)
- Update UI adapters
- Update relevant SOP page(s) under
/admin/sop* - Run validation gates (including registry, API, governance, and UI adapter validation)
- Add new field
rainyDays: add to schema first, then data/builders/adapters/UI. - Rename
publicLabeltolabel: update schema first, then refactor all code paths and UI adapters. - Remove
cta: remove from schema first, then remove or redesign all dependent UI/logic.