EcoWorld Academy -> ZAYAZ Evidence Integration
Decision
The existing Academy schema is sufficient to begin evidence integration without hard-coding Academy tables into the Evidence Context Resolver.
The resolver should consume Academy data through SSSR/CMID mappings exactly like any other ZAYAZ domain.
Evidence semantics added
training_coverage_percentageesg_training_coverageanti_corruption_training_coveragetraining_competency_assessmenttraining_certification
Existing evidence types such as training_completion, health_safety_training, employee_training_hours, anti_bribery_training, and ethics_training remain reusable.
Canonical training dimensions
| dimension_key | class | purpose |
|---|---|---|
reporting_period | time | period used for training/compliance measurement |
organizational_unit | organizational | business unit, department, subsidiary, function |
workforce_category | workforce | employees, contractors, managers, functions-at-risk, etc. |
course | learning | qualifying course/course set |
training_topic | learning | ESG, anti-corruption, ethics, safety, cybersecurity, etc. |
jurisdiction | jurisdiction | legal/geographic scope where relevant |
Tenant/E-C-O identity is intentionally not an evidence dimension. Authorization establishes the effective client scope before evidence resolution.
Existing Academy tables and evidence roles
Learner / organization identity
academy.usersacademy.user_profilesacademy.academy_company_seat_assignments
Course qualification and taxonomy
academy.coursesacademy.course_modulesacademy.modulesacademy.content_registry
Completion evidence
academy.module_progressacademy.certificatesacademy.learning_signal_events(supporting telemetry)
Competency evidence
academy.quiz_attemptsacademy.quiz_attempt_answersacademy.workbook_responsesacademy.certificates
Certification evidence
academy.certificates
Access / assignment context
academy.entitlementsacademy.academy_company_seat_assignmentsacademy.academy_client_tiers
Audit/support context
academy.consent_records- Academy feedback and telemetry tables where relevant
Important boundary: denominator population
Academy activity is excellent evidence for the numerator of training-coverage metrics: who completed qualifying training.
It is not automatically the authoritative denominator for regulatory percentages. The denominator may be:
- total employees,
- functions-at-risk,
- managers,
- employees in selected jurisdictions,
- workers for whom the training is relevant,
- or another governed workforce population.
That population should come from the authoritative ZAYAZ workforce/HR source via SSSR and be combined by a governed calculation. academy_company_seat_assignments may be useful context, but seat assignment is not assumed to equal regulatory workforce eligibility.
Course qualification
A course should not count toward an evidence type merely because its title contains a keyword.
The Evidence Admin UI should approve which Academy course/course versions qualify for each evidence type. The approved qualification can be represented by source-binding applicability/resolution metadata and the course / training_topic dimensions.
academy.content_registry remains valuable as semantic input for the Admin UI (frameworks, concepts, operational contexts), but legal/compliance qualification should be explicitly approved in the Evidence Registry.
Recommended normalized read model (optional, not required for v1)
The current tables are sufficient to start. If completion queries become repetitive, create a governed read model rather than a new source of truth, for example:
academy.v_training_evidence_fact
It could normalize:
- learner ID,
- course ID/version,
- training topic,
- completion status,
- completion timestamp,
- pass/fail,
- score,
- certificate ID/verification reference,
- organizational context,
- provenance/source event.
The view should be built only after the actual Academy column contracts are inspected. It should not duplicate mutable learning state into an unnecessary new operational table.
APPENDIX - Training Evidence Deepdive
There are really three different questions hiding inside a statement like:
87% of relevant employees completed anti-corruption training.
1. Who was supposed to be trained?
This is the eligible population.
Not necessarily:
number of Academy users
and not necessarily:
number of seats assigned
It should come from the authoritative HR/workforce system using whatever eligibility rule applies:
Employment during reporting period
+
applicable employee category
+
role/function
+
jurisdiction
+
training requirement
=
eligible training population
2. Did the organization actually assign/invite them?
This is the training deployment/control test.
Eligible population
↓
Should have been invited
↓
Actually invited/assigned
That produces a separate KPI:
training_invitation_coverage
=
eligible people invited
────────────────────────
eligible population
That is extremely valuable evidence.
3. Did they complete it?
Then:
training_completion_coverage
=
eligible people completing qualifying training
──────────────────────────────────────────────
eligible population
Leavers/new hires can be handled properly instead of disappearing from the calculation.
4. The Training Compliance Cohort
For a reporting period:
FY2026
│
▼
Eligible workforce cohort
│
┌────────────┼──────────────┐
│ │ │
▼ ▼ ▼
opening staff new starters leavers
│ │ │
└────────────┼──────────────┘
▼
Required to be trained
│
┌────────┴────────┐
▼ ▼
invited not invited
│
┌─────┼──────┐
▼ ▼ ▼
completed active left-before-
completion
That gives us much better evidence than a single percentage.
For each person, conceptually we want to know:
person
employment_start
employment_end
eligibility_start
eligibility_end
training_required
training_requirement_reason
invited
invited_at
invitation_source
due_date
started
started_at
completed
completed_at
certificate
employment_status_at_due_date
exception_reason
Not all of these fields have to live in Academy.
5. Proper system ownership
HR / Workforce
────────────────────────
employment_start
employment_end
employment_status
organizational_unit
workforce_category
role/function
jurisdiction
Evidence / compliance logic
────────────────────────────
training eligibility
required course/topic
eligibility period
deadline
exception logic
Academy
────────────────────────
invitation / assignment
course access
course start
progress
completion
assessment
certificate
The Evidence Resolver combines them.
6. Reserving History
The academy.learning_assignment_events table gives us to possibility to see:
2026-01-04 eligible
2026-01-05 assigned
2026-01-05 invited
2026-01-20 reminded
2026-02-02 started
2026-02-07 completed
That is audit-grade.
7. New hires and leavers
Imagine:
Opening workforce 500
New hires during year 75
Leavers during year 60
A simple:
completed / average headcount
can obscure whether the training control actually worked.
Instead, the evidence layer could expose several related measures:
Eligible during reporting period 540
Invited 532
Not invited 8
Completed 490
In progress at period end 18
Left employment before completion 14
Still employed but overdue 8
Waived / documented exception 10
Now management—and an auditor—can understand what happened.
And we can derive:
Invitation coverage
532 / 540 = 98.5%
Completion coverage
490 / 540 = 90.7%
Completion among invited
490 / 532 = 92.1%
Unaddressed compliance gap
8 eligible people never invited
The exact regulatory KPI can use whatever denominator the applicable standard requires, while ZAYAZ still preserves the full underlying control story.
That's the important part.
8. New hires should create a control test
Example:
Did the new employees get an invitation to take the course—was it part of onboarding?
is particularly useful.
We create evidence semantics for this.
training_eligible_population
training_invitation_record
training_invitation_coverage
new_hire_training_invitation_coverage
training_completion
training_completion_coverage
training_noncompletion_reason
training_compliance_cohort
Then:
new_hire_training_invitation_coverage
can ask:
Employees joining during period
who are subject to training
│
▼
Were they assigned the qualifying course
within required onboarding window?
That turns Academy into evidence not only that people learned something, but that an organizational control operated effectively.
That's materially more valuable.
9. The Evidence Resolver Resolve This:
For:
anti_corruption_training_coverage
the resolver might ultimately resolve:
anti_corruption_training_coverage
│
resolution = calculation
│
┌───────┴─────────┐
▼ ▼
training_compliance_ qualifying training
cohort completion evidence
│ │
▼ ▼
HR/workforce Academy
│ │
└────────┬────────┘
▼
governed calculation
│
▼
reported percentage
And an auditor clicking:
<AuditEvidenceLink evidence="anti_corruption_training" />
could see something like:
Anti-Corruption Training — FY2026
──────────────────────────────────────────
Eligible workforce 540
Invited 532
Completed 490
Left before completion 14
Overdue 8
Documented exemptions 10
Invitation coverage 98.5%
Completion coverage 90.7%
New hires subject to training 75
New hires invited 74
New-hire invitation coverage 98.7%
Supporting evidence
✓ HR population
✓ Academy assignments
✓ Academy invitation events
✓ Completion records
✓ Certificates
✓ Course qualification