@learncard/credential-library 2.0.5 → 2.1.1

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.
Files changed (59) hide show
  1. package/README.md +30 -1
  2. package/SOURCES.md +63 -0
  3. package/dist/credential-library.cjs.development.js +1577 -32
  4. package/dist/credential-library.cjs.development.js.map +4 -4
  5. package/dist/credential-library.cjs.production.min.js +3 -3
  6. package/dist/credential-library.cjs.production.min.js.map +4 -4
  7. package/dist/credential-library.esm.js +1563 -18
  8. package/dist/credential-library.esm.js.map +4 -4
  9. package/dist/fixtures/clr/military-comprehensive-record.d.ts +4 -0
  10. package/dist/fixtures/clr/military-comprehensive-record.d.ts.map +1 -0
  11. package/dist/fixtures/clr/mixed-role-portfolio.d.ts +3 -0
  12. package/dist/fixtures/clr/mixed-role-portfolio.d.ts.map +1 -0
  13. package/dist/fixtures/custom/course-enrollment.d.ts +3 -0
  14. package/dist/fixtures/custom/course-enrollment.d.ts.map +1 -0
  15. package/dist/fixtures/custom/exam-accommodation.d.ts +3 -0
  16. package/dist/fixtures/custom/exam-accommodation.d.ts.map +1 -0
  17. package/dist/fixtures/index.d.ts +16 -1
  18. package/dist/fixtures/index.d.ts.map +1 -1
  19. package/dist/fixtures/obv3/food-allergen-facilitator.d.ts +3 -0
  20. package/dist/fixtures/obv3/food-allergen-facilitator.d.ts.map +1 -0
  21. package/dist/fixtures/obv3/food-allergen-practice-fr.d.ts +3 -0
  22. package/dist/fixtures/obv3/food-allergen-practice-fr.d.ts.map +1 -0
  23. package/dist/fixtures/obv3/food-allergen-practice.d.ts +3 -0
  24. package/dist/fixtures/obv3/food-allergen-practice.d.ts.map +1 -0
  25. package/dist/fixtures/obv3/phishing-transfer.d.ts +3 -0
  26. package/dist/fixtures/obv3/phishing-transfer.d.ts.map +1 -0
  27. package/dist/fixtures/obv3/qualification-apprenticeship.d.ts +3 -0
  28. package/dist/fixtures/obv3/qualification-apprenticeship.d.ts.map +1 -0
  29. package/dist/fixtures/obv3/qualification-badge-override.d.ts +3 -0
  30. package/dist/fixtures/obv3/qualification-badge-override.d.ts.map +1 -0
  31. package/dist/fixtures/obv3/qualification-certification.d.ts +3 -0
  32. package/dist/fixtures/obv3/qualification-certification.d.ts.map +1 -0
  33. package/dist/fixtures/obv3/qualification-expired.d.ts +3 -0
  34. package/dist/fixtures/obv3/qualification-expired.d.ts.map +1 -0
  35. package/dist/fixtures/obv3/qualification-journeyman.d.ts +3 -0
  36. package/dist/fixtures/obv3/qualification-journeyman.d.ts.map +1 -0
  37. package/dist/fixtures/obv3/qualification-license.d.ts +3 -0
  38. package/dist/fixtures/obv3/qualification-license.d.ts.map +1 -0
  39. package/dist/fixtures/obv3/qualification-master.d.ts +3 -0
  40. package/dist/fixtures/obv3/qualification-master.d.ts.map +1 -0
  41. package/package.json +7 -6
  42. package/src/__tests__/curated-examples.test.ts +248 -0
  43. package/src/__tests__/issuance.test.ts +35 -0
  44. package/src/fixtures/clr/military-comprehensive-record.ts +155 -0
  45. package/src/fixtures/clr/mixed-role-portfolio.ts +490 -0
  46. package/src/fixtures/custom/course-enrollment.ts +56 -0
  47. package/src/fixtures/custom/exam-accommodation.ts +56 -0
  48. package/src/fixtures/index.ts +49 -0
  49. package/src/fixtures/obv3/food-allergen-facilitator.ts +108 -0
  50. package/src/fixtures/obv3/food-allergen-practice-fr.ts +107 -0
  51. package/src/fixtures/obv3/food-allergen-practice.ts +105 -0
  52. package/src/fixtures/obv3/phishing-transfer.ts +163 -0
  53. package/src/fixtures/obv3/qualification-apprenticeship.ts +58 -0
  54. package/src/fixtures/obv3/qualification-badge-override.ts +64 -0
  55. package/src/fixtures/obv3/qualification-certification.ts +59 -0
  56. package/src/fixtures/obv3/qualification-expired.ts +59 -0
  57. package/src/fixtures/obv3/qualification-journeyman.ts +58 -0
  58. package/src/fixtures/obv3/qualification-license.ts +58 -0
  59. package/src/fixtures/obv3/qualification-master.ts +58 -0
@@ -5252,6 +5252,409 @@ var obv3RubricAlignedBadge = {
5252
5252
  }
5253
5253
  };
5254
5254
 
