@learncard/credential-library 2.0.4 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -1
- package/SOURCES.md +63 -0
- package/dist/bundles/index.d.ts +5 -0
- package/dist/bundles/index.d.ts.map +1 -0
- package/dist/bundles/student.d.ts +3 -0
- package/dist/bundles/student.d.ts.map +1 -0
- package/dist/bundles/types.d.ts +24 -0
- package/dist/bundles/types.d.ts.map +1 -0
- package/dist/credential-library.cjs.development.js +12244 -713
- package/dist/credential-library.cjs.development.js.map +4 -4
- package/dist/credential-library.cjs.production.min.js +11 -1
- package/dist/credential-library.cjs.production.min.js.map +4 -4
- package/dist/credential-library.esm.js +12242 -709
- package/dist/credential-library.esm.js.map +4 -4
- package/dist/fixtures/clr/achievement-id-associations.d.ts +3 -0
- package/dist/fixtures/clr/achievement-id-associations.d.ts.map +1 -0
- package/dist/fixtures/clr/employment-record.d.ts +8 -0
- package/dist/fixtures/clr/employment-record.d.ts.map +1 -0
- package/dist/fixtures/clr/licensing-regulatory-record.d.ts +8 -0
- package/dist/fixtures/clr/licensing-regulatory-record.d.ts.map +1 -0
- package/dist/fixtures/clr/military-training-record.d.ts +8 -0
- package/dist/fixtures/clr/military-training-record.d.ts.map +1 -0
- package/dist/fixtures/clr/mixed-career-record.d.ts +8 -0
- package/dist/fixtures/clr/mixed-career-record.d.ts.map +1 -0
- package/dist/fixtures/clr/mixed-role-portfolio.d.ts +3 -0
- package/dist/fixtures/clr/mixed-role-portfolio.d.ts.map +1 -0
- package/dist/fixtures/clr/professional-organization-record.d.ts +8 -0
- package/dist/fixtures/clr/professional-organization-record.d.ts.map +1 -0
- package/dist/fixtures/clr/student-official-academic-transcript.d.ts +3 -0
- package/dist/fixtures/clr/student-official-academic-transcript.d.ts.map +1 -0
- package/dist/fixtures/clr/training-provider-record.d.ts +8 -0
- package/dist/fixtures/clr/training-provider-record.d.ts.map +1 -0
- package/dist/fixtures/custom/course-enrollment.d.ts +3 -0
- package/dist/fixtures/custom/course-enrollment.d.ts.map +1 -0
- package/dist/fixtures/custom/exam-accommodation.d.ts +3 -0
- package/dist/fixtures/custom/exam-accommodation.d.ts.map +1 -0
- package/dist/fixtures/index.d.ts +25 -1
- package/dist/fixtures/index.d.ts.map +1 -1
- package/dist/fixtures/obv3/food-allergen-facilitator.d.ts +3 -0
- package/dist/fixtures/obv3/food-allergen-facilitator.d.ts.map +1 -0
- package/dist/fixtures/obv3/food-allergen-practice-fr.d.ts +3 -0
- package/dist/fixtures/obv3/food-allergen-practice-fr.d.ts.map +1 -0
- package/dist/fixtures/obv3/food-allergen-practice.d.ts +3 -0
- package/dist/fixtures/obv3/food-allergen-practice.d.ts.map +1 -0
- package/dist/fixtures/obv3/phishing-transfer.d.ts +3 -0
- package/dist/fixtures/obv3/phishing-transfer.d.ts.map +1 -0
- package/dist/fixtures/obv3/qualification-apprenticeship.d.ts +3 -0
- package/dist/fixtures/obv3/qualification-apprenticeship.d.ts.map +1 -0
- package/dist/fixtures/obv3/qualification-badge-override.d.ts +3 -0
- package/dist/fixtures/obv3/qualification-badge-override.d.ts.map +1 -0
- package/dist/fixtures/obv3/qualification-certification.d.ts +3 -0
- package/dist/fixtures/obv3/qualification-certification.d.ts.map +1 -0
- package/dist/fixtures/obv3/qualification-expired.d.ts +3 -0
- package/dist/fixtures/obv3/qualification-expired.d.ts.map +1 -0
- package/dist/fixtures/obv3/qualification-journeyman.d.ts +3 -0
- package/dist/fixtures/obv3/qualification-journeyman.d.ts.map +1 -0
- package/dist/fixtures/obv3/qualification-license.d.ts +3 -0
- package/dist/fixtures/obv3/qualification-license.d.ts.map +1 -0
- package/dist/fixtures/obv3/qualification-master.d.ts +3 -0
- package/dist/fixtures/obv3/qualification-master.d.ts.map +1 -0
- package/dist/fixtures/obv3/student-additional-credentials.d.ts +3 -0
- package/dist/fixtures/obv3/student-additional-credentials.d.ts.map +1 -0
- package/dist/fixtures/obv3/student-sample-badges.d.ts +586 -0
- package/dist/fixtures/obv3/student-sample-badges.d.ts.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/prepare.d.ts.map +1 -1
- package/package.json +8 -7
- package/src/__tests__/bundles.test.ts +234 -0
- package/src/__tests__/clr-non-academic.test.ts +220 -0
- package/src/__tests__/curated-examples.test.ts +248 -0
- package/src/__tests__/issuance.test.ts +35 -0
- package/src/__tests__/registry.test.ts +31 -0
- package/src/bundles/index.ts +19 -0
- package/src/bundles/student.ts +251 -0
- package/src/bundles/types.ts +25 -0
- package/src/fixtures/clr/README.md +142 -0
- package/src/fixtures/clr/achievement-id-associations.ts +342 -0
- package/src/fixtures/clr/employment-record.ts +487 -0
- package/src/fixtures/clr/licensing-regulatory-record.ts +388 -0
- package/src/fixtures/clr/military-training-record.ts +468 -0
- package/src/fixtures/clr/mixed-career-record.ts +814 -0
- package/src/fixtures/clr/mixed-role-portfolio.ts +490 -0
- package/src/fixtures/clr/professional-organization-record.ts +403 -0
- package/src/fixtures/clr/student-official-academic-transcript.ts +3202 -0
- package/src/fixtures/clr/training-provider-record.ts +510 -0
- package/src/fixtures/custom/course-enrollment.ts +56 -0
- package/src/fixtures/custom/exam-accommodation.ts +56 -0
- package/src/fixtures/index.ts +87 -0
- package/src/fixtures/obv3/food-allergen-facilitator.ts +108 -0
- package/src/fixtures/obv3/food-allergen-practice-fr.ts +107 -0
- package/src/fixtures/obv3/food-allergen-practice.ts +105 -0
- package/src/fixtures/obv3/phishing-transfer.ts +163 -0
- package/src/fixtures/obv3/qualification-apprenticeship.ts +58 -0
- package/src/fixtures/obv3/qualification-badge-override.ts +64 -0
- package/src/fixtures/obv3/qualification-certification.ts +59 -0
- package/src/fixtures/obv3/qualification-expired.ts +59 -0
- package/src/fixtures/obv3/qualification-journeyman.ts +58 -0
- package/src/fixtures/obv3/qualification-license.ts +58 -0
- package/src/fixtures/obv3/qualification-master.ts +58 -0
- package/src/fixtures/obv3/student-additional-credentials.ts +3912 -0
- package/src/fixtures/obv3/student-sample-badges.ts +424 -0
- package/src/index.ts +2 -0
- package/src/prepare.ts +55 -11
- package/dist/__tests__/docs-json.test.d.ts +0 -2
- package/dist/__tests__/docs-json.test.d.ts.map +0 -1
- package/dist/__tests__/issuance.test.d.ts +0 -2
- package/dist/__tests__/issuance.test.d.ts.map +0 -1
- package/dist/__tests__/registry.test.d.ts +0 -2
- package/dist/__tests__/registry.test.d.ts.map +0 -1
- package/dist/__tests__/sd-jwt-vc.test.d.ts +0 -2
- package/dist/__tests__/sd-jwt-vc.test.d.ts.map +0 -1
package/src/fixtures/index.ts
CHANGED
|
@@ -23,12 +23,33 @@ import { obv3CourseCompletion } from './obv3/course-completion';
|
|
|
23
23
|
import { obv3StandaloneFullCourse } from './obv3/standalone-full-course';
|
|
24
24
|
import { obv3K12Diploma } from './obv3/k12-diploma';
|
|
25
25
|
import { obv3EndorsementCredential } from './obv3/endorsement';
|
|
26
|
+
import {
|
|
27
|
+
obv3StudentAfterschoolProgramMentor,
|
|
28
|
+
obv3StudentEnvironmentBadge,
|
|
29
|
+
obv3StudentRockClimbingMentor,
|
|
30
|
+
obv3StudentParkCleanupHelper,
|
|
31
|
+
} from './obv3/student-sample-badges';
|
|
32
|
+
import { obv3StudentAdditionalCredentials } from './obv3/student-additional-credentials';
|
|
26
33
|
import { obv3RubricAlignedBadge } from './obv3/rubric-aligned-badge';
|
|
34
|
+
import { obv3QualificationLicense } from './obv3/qualification-license';
|
|
35
|
+
import { obv3QualificationCertification } from './obv3/qualification-certification';
|
|
36
|
+
import { obv3QualificationApprenticeship } from './obv3/qualification-apprenticeship';
|
|
37
|
+
import { obv3QualificationJourneyman } from './obv3/qualification-journeyman';
|
|
38
|
+
import { obv3QualificationMaster } from './obv3/qualification-master';
|
|
39
|
+
import { obv3QualificationExpired } from './obv3/qualification-expired';
|
|
40
|
+
import { obv3QualificationBadgeOverride } from './obv3/qualification-badge-override';
|
|
27
41
|
|
|
28
42
|
// CLR v2
|
|
29
43
|
import { clrMinimal } from './clr/minimal';
|
|
30
44
|
import { clrMultiAchievement } from './clr/multi-achievement';
|
|
31
45
|
import { clrUniversityTranscript } from './clr/university-transcript';
|
|
46
|
+
import { clrStudentOfficialAcademicTranscript } from './clr/student-official-academic-transcript';
|
|
47
|
+
import { clrEmploymentRecord } from './clr/employment-record';
|
|
48
|
+
import { clrTrainingProviderRecord } from './clr/training-provider-record';
|
|
49
|
+
import { clrMilitaryTrainingRecord } from './clr/military-training-record';
|
|
50
|
+
import { clrProfessionalOrganizationRecord } from './clr/professional-organization-record';
|
|
51
|
+
import { clrLicensingRegulatoryRecord } from './clr/licensing-regulatory-record';
|
|
52
|
+
import { clrMixedCareerRecord } from './clr/mixed-career-record';
|
|
32
53
|
|
|
33
54
|
// LearnCard Boosts
|
|
34
55
|
import { boostBasic } from './boost/basic';
|
|
@@ -57,6 +78,7 @@ import { vcV2LicenseCredential } from './vc-v2/license-credential';
|
|
|
57
78
|
import { clrGreatPlainsFull } from './clr/great-plains-full';
|
|
58
79
|
import { clrWestbridgeFull } from './clr/westbridge-full';
|
|
59
80
|
import { clrCompetencyAligned } from './clr/competency-aligned';
|
|
81
|
+
import { clrAchievementIdAssociations } from './clr/achievement-id-associations';
|
|
60
82
|
import {
|
|
61
83
|
clrProvisionalTranscript,
|
|
62
84
|
buildFinalTranscriptVariant,
|
|
@@ -64,6 +86,15 @@ import {
|
|
|
64
86
|
} from './clr/provisional-transcript';
|
|
65
87
|
import { clrDemoIsdDiplomaAssessments } from './clr/demo-isd-diploma-assessments';
|
|
66
88
|
|
|
89
|
+
// Curated practice, role, language, and administrative examples
|
|
90
|
+
import { obv3FoodAllergenPractice } from './obv3/food-allergen-practice';
|
|
91
|
+
import { obv3FoodAllergenFacilitator } from './obv3/food-allergen-facilitator';
|
|
92
|
+
import { obv3FoodAllergenPracticeFr } from './obv3/food-allergen-practice-fr';
|
|
93
|
+
import { obv3PhishingTransfer } from './obv3/phishing-transfer';
|
|
94
|
+
import { customCourseEnrollment } from './custom/course-enrollment';
|
|
95
|
+
import { customExamAccommodation } from './custom/exam-accommodation';
|
|
96
|
+
import { clrMixedRolePortfolio } from './clr/mixed-role-portfolio';
|
|
97
|
+
|
|
67
98
|
// SD-JWT VC
|
|
68
99
|
import { sdJwtVcCourseCompletion } from './sd-jwt-vc/course-completion';
|
|
69
100
|
|
|
@@ -90,17 +121,36 @@ export const ALL_FIXTURES: LibraryFixture[] = [
|
|
|
90
121
|
obv3PlugfestJff2,
|
|
91
122
|
obv3OneedtechFull,
|
|
92
123
|
obv3ProfessionalCert,
|
|
124
|
+
obv3QualificationLicense,
|
|
125
|
+
obv3QualificationCertification,
|
|
126
|
+
obv3QualificationApprenticeship,
|
|
127
|
+
obv3QualificationJourneyman,
|
|
128
|
+
obv3QualificationMaster,
|
|
129
|
+
obv3QualificationExpired,
|
|
130
|
+
obv3QualificationBadgeOverride,
|
|
93
131
|
obv3MicroCredential,
|
|
94
132
|
obv3CourseCompletion,
|
|
95
133
|
obv3StandaloneFullCourse,
|
|
96
134
|
obv3K12Diploma,
|
|
97
135
|
obv3EndorsementCredential,
|
|
136
|
+
obv3StudentAfterschoolProgramMentor,
|
|
137
|
+
obv3StudentEnvironmentBadge,
|
|
138
|
+
obv3StudentRockClimbingMentor,
|
|
139
|
+
obv3StudentParkCleanupHelper,
|
|
140
|
+
...obv3StudentAdditionalCredentials,
|
|
98
141
|
obv3RubricAlignedBadge,
|
|
99
142
|
|
|
100
143
|
// CLR v2
|
|
101
144
|
clrMinimal,
|
|
102
145
|
clrMultiAchievement,
|
|
103
146
|
clrUniversityTranscript,
|
|
147
|
+
clrStudentOfficialAcademicTranscript,
|
|
148
|
+
clrEmploymentRecord,
|
|
149
|
+
clrTrainingProviderRecord,
|
|
150
|
+
clrMilitaryTrainingRecord,
|
|
151
|
+
clrProfessionalOrganizationRecord,
|
|
152
|
+
clrLicensingRegulatoryRecord,
|
|
153
|
+
clrMixedCareerRecord,
|
|
104
154
|
|
|
105
155
|
// Boosts
|
|
106
156
|
boostBasic,
|
|
@@ -127,9 +177,19 @@ export const ALL_FIXTURES: LibraryFixture[] = [
|
|
|
127
177
|
clrGreatPlainsFull,
|
|
128
178
|
clrWestbridgeFull,
|
|
129
179
|
clrCompetencyAligned,
|
|
180
|
+
clrAchievementIdAssociations,
|
|
130
181
|
clrProvisionalTranscript,
|
|
131
182
|
clrDemoIsdDiplomaAssessments,
|
|
132
183
|
|
|
184
|
+
// Curated examples
|
|
185
|
+
obv3FoodAllergenPractice,
|
|
186
|
+
obv3FoodAllergenFacilitator,
|
|
187
|
+
obv3FoodAllergenPracticeFr,
|
|
188
|
+
obv3PhishingTransfer,
|
|
189
|
+
customCourseEnrollment,
|
|
190
|
+
customExamAccommodation,
|
|
191
|
+
clrMixedRolePortfolio,
|
|
192
|
+
|
|
133
193
|
// SD-JWT VC
|
|
134
194
|
sdJwtVcCourseCompletion,
|
|
135
195
|
];
|
|
@@ -158,13 +218,32 @@ export {
|
|
|
158
218
|
clrNdStudentTranscript,
|
|
159
219
|
obv3OneedtechFull,
|
|
160
220
|
obv3ProfessionalCert,
|
|
221
|
+
obv3QualificationLicense,
|
|
222
|
+
obv3QualificationCertification,
|
|
223
|
+
obv3QualificationApprenticeship,
|
|
224
|
+
obv3QualificationJourneyman,
|
|
225
|
+
obv3QualificationMaster,
|
|
226
|
+
obv3QualificationExpired,
|
|
227
|
+
obv3QualificationBadgeOverride,
|
|
161
228
|
obv3MicroCredential,
|
|
162
229
|
obv3CourseCompletion,
|
|
163
230
|
obv3StandaloneFullCourse,
|
|
164
231
|
obv3K12Diploma,
|
|
165
232
|
obv3EndorsementCredential,
|
|
233
|
+
obv3StudentAfterschoolProgramMentor,
|
|
234
|
+
obv3StudentEnvironmentBadge,
|
|
235
|
+
obv3StudentRockClimbingMentor,
|
|
236
|
+
obv3StudentParkCleanupHelper,
|
|
237
|
+
obv3StudentAdditionalCredentials,
|
|
166
238
|
obv3RubricAlignedBadge,
|
|
167
239
|
clrUniversityTranscript,
|
|
240
|
+
clrStudentOfficialAcademicTranscript,
|
|
241
|
+
clrEmploymentRecord,
|
|
242
|
+
clrTrainingProviderRecord,
|
|
243
|
+
clrMilitaryTrainingRecord,
|
|
244
|
+
clrProfessionalOrganizationRecord,
|
|
245
|
+
clrLicensingRegulatoryRecord,
|
|
246
|
+
clrMixedCareerRecord,
|
|
168
247
|
boostCommunityAward,
|
|
169
248
|
boostDelegate,
|
|
170
249
|
vcV1AlumniCredential,
|
|
@@ -176,9 +255,17 @@ export {
|
|
|
176
255
|
clrGreatPlainsFull,
|
|
177
256
|
clrWestbridgeFull,
|
|
178
257
|
clrCompetencyAligned,
|
|
258
|
+
clrAchievementIdAssociations,
|
|
179
259
|
clrProvisionalTranscript,
|
|
180
260
|
buildFinalTranscriptVariant,
|
|
181
261
|
REFRESH_SERVICE_INLINE_CONTEXT,
|
|
182
262
|
clrDemoIsdDiplomaAssessments,
|
|
263
|
+
obv3FoodAllergenPractice,
|
|
264
|
+
obv3FoodAllergenFacilitator,
|
|
265
|
+
obv3FoodAllergenPracticeFr,
|
|
266
|
+
obv3PhishingTransfer,
|
|
267
|
+
customCourseEnrollment,
|
|
268
|
+
customExamAccommodation,
|
|
269
|
+
clrMixedRolePortfolio,
|
|
183
270
|
sdJwtVcCourseCompletion,
|
|
184
271
|
};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { UnsignedAchievementCredentialValidator } from '@learncard/types';
|
|
2
|
+
|
|
3
|
+
import type { CredentialFixture } from '../../types';
|
|
4
|
+
|
|
5
|
+
// Example corpus provenance and alignment attribution: ../../../SOURCES.md.
|
|
6
|
+
export const obv3FoodAllergenFacilitator: CredentialFixture = {
|
|
7
|
+
id: 'obv3/food-allergen-facilitator',
|
|
8
|
+
name: 'Food Allergen Control Facilitation',
|
|
9
|
+
description:
|
|
10
|
+
'Matched teaching-performance assessment with an instructor role and O*NET Instructing alignment.',
|
|
11
|
+
spec: 'obv3',
|
|
12
|
+
profile: 'generic',
|
|
13
|
+
features: ['evidence', 'alignment', 'results', 'expiration'],
|
|
14
|
+
source: 'synthetic',
|
|
15
|
+
signed: false,
|
|
16
|
+
validity: 'valid',
|
|
17
|
+
validator: UnsignedAchievementCredentialValidator,
|
|
18
|
+
tags: ['food-safety', 'instructor', 'role-scope'],
|
|
19
|
+
|
|
20
|
+
credential: {
|
|
21
|
+
'@context': [
|
|
22
|
+
'https://www.w3.org/ns/credentials/v2',
|
|
23
|
+
'https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json',
|
|
24
|
+
],
|
|
25
|
+
id: 'urn:uuid:04adda59-747f-5d5b-b287-1a9b1943b2ba',
|
|
26
|
+
type: ['VerifiableCredential', 'OpenBadgeCredential'],
|
|
27
|
+
name: 'Teaching Food allergen control — facilitator performance',
|
|
28
|
+
description:
|
|
29
|
+
'Train a simulated food-preparation team on cross-contact communication in a fictional order. Assesses teaching performance; independent learner skill is outside this assessment.',
|
|
30
|
+
issuer: {
|
|
31
|
+
id: 'did:example:lc2184-cedar-training',
|
|
32
|
+
type: ['Profile'],
|
|
33
|
+
name: 'Cedar Technical Training',
|
|
34
|
+
url: 'https://cedar-training.example',
|
|
35
|
+
},
|
|
36
|
+
validFrom: '2026-09-01T00:00:00Z',
|
|
37
|
+
validUntil: '2028-09-01T00:00:00Z',
|
|
38
|
+
credentialSubject: {
|
|
39
|
+
id: 'https://fixtures.example.org/frenchfry/personas/d56d0c592ac6',
|
|
40
|
+
type: ['AchievementSubject'],
|
|
41
|
+
achievement: {
|
|
42
|
+
id: 'https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/facilitator',
|
|
43
|
+
type: ['Achievement'],
|
|
44
|
+
achievementType: 'Assessment',
|
|
45
|
+
name: 'Teaching Food allergen control — facilitator performance',
|
|
46
|
+
description:
|
|
47
|
+
'Train a simulated food-preparation team on cross-contact communication in a fictional order. Assesses teaching performance; independent learner skill is outside this assessment.',
|
|
48
|
+
criteria: {
|
|
49
|
+
narrative:
|
|
50
|
+
'Use a shared-tool counterexample and observe whether the team escalates uncertainty without making medical claims.',
|
|
51
|
+
},
|
|
52
|
+
fieldOfStudy: 'vocational',
|
|
53
|
+
inLanguage: 'en',
|
|
54
|
+
tag: ['vocational', 'Food allergen control', 'instructor'],
|
|
55
|
+
resultDescription: [
|
|
56
|
+
{
|
|
57
|
+
id: 'https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/facilitator/rubric',
|
|
58
|
+
type: ['ResultDescription'],
|
|
59
|
+
name: 'Instruction performance',
|
|
60
|
+
resultType: 'PerformanceLevel',
|
|
61
|
+
allowedValue: ['Developing', 'Proficient', 'Advanced'],
|
|
62
|
+
requiredValue: 'Proficient',
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
alignment: [
|
|
66
|
+
{
|
|
67
|
+
type: ['Alignment'],
|
|
68
|
+
targetName: 'Instructing',
|
|
69
|
+
targetUrl:
|
|
70
|
+
'https://www.onetcenter.org/ctdlasn/resources/ce-07c266f7-9119-11e8-b852-782bcb5df6ac',
|
|
71
|
+
targetFramework:
|
|
72
|
+
'O*NET Content Model Worker Requirements - Transferable Skills: U.S. Department of Labor (DOL)',
|
|
73
|
+
targetDescription: 'Teaching others how to do something.',
|
|
74
|
+
targetType: 'ceasn:Competency',
|
|
75
|
+
targetCode: '2.B.1.e',
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
role: 'instructor',
|
|
80
|
+
narrative:
|
|
81
|
+
'Assesses teaching performance; independent learner skill is outside this assessment.',
|
|
82
|
+
activityStartDate: '2026-08-01T00:00:00Z',
|
|
83
|
+
activityEndDate: '2026-08-31T00:00:00Z',
|
|
84
|
+
result: [
|
|
85
|
+
{
|
|
86
|
+
type: ['Result'],
|
|
87
|
+
resultDescription:
|
|
88
|
+
'https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/facilitator/rubric',
|
|
89
|
+
value: 'Proficient',
|
|
90
|
+
status: 'Completed',
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
evidence: [
|
|
95
|
+
{
|
|
96
|
+
id: 'https://fixtures.example.org/frenchfry/evidence/d56d0c592ac6/facilitator',
|
|
97
|
+
type: ['Evidence'],
|
|
98
|
+
name: 'Cross-contact training tabletop and communication rubric',
|
|
99
|
+
description:
|
|
100
|
+
'Train a simulated food-preparation team on cross-contact communication in a fictional order; evaluation considered: Use a shared-tool counterexample and observe whether the team escalates uncertainty without making medical claims.',
|
|
101
|
+
narrative:
|
|
102
|
+
'Train a simulated food-preparation team on cross-contact communication in a fictional order; evaluation considered: Use a shared-tool counterexample and observe whether the team escalates uncertainty without making medical claims.',
|
|
103
|
+
genre: 'Portfolio',
|
|
104
|
+
audience: 'Assessors',
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
},
|
|
108
|
+
};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { UnsignedAchievementCredentialValidator } from '@learncard/types';
|
|
2
|
+
|
|
3
|
+
import type { CredentialFixture } from '../../types';
|
|
4
|
+
|
|
5
|
+
// Example corpus provenance and alignment attribution: ../../../SOURCES.md.
|
|
6
|
+
export const obv3FoodAllergenPracticeFr: CredentialFixture = {
|
|
7
|
+
id: 'obv3/food-allergen-practice-fr',
|
|
8
|
+
name: 'Prévention des contacts croisés avec des allergènes',
|
|
9
|
+
description:
|
|
10
|
+
'French counterpart of the food-allergen practice assessment, retaining its RubricScore and alignment.',
|
|
11
|
+
spec: 'obv3',
|
|
12
|
+
profile: 'generic',
|
|
13
|
+
features: ['evidence', 'alignment', 'results', 'expiration'],
|
|
14
|
+
source: 'synthetic',
|
|
15
|
+
signed: false,
|
|
16
|
+
validity: 'valid',
|
|
17
|
+
validator: UnsignedAchievementCredentialValidator,
|
|
18
|
+
tags: ['food-safety', 'rubric-score', 'french', 'localization', 'learner'],
|
|
19
|
+
|
|
20
|
+
credential: {
|
|
21
|
+
'@context': [
|
|
22
|
+
'https://www.w3.org/ns/credentials/v2',
|
|
23
|
+
'https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json',
|
|
24
|
+
],
|
|
25
|
+
id: 'urn:uuid:14adf3a3-43d2-5271-90be-9812f906deef',
|
|
26
|
+
type: ['VerifiableCredential', 'OpenBadgeCredential'],
|
|
27
|
+
name: 'Prévention des contacts croisés avec des allergènes',
|
|
28
|
+
description:
|
|
29
|
+
"Évaluation d'un exercice de prévention des contacts croisés avec des allergènes.",
|
|
30
|
+
issuer: {
|
|
31
|
+
id: 'did:example:lc2184-cedar-training',
|
|
32
|
+
type: ['Profile'],
|
|
33
|
+
name: 'Cedar Technical Training',
|
|
34
|
+
url: 'https://cedar-training.example',
|
|
35
|
+
},
|
|
36
|
+
validFrom: '2026-09-01T00:00:00Z',
|
|
37
|
+
validUntil: '2028-09-01T00:00:00Z',
|
|
38
|
+
credentialSubject: {
|
|
39
|
+
id: 'https://fixtures.example.org/frenchfry/personas/d56d0c592ac6',
|
|
40
|
+
type: ['AchievementSubject'],
|
|
41
|
+
achievement: {
|
|
42
|
+
id: 'https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/practice/fr',
|
|
43
|
+
type: ['Achievement'],
|
|
44
|
+
achievementType: 'Assessment',
|
|
45
|
+
name: 'Prévention des contacts croisés avec des allergènes',
|
|
46
|
+
description:
|
|
47
|
+
"Planifie la préparation d'une commande fictive dans un exercice de cuisine simulé.",
|
|
48
|
+
criteria: {
|
|
49
|
+
narrative:
|
|
50
|
+
'Repère les possibilités de contact croisé, précise les étapes de communication et signale les incertitudes sans faire de diagnostic médical.',
|
|
51
|
+
},
|
|
52
|
+
fieldOfStudy: 'vocational',
|
|
53
|
+
inLanguage: 'fr',
|
|
54
|
+
tag: ['vocational', 'Food allergen control', 'learner'],
|
|
55
|
+
resultDescription: [
|
|
56
|
+
{
|
|
57
|
+
id: 'https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/practice/fr/rubric',
|
|
58
|
+
type: ['ResultDescription'],
|
|
59
|
+
name: "Points de la grille d'observation",
|
|
60
|
+
resultType: 'RubricScore',
|
|
61
|
+
valueMin: '0',
|
|
62
|
+
valueMax: '4',
|
|
63
|
+
requiredValue: '3',
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
alignment: [
|
|
67
|
+
{
|
|
68
|
+
type: ['Alignment'],
|
|
69
|
+
targetName: 'food safety principles',
|
|
70
|
+
targetUrl:
|
|
71
|
+
'http://data.europa.eu/esco/skill/3f4e4eab-a8e0-4aed-b8bb-79afe7c890e3',
|
|
72
|
+
targetFramework: 'ESCO (requested dataset v1.2.0)',
|
|
73
|
+
targetDescription:
|
|
74
|
+
'Scientific background of food safety which includes preparation, handling, and storage of food to minimise the risk of foodborne illness and other health hazards.',
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
role: 'learner',
|
|
79
|
+
narrative:
|
|
80
|
+
"Planifie la préparation d'une commande fictive dans un exercice de cuisine simulé.",
|
|
81
|
+
activityStartDate: '2026-08-01T00:00:00Z',
|
|
82
|
+
activityEndDate: '2026-08-31T00:00:00Z',
|
|
83
|
+
result: [
|
|
84
|
+
{
|
|
85
|
+
type: ['Result'],
|
|
86
|
+
resultDescription:
|
|
87
|
+
'https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/practice/fr/rubric',
|
|
88
|
+
value: '4',
|
|
89
|
+
status: 'Completed',
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
evidence: [
|
|
94
|
+
{
|
|
95
|
+
id: 'https://fixtures.example.org/frenchfry/evidence/d56d0c592ac6/practice/fr',
|
|
96
|
+
type: ['Evidence'],
|
|
97
|
+
name: "Liste de contrôle et compte rendu d'un exercice de simulation",
|
|
98
|
+
description:
|
|
99
|
+
"Planifie la préparation d'une commande fictive dans un exercice de cuisine simulé.",
|
|
100
|
+
narrative:
|
|
101
|
+
"Planifie la préparation d'une commande fictive dans un exercice de cuisine simulé.",
|
|
102
|
+
genre: "Compte rendu d'observation",
|
|
103
|
+
audience: 'Évaluateurs',
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { UnsignedAchievementCredentialValidator } from '@learncard/types';
|
|
2
|
+
|
|
3
|
+
import type { CredentialFixture } from '../../types';
|
|
4
|
+
|
|
5
|
+
// Example corpus provenance and alignment attribution: ../../../SOURCES.md.
|
|
6
|
+
export const obv3FoodAllergenPractice: CredentialFixture = {
|
|
7
|
+
id: 'obv3/food-allergen-practice',
|
|
8
|
+
name: 'Food Allergen Control Practice',
|
|
9
|
+
description:
|
|
10
|
+
'Observed food-preparation practice with a RubricScore result, evidence, and ESCO alignment.',
|
|
11
|
+
spec: 'obv3',
|
|
12
|
+
profile: 'generic',
|
|
13
|
+
features: ['evidence', 'alignment', 'results', 'expiration'],
|
|
14
|
+
source: 'synthetic',
|
|
15
|
+
signed: false,
|
|
16
|
+
validity: 'valid',
|
|
17
|
+
validator: UnsignedAchievementCredentialValidator,
|
|
18
|
+
tags: ['food-safety', 'rubric-score', 'learner'],
|
|
19
|
+
|
|
20
|
+
credential: {
|
|
21
|
+
'@context': [
|
|
22
|
+
'https://www.w3.org/ns/credentials/v2',
|
|
23
|
+
'https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json',
|
|
24
|
+
],
|
|
25
|
+
id: 'urn:uuid:7cc497f9-092a-5ea2-8cdb-7a2e60c25e68',
|
|
26
|
+
type: ['VerifiableCredential', 'OpenBadgeCredential'],
|
|
27
|
+
name: 'Food allergen control — observed practice',
|
|
28
|
+
description:
|
|
29
|
+
'Plan preparation for a fictional allergen-sensitive order. Demonstrate a controlled practice task with observer feedback.',
|
|
30
|
+
issuer: {
|
|
31
|
+
id: 'did:example:lc2184-cedar-training',
|
|
32
|
+
type: ['Profile'],
|
|
33
|
+
name: 'Cedar Technical Training',
|
|
34
|
+
url: 'https://cedar-training.example',
|
|
35
|
+
},
|
|
36
|
+
validFrom: '2026-09-01T00:00:00Z',
|
|
37
|
+
validUntil: '2028-09-01T00:00:00Z',
|
|
38
|
+
credentialSubject: {
|
|
39
|
+
id: 'https://fixtures.example.org/frenchfry/personas/d56d0c592ac6',
|
|
40
|
+
type: ['AchievementSubject'],
|
|
41
|
+
achievement: {
|
|
42
|
+
id: 'https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/practice',
|
|
43
|
+
type: ['Achievement'],
|
|
44
|
+
achievementType: 'Assessment',
|
|
45
|
+
name: 'Food allergen control — observed practice',
|
|
46
|
+
description:
|
|
47
|
+
'Plan preparation for a fictional allergen-sensitive order. Demonstrate a controlled practice task with observer feedback.',
|
|
48
|
+
criteria: {
|
|
49
|
+
narrative: 'Identify cross-contact routes and communication steps',
|
|
50
|
+
},
|
|
51
|
+
fieldOfStudy: 'vocational',
|
|
52
|
+
inLanguage: 'en',
|
|
53
|
+
tag: ['vocational', 'Food allergen control', 'learner'],
|
|
54
|
+
resultDescription: [
|
|
55
|
+
{
|
|
56
|
+
id: 'https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/practice/rubric',
|
|
57
|
+
type: ['ResultDescription'],
|
|
58
|
+
name: 'Observed task rubric points',
|
|
59
|
+
resultType: 'RubricScore',
|
|
60
|
+
valueMin: '0',
|
|
61
|
+
valueMax: '4',
|
|
62
|
+
requiredValue: '3',
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
alignment: [
|
|
66
|
+
{
|
|
67
|
+
type: ['Alignment'],
|
|
68
|
+
targetName: 'food safety principles',
|
|
69
|
+
targetUrl:
|
|
70
|
+
'http://data.europa.eu/esco/skill/3f4e4eab-a8e0-4aed-b8bb-79afe7c890e3',
|
|
71
|
+
targetFramework: 'ESCO (requested dataset v1.2.0)',
|
|
72
|
+
targetDescription:
|
|
73
|
+
'Scientific background of food safety which includes preparation, handling, and storage of food to minimise the risk of foodborne illness and other health hazards.',
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
role: 'learner',
|
|
78
|
+
narrative: 'Demonstrate a controlled practice task with observer feedback.',
|
|
79
|
+
activityStartDate: '2026-08-01T00:00:00Z',
|
|
80
|
+
activityEndDate: '2026-08-31T00:00:00Z',
|
|
81
|
+
result: [
|
|
82
|
+
{
|
|
83
|
+
type: ['Result'],
|
|
84
|
+
resultDescription:
|
|
85
|
+
'https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/practice/rubric',
|
|
86
|
+
value: '4',
|
|
87
|
+
status: 'Completed',
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
evidence: [
|
|
92
|
+
{
|
|
93
|
+
id: 'https://fixtures.example.org/frenchfry/evidence/d56d0c592ac6/practice',
|
|
94
|
+
type: ['Evidence'],
|
|
95
|
+
name: 'Kitchen simulation checklist',
|
|
96
|
+
description:
|
|
97
|
+
'Plan preparation for a fictional allergen-sensitive order; evaluation considered: Identify cross-contact routes and communication steps',
|
|
98
|
+
narrative:
|
|
99
|
+
'Plan preparation for a fictional allergen-sensitive order; evaluation considered: Identify cross-contact routes and communication steps',
|
|
100
|
+
genre: 'Observation record',
|
|
101
|
+
audience: 'Assessors',
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
},
|
|
105
|
+
};
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { UnsignedAchievementCredentialValidator } from '@learncard/types';
|
|
2
|
+
|
|
3
|
+
import type { CredentialFixture } from '../../types';
|
|
4
|
+
|
|
5
|
+
// Example corpus provenance and alignment attribution: ../../../SOURCES.md.
|
|
6
|
+
export const obv3PhishingTransfer: CredentialFixture = {
|
|
7
|
+
id: 'obv3/phishing-transfer',
|
|
8
|
+
name: 'Phishing Recognition Transfer Project',
|
|
9
|
+
description:
|
|
10
|
+
'Independent project with an achieved-level-only rubric result and a separate RawScore result.',
|
|
11
|
+
spec: 'obv3',
|
|
12
|
+
profile: 'micro-credential',
|
|
13
|
+
features: ['evidence', 'alignment', 'results', 'expiration'],
|
|
14
|
+
source: 'synthetic',
|
|
15
|
+
signed: false,
|
|
16
|
+
validity: 'valid',
|
|
17
|
+
validator: UnsignedAchievementCredentialValidator,
|
|
18
|
+
tags: ['phishing', 'mixed-results', 'achieved-level-only', 'learner'],
|
|
19
|
+
|
|
20
|
+
credential: {
|
|
21
|
+
'@context': [
|
|
22
|
+
'https://www.w3.org/ns/credentials/v2',
|
|
23
|
+
'https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json',
|
|
24
|
+
],
|
|
25
|
+
id: 'urn:uuid:670ef7c6-b8de-532c-9667-9817a0c942e8',
|
|
26
|
+
type: ['VerifiableCredential', 'OpenBadgeCredential'],
|
|
27
|
+
name: 'Phishing recognition — independent transfer project',
|
|
28
|
+
description:
|
|
29
|
+
'Adapt this task to a new fictional setting: Classify synthetic suspicious email examples. Complete an independently planned transfer project, recording assumptions, an initial failed approach and a supported revision.',
|
|
30
|
+
issuer: {
|
|
31
|
+
id: 'did:example:issuer123',
|
|
32
|
+
type: ['Profile'],
|
|
33
|
+
name: 'Tech Academy',
|
|
34
|
+
url: 'https://techacademy.example.com',
|
|
35
|
+
},
|
|
36
|
+
validFrom: '2026-09-01T00:00:00Z',
|
|
37
|
+
validUntil: '2028-09-01T00:00:00Z',
|
|
38
|
+
credentialSubject: {
|
|
39
|
+
id: 'https://fixtures.example.org/frenchfry/personas/ddf7bc68efd4',
|
|
40
|
+
type: ['AchievementSubject'],
|
|
41
|
+
achievement: {
|
|
42
|
+
id: 'https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer',
|
|
43
|
+
type: ['Achievement'],
|
|
44
|
+
achievementType: 'MicroCredential',
|
|
45
|
+
name: 'Phishing recognition — independent transfer project',
|
|
46
|
+
description:
|
|
47
|
+
'Adapt this task to a new fictional setting: Classify synthetic suspicious email examples. Complete an independently planned transfer project, recording assumptions, an initial failed approach and a supported revision.',
|
|
48
|
+
criteria: {
|
|
49
|
+
narrative:
|
|
50
|
+
'Identify cues without following links or sharing secrets; compare two alternative approaches and justify one under time and resource constraints.',
|
|
51
|
+
},
|
|
52
|
+
fieldOfStudy: 'technology',
|
|
53
|
+
inLanguage: 'en',
|
|
54
|
+
tag: ['technology', 'Phishing recognition', 'learner'],
|
|
55
|
+
resultDescription: [
|
|
56
|
+
{
|
|
57
|
+
id: 'https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric',
|
|
58
|
+
type: ['ResultDescription'],
|
|
59
|
+
name: 'Independent transfer rubric',
|
|
60
|
+
resultType: 'RubricCriterionLevel',
|
|
61
|
+
requiredLevel:
|
|
62
|
+
'https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric/proficient',
|
|
63
|
+
rubricCriterionLevel: [
|
|
64
|
+
{
|
|
65
|
+
id: 'https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric/developing',
|
|
66
|
+
type: ['RubricCriterionLevel'],
|
|
67
|
+
name: 'Developing',
|
|
68
|
+
level: '1',
|
|
69
|
+
description:
|
|
70
|
+
'Needs support to complete: Adapt this task to a new fictional setting: Classify synthetic suspicious email examples',
|
|
71
|
+
points: '1',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: 'https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric/proficient',
|
|
75
|
+
type: ['RubricCriterionLevel'],
|
|
76
|
+
name: 'Proficient',
|
|
77
|
+
level: '2',
|
|
78
|
+
description:
|
|
79
|
+
'Meets the task criterion: Identify cues without following links or sharing secrets; compare two alternative approaches and justify one under time and resource constraints.',
|
|
80
|
+
points: '2',
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: 'https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric/advanced',
|
|
84
|
+
type: ['RubricCriterionLevel'],
|
|
85
|
+
name: 'Advanced',
|
|
86
|
+
level: '3',
|
|
87
|
+
description:
|
|
88
|
+
'Meets criterion and explains limits and alternative approaches.',
|
|
89
|
+
points: '3',
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: 'https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric/functional-checks',
|
|
95
|
+
type: ['ResultDescription'],
|
|
96
|
+
name: 'Simulated functional acceptance checks',
|
|
97
|
+
resultType: 'RawScore',
|
|
98
|
+
valueMin: '0',
|
|
99
|
+
valueMax: '10',
|
|
100
|
+
requiredValue: '8',
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
alignment: [
|
|
104
|
+
{
|
|
105
|
+
type: ['Alignment'],
|
|
106
|
+
targetName: 'Critical Thinking',
|
|
107
|
+
targetUrl:
|
|
108
|
+
'https://www.onetcenter.org/ctdlasn/resources/ce-07c26361-9119-11e8-b852-782bcb5df6ac',
|
|
109
|
+
targetFramework:
|
|
110
|
+
'O*NET Content Model Worker Requirements - Essential Skills: U.S. Department of Labor (DOL)',
|
|
111
|
+
targetDescription:
|
|
112
|
+
'Using logic and reasoning to identify the strengths and weaknesses of alternative solutions, conclusions, or approaches to problems.',
|
|
113
|
+
targetType: 'ceasn:Competency',
|
|
114
|
+
targetCode: '2.A.2.a',
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
},
|
|
118
|
+
role: 'learner',
|
|
119
|
+
narrative:
|
|
120
|
+
'Complete an independently planned transfer project, recording assumptions, an initial failed approach and a supported revision.',
|
|
121
|
+
activityStartDate: '2026-08-01T00:00:00Z',
|
|
122
|
+
activityEndDate: '2026-08-31T00:00:00Z',
|
|
123
|
+
result: [
|
|
124
|
+
{
|
|
125
|
+
type: ['Result'],
|
|
126
|
+
resultDescription:
|
|
127
|
+
'https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric',
|
|
128
|
+
achievedLevel:
|
|
129
|
+
'https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric/proficient',
|
|
130
|
+
status: 'Completed',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
type: ['Result'],
|
|
134
|
+
resultDescription:
|
|
135
|
+
'https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric/functional-checks',
|
|
136
|
+
value: '9',
|
|
137
|
+
status: 'Completed',
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
},
|
|
141
|
+
evidence: [
|
|
142
|
+
{
|
|
143
|
+
id: 'https://fixtures.example.org/frenchfry/evidence/ddf7bc68efd4/transfer',
|
|
144
|
+
type: ['Evidence'],
|
|
145
|
+
name: 'Independent project dossier; Classification worksheet and explanation',
|
|
146
|
+
description:
|
|
147
|
+
'Adapt this task to a new fictional setting: Classify synthetic suspicious email examples; evaluation considered: Identify cues without following links or sharing secrets; compare two alternative approaches and justify one under time and resource constraints.',
|
|
148
|
+
narrative:
|
|
149
|
+
'Adapt this task to a new fictional setting: Classify synthetic suspicious email examples; evaluation considered: Identify cues without following links or sharing secrets; compare two alternative approaches and justify one under time and resource constraints.',
|
|
150
|
+
genre: 'Portfolio',
|
|
151
|
+
audience: 'Assessors',
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
id: 'https://fixtures.example.org/frenchfry/evidence/ddf7bc68efd4/transfer-review',
|
|
155
|
+
type: ['Evidence'],
|
|
156
|
+
name: 'Revision and peer critique record',
|
|
157
|
+
narrative:
|
|
158
|
+
'An initial approach was reviewed; the learner documented assumptions, evaluated an alternative and revised the work.',
|
|
159
|
+
genre: 'Reflective critique',
|
|
160
|
+
},
|
|
161
|
+
],
|
|
162
|
+
},
|
|
163
|
+
};
|