5255
+ // src/fixtures/obv3/qualification-license.ts
5256
+ import { UnsignedAchievementCredentialValidator as UnsignedAchievementCredentialValidator10 } from "@learncard/types";
5257
+ var obv3QualificationLicense = {
5258
+ "id": "obv3/qualification-license",
5259
+ "name": "Professional Electrical License",
5260
+ "description": "LC-2111 License classification and default certificate test.",
5261
+ "spec": "obv3",
5262
+ "profile": "license",
5263
+ "features": ["expiration", "image"],
5264
+ "source": "synthetic",
5265
+ "signed": false,
5266
+ "validity": "valid",
5267
+ validator: UnsignedAchievementCredentialValidator10,
5268
+ "tags": ["qualifications", "lc-2111", "license"],
5269
+ "credential": {
5270
+ "@context": [
5271
+ "https://www.w3.org/ns/credentials/v2",
5272
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
5273
+ ],
5274
+ "id": "urn:uuid:21110000-0000-4000-8000-000000000001",
5275
+ "type": ["VerifiableCredential", "OpenBadgeCredential"],
5276
+ "name": "Professional Electrical License",
5277
+ "description": "Authorizes supervised electrical installation and maintenance.",
5278
+ "image": {
5279
+ id: "https://openmoji.org/data/color/svg/1F50C.svg",
5280
+ type: "Image",
5281
+ caption: "Electrical license illustration \u2014 OpenMoji (CC BY-SA 4.0)"
5282
+ },
5283
+ "issuer": {
5284
+ "id": "did:example:qualification-issuer",
5285
+ "type": ["Profile"],
5286
+ "name": "Example Professional Training Academy"
5287
+ },
5288
+ "validFrom": "2023-01-01T00:00:00Z",
5289
+ "validUntil": "2037-01-01T00:00:00Z",
5290
+ "credentialSubject": {
5291
+ "id": "did:example:qualification-holder",
5292
+ "type": ["AchievementSubject"],
5293
+ "achievement": {
5294
+ "id": "https://example.org/qualifications/license",
5295
+ "type": ["Achievement"],
5296
+ "achievementType": "License",
5297
+ "name": "Professional Electrical License",
5298
+ "description": "Authorizes supervised electrical installation and maintenance.",
5299
+ "image": {
5300
+ id: "https://openmoji.org/data/color/svg/1F50C.svg",
5301
+ type: "Image",
5302
+ caption: "Electrical license illustration \u2014 OpenMoji (CC BY-SA 4.0)"
5303
+ },
5304
+ "criteria": {
5305
+ "narrative": "Complete the required training and pass the practical assessment."
5306
+ }
5307
+ }
5308
+ }
5309
+ }
5310
+ };
5311
+
5312
+ // src/fixtures/obv3/qualification-certification.ts
5313
+ import { UnsignedAchievementCredentialValidator as UnsignedAchievementCredentialValidator11 } from "@learncard/types";
5314
+ var obv3QualificationCertification = {
5315
+ "id": "obv3/qualification-certification",
5316
+ "name": "Project Management Certification",
5317
+ "description": "LC-2111 Certification classification and default certificate test.",
5318
+ "spec": "obv3",
5319
+ "profile": "certificate",
5320
+ "features": ["expiration", "image"],
5321
+ "source": "synthetic",
5322
+ "signed": false,
5323
+ "validity": "valid",
5324
+ validator: UnsignedAchievementCredentialValidator11,
5325
+ "tags": ["qualifications", "lc-2111", "certification"],
5326
+ "credential": {
5327
+ "@context": [
5328
+ "https://www.w3.org/ns/credentials/v2",
5329
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
5330
+ ],
5331
+ "id": "urn:uuid:21110000-0000-4000-8000-000000000002",
5332
+ "type": ["VerifiableCredential", "OpenBadgeCredential"],
5333
+ "name": "Project Management Certification",
5334
+ "description": "Demonstrates competency in planning, delivering, and evaluating projects.",
5335
+ "image": {
5336
+ id: "https://openmoji.org/data/color/svg/1F4CB.svg",
5337
+ type: "Image",
5338
+ caption: "Project management illustration \u2014 OpenMoji (CC BY-SA 4.0)"
5339
+ },
5340
+ "issuer": {
5341
+ "id": "did:example:qualification-issuer",
5342
+ "type": ["Profile"],
5343
+ "name": "Example Professional Training Academy"
5344
+ },
5345
+ "validFrom": "2023-01-01T00:00:00Z",
5346
+ "validUntil": "2037-01-01T00:00:00Z",
5347
+ "credentialSubject": {
5348
+ "id": "did:example:qualification-holder",
5349
+ "type": ["AchievementSubject"],
5350
+ "achievement": {
5351
+ "id": "https://example.org/qualifications/certification",
5352
+ "type": ["Achievement"],
5353
+ "achievementType": "Certification",
5354
+ "name": "Project Management Certification",
5355
+ "description": "Demonstrates competency in planning, delivering, and evaluating projects.",
5356
+ "image": {
5357
+ id: "https://openmoji.org/data/color/svg/1F4CB.svg",
5358
+ type: "Image",
5359
+ caption: "Project management illustration \u2014 OpenMoji (CC BY-SA 4.0)"
5360
+ },
5361
+ "criteria": {
5362
+ "narrative": "Complete the required training and pass the practical assessment."
5363
+ }
5364
+ }
5365
+ }
5366
+ }
5367
+ };
5368
+
5369
+ // src/fixtures/obv3/qualification-apprenticeship.ts
5370
+ import { UnsignedAchievementCredentialValidator as UnsignedAchievementCredentialValidator12 } from "@learncard/types";
5371
+ var obv3QualificationApprenticeship = {
5372
+ "id": "obv3/qualification-apprenticeship",
5373
+ "name": "Electrical Apprenticeship Certificate",
5374
+ "description": "LC-2111 ApprenticeshipCertificate classification and default certificate test.",
5375
+ "spec": "obv3",
5376
+ "profile": "certificate",
5377
+ "features": ["expiration", "image"],
5378
+ "source": "synthetic",
5379
+ "signed": false,
5380
+ "validity": "valid",
5381
+ validator: UnsignedAchievementCredentialValidator12,
5382
+ "tags": ["qualifications", "lc-2111", "apprenticeship"],
5383
+ "credential": {
5384
+ "@context": [
5385
+ "https://www.w3.org/ns/credentials/v2",
5386
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
5387
+ ],
5388
+ "id": "urn:uuid:21110000-0000-4000-8000-000000000003",
5389
+ "type": ["VerifiableCredential", "OpenBadgeCredential"],
5390
+ "name": "Electrical Apprenticeship Certificate",
5391
+ "description": "Recognizes completion of supervised electrical training.",
5392
+ "image": {
5393
+ id: "https://openmoji.org/data/color/svg/1F6E0.svg",
5394
+ type: "Image",
5395
+ caption: "Apprenticeship tools illustration \u2014 OpenMoji (CC BY-SA 4.0)"
5396
+ },
5397
+ "issuer": {
5398
+ "id": "did:example:qualification-issuer",
5399
+ "type": ["Profile"],
5400
+ "name": "Example Professional Training Academy"
5401
+ },
5402
+ "validFrom": "2023-01-01T00:00:00Z",
5403
+ "validUntil": "2037-01-01T00:00:00Z",
5404
+ "credentialSubject": {
5405
+ "id": "did:example:qualification-holder",
5406
+ "type": ["AchievementSubject"],
5407
+ "achievement": {
5408
+ "id": "https://example.org/qualifications/apprenticeship",
5409
+ "type": ["Achievement"],
5410
+ "achievementType": "ApprenticeshipCertificate",
5411
+ "name": "Electrical Apprenticeship Certificate",
5412
+ "description": "Recognizes completion of supervised electrical training.",
5413
+ "image": {
5414
+ id: "https://openmoji.org/data/color/svg/1F6E0.svg",
5415
+ type: "Image",
5416
+ caption: "Apprenticeship tools illustration \u2014 OpenMoji (CC BY-SA 4.0)"
5417
+ },
5418
+ "criteria": {
5419
+ "narrative": "Complete the required training and pass the practical assessment."
5420
+ }
5421
+ }
5422
+ }
5423
+ }
5424
+ };
5425
+
5426
+ // src/fixtures/obv3/qualification-journeyman.ts
5427
+ import { UnsignedAchievementCredentialValidator as UnsignedAchievementCredentialValidator13 } from "@learncard/types";
5428
+ var obv3QualificationJourneyman = {
5429
+ "id": "obv3/qualification-journeyman",
5430
+ "name": "Journeyman Electrician Certificate",
5431
+ "description": "LC-2111 JourneymanCertificate classification and default certificate test.",
5432
+ "spec": "obv3",
5433
+ "profile": "certificate",
5434
+ "features": ["expiration", "image"],
5435
+ "source": "synthetic",
5436
+ "signed": false,
5437
+ "validity": "valid",
5438
+ validator: UnsignedAchievementCredentialValidator13,
5439
+ "tags": ["qualifications", "lc-2111", "journeyman"],
5440
+ "credential": {
5441
+ "@context": [
5442
+ "https://www.w3.org/ns/credentials/v2",
5443
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
5444
+ ],
5445
+ "id": "urn:uuid:21110000-0000-4000-8000-000000000004",
5446
+ "type": ["VerifiableCredential", "OpenBadgeCredential"],
5447
+ "name": "Journeyman Electrician Certificate",
5448
+ "description": "Recognizes qualification to work independently as an electrician.",
5449
+ "image": {
5450
+ id: "https://openmoji.org/data/color/svg/1F527.svg",
5451
+ type: "Image",
5452
+ caption: "Journeyman tools illustration \u2014 OpenMoji (CC BY-SA 4.0)"
5453
+ },
5454
+ "issuer": {
5455
+ "id": "did:example:qualification-issuer",
5456
+ "type": ["Profile"],
5457
+ "name": "Example Professional Training Academy"
5458
+ },
5459
+ "validFrom": "2023-01-01T00:00:00Z",
5460
+ "validUntil": "2037-01-01T00:00:00Z",
5461
+ "credentialSubject": {
5462
+ "id": "did:example:qualification-holder",
5463
+ "type": ["AchievementSubject"],
5464
+ "achievement": {
5465
+ "id": "https://example.org/qualifications/journeyman",
5466
+ "type": ["Achievement"],
5467
+ "achievementType": "JourneymanCertificate",
5468
+ "name": "Journeyman Electrician Certificate",
5469
+ "description": "Recognizes qualification to work independently as an electrician.",
5470
+ "image": {
5471
+ id: "https://openmoji.org/data/color/svg/1F527.svg",
5472
+ type: "Image",
5473
+ caption: "Journeyman tools illustration \u2014 OpenMoji (CC BY-SA 4.0)"
5474
+ },
5475
+ "criteria": {
5476
+ "narrative": "Complete the required training and pass the practical assessment."
5477
+ }
5478
+ }
5479
+ }
5480
+ }
5481
+ };
5482
+
5483
+ // src/fixtures/obv3/qualification-master.ts
5484
+ import { UnsignedAchievementCredentialValidator as UnsignedAchievementCredentialValidator14 } from "@learncard/types";
5485
+ var obv3QualificationMaster = {
5486
+ "id": "obv3/qualification-master",
5487
+ "name": "Master Electrician Certificate",
5488
+ "description": "LC-2111 MasterCertificate classification and default certificate test.",
5489
+ "spec": "obv3",
5490
+ "profile": "certificate",
5491
+ "features": ["expiration", "image"],
5492
+ "source": "synthetic",
5493
+ "signed": false,
5494
+ "validity": "valid",
5495
+ validator: UnsignedAchievementCredentialValidator14,
5496
+ "tags": ["qualifications", "lc-2111", "master"],
5497
+ "credential": {
5498
+ "@context": [
5499
+ "https://www.w3.org/ns/credentials/v2",
5500
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
5501
+ ],
5502
+ "id": "urn:uuid:21110000-0000-4000-8000-000000000005",
5503
+ "type": ["VerifiableCredential", "OpenBadgeCredential"],
5504
+ "name": "Master Electrician Certificate",
5505
+ "description": "Recognizes advanced electrical design and supervisory competence.",
5506
+ "image": {
5507
+ id: "https://openmoji.org/data/color/svg/1F3C6.svg",
5508
+ type: "Image",
5509
+ caption: "Master qualification illustration \u2014 OpenMoji (CC BY-SA 4.0)"
5510
+ },
5511
+ "issuer": {
5512
+ "id": "did:example:qualification-issuer",
5513
+ "type": ["Profile"],
5514
+ "name": "Example Professional Training Academy"
5515
+ },
5516
+ "validFrom": "2023-01-01T00:00:00Z",
5517
+ "validUntil": "2037-01-01T00:00:00Z",
5518
+ "credentialSubject": {
5519
+ "id": "did:example:qualification-holder",
5520
+ "type": ["AchievementSubject"],
5521
+ "achievement": {
5522
+ "id": "https://example.org/qualifications/master",
5523
+ "type": ["Achievement"],
5524
+ "achievementType": "MasterCertificate",
5525
+ "name": "Master Electrician Certificate",
5526
+ "description": "Recognizes advanced electrical design and supervisory competence.",
5527
+ "image": {
5528
+ id: "https://openmoji.org/data/color/svg/1F3C6.svg",
5529
+ type: "Image",
5530
+ caption: "Master qualification illustration \u2014 OpenMoji (CC BY-SA 4.0)"
5531
+ },
5532
+ "criteria": {
5533
+ "narrative": "Complete the required training and pass the practical assessment."
5534
+ }
5535
+ }
5536
+ }
5537
+ }
5538
+ };
5539
+
5540
+ // src/fixtures/obv3/qualification-expired.ts
5541
+ import { UnsignedAchievementCredentialValidator as UnsignedAchievementCredentialValidator15 } from "@learncard/types";
5542
+ var obv3QualificationExpired = {
5543
+ "id": "obv3/qualification-expired",
5544
+ "name": "Expired Safety Certification",
5545
+ "description": "LC-2111 expiration test. Enable Keep fixture dates in the viewer to retain the past expiration.",
5546
+ "spec": "obv3",
5547
+ "profile": "certificate",
5548
+ "features": ["expiration", "image"],
5549
+ "source": "synthetic",
5550
+ "signed": false,
5551
+ "validity": "valid",
5552
+ validator: UnsignedAchievementCredentialValidator15,
5553
+ "tags": ["qualifications", "lc-2111", "expired"],
5554
+ "credential": {
5555
+ "@context": [
5556
+ "https://www.w3.org/ns/credentials/v2",
5557
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
5558
+ ],
5559
+ "id": "urn:uuid:21110000-0000-4000-8000-000000000006",
5560
+ "type": ["VerifiableCredential", "OpenBadgeCredential"],
5561
+ "name": "Expired Safety Certification",
5562
+ "description": "An expired qualification that must remain visible and selectable.",
5563
+ "image": {
5564
+ id: "https://openmoji.org/data/color/svg/26A0.svg",
5565
+ type: "Image",
5566
+ caption: "Safety warning illustration \u2014 OpenMoji (CC BY-SA 4.0)"
5567
+ },
5568
+ "issuer": {
5569
+ "id": "did:example:qualification-issuer",
5570
+ "type": ["Profile"],
5571
+ "name": "Example Professional Training Academy"
5572
+ },
5573
+ "validFrom": "2023-01-01T00:00:00Z",
5574
+ "validUntil": "2024-01-01T00:00:00Z",
5575
+ "credentialSubject": {
5576
+ "id": "did:example:qualification-holder",
5577
+ "type": ["AchievementSubject"],
5578
+ "achievement": {
5579
+ "id": "https://example.org/qualifications/expired",
5580
+ "type": ["Achievement"],
5581
+ "achievementType": "Certification",
5582
+ "name": "Expired Safety Certification",
5583
+ "description": "An expired qualification that must remain visible and selectable.",
5584
+ "image": {
5585
+ id: "https://openmoji.org/data/color/svg/26A0.svg",
5586
+ type: "Image",
5587
+ caption: "Safety warning illustration \u2014 OpenMoji (CC BY-SA 4.0)"
5588
+ },
5589
+ "criteria": {
5590
+ "narrative": "Complete the safety course; renewal is required after expiration."
5591
+ }
5592
+ }
5593
+ }
5594
+ }
5595
+ };
5596
+
5597
+ // src/fixtures/obv3/qualification-badge-override.ts
5598
+ import { UnsignedAchievementCredentialValidator as UnsignedAchievementCredentialValidator16 } from "@learncard/types";
5599
+ var obv3QualificationBadgeOverride = {
5600
+ "id": "obv3/qualification-badge-override",
5601
+ "name": "Safety Certification \u2014 Badge Layout",
5602
+ "description": "LC-2111 Certification classification and explicit display override test.",
5603
+ "spec": "obv3",
5604
+ "profile": "certificate",
5605
+ "features": ["expiration", "display", "image"],
5606
+ "source": "synthetic",
5607
+ "signed": false,
5608
+ "validity": "valid",
5609
+ validator: UnsignedAchievementCredentialValidator16,
5610
+ "tags": ["qualifications", "lc-2111", "badge-override"],
5611
+ "credential": {
5612
+ "@context": [
5613
+ "https://www.w3.org/ns/credentials/v2",
5614
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json",
5615
+ "https://ctx.learncard.com/boosts/1.0.3.json"
5616
+ ],
5617
+ "id": "urn:uuid:21110000-0000-4000-8000-000000000007",
5618
+ "type": ["VerifiableCredential", "OpenBadgeCredential", "BoostCredential"],
5619
+ "name": "Safety Certification \u2014 Badge Layout",
5620
+ "description": "A qualification with an explicit badge layout instead of the default certificate.",
5621
+ "image": {
5622
+ id: "https://openmoji.org/data/color/svg/1F6E1.svg",
5623
+ type: "Image",
5624
+ caption: "Safety certification illustration \u2014 OpenMoji (CC BY-SA 4.0)"
5625
+ },
5626
+ "issuer": {
5627
+ "id": "did:example:qualification-issuer",
5628
+ "type": ["Profile"],
5629
+ "name": "Example Professional Training Academy"
5630
+ },
5631
+ "validFrom": "2023-01-01T00:00:00Z",
5632
+ "validUntil": "2037-01-01T00:00:00Z",
5633
+ "credentialSubject": {
5634
+ "id": "did:example:qualification-holder",
5635
+ "type": ["AchievementSubject"],
5636
+ "achievement": {
5637
+ "id": "https://example.org/qualifications/badge-override",
5638
+ "type": ["Achievement"],
5639
+ "achievementType": "Certification",
5640
+ "name": "Safety Certification \u2014 Badge Layout",
5641
+ "description": "A qualification with an explicit badge layout instead of the default certificate.",
5642
+ "image": {
5643
+ id: "https://openmoji.org/data/color/svg/1F6E1.svg",
5644
+ type: "Image",
5645
+ caption: "Safety certification illustration \u2014 OpenMoji (CC BY-SA 4.0)"
5646
+ },
5647
+ "criteria": {
5648
+ "narrative": "Complete the required training and pass the practical assessment."
5649
+ }
5650
+ }
5651
+ },
5652
+ "display": {
5653
+ "displayType": "badge"
5654
+ }
5655
+ }
5656
+ };
5657
+
5255
5658
  // src/fixtures/clr/minimal.ts
5256
5659
  import { UnsignedClrCredentialValidator } from "@learncard/types";
5257
5660
  var clrMinimal = {
@@ -10094,6 +10497,153 @@ var clrMilitaryTrainingRecord = {
10094
10497
  }
10095
10498
  };
10096
10499
 
10500
+ // src/fixtures/clr/military-comprehensive-record.ts
10501
+ var base = structuredClone(clrMilitaryTrainingRecord.credential);
10502
+ var subject = base.credentialSubject;
10503
+ var context = [
10504
+ "https://www.w3.org/ns/credentials/v2",
10505
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
10506
+ ];
10507
+ var issuer = {
10508
+ id: "did:example:meridian-qualifications",
10509
+ type: ["Profile"],
10510
+ name: "Meridian Qualifications Board (Fictional)"
10511
+ };
10512
+ var evaluationIssuer = {
10513
+ id: "did:example:meridian-assessment",
10514
+ type: ["Profile"],
10515
+ name: "Meridian Independent Assessments (Fictional)"
10516
+ };
10517
+ var clrMilitaryComprehensiveRecord = {
10518
+ ...clrMilitaryTrainingRecord,
10519
+ id: "clr/military-comprehensive-record",
10520
+ name: "Military Training and Qualifications \u2014 Comprehensive",
10521
+ description: "Six source-backed children covering training, fieldwork, award, competency, assessment, and qualification with distinct issuers.",
10522
+ tags: [...clrMilitaryTrainingRecord.tags ?? [], "lc-2215"],
10523
+ credential: {
10524
+ ...base,
10525
+ id: "urn:uuid:7293fe71-4b24-4428-9f6f-60923687184c",
10526
+ name: "Military Training and Qualifications \u2014 Comprehensive",
10527
+ credentialSubject: {
10528
+ ...subject,
10529
+ verifiableCredential: [
10530
+ ...subject.verifiableCredential,
10531
+ {
10532
+ "@context": context,
10533
+ id: "urn:uuid:89a65d6b-3d7b-43f9-a545-82979d22b874",
10534
+ type: ["VerifiableCredential", "AchievementCredential"],
10535
+ issuer: evaluationIssuer,
10536
+ validFrom: "2026-03-01T12:00:00Z",
10537
+ credentialSubject: {
10538
+ id: subject.id,
10539
+ type: ["AchievementSubject"],
10540
+ achievement: {
10541
+ id: "urn:uuid:e6b5c726-4f43-4cec-8099-fd5d476c91c0",
10542
+ type: ["Achievement"],
10543
+ achievementType: "Competency",
10544
+ name: "Safe logistics coordination",
10545
+ description: "Demonstrated coordination in a fictional training exercise.",
10546
+ criteria: {
10547
+ narrative: "Explain and demonstrate the supplied safety checklist."
10548
+ },
10549
+ alignment: [
10550
+ {
10551
+ type: ["Alignment"],
10552
+ targetName: "Safe coordination",
10553
+ targetUrl: "https://skills.example/safe-coordination",
10554
+ targetCode: "SAFE-101"
10555
+ }
10556
+ ]
10557
+ }
10558
+ },
10559
+ evidence: [
10560
+ {
10561
+ type: ["Evidence"],
10562
+ name: "Observation notes",
10563
+ narrative: "The learner demonstrated the checklist in a supervised simulation."
10564
+ }
10565
+ ]
10566
+ },
10567
+ {
10568
+ "@context": context,
10569
+ id: "urn:uuid:676e976f-0e91-4c4c-a2d4-1cac83672875",
10570
+ type: ["VerifiableCredential", "AchievementCredential"],
10571
+ issuer: evaluationIssuer,
10572
+ validFrom: "2026-03-02T12:00:00Z",
10573
+ credentialSubject: {
10574
+ id: subject.id,
10575
+ type: ["AchievementSubject"],
10576
+ achievement: {
10577
+ id: "urn:uuid:027361d1-5945-4292-85a6-2d8204b3e876",
10578
+ type: ["Achievement"],
10579
+ achievementType: "Assessment",
10580
+ name: "Coordination knowledge assessment",
10581
+ description: "Synthetic knowledge assessment.",
10582
+ criteria: { narrative: "Answer the scenario questions." },
10583
+ resultDescription: [
10584
+ {
10585
+ id: "urn:uuid:3b6af4be-5b0f-44f1-9d58-a8f8bd1a2877",
10586
+ type: ["ResultDescription"],
10587
+ name: "Knowledge score",
10588
+ resultType: "RawScore",
10589
+ valueMin: "0",
10590
+ valueMax: "100",
10591
+ requiredValue: "70"
10592
+ }
10593
+ ]
10594
+ },
10595
+ result: [
10596
+ {
10597
+ type: ["Result"],
10598
+ resultDescription: "urn:uuid:3b6af4be-5b0f-44f1-9d58-a8f8bd1a2877",
10599
+ value: "86"
10600
+ }
10601
+ ]
10602
+ }
10603
+ },
10604
+ {
10605
+ "@context": context,
10606
+ id: "urn:uuid:492bb221-9dca-46a4-bce1-205537633878",
10607
+ type: ["VerifiableCredential", "AchievementCredential"],
10608
+ issuer,
10609
+ awardedDate: "2026-03-03T12:00:00Z",
10610
+ validFrom: "2026-04-01T12:00:00Z",
10611
+ validUntil: "2027-04-01T12:00:00Z",
10612
+ credentialSubject: {
10613
+ id: subject.id,
10614
+ type: ["AchievementSubject"],
10615
+ licenseNumber: "SYN-LOG-2048",
10616
+ achievement: {
10617
+ id: "urn:uuid:8067ec9d-6fae-41f0-aa5f-6356f7a96879",
10618
+ type: ["Achievement"],
10619
+ achievementType: "License",
10620
+ name: "Simulated logistics qualification",
10621
+ description: "Fictional qualification for display testing only.",
10622
+ criteria: {
10623
+ narrative: "Demonstrate the training objectives and complete the assessment."
10624
+ },
10625
+ otherIdentifier: [
10626
+ {
10627
+ type: "IdentifierEntry",
10628
+ identifier: "SYN-QUAL-48",
10629
+ identifierType: "identifier"
10630
+ }
10631
+ ]
10632
+ }
10633
+ },
10634
+ evidence: [
10635
+ {
10636
+ type: ["Evidence"],
10637
+ name: "Qualification review",
10638
+ narrative: "Synthetic review of training and assessment evidence."
10639
+ }
10640
+ ]
10641
+ }
10642
+ ]
10643
+ }
10644
+ }
10645
+ };
10646
+
10097
10647
  // src/fixtures/clr/professional-organization-record.ts
10098
10648
  var clrProfessionalOrganizationRecord = {
10099
10649
  id: "clr/professional-organization-record",
@@ -11569,7 +12119,7 @@ var clrMixedCareerRecord = {
11569
12119
  };
11570
12120
 
11571
12121
  // src/fixtures/boost/basic.ts
11572
- import { UnsignedAchievementCredentialValidator as UnsignedAchievementCredentialValidator10 } from "@learncard/types";
12122
+ import { UnsignedAchievementCredentialValidator as UnsignedAchievementCredentialValidator17 } from "@learncard/types";
11573
12123
  var boostBasic = {
11574
12124
  id: "boost/basic",
11575
12125
  name: "Basic LearnCard Boost",
@@ -11580,7 +12130,7 @@ var boostBasic = {
11580
12130
  source: "synthetic",
11581
12131
  signed: false,
11582
12132
  validity: "valid",
11583
- validator: UnsignedAchievementCredentialValidator10,
12133
+ validator: UnsignedAchievementCredentialValidator17,
11584
12134
  tags: ["learncard", "boost"],
11585
12135
  credential: {
11586
12136
  "@context": [
@@ -11616,7 +12166,7 @@ var boostBasic = {
11616
12166
  };
11617
12167
 
11618
12168
  // src/fixtures/boost/boost-id.ts
11619
- import { UnsignedAchievementCredentialValidator as UnsignedAchievementCredentialValidator11 } from "@learncard/types";
12169
+ import { UnsignedAchievementCredentialValidator as UnsignedAchievementCredentialValidator18 } from "@learncard/types";
11620
12170
  var boostId = {
11621
12171
  id: "boost/boost-id",
11622
12172
  name: "LearnCard Boost ID",
@@ -11627,7 +12177,7 @@ var boostId = {
11627
12177
  source: "synthetic",
11628
12178
  signed: false,
11629
12179
  validity: "valid",
11630
- validator: UnsignedAchievementCredentialValidator11,
12180
+ validator: UnsignedAchievementCredentialValidator18,
11631
12181
  tags: ["learncard", "boost", "id"],
11632
12182
  credential: {
11633
12183
  "@context": [
@@ -11672,7 +12222,7 @@ var boostId = {
11672
12222
  };
11673
12223
 
11674
12224
  // src/fixtures/boost/with-skills.ts
11675
- import { UnsignedAchievementCredentialValidator as UnsignedAchievementCredentialValidator12 } from "@learncard/types";
12225
+ import { UnsignedAchievementCredentialValidator as UnsignedAchievementCredentialValidator19 } from "@learncard/types";
11676
12226
  var boostWithSkills = {
11677
12227
  id: "boost/with-skills",
11678
12228
  name: "LearnCard Boost with Skills",
@@ -11683,7 +12233,7 @@ var boostWithSkills = {
11683
12233
  source: "synthetic",
11684
12234
  signed: false,
11685
12235
  validity: "valid",
11686
- validator: UnsignedAchievementCredentialValidator12,
12236
+ validator: UnsignedAchievementCredentialValidator19,
11687
12237
  tags: ["learncard", "boost", "skills"],
11688
12238
  credential: {
11689
12239
  "@context": [
@@ -24279,9 +24829,9 @@ var buildFinalTranscriptVariant = /* @__PURE__ */ __name((provisional, options =
24279
24829
  if (options.validFrom) final.validFrom = options.validFrom;
24280
24830
  delete final.validUntil;
24281
24831
  delete final.partial;
24282
- const subject = final.credentialSubject;
24283
- if (isRecord(subject) && Array.isArray(subject.verifiableCredential)) {
24284
- subject.verifiableCredential = subject.verifiableCredential.map((nested) => {
24832
+ const subject2 = final.credentialSubject;
24833
+ if (isRecord(subject2) && Array.isArray(subject2.verifiableCredential)) {
24834
+ subject2.verifiableCredential = subject2.verifiableCredential.map((nested) => {
24285
24835
  if (!isRecord(nested)) return nested;
24286
24836
  const next = { ...nested };
24287
24837
  if (typeof next.name === "string") {
@@ -32806,6 +33356,970 @@ var clrDemoIsdDiplomaAssessments = {
32806
33356
  }
32807
33357
  };
32808
33358
 
33359
+ // src/fixtures/obv3/food-allergen-practice.ts
33360
+ import { UnsignedAchievementCredentialValidator as UnsignedAchievementCredentialValidator20 } from "@learncard/types";
33361
+ var obv3FoodAllergenPractice = {
33362
+ id: "obv3/food-allergen-practice",
33363
+ name: "Food Allergen Control Practice",
33364
+ description: "Observed food-preparation practice with a RubricScore result, evidence, and ESCO alignment.",
33365
+ spec: "obv3",
33366
+ profile: "generic",
33367
+ features: ["evidence", "alignment", "results", "expiration"],
33368
+ source: "synthetic",
33369
+ signed: false,
33370
+ validity: "valid",
33371
+ validator: UnsignedAchievementCredentialValidator20,
33372
+ tags: ["food-safety", "rubric-score", "learner"],
33373
+ credential: {
33374
+ "@context": [
33375
+ "https://www.w3.org/ns/credentials/v2",
33376
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
33377
+ ],
33378
+ id: "urn:uuid:7cc497f9-092a-5ea2-8cdb-7a2e60c25e68",
33379
+ type: ["VerifiableCredential", "OpenBadgeCredential"],
33380
+ name: "Food allergen control \u2014 observed practice",
33381
+ description: "Plan preparation for a fictional allergen-sensitive order. Demonstrate a controlled practice task with observer feedback.",
33382
+ issuer: {
33383
+ id: "did:example:lc2184-cedar-training",
33384
+ type: ["Profile"],
33385
+ name: "Cedar Technical Training",
33386
+ url: "https://cedar-training.example"
33387
+ },
33388
+ validFrom: "2026-09-01T00:00:00Z",
33389
+ validUntil: "2028-09-01T00:00:00Z",
33390
+ credentialSubject: {
33391
+ id: "https://fixtures.example.org/frenchfry/personas/d56d0c592ac6",
33392
+ type: ["AchievementSubject"],
33393
+ achievement: {
33394
+ id: "https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/practice",
33395
+ type: ["Achievement"],
33396
+ achievementType: "Assessment",
33397
+ name: "Food allergen control \u2014 observed practice",
33398
+ description: "Plan preparation for a fictional allergen-sensitive order. Demonstrate a controlled practice task with observer feedback.",
33399
+ criteria: {
33400
+ narrative: "Identify cross-contact routes and communication steps"
33401
+ },
33402
+ fieldOfStudy: "vocational",
33403
+ inLanguage: "en",
33404
+ tag: ["vocational", "Food allergen control", "learner"],
33405
+ resultDescription: [
33406
+ {
33407
+ id: "https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/practice/rubric",
33408
+ type: ["ResultDescription"],
33409
+ name: "Observed task rubric points",
33410
+ resultType: "RubricScore",
33411
+ valueMin: "0",
33412
+ valueMax: "4",
33413
+ requiredValue: "3"
33414
+ }
33415
+ ],
33416
+ alignment: [
33417
+ {
33418
+ type: ["Alignment"],
33419
+ targetName: "food safety principles",
33420
+ targetUrl: "http://data.europa.eu/esco/skill/3f4e4eab-a8e0-4aed-b8bb-79afe7c890e3",
33421
+ targetFramework: "ESCO (requested dataset v1.2.0)",
33422
+ targetDescription: "Scientific background of food safety which includes preparation, handling, and storage of food to minimise the risk of foodborne illness and other health hazards."
33423
+ }
33424
+ ]
33425
+ },
33426
+ role: "learner",
33427
+ narrative: "Demonstrate a controlled practice task with observer feedback.",
33428
+ activityStartDate: "2026-08-01T00:00:00Z",
33429
+ activityEndDate: "2026-08-31T00:00:00Z",
33430
+ result: [
33431
+ {
33432
+ type: ["Result"],
33433
+ resultDescription: "https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/practice/rubric",
33434
+ value: "4",
33435
+ status: "Completed"
33436
+ }
33437
+ ]
33438
+ },
33439
+ evidence: [
33440
+ {
33441
+ id: "https://fixtures.example.org/frenchfry/evidence/d56d0c592ac6/practice",
33442
+ type: ["Evidence"],
33443
+ name: "Kitchen simulation checklist",
33444
+ description: "Plan preparation for a fictional allergen-sensitive order; evaluation considered: Identify cross-contact routes and communication steps",
33445
+ narrative: "Plan preparation for a fictional allergen-sensitive order; evaluation considered: Identify cross-contact routes and communication steps",
33446
+ genre: "Observation record",
33447
+ audience: "Assessors"
33448
+ }
33449
+ ]
33450
+ }
33451
+ };
33452
+
33453
+ // src/fixtures/obv3/food-allergen-facilitator.ts
33454
+ import { UnsignedAchievementCredentialValidator as UnsignedAchievementCredentialValidator21 } from "@learncard/types";
33455
+ var obv3FoodAllergenFacilitator = {
33456
+ id: "obv3/food-allergen-facilitator",
33457
+ name: "Food Allergen Control Facilitation",
33458
+ description: "Matched teaching-performance assessment with an instructor role and O*NET Instructing alignment.",
33459
+ spec: "obv3",
33460
+ profile: "generic",
33461
+ features: ["evidence", "alignment", "results", "expiration"],
33462
+ source: "synthetic",
33463
+ signed: false,
33464
+ validity: "valid",
33465
+ validator: UnsignedAchievementCredentialValidator21,
33466
+ tags: ["food-safety", "instructor", "role-scope"],
33467
+ credential: {
33468
+ "@context": [
33469
+ "https://www.w3.org/ns/credentials/v2",
33470
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
33471
+ ],
33472
+ id: "urn:uuid:04adda59-747f-5d5b-b287-1a9b1943b2ba",
33473
+ type: ["VerifiableCredential", "OpenBadgeCredential"],
33474
+ name: "Teaching Food allergen control \u2014 facilitator performance",
33475
+ description: "Train a simulated food-preparation team on cross-contact communication in a fictional order. Assesses teaching performance; independent learner skill is outside this assessment.",
33476
+ issuer: {
33477
+ id: "did:example:lc2184-cedar-training",
33478
+ type: ["Profile"],
33479
+ name: "Cedar Technical Training",
33480
+ url: "https://cedar-training.example"
33481
+ },
33482
+ validFrom: "2026-09-01T00:00:00Z",
33483
+ validUntil: "2028-09-01T00:00:00Z",
33484
+ credentialSubject: {
33485
+ id: "https://fixtures.example.org/frenchfry/personas/d56d0c592ac6",
33486
+ type: ["AchievementSubject"],
33487
+ achievement: {
33488
+ id: "https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/facilitator",
33489
+ type: ["Achievement"],
33490
+ achievementType: "Assessment",
33491
+ name: "Teaching Food allergen control \u2014 facilitator performance",
33492
+ description: "Train a simulated food-preparation team on cross-contact communication in a fictional order. Assesses teaching performance; independent learner skill is outside this assessment.",
33493
+ criteria: {
33494
+ narrative: "Use a shared-tool counterexample and observe whether the team escalates uncertainty without making medical claims."
33495
+ },
33496
+ fieldOfStudy: "vocational",
33497
+ inLanguage: "en",
33498
+ tag: ["vocational", "Food allergen control", "instructor"],
33499
+ resultDescription: [
33500
+ {
33501
+ id: "https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/facilitator/rubric",
33502
+ type: ["ResultDescription"],
33503
+ name: "Instruction performance",
33504
+ resultType: "PerformanceLevel",
33505
+ allowedValue: ["Developing", "Proficient", "Advanced"],
33506
+ requiredValue: "Proficient"
33507
+ }
33508
+ ],
33509
+ alignment: [
33510
+ {
33511
+ type: ["Alignment"],
33512
+ targetName: "Instructing",
33513
+ targetUrl: "https://www.onetcenter.org/ctdlasn/resources/ce-07c266f7-9119-11e8-b852-782bcb5df6ac",
33514
+ targetFramework: "O*NET Content Model Worker Requirements - Transferable Skills: U.S. Department of Labor (DOL)",
33515
+ targetDescription: "Teaching others how to do something.",
33516
+ targetType: "ceasn:Competency",
33517
+ targetCode: "2.B.1.e"
33518
+ }
33519
+ ]
33520
+ },
33521
+ role: "instructor",
33522
+ narrative: "Assesses teaching performance; independent learner skill is outside this assessment.",
33523
+ activityStartDate: "2026-08-01T00:00:00Z",
33524
+ activityEndDate: "2026-08-31T00:00:00Z",
33525
+ result: [
33526
+ {
33527
+ type: ["Result"],
33528
+ resultDescription: "https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/facilitator/rubric",
33529
+ value: "Proficient",
33530
+ status: "Completed"
33531
+ }
33532
+ ]
33533
+ },
33534
+ evidence: [
33535
+ {
33536
+ id: "https://fixtures.example.org/frenchfry/evidence/d56d0c592ac6/facilitator",
33537
+ type: ["Evidence"],
33538
+ name: "Cross-contact training tabletop and communication rubric",
33539
+ description: "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.",
33540
+ narrative: "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.",
33541
+ genre: "Portfolio",
33542
+ audience: "Assessors"
33543
+ }
33544
+ ]
33545
+ }
33546
+ };
33547
+
33548
+ // src/fixtures/obv3/food-allergen-practice-fr.ts
33549
+ import { UnsignedAchievementCredentialValidator as UnsignedAchievementCredentialValidator22 } from "@learncard/types";
33550
+ var obv3FoodAllergenPracticeFr = {
33551
+ id: "obv3/food-allergen-practice-fr",
33552
+ name: "Pr\xE9vention des contacts crois\xE9s avec des allerg\xE8nes",
33553
+ description: "French counterpart of the food-allergen practice assessment, retaining its RubricScore and alignment.",
33554
+ spec: "obv3",
33555
+ profile: "generic",
33556
+ features: ["evidence", "alignment", "results", "expiration"],
33557
+ source: "synthetic",
33558
+ signed: false,
33559
+ validity: "valid",
33560
+ validator: UnsignedAchievementCredentialValidator22,
33561
+ tags: ["food-safety", "rubric-score", "french", "localization", "learner"],
33562
+ credential: {
33563
+ "@context": [
33564
+ "https://www.w3.org/ns/credentials/v2",
33565
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
33566
+ ],
33567
+ id: "urn:uuid:14adf3a3-43d2-5271-90be-9812f906deef",
33568
+ type: ["VerifiableCredential", "OpenBadgeCredential"],
33569
+ name: "Pr\xE9vention des contacts crois\xE9s avec des allerg\xE8nes",
33570
+ description: "\xC9valuation d'un exercice de pr\xE9vention des contacts crois\xE9s avec des allerg\xE8nes.",
33571
+ issuer: {
33572
+ id: "did:example:lc2184-cedar-training",
33573
+ type: ["Profile"],
33574
+ name: "Cedar Technical Training",
33575
+ url: "https://cedar-training.example"
33576
+ },
33577
+ validFrom: "2026-09-01T00:00:00Z",
33578
+ validUntil: "2028-09-01T00:00:00Z",
33579
+ credentialSubject: {
33580
+ id: "https://fixtures.example.org/frenchfry/personas/d56d0c592ac6",
33581
+ type: ["AchievementSubject"],
33582
+ achievement: {
33583
+ id: "https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/practice/fr",
33584
+ type: ["Achievement"],
33585
+ achievementType: "Assessment",
33586
+ name: "Pr\xE9vention des contacts crois\xE9s avec des allerg\xE8nes",
33587
+ description: "Planifie la pr\xE9paration d'une commande fictive dans un exercice de cuisine simul\xE9.",
33588
+ criteria: {
33589
+ narrative: "Rep\xE8re les possibilit\xE9s de contact crois\xE9, pr\xE9cise les \xE9tapes de communication et signale les incertitudes sans faire de diagnostic m\xE9dical."
33590
+ },
33591
+ fieldOfStudy: "vocational",
33592
+ inLanguage: "fr",
33593
+ tag: ["vocational", "Food allergen control", "learner"],
33594
+ resultDescription: [
33595
+ {
33596
+ id: "https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/practice/fr/rubric",
33597
+ type: ["ResultDescription"],
33598
+ name: "Points de la grille d'observation",
33599
+ resultType: "RubricScore",
33600
+ valueMin: "0",
33601
+ valueMax: "4",
33602
+ requiredValue: "3"
33603
+ }
33604
+ ],
33605
+ alignment: [
33606
+ {
33607
+ type: ["Alignment"],
33608
+ targetName: "food safety principles",
33609
+ targetUrl: "http://data.europa.eu/esco/skill/3f4e4eab-a8e0-4aed-b8bb-79afe7c890e3",
33610
+ targetFramework: "ESCO (requested dataset v1.2.0)",
33611
+ targetDescription: "Scientific background of food safety which includes preparation, handling, and storage of food to minimise the risk of foodborne illness and other health hazards."
33612
+ }
33613
+ ]
33614
+ },
33615
+ role: "learner",
33616
+ narrative: "Planifie la pr\xE9paration d'une commande fictive dans un exercice de cuisine simul\xE9.",
33617
+ activityStartDate: "2026-08-01T00:00:00Z",
33618
+ activityEndDate: "2026-08-31T00:00:00Z",
33619
+ result: [
33620
+ {
33621
+ type: ["Result"],
33622
+ resultDescription: "https://fixtures.example.org/frenchfry/achievements/d56d0c592ac6/practice/fr/rubric",
33623
+ value: "4",
33624
+ status: "Completed"
33625
+ }
33626
+ ]
33627
+ },
33628
+ evidence: [
33629
+ {
33630
+ id: "https://fixtures.example.org/frenchfry/evidence/d56d0c592ac6/practice/fr",
33631
+ type: ["Evidence"],
33632
+ name: "Liste de contr\xF4le et compte rendu d'un exercice de simulation",
33633
+ description: "Planifie la pr\xE9paration d'une commande fictive dans un exercice de cuisine simul\xE9.",
33634
+ narrative: "Planifie la pr\xE9paration d'une commande fictive dans un exercice de cuisine simul\xE9.",
33635
+ genre: "Compte rendu d'observation",
33636
+ audience: "\xC9valuateurs"
33637
+ }
33638
+ ]
33639
+ }
33640
+ };
33641
+
33642
+ // src/fixtures/obv3/phishing-transfer.ts
33643
+ import { UnsignedAchievementCredentialValidator as UnsignedAchievementCredentialValidator23 } from "@learncard/types";
33644
+ var obv3PhishingTransfer = {
33645
+ id: "obv3/phishing-transfer",
33646
+ name: "Phishing Recognition Transfer Project",
33647
+ description: "Independent project with an achieved-level-only rubric result and a separate RawScore result.",
33648
+ spec: "obv3",
33649
+ profile: "micro-credential",
33650
+ features: ["evidence", "alignment", "results", "expiration"],
33651
+ source: "synthetic",
33652
+ signed: false,
33653
+ validity: "valid",
33654
+ validator: UnsignedAchievementCredentialValidator23,
33655
+ tags: ["phishing", "mixed-results", "achieved-level-only", "learner"],
33656
+ credential: {
33657
+ "@context": [
33658
+ "https://www.w3.org/ns/credentials/v2",
33659
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
33660
+ ],
33661
+ id: "urn:uuid:670ef7c6-b8de-532c-9667-9817a0c942e8",
33662
+ type: ["VerifiableCredential", "OpenBadgeCredential"],
33663
+ name: "Phishing recognition \u2014 independent transfer project",
33664
+ description: "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.",
33665
+ issuer: {
33666
+ id: "did:example:issuer123",
33667
+ type: ["Profile"],
33668
+ name: "Tech Academy",
33669
+ url: "https://techacademy.example.com"
33670
+ },
33671
+ validFrom: "2026-09-01T00:00:00Z",
33672
+ validUntil: "2028-09-01T00:00:00Z",
33673
+ credentialSubject: {
33674
+ id: "https://fixtures.example.org/frenchfry/personas/ddf7bc68efd4",
33675
+ type: ["AchievementSubject"],
33676
+ achievement: {
33677
+ id: "https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer",
33678
+ type: ["Achievement"],
33679
+ achievementType: "MicroCredential",
33680
+ name: "Phishing recognition \u2014 independent transfer project",
33681
+ description: "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.",
33682
+ criteria: {
33683
+ narrative: "Identify cues without following links or sharing secrets; compare two alternative approaches and justify one under time and resource constraints."
33684
+ },
33685
+ fieldOfStudy: "technology",
33686
+ inLanguage: "en",
33687
+ tag: ["technology", "Phishing recognition", "learner"],
33688
+ resultDescription: [
33689
+ {
33690
+ id: "https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric",
33691
+ type: ["ResultDescription"],
33692
+ name: "Independent transfer rubric",
33693
+ resultType: "RubricCriterionLevel",
33694
+ requiredLevel: "https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric/proficient",
33695
+ rubricCriterionLevel: [
33696
+ {
33697
+ id: "https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric/developing",
33698
+ type: ["RubricCriterionLevel"],
33699
+ name: "Developing",
33700
+ level: "1",
33701
+ description: "Needs support to complete: Adapt this task to a new fictional setting: Classify synthetic suspicious email examples",
33702
+ points: "1"
33703
+ },
33704
+ {
33705
+ id: "https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric/proficient",
33706
+ type: ["RubricCriterionLevel"],
33707
+ name: "Proficient",
33708
+ level: "2",
33709
+ description: "Meets the task criterion: Identify cues without following links or sharing secrets; compare two alternative approaches and justify one under time and resource constraints.",
33710
+ points: "2"
33711
+ },
33712
+ {
33713
+ id: "https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric/advanced",
33714
+ type: ["RubricCriterionLevel"],
33715
+ name: "Advanced",
33716
+ level: "3",
33717
+ description: "Meets criterion and explains limits and alternative approaches.",
33718
+ points: "3"
33719
+ }
33720
+ ]
33721
+ },
33722
+ {
33723
+ id: "https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric/functional-checks",
33724
+ type: ["ResultDescription"],
33725
+ name: "Simulated functional acceptance checks",
33726
+ resultType: "RawScore",
33727
+ valueMin: "0",
33728
+ valueMax: "10",
33729
+ requiredValue: "8"
33730
+ }
33731
+ ],
33732
+ alignment: [
33733
+ {
33734
+ type: ["Alignment"],
33735
+ targetName: "Critical Thinking",
33736
+ targetUrl: "https://www.onetcenter.org/ctdlasn/resources/ce-07c26361-9119-11e8-b852-782bcb5df6ac",
33737
+ targetFramework: "O*NET Content Model Worker Requirements - Essential Skills: U.S. Department of Labor (DOL)",
33738
+ targetDescription: "Using logic and reasoning to identify the strengths and weaknesses of alternative solutions, conclusions, or approaches to problems.",
33739
+ targetType: "ceasn:Competency",
33740
+ targetCode: "2.A.2.a"
33741
+ }
33742
+ ]
33743
+ },
33744
+ role: "learner",
33745
+ narrative: "Complete an independently planned transfer project, recording assumptions, an initial failed approach and a supported revision.",
33746
+ activityStartDate: "2026-08-01T00:00:00Z",
33747
+ activityEndDate: "2026-08-31T00:00:00Z",
33748
+ result: [
33749
+ {
33750
+ type: ["Result"],
33751
+ resultDescription: "https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric",
33752
+ achievedLevel: "https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric/proficient",
33753
+ status: "Completed"
33754
+ },
33755
+ {
33756
+ type: ["Result"],
33757
+ resultDescription: "https://fixtures.example.org/frenchfry/achievements/ddf7bc68efd4/transfer/rubric/functional-checks",
33758
+ value: "9",
33759
+ status: "Completed"
33760
+ }
33761
+ ]
33762
+ },
33763
+ evidence: [
33764
+ {
33765
+ id: "https://fixtures.example.org/frenchfry/evidence/ddf7bc68efd4/transfer",
33766
+ type: ["Evidence"],
33767
+ name: "Independent project dossier; Classification worksheet and explanation",
33768
+ description: "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.",
33769
+ narrative: "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.",
33770
+ genre: "Portfolio",
33771
+ audience: "Assessors"
33772
+ },
33773
+ {
33774
+ id: "https://fixtures.example.org/frenchfry/evidence/ddf7bc68efd4/transfer-review",
33775
+ type: ["Evidence"],
33776
+ name: "Revision and peer critique record",
33777
+ narrative: "An initial approach was reviewed; the learner documented assumptions, evaluated an alternative and revised the work.",
33778
+ genre: "Reflective critique"
33779
+ }
33780
+ ]
33781
+ }
33782
+ };
33783
+
33784
+ // src/fixtures/custom/course-enrollment.ts
33785
+ import { UnsignedVCValidator as UnsignedVCValidator10 } from "@learncard/types";
33786
+ var customCourseEnrollment = {
33787
+ id: "custom/course-enrollment",
33788
+ name: "Course Enrollment",
33789
+ description: "Administrative course enrollment claim without completion, assessment, or skill attainment.",
33790
+ spec: "custom",
33791
+ profile: "generic",
33792
+ features: ["expiration"],
33793
+ source: "synthetic",
33794
+ signed: false,
33795
+ validity: "valid",
33796
+ validator: UnsignedVCValidator10,
33797
+ tags: ["enrollment", "administrative", "non-achievement"],
33798
+ credential: {
33799
+ "@context": [
33800
+ "https://www.w3.org/ns/credentials/v2",
33801
+ {
33802
+ designation: "https://fixtures.example.org/frenchfry/vocab/designation",
33803
+ claimScope: "https://fixtures.example.org/frenchfry/vocab/claimScope",
33804
+ claimRole: "https://fixtures.example.org/frenchfry/vocab/claimRole",
33805
+ Profile: "https://purl.imsglobal.org/spec/vc/ob/vocab.html#Profile",
33806
+ url: {
33807
+ "@id": "https://schema.org/url",
33808
+ "@type": "https://www.w3.org/2001/XMLSchema#anyURI"
33809
+ },
33810
+ CourseEnrollmentCredential: "https://fixtures.example.org/frenchfry/vocab/CourseEnrollmentCredential"
33811
+ }
33812
+ ],
33813
+ id: "urn:uuid:6ea43ad2-3fb5-55dd-aee8-6380b7ec0725",
33814
+ type: ["VerifiableCredential", "CourseEnrollmentCredential"],
33815
+ issuer: {
33816
+ id: "did:web:registrar.metropolis-university-example.edu",
33817
+ type: ["Profile"],
33818
+ name: "Metropolis University \u2013 Office of the Registrar",
33819
+ url: "https://metropolis-university-example.edu"
33820
+ },
33821
+ validFrom: "2026-09-01T00:00:00Z",
33822
+ validUntil: "2027-09-01T00:00:00Z",
33823
+ name: "Course Enrollment",
33824
+ description: "Administrative course enrollment claim without completion, assessment, or skill attainment.",
33825
+ credentialSubject: {
33826
+ id: "https://fixtures.example.org/frenchfry/personas/admin-5",
33827
+ designation: "Course enrollment",
33828
+ claimRole: "student",
33829
+ claimScope: "Enrollment in a fictional database course"
33830
+ }
33831
+ }
33832
+ };
33833
+
33834
+ // src/fixtures/custom/exam-accommodation.ts
33835
+ import { UnsignedVCValidator as UnsignedVCValidator11 } from "@learncard/types";
33836
+ var customExamAccommodation = {
33837
+ id: "custom/exam-accommodation",
33838
+ name: "Extended Exam Time",
33839
+ description: "Administrative exam accommodation claim without a diagnosis or assessed achievement.",
33840
+ spec: "custom",
33841
+ profile: "generic",
33842
+ features: ["expiration"],
33843
+ source: "synthetic",
33844
+ signed: false,
33845
+ validity: "valid",
33846
+ validator: UnsignedVCValidator11,
33847
+ tags: ["accommodation", "administrative", "non-achievement"],
33848
+ credential: {
33849
+ "@context": [
33850
+ "https://www.w3.org/ns/credentials/v2",
33851
+ {
33852
+ designation: "https://fixtures.example.org/frenchfry/vocab/designation",
33853
+ claimScope: "https://fixtures.example.org/frenchfry/vocab/claimScope",
33854
+ claimRole: "https://fixtures.example.org/frenchfry/vocab/claimRole",
33855
+ Profile: "https://purl.imsglobal.org/spec/vc/ob/vocab.html#Profile",
33856
+ url: {
33857
+ "@id": "https://schema.org/url",
33858
+ "@type": "https://www.w3.org/2001/XMLSchema#anyURI"
33859
+ },
33860
+ ExamAccommodationCredential: "https://fixtures.example.org/frenchfry/vocab/ExamAccommodationCredential"
33861
+ }
33862
+ ],
33863
+ id: "urn:uuid:0e341ee2-6006-51b9-a559-62d7ac21a4e1",
33864
+ type: ["VerifiableCredential", "ExamAccommodationCredential"],
33865
+ issuer: {
33866
+ id: "did:web:university-example.edu",
33867
+ type: ["Profile"],
33868
+ name: "State University",
33869
+ url: "https://university-example.edu"
33870
+ },
33871
+ validFrom: "2026-09-01T00:00:00Z",
33872
+ validUntil: "2027-09-01T00:00:00Z",
33873
+ name: "Extended Exam Time",
33874
+ description: "Administrative exam accommodation claim without a diagnosis or assessed achievement.",
33875
+ credentialSubject: {
33876
+ id: "https://fixtures.example.org/frenchfry/personas/admin-20",
33877
+ designation: "Extended exam time",
33878
+ claimRole: "recipient",
33879
+ claimScope: "Fictional extra time provision; no diagnosis included"
33880
+ }
33881
+ }
33882
+ };
33883
+
33884
+ // src/fixtures/clr/mixed-role-portfolio.ts
33885
+ import { UnsignedClrCredentialValidator as UnsignedClrCredentialValidator5 } from "@learncard/types";
33886
+ var clrMixedRolePortfolio = {
33887
+ id: "clr/mixed-role-portfolio",
33888
+ name: "Quadratic Modeling and Statistical Sampling Portfolio",
33889
+ description: "CLR collection with two learner assessments, one instructor assessment, and scalar Association types.",
33890
+ spec: "clr-v2",
33891
+ profile: "learner-record",
33892
+ features: [
33893
+ "evidence",
33894
+ "alignment",
33895
+ "results",
33896
+ "expiration",
33897
+ "associations",
33898
+ "nested-credentials"
33899
+ ],
33900
+ source: "synthetic",
33901
+ signed: false,
33902
+ validity: "valid",
33903
+ validator: UnsignedClrCredentialValidator5,
33904
+ tags: ["portfolio", "mixed-role", "canonical-associations", "achievement-ids"],
33905
+ credential: {
33906
+ "@context": [
33907
+ "https://www.w3.org/ns/credentials/v2",
33908
+ "https://purl.imsglobal.org/spec/clr/v2p0/context.json",
33909
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
33910
+ ],
33911
+ id: "urn:uuid:47213155-4246-5f73-bcf4-54776e488e21",
33912
+ type: ["VerifiableCredential", "ClrCredential"],
33913
+ name: "Quadratic Modeling and Statistical Sampling Portfolio",
33914
+ description: "Portfolio of quadratic modeling practice, statistical sampling transfer, and teaching performance.",
33915
+ issuer: {
33916
+ id: "did:example:communitycollegeXYZ",
33917
+ type: ["Profile"],
33918
+ name: "Community College XYZ",
33919
+ url: "https://ccxyz.example.edu"
33920
+ },
33921
+ validFrom: "2026-09-02T00:00:00Z",
33922
+ credentialSubject: {
33923
+ id: "https://fixtures.example.org/frenchfry/personas/b8aecbfaee47",
33924
+ type: ["ClrSubject"],
33925
+ verifiableCredential: [
33926
+ {
33927
+ "@context": [
33928
+ "https://www.w3.org/ns/credentials/v2",
33929
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
33930
+ ],
33931
+ id: "urn:uuid:a70a3561-5b59-56ef-95c3-fba84bf4dbb6",
33932
+ type: ["VerifiableCredential", "OpenBadgeCredential"],
33933
+ name: "Quadratic modeling \u2014 observed practice",
33934
+ description: "Fit a parabola to a simulated projectile dataset. Demonstrate a controlled practice task with observer feedback.",
33935
+ issuer: {
33936
+ id: "did:example:communitycollegeXYZ",
33937
+ type: ["Profile"],
33938
+ name: "Community College XYZ",
33939
+ url: "https://ccxyz.example.edu"
33940
+ },
33941
+ validFrom: "2026-09-01T00:00:00Z",
33942
+ validUntil: "2028-09-01T00:00:00Z",
33943
+ credentialSubject: {
33944
+ id: "https://fixtures.example.org/frenchfry/personas/b8aecbfaee47",
33945
+ type: ["AchievementSubject"],
33946
+ achievement: {
33947
+ id: "https://fixtures.example.org/frenchfry/achievements/b8aecbfaee47/practice",
33948
+ type: ["Achievement"],
33949
+ achievementType: "Assessment",
33950
+ name: "Quadratic modeling \u2014 observed practice",
33951
+ description: "Fit a parabola to a simulated projectile dataset. Demonstrate a controlled practice task with observer feedback.",
33952
+ criteria: {
33953
+ narrative: "Report residuals and explain the valid time domain"
33954
+ },
33955
+ fieldOfStudy: "education",
33956
+ inLanguage: "en",
33957
+ tag: ["education", "Quadratic modeling", "learner"],
33958
+ resultDescription: [
33959
+ {
33960
+ id: "https://fixtures.example.org/frenchfry/achievements/b8aecbfaee47/practice/rubric",
33961
+ type: ["ResultDescription"],
33962
+ name: "Simulated performance rubric",
33963
+ resultType: "Percent",
33964
+ valueMin: "0",
33965
+ valueMax: "100",
33966
+ requiredValue: "80"
33967
+ }
33968
+ ]
33969
+ },
33970
+ role: "learner",
33971
+ narrative: "Demonstrate a controlled practice task with observer feedback.",
33972
+ activityStartDate: "2026-08-01T00:00:00Z",
33973
+ activityEndDate: "2026-08-31T00:00:00Z",
33974
+ result: [
33975
+ {
33976
+ type: ["Result"],
33977
+ resultDescription: "https://fixtures.example.org/frenchfry/achievements/b8aecbfaee47/practice/rubric",
33978
+ value: "86",
33979
+ status: "Completed"
33980
+ }
33981
+ ]
33982
+ },
33983
+ evidence: [
33984
+ {
33985
+ id: "https://fixtures.example.org/frenchfry/evidence/b8aecbfaee47/practice",
33986
+ type: ["Evidence"],
33987
+ name: "Model notebook and residual plot",
33988
+ description: "Fit a parabola to a simulated projectile dataset; evaluation considered: Report residuals and explain the valid time domain",
33989
+ narrative: "Fit a parabola to a simulated projectile dataset; evaluation considered: Report residuals and explain the valid time domain",
33990
+ genre: "Observation record",
33991
+ audience: "Assessors"
33992
+ }
33993
+ ]
33994
+ },
33995
+ {
33996
+ "@context": [
33997
+ "https://www.w3.org/ns/credentials/v2",
33998
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
33999
+ ],
34000
+ id: "urn:uuid:16476c98-56e6-5d0e-96dc-9ab47f234874",
34001
+ type: ["VerifiableCredential", "OpenBadgeCredential"],
34002
+ name: "Statistical sampling \u2014 independent transfer project",
34003
+ description: "Adapt this task to a new fictional setting: Design a stratified survey for a fictional school. Complete an independently planned transfer project, recording assumptions, an initial failed approach and a supported revision.",
34004
+ issuer: {
34005
+ id: "did:example:communitycollegeXYZ",
34006
+ type: ["Profile"],
34007
+ name: "Community College XYZ",
34008
+ url: "https://ccxyz.example.edu"
34009
+ },
34010
+ validFrom: "2026-09-01T00:00:00Z",
34011
+ validUntil: "2028-09-01T00:00:00Z",
34012
+ credentialSubject: {
34013
+ id: "https://fixtures.example.org/frenchfry/personas/b8aecbfaee47",
34014
+ type: ["AchievementSubject"],
34015
+ achievement: {
34016
+ id: "https://fixtures.example.org/frenchfry/achievements/c573cf61265a/transfer",
34017
+ type: ["Achievement"],
34018
+ achievementType: "Course",
34019
+ name: "Statistical sampling \u2014 independent transfer project",
34020
+ description: "Adapt this task to a new fictional setting: Design a stratified survey for a fictional school. Complete an independently planned transfer project, recording assumptions, an initial failed approach and a supported revision.",
34021
+ criteria: {
34022
+ narrative: "Identify population, sampling frame and two bias risks; compare two alternative approaches and justify one under time and resource constraints."
34023
+ },
34024
+ fieldOfStudy: "education",
34025
+ inLanguage: "en",
34026
+ tag: ["education", "Statistical sampling", "learner"],
34027
+ resultDescription: [
34028
+ {
34029
+ id: "https://fixtures.example.org/frenchfry/achievements/c573cf61265a/transfer/rubric",
34030
+ type: ["ResultDescription"],
34031
+ name: "Independent transfer rubric",
34032
+ resultType: "RubricCriterionLevel",
34033
+ requiredLevel: "https://fixtures.example.org/frenchfry/achievements/c573cf61265a/transfer/rubric/proficient",
34034
+ rubricCriterionLevel: [
34035
+ {
34036
+ id: "https://fixtures.example.org/frenchfry/achievements/c573cf61265a/transfer/rubric/developing",
34037
+ type: ["RubricCriterionLevel"],
34038
+ name: "Developing",
34039
+ level: "1",
34040
+ description: "Needs support to complete: Adapt this task to a new fictional setting: Design a stratified survey for a fictional school",
34041
+ points: "1"
34042
+ },
34043
+ {
34044
+ id: "https://fixtures.example.org/frenchfry/achievements/c573cf61265a/transfer/rubric/proficient",
34045
+ type: ["RubricCriterionLevel"],
34046
+ name: "Proficient",
34047
+ level: "2",
34048
+ description: "Meets the task criterion: Identify population, sampling frame and two bias risks; compare two alternative approaches and justify one under time and resource constraints.",
34049
+ points: "2"
34050
+ },
34051
+ {
34052
+ id: "https://fixtures.example.org/frenchfry/achievements/c573cf61265a/transfer/rubric/advanced",
34053
+ type: ["RubricCriterionLevel"],
34054
+ name: "Advanced",
34055
+ level: "3",
34056
+ description: "Meets criterion and explains limits and alternative approaches.",
34057
+ points: "3"
34058
+ }
34059
+ ]
34060
+ }
34061
+ ],
34062
+ alignment: [
34063
+ {
34064
+ type: ["Alignment"],
34065
+ targetName: "statistics",
34066
+ targetUrl: "http://data.europa.eu/esco/skill/7ee4c2ea-b349-4bd2-81a3-ec31475d4833",
34067
+ targetFramework: "ESCO (requested dataset v1.2.0)",
34068
+ targetDescription: "The study of statistical theory, methods and practices such as collection, organisation, analysis, interpretation and presentation of data. It deals with all aspects of data including the planning of data collection in terms of the design of surveys and experiments in order to forecast and plan work-related activities."
34069
+ }
34070
+ ],
34071
+ creditsAvailable: 2
34072
+ },
34073
+ role: "learner",
34074
+ narrative: "Complete an independently planned transfer project, recording assumptions, an initial failed approach and a supported revision.",
34075
+ activityStartDate: "2026-08-01T00:00:00Z",
34076
+ activityEndDate: "2026-08-31T00:00:00Z",
34077
+ result: [
34078
+ {
34079
+ type: ["Result"],
34080
+ resultDescription: "https://fixtures.example.org/frenchfry/achievements/c573cf61265a/transfer/rubric",
34081
+ achievedLevel: "https://fixtures.example.org/frenchfry/achievements/c573cf61265a/transfer/rubric/proficient",
34082
+ status: "Completed"
34083
+ }
34084
+ ],
34085
+ creditsEarned: 2,
34086
+ term: "Synthetic Fall 2026"
34087
+ },
34088
+ evidence: [
34089
+ {
34090
+ id: "https://fixtures.example.org/frenchfry/evidence/c573cf61265a/transfer",
34091
+ type: ["Evidence"],
34092
+ name: "Independent project dossier; Sampling plan and response audit",
34093
+ description: "Adapt this task to a new fictional setting: Design a stratified survey for a fictional school; evaluation considered: Identify population, sampling frame and two bias risks; compare two alternative approaches and justify one under time and resource constraints.",
34094
+ narrative: "Adapt this task to a new fictional setting: Design a stratified survey for a fictional school; evaluation considered: Identify population, sampling frame and two bias risks; compare two alternative approaches and justify one under time and resource constraints.",
34095
+ genre: "Portfolio",
34096
+ audience: "Assessors"
34097
+ },
34098
+ {
34099
+ id: "https://fixtures.example.org/frenchfry/evidence/c573cf61265a/transfer-review",
34100
+ type: ["Evidence"],
34101
+ name: "Revision and peer critique record",
34102
+ narrative: "An initial approach was reviewed; the learner documented assumptions, evaluated an alternative and revised the work.",
34103
+ genre: "Reflective critique"
34104
+ }
34105
+ ]
34106
+ },
34107
+ {
34108
+ "@context": [
34109
+ "https://www.w3.org/ns/credentials/v2",
34110
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
34111
+ ],
34112
+ id: "urn:uuid:b2aadaa8-c127-5a89-b4d0-c7f20f4da0df",
34113
+ type: ["VerifiableCredential", "OpenBadgeCredential"],
34114
+ name: "Teaching Quadratic modeling \u2014 facilitator performance",
34115
+ description: "Facilitate a simulated novice task: Fit a parabola to a simulated projectile dataset. Assesses teaching performance; independent learner skill is outside this assessment.",
34116
+ issuer: {
34117
+ id: "did:example:communitycollegeXYZ",
34118
+ type: ["Profile"],
34119
+ name: "Community College XYZ",
34120
+ url: "https://ccxyz.example.edu"
34121
+ },
34122
+ validFrom: "2026-09-01T00:00:00Z",
34123
+ validUntil: "2028-09-01T00:00:00Z",
34124
+ credentialSubject: {
34125
+ id: "https://fixtures.example.org/frenchfry/personas/b8aecbfaee47",
34126
+ type: ["AchievementSubject"],
34127
+ achievement: {
34128
+ id: "https://fixtures.example.org/frenchfry/achievements/b8aecbfaee47/facilitator",
34129
+ type: ["Achievement"],
34130
+ achievementType: "Assessment",
34131
+ name: "Teaching Quadratic modeling \u2014 facilitator performance",
34132
+ description: "Facilitate a simulated novice task: Fit a parabola to a simulated projectile dataset. Assesses teaching performance; independent learner skill is outside this assessment.",
34133
+ criteria: {
34134
+ narrative: "Coach the novice to explain and apply this task criterion: Report residuals and explain the valid time domain. Use an error example, ask for a revised attempt and distinguish this learning task from Linear regression."
34135
+ },
34136
+ fieldOfStudy: "education",
34137
+ inLanguage: "en",
34138
+ tag: ["education", "Quadratic modeling", "instructor"],
34139
+ resultDescription: [
34140
+ {
34141
+ id: "https://fixtures.example.org/frenchfry/achievements/b8aecbfaee47/facilitator/rubric",
34142
+ type: ["ResultDescription"],
34143
+ name: "Instruction performance",
34144
+ resultType: "PerformanceLevel",
34145
+ allowedValue: ["Developing", "Proficient", "Advanced"],
34146
+ requiredValue: "Proficient"
34147
+ }
34148
+ ],
34149
+ alignment: [
34150
+ {
34151
+ type: ["Alignment"],
34152
+ targetName: "Instructing",
34153
+ targetUrl: "https://www.onetcenter.org/ctdlasn/resources/ce-07c266f7-9119-11e8-b852-782bcb5df6ac",
34154
+ targetFramework: "O*NET Content Model Worker Requirements - Transferable Skills: U.S. Department of Labor (DOL)",
34155
+ targetDescription: "Teaching others how to do something.",
34156
+ targetType: "ceasn:Competency",
34157
+ targetCode: "2.B.1.e"
34158
+ }
34159
+ ]
34160
+ },
34161
+ role: "instructor",
34162
+ narrative: "Assesses teaching performance; independent learner skill is outside this assessment.",
34163
+ activityStartDate: "2026-08-01T00:00:00Z",
34164
+ activityEndDate: "2026-08-31T00:00:00Z",
34165
+ result: [
34166
+ {
34167
+ type: ["Result"],
34168
+ resultDescription: "https://fixtures.example.org/frenchfry/achievements/b8aecbfaee47/facilitator/rubric",
34169
+ value: "Proficient",
34170
+ status: "Completed"
34171
+ }
34172
+ ]
34173
+ },
34174
+ evidence: [
34175
+ {
34176
+ id: "https://fixtures.example.org/frenchfry/evidence/b8aecbfaee47/facilitator",
34177
+ type: ["Evidence"],
34178
+ name: "Instructional worked example based on Model notebook and residual plot; simulated teach-back and observer critique",
34179
+ description: "Facilitate a simulated novice task: Fit a parabola to a simulated projectile dataset; evaluation considered: Coach the novice to explain and apply this task criterion: Report residuals and explain the valid time domain. Use an error example, ask for a revised attempt and distinguish this learning task from Linear regression.",
34180
+ narrative: "Facilitate a simulated novice task: Fit a parabola to a simulated projectile dataset; evaluation considered: Coach the novice to explain and apply this task criterion: Report residuals and explain the valid time domain. Use an error example, ask for a revised attempt and distinguish this learning task from Linear regression.",
34181
+ genre: "Portfolio",
34182
+ audience: "Assessors"
34183
+ }
34184
+ ]
34185
+ }
34186
+ ],
34187
+ achievement: [
34188
+ {
34189
+ id: "https://fixtures.example.org/frenchfry/achievements/b8aecbfaee47/practice",
34190
+ type: ["Achievement"],
34191
+ achievementType: "Assessment",
34192
+ name: "Quadratic modeling \u2014 observed practice",
34193
+ description: "Fit a parabola to a simulated projectile dataset. Demonstrate a controlled practice task with observer feedback.",
34194
+ criteria: {
34195
+ narrative: "Report residuals and explain the valid time domain"
34196
+ },
34197
+ fieldOfStudy: "education",
34198
+ inLanguage: "en",
34199
+ tag: ["education", "Quadratic modeling", "learner"],
34200
+ resultDescription: [
34201
+ {
34202
+ id: "https://fixtures.example.org/frenchfry/achievements/b8aecbfaee47/practice/rubric",
34203
+ type: ["ResultDescription"],
34204
+ name: "Simulated performance rubric",
34205
+ resultType: "Percent",
34206
+ valueMin: "0",
34207
+ valueMax: "100",
34208
+ requiredValue: "80"
34209
+ }
34210
+ ]
34211
+ },
34212
+ {
34213
+ id: "https://fixtures.example.org/frenchfry/achievements/c573cf61265a/transfer",
34214
+ type: ["Achievement"],
34215
+ achievementType: "Course",
34216
+ name: "Statistical sampling \u2014 independent transfer project",
34217
+ description: "Adapt this task to a new fictional setting: Design a stratified survey for a fictional school. Complete an independently planned transfer project, recording assumptions, an initial failed approach and a supported revision.",
34218
+ criteria: {
34219
+ narrative: "Identify population, sampling frame and two bias risks; compare two alternative approaches and justify one under time and resource constraints."
34220
+ },
34221
+ fieldOfStudy: "education",
34222
+ inLanguage: "en",
34223
+ tag: ["education", "Statistical sampling", "learner"],
34224
+ resultDescription: [
34225
+ {
34226
+ id: "https://fixtures.example.org/frenchfry/achievements/c573cf61265a/transfer/rubric",
34227
+ type: ["ResultDescription"],
34228
+ name: "Independent transfer rubric",
34229
+ resultType: "RubricCriterionLevel",
34230
+ requiredLevel: "https://fixtures.example.org/frenchfry/achievements/c573cf61265a/transfer/rubric/proficient",
34231
+ rubricCriterionLevel: [
34232
+ {
34233
+ id: "https://fixtures.example.org/frenchfry/achievements/c573cf61265a/transfer/rubric/developing",
34234
+ type: ["RubricCriterionLevel"],
34235
+ name: "Developing",
34236
+ level: "1",
34237
+ description: "Needs support to complete: Adapt this task to a new fictional setting: Design a stratified survey for a fictional school",
34238
+ points: "1"
34239
+ },
34240
+ {
34241
+ id: "https://fixtures.example.org/frenchfry/achievements/c573cf61265a/transfer/rubric/proficient",
34242
+ type: ["RubricCriterionLevel"],
34243
+ name: "Proficient",
34244
+ level: "2",
34245
+ description: "Meets the task criterion: Identify population, sampling frame and two bias risks; compare two alternative approaches and justify one under time and resource constraints.",
34246
+ points: "2"
34247
+ },
34248
+ {
34249
+ id: "https://fixtures.example.org/frenchfry/achievements/c573cf61265a/transfer/rubric/advanced",
34250
+ type: ["RubricCriterionLevel"],
34251
+ name: "Advanced",
34252
+ level: "3",
34253
+ description: "Meets criterion and explains limits and alternative approaches.",
34254
+ points: "3"
34255
+ }
34256
+ ]
34257
+ }
34258
+ ],
34259
+ alignment: [
34260
+ {
34261
+ type: ["Alignment"],
34262
+ targetName: "statistics",
34263
+ targetUrl: "http://data.europa.eu/esco/skill/7ee4c2ea-b349-4bd2-81a3-ec31475d4833",
34264
+ targetFramework: "ESCO (requested dataset v1.2.0)",
34265
+ targetDescription: "The study of statistical theory, methods and practices such as collection, organisation, analysis, interpretation and presentation of data. It deals with all aspects of data including the planning of data collection in terms of the design of surveys and experiments in order to forecast and plan work-related activities."
34266
+ }
34267
+ ],
34268
+ creditsAvailable: 2
34269
+ },
34270
+ {
34271
+ id: "https://fixtures.example.org/frenchfry/achievements/b8aecbfaee47/facilitator",
34272
+ type: ["Achievement"],
34273
+ achievementType: "Assessment",
34274
+ name: "Teaching Quadratic modeling \u2014 facilitator performance",
34275
+ description: "Facilitate a simulated novice task: Fit a parabola to a simulated projectile dataset. Assesses teaching performance; independent learner skill is outside this assessment.",
34276
+ criteria: {
34277
+ narrative: "Coach the novice to explain and apply this task criterion: Report residuals and explain the valid time domain. Use an error example, ask for a revised attempt and distinguish this learning task from Linear regression."
34278
+ },
34279
+ fieldOfStudy: "education",
34280
+ inLanguage: "en",
34281
+ tag: ["education", "Quadratic modeling", "instructor"],
34282
+ resultDescription: [
34283
+ {
34284
+ id: "https://fixtures.example.org/frenchfry/achievements/b8aecbfaee47/facilitator/rubric",
34285
+ type: ["ResultDescription"],
34286
+ name: "Instruction performance",
34287
+ resultType: "PerformanceLevel",
34288
+ allowedValue: ["Developing", "Proficient", "Advanced"],
34289
+ requiredValue: "Proficient"
34290
+ }
34291
+ ],
34292
+ alignment: [
34293
+ {
34294
+ type: ["Alignment"],
34295
+ targetName: "Instructing",
34296
+ targetUrl: "https://www.onetcenter.org/ctdlasn/resources/ce-07c266f7-9119-11e8-b852-782bcb5df6ac",
34297
+ targetFramework: "O*NET Content Model Worker Requirements - Transferable Skills: U.S. Department of Labor (DOL)",
34298
+ targetDescription: "Teaching others how to do something.",
34299
+ targetType: "ceasn:Competency",
34300
+ targetCode: "2.B.1.e"
34301
+ }
34302
+ ]
34303
+ }
34304
+ ],
34305
+ association: [
34306
+ {
34307
+ type: "Association",
34308
+ associationType: "isRelatedTo",
34309
+ sourceId: "https://fixtures.example.org/frenchfry/achievements/b8aecbfaee47/practice",
34310
+ targetId: "https://fixtures.example.org/frenchfry/achievements/c573cf61265a/transfer"
34311
+ },
34312
+ {
34313
+ type: "Association",
34314
+ associationType: "isRelatedTo",
34315
+ sourceId: "https://fixtures.example.org/frenchfry/achievements/c573cf61265a/transfer",
34316
+ targetId: "https://fixtures.example.org/frenchfry/achievements/b8aecbfaee47/facilitator"
34317
+ }
34318
+ ]
34319
+ }
34320
+ }
34321
+ };
34322
+
32809
34323
  // src/fixtures/sd-jwt-vc/course-completion.ts
32810
34324
  var sdJwtVcCourseCompletion = {
32811
34325
  kind: "sd-jwt-vc",
@@ -32850,6 +34364,13 @@ var ALL_FIXTURES = [
32850
34364
  obv3PlugfestJff2,
32851
34365
  obv3OneedtechFull,
32852
34366
  obv3ProfessionalCert,
34367
+ obv3QualificationLicense,
34368
+ obv3QualificationCertification,
34369
+ obv3QualificationApprenticeship,
34370
+ obv3QualificationJourneyman,
34371
+ obv3QualificationMaster,
34372
+ obv3QualificationExpired,
34373
+ obv3QualificationBadgeOverride,
32853
34374
  obv3MicroCredential,
32854
34375
  obv3CourseCompletion,
32855
34376
  obv3StandaloneFullCourse,
@@ -32869,6 +34390,7 @@ var ALL_FIXTURES = [
32869
34390
  clrEmploymentRecord,
32870
34391
  clrTrainingProviderRecord,
32871
34392
  clrMilitaryTrainingRecord,
34393
+ clrMilitaryComprehensiveRecord,
32872
34394
  clrProfessionalOrganizationRecord,
32873
34395
  clrLicensingRegulatoryRecord,
32874
34396
  clrMixedCareerRecord,
@@ -32897,6 +34419,14 @@ var ALL_FIXTURES = [
32897
34419
  clrAchievementIdAssociations,
32898
34420
  clrProvisionalTranscript,
32899
34421
  clrDemoIsdDiplomaAssessments,
34422
+ // Curated examples
34423
+ obv3FoodAllergenPractice,
34424
+ obv3FoodAllergenFacilitator,
34425
+ obv3FoodAllergenPracticeFr,
34426
+ obv3PhishingTransfer,
34427
+ customCourseEnrollment,
34428
+ customExamAccommodation,
34429
+ clrMixedRolePortfolio,
32900
34430
  // SD-JWT VC
32901
34431
  sdJwtVcCourseCompletion
32902
34432
  ];
@@ -33104,12 +34634,12 @@ var remapUuidReferences = /* @__PURE__ */ __name((value, idMap, preserveSignedCr
33104
34634
  }
33105
34635
  return value;
33106
34636
  }, "remapUuidReferences");
33107
- var patchIssuer = /* @__PURE__ */ __name((issuer, issuerDid) => {
33108
- if (typeof issuer === "string") {
34637
+ var patchIssuer = /* @__PURE__ */ __name((issuer2, issuerDid) => {
34638
+ if (typeof issuer2 === "string") {
33109
34639
  return issuerDid;
33110
34640
  }
33111
- if (issuer && typeof issuer === "object") {
33112
- return { ...issuer, id: issuerDid };
34641
+ if (issuer2 && typeof issuer2 === "object") {
34642
+ return { ...issuer2, id: issuerDid };
33113
34643
  }
33114
34644
  return issuerDid;
33115
34645
  }, "patchIssuer");
@@ -33127,13 +34657,13 @@ var patchCredentialSubject = /* @__PURE__ */ __name((credential, subjectDid) =>
33127
34657
  }
33128
34658
  return patchedCredential;
33129
34659
  }, "patchCredentialSubject");
33130
- var patchSubject = /* @__PURE__ */ __name((subject, subjectDid) => {
33131
- if (Array.isArray(subject)) {
33132
- return subject.map((nestedSubject) => patchSubject(nestedSubject, subjectDid));
34660
+ var patchSubject = /* @__PURE__ */ __name((subject2, subjectDid) => {
34661
+ if (Array.isArray(subject2)) {
34662
+ return subject2.map((nestedSubject) => patchSubject(nestedSubject, subjectDid));
33133
34663
  }
33134
- if (!subject || typeof subject !== "object") return subject;
34664
+ if (!subject2 || typeof subject2 !== "object") return subject2;
33135
34665
  const patchedSubject = {
33136
- ...subject,
34666
+ ...subject2,
33137
34667
  id: subjectDid
33138
34668
  };
33139
34669
  const embeddedCredentials = patchedSubject.verifiableCredential;
@@ -33581,9 +35111,11 @@ export {
33581
35111
  clrEmploymentRecord,
33582
35112
  clrGreatPlainsFull,
33583
35113
  clrLicensingRegulatoryRecord,
35114
+ clrMilitaryComprehensiveRecord,
33584
35115
  clrMilitaryTrainingRecord,
33585
35116
  clrMinimal,
33586
35117
  clrMixedCareerRecord,
35118
+ clrMixedRolePortfolio,
33587
35119
  clrMultiAchievement,
33588
35120
  clrNdStudentTranscript,
33589
35121
  clrProfessionalOrganizationRecord,
@@ -33592,6 +35124,8 @@ export {
33592
35124
  clrTrainingProviderRecord,
33593
35125
  clrUniversityTranscript,
33594
35126
  clrWestbridgeFull,
35127
+ customCourseEnrollment,
35128
+ customExamAccommodation,
33595
35129
  findFixture,
33596
35130
  getAllFixtures,
33597
35131
  getBundle,
@@ -33610,13 +35144,24 @@ export {
33610
35144
  materializeSdJwtVcFixture,
33611
35145
  obv3CourseCompletion,
33612
35146
  obv3EndorsementCredential,
35147
+ obv3FoodAllergenFacilitator,
35148
+ obv3FoodAllergenPractice,
35149
+ obv3FoodAllergenPracticeFr,
33613
35150
  obv3FullBadge,
33614
35151
  obv3K12Diploma,
33615
35152
  obv3MicroCredential,
33616
35153
  obv3MinimalBadge,
33617
35154
  obv3OneedtechFull,
35155
+ obv3PhishingTransfer,
33618
35156
  obv3PlugfestJff2,
33619
35157
  obv3ProfessionalCert,
35158
+ obv3QualificationApprenticeship,
35159
+ obv3QualificationBadgeOverride,
35160
+ obv3QualificationCertification,
35161
+ obv3QualificationExpired,
35162
+ obv3QualificationJourneyman,
35163
+ obv3QualificationLicense,
35164
+ obv3QualificationMaster,
33620
35165
  obv3RubricAlignedBadge,
33621
35166
  obv3StandaloneFullCourse,
33622
35167
  obv3StudentAdditionalCredentials,