@cleocode/core 2026.4.4 → 2026.4.6

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 (145) hide show
  1. package/dist/discovery.d.ts +69 -0
  2. package/dist/discovery.d.ts.map +1 -0
  3. package/dist/index.d.ts +3 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1643 -2349
  6. package/dist/index.js.map +4 -4
  7. package/dist/init.d.ts +51 -0
  8. package/dist/init.d.ts.map +1 -1
  9. package/dist/internal.d.ts +9 -1
  10. package/dist/internal.d.ts.map +1 -1
  11. package/dist/lifecycle/default-chain.d.ts +8 -2
  12. package/dist/lifecycle/default-chain.d.ts.map +1 -1
  13. package/dist/lifecycle/index.d.ts +1 -0
  14. package/dist/lifecycle/index.d.ts.map +1 -1
  15. package/dist/lifecycle/stage-guidance.d.ts +140 -0
  16. package/dist/lifecycle/stage-guidance.d.ts.map +1 -0
  17. package/dist/orchestration/protocol-validators.d.ts +122 -3
  18. package/dist/orchestration/protocol-validators.d.ts.map +1 -1
  19. package/dist/paths.d.ts +91 -0
  20. package/dist/paths.d.ts.map +1 -1
  21. package/dist/scaffold.d.ts +31 -1
  22. package/dist/scaffold.d.ts.map +1 -1
  23. package/dist/skills/dispatch.d.ts +1 -1
  24. package/dist/skills/skill-paths.d.ts +9 -6
  25. package/dist/skills/skill-paths.d.ts.map +1 -1
  26. package/dist/validation/protocols/_shared.d.ts +40 -0
  27. package/dist/validation/protocols/_shared.d.ts.map +1 -0
  28. package/dist/validation/protocols/architecture-decision.d.ts +23 -0
  29. package/dist/validation/protocols/architecture-decision.d.ts.map +1 -0
  30. package/dist/validation/protocols/artifact-publish.d.ts +22 -0
  31. package/dist/validation/protocols/artifact-publish.d.ts.map +1 -0
  32. package/dist/validation/protocols/consensus.d.ts +11 -17
  33. package/dist/validation/protocols/consensus.d.ts.map +1 -1
  34. package/dist/validation/protocols/contribution.d.ts +12 -17
  35. package/dist/validation/protocols/contribution.d.ts.map +1 -1
  36. package/dist/validation/protocols/decomposition.d.ts +18 -21
  37. package/dist/validation/protocols/decomposition.d.ts.map +1 -1
  38. package/dist/validation/protocols/implementation.d.ts +9 -17
  39. package/dist/validation/protocols/implementation.d.ts.map +1 -1
  40. package/dist/validation/protocols/provenance.d.ts +23 -0
  41. package/dist/validation/protocols/provenance.d.ts.map +1 -0
  42. package/dist/validation/protocols/release.d.ts +25 -0
  43. package/dist/validation/protocols/release.d.ts.map +1 -0
  44. package/dist/validation/protocols/research.d.ts +9 -17
  45. package/dist/validation/protocols/research.d.ts.map +1 -1
  46. package/dist/validation/protocols/specification.d.ts +7 -17
  47. package/dist/validation/protocols/specification.d.ts.map +1 -1
  48. package/dist/validation/protocols/testing.d.ts +22 -0
  49. package/dist/validation/protocols/testing.d.ts.map +1 -0
  50. package/dist/validation/protocols/validation.d.ts +22 -0
  51. package/dist/validation/protocols/validation.d.ts.map +1 -0
  52. package/package.json +7 -7
  53. package/src/__tests__/injection-mvi-tiers.test.js +54 -90
  54. package/src/__tests__/injection-mvi-tiers.test.js.map +1 -1
  55. package/src/discovery.ts +235 -0
  56. package/src/hooks/handlers/__tests__/hook-automation-e2e.test.js +3 -1
  57. package/src/hooks/handlers/__tests__/hook-automation-e2e.test.js.map +1 -1
  58. package/src/index.ts +16 -0
  59. package/src/init.ts +196 -0
  60. package/src/internal.ts +31 -1
  61. package/src/lifecycle/default-chain.ts +11 -2
  62. package/src/lifecycle/index.ts +10 -0
  63. package/src/lifecycle/stage-guidance.ts +282 -0
  64. package/src/metrics/__tests__/provider-detection.test.js +19 -7
  65. package/src/metrics/__tests__/provider-detection.test.js.map +1 -1
  66. package/src/metrics/__tests__/provider-detection.test.ts +19 -7
  67. package/src/orchestration/__tests__/protocol-validators.test.js +228 -8
  68. package/src/orchestration/__tests__/protocol-validators.test.js.map +1 -1
  69. package/src/orchestration/__tests__/protocol-validators.test.ts +259 -7
  70. package/src/orchestration/protocol-validators.ts +419 -4
  71. package/src/paths.ts +110 -0
  72. package/src/scaffold.ts +240 -4
  73. package/src/skills/dispatch.ts +6 -6
  74. package/src/skills/skill-paths.ts +27 -23
  75. package/src/validation/protocols/_shared.ts +88 -0
  76. package/src/validation/protocols/architecture-decision.ts +52 -0
  77. package/src/validation/protocols/artifact-publish.ts +49 -0
  78. package/src/validation/protocols/consensus.ts +44 -74
  79. package/src/validation/protocols/contribution.ts +28 -65
  80. package/src/validation/protocols/decomposition.ts +37 -64
  81. package/src/validation/protocols/implementation.ts +25 -65
  82. package/src/validation/protocols/protocols-markdown/architecture-decision.md +303 -0
  83. package/src/validation/protocols/protocols-markdown/artifact-publish.md +600 -0
  84. package/src/validation/protocols/protocols-markdown/consensus.md +322 -0
  85. package/src/validation/protocols/protocols-markdown/contribution.md +388 -0
  86. package/src/validation/protocols/protocols-markdown/decomposition.md +421 -0
  87. package/src/validation/protocols/protocols-markdown/implementation.md +357 -0
  88. package/src/validation/protocols/protocols-markdown/provenance.md +613 -0
  89. package/src/validation/protocols/protocols-markdown/release.md +783 -0
  90. package/src/validation/protocols/protocols-markdown/research.md +261 -0
  91. package/src/validation/protocols/protocols-markdown/specification.md +300 -0
  92. package/src/validation/protocols/protocols-markdown/testing.md +287 -0
  93. package/src/validation/protocols/protocols-markdown/validation.md +242 -0
  94. package/src/validation/protocols/provenance.ts +50 -0
  95. package/src/validation/protocols/release.ts +44 -0
  96. package/src/validation/protocols/research.ts +25 -87
  97. package/src/validation/protocols/specification.ts +27 -89
  98. package/src/validation/protocols/testing.ts +46 -0
  99. package/src/validation/protocols/validation.ts +46 -0
  100. package/dist/validation/protocols/release-protocol.d.ts +0 -27
  101. package/dist/validation/protocols/release-protocol.d.ts.map +0 -1
  102. package/dist/validation/protocols/testing-protocol.d.ts +0 -27
  103. package/dist/validation/protocols/testing-protocol.d.ts.map +0 -1
  104. package/dist/validation/protocols/validation-protocol.d.ts +0 -27
  105. package/dist/validation/protocols/validation-protocol.d.ts.map +0 -1
  106. package/schemas/agent-configs.schema.json +0 -120
  107. package/schemas/agent-registry.schema.json +0 -132
  108. package/schemas/archive.schema.json +0 -450
  109. package/schemas/brain-decision.schema.json +0 -69
  110. package/schemas/brain-learning.schema.json +0 -57
  111. package/schemas/brain-pattern.schema.json +0 -72
  112. package/schemas/critical-path.schema.json +0 -246
  113. package/schemas/deps-cache.schema.json +0 -97
  114. package/schemas/doctor-output.schema.json +0 -283
  115. package/schemas/error.schema.json +0 -161
  116. package/schemas/global-config.schema.json +0 -219
  117. package/schemas/grade.schema.json +0 -49
  118. package/schemas/log.schema.json +0 -250
  119. package/schemas/metrics.schema.json +0 -328
  120. package/schemas/migrations.schema.json +0 -150
  121. package/schemas/nexus-registry.schema.json +0 -90
  122. package/schemas/operation-constitution.schema.json +0 -438
  123. package/schemas/output.schema.json +0 -164
  124. package/schemas/projects-registry.schema.json +0 -107
  125. package/schemas/protocol-frontmatter.schema.json +0 -72
  126. package/schemas/rcasd-consensus-report.schema.json +0 -10
  127. package/schemas/rcasd-evidence.schema.json +0 -42
  128. package/schemas/rcasd-gate-result.schema.json +0 -46
  129. package/schemas/rcasd-hitl-resolution.schema.json +0 -10
  130. package/schemas/rcasd-index.schema.json +0 -10
  131. package/schemas/rcasd-manifest.schema.json +0 -10
  132. package/schemas/rcasd-research-output.schema.json +0 -10
  133. package/schemas/rcasd-spec-frontmatter.schema.json +0 -10
  134. package/schemas/rcasd-stage-transition.schema.json +0 -38
  135. package/schemas/releases.schema.json +0 -267
  136. package/schemas/skills-manifest.schema.json +0 -91
  137. package/schemas/spec-index.schema.json +0 -196
  138. package/schemas/system-flow-atlas.schema.json +0 -125
  139. package/src/conduit/__tests__/dual-api-e2e.test.d.ts.map +0 -1
  140. package/src/conduit/__tests__/dual-api-e2e.test.js +0 -178
  141. package/src/conduit/__tests__/dual-api-e2e.test.js.map +0 -1
  142. package/src/conduit/__tests__/dual-api-e2e.test.ts +0 -212
  143. package/src/validation/protocols/release-protocol.ts +0 -80
  144. package/src/validation/protocols/testing-protocol.ts +0 -93
  145. package/src/validation/protocols/validation-protocol.ts +0 -93
@@ -14,6 +14,7 @@ import {
14
14
  PROTOCOL_EXIT_CODES,
15
15
  PROTOCOL_TYPES,
16
16
  type ProtocolType,
17
+ validateArchitectureDecisionProtocol,
17
18
  validateArtifactPublishProtocol,
18
19
  validateConsensusProtocol,
19
20
  validateContributionProtocol,
@@ -24,6 +25,8 @@ import {
24
25
  validateReleaseProtocol,
25
26
  validateResearchProtocol,
26
27
  validateSpecificationProtocol,
28
+ validateTestingProtocol,
29
+ validateValidationProtocol,
27
30
  } from '../protocol-validators.js';
28
31
 
29
32
  // ============================================================
@@ -399,15 +402,253 @@ describe('Provenance Protocol', () => {
399
402
  });
400
403
  });
401
404
 
405
+ // ============================================================
406
+ // 10. ARCHITECTURE DECISION RECORD PROTOCOL (exit code 84)
407
+ // ============================================================
408
+
409
+ describe('Architecture Decision Record Protocol', () => {
410
+ const adrEntry = (
411
+ overrides: Partial<ManifestEntryInput & { consensus_manifest_id?: string }> = {},
412
+ ) => ({
413
+ ...validEntry('decision'),
414
+ consensus_manifest_id: 'manifest_consensus_2026_04_07',
415
+ ...overrides,
416
+ });
417
+
418
+ it('passes a complete ADR entry', () => {
419
+ const result = validateArchitectureDecisionProtocol(adrEntry(), {
420
+ status: 'proposed',
421
+ adrContent: '## Context\n## Options Evaluated\n## Decision\n## Rationale\n## Consequences\n',
422
+ persistedInDb: true,
423
+ });
424
+ expect(result.valid).toBe(true);
425
+ expect(result.protocol).toBe('architecture-decision');
426
+ });
427
+
428
+ it('fails without a consensus manifest link (ADR-001)', () => {
429
+ const result = validateArchitectureDecisionProtocol(
430
+ adrEntry({ consensus_manifest_id: undefined }),
431
+ );
432
+ expect(result.valid).toBe(false);
433
+ expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'ADR-001' }));
434
+ });
435
+
436
+ it('fails when accepted without HITL review (ADR-003)', () => {
437
+ const result = validateArchitectureDecisionProtocol(adrEntry(), {
438
+ status: 'accepted',
439
+ hitlReviewed: false,
440
+ adrContent: '## Context\n## Options\n## Decision\n## Rationale\n## Consequences\n',
441
+ persistedInDb: true,
442
+ });
443
+ expect(result.valid).toBe(false);
444
+ expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'ADR-003' }));
445
+ });
446
+
447
+ it('fails when required sections are missing (ADR-004)', () => {
448
+ const result = validateArchitectureDecisionProtocol(adrEntry(), {
449
+ status: 'proposed',
450
+ adrContent: '## Context only',
451
+ persistedInDb: true,
452
+ });
453
+ expect(result.valid).toBe(false);
454
+ expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'ADR-004' }));
455
+ });
456
+
457
+ it('fails superseded ADR without downstream flag (ADR-005)', () => {
458
+ const result = validateArchitectureDecisionProtocol(adrEntry(), {
459
+ status: 'superseded',
460
+ downstreamFlagged: false,
461
+ adrContent: '## Context\n## Options\n## Decision\n## Rationale\n## Consequences\n',
462
+ persistedInDb: true,
463
+ });
464
+ expect(result.valid).toBe(false);
465
+ expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'ADR-005' }));
466
+ });
467
+
468
+ it('fails when not persisted in SQLite (ADR-006)', () => {
469
+ const result = validateArchitectureDecisionProtocol(adrEntry(), {
470
+ status: 'proposed',
471
+ persistedInDb: false,
472
+ adrContent: '## Context\n## Options\n## Decision\n## Rationale\n## Consequences\n',
473
+ });
474
+ expect(result.valid).toBe(false);
475
+ expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'ADR-006' }));
476
+ });
477
+
478
+ it('fails with wrong agent_type (ADR-007)', () => {
479
+ const result = validateArchitectureDecisionProtocol(adrEntry({ agent_type: 'specification' }));
480
+ expect(result.valid).toBe(false);
481
+ expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'ADR-007' }));
482
+ });
483
+ });
484
+
485
+ // ============================================================
486
+ // 11. VALIDATION PROTOCOL (exit code 80)
487
+ // ============================================================
488
+
489
+ describe('Validation Protocol', () => {
490
+ it('passes a complete validation entry', () => {
491
+ const result = validateValidationProtocol(validEntry('validation'), {
492
+ specMatchConfirmed: true,
493
+ testSuitePassed: true,
494
+ protocolComplianceChecked: true,
495
+ });
496
+ expect(result.valid).toBe(true);
497
+ expect(result.protocol).toBe('validation');
498
+ });
499
+
500
+ it('fails when spec-match not confirmed (VALID-001)', () => {
501
+ const result = validateValidationProtocol(validEntry('validation'), {
502
+ specMatchConfirmed: false,
503
+ });
504
+ expect(result.valid).toBe(false);
505
+ expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'VALID-001' }));
506
+ });
507
+
508
+ it('fails when test suite failed (VALID-002)', () => {
509
+ const result = validateValidationProtocol(validEntry('validation'), {
510
+ testSuitePassed: false,
511
+ });
512
+ expect(result.valid).toBe(false);
513
+ expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'VALID-002' }));
514
+ });
515
+
516
+ it('fails without key_findings (VALID-005)', () => {
517
+ const result = validateValidationProtocol(validEntry('validation', { key_findings: [] }));
518
+ expect(result.valid).toBe(false);
519
+ expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'VALID-005' }));
520
+ });
521
+
522
+ it('fails with wrong agent_type (VALID-006)', () => {
523
+ const result = validateValidationProtocol(validEntry('implementation'));
524
+ expect(result.valid).toBe(false);
525
+ expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'VALID-006' }));
526
+ });
527
+ });
528
+
529
+ // ============================================================
530
+ // 12. TESTING PROTOCOL (project-agnostic IVT loop)
531
+ // ============================================================
532
+
533
+ describe('Testing Protocol', () => {
534
+ it('passes a complete testing entry with any framework', () => {
535
+ const result = validateTestingProtocol(validEntry('testing'), {
536
+ framework: 'vitest',
537
+ testsRun: 42,
538
+ testsPassed: 42,
539
+ testsFailed: 0,
540
+ ivtLoopConverged: true,
541
+ });
542
+ expect(result.valid).toBe(true);
543
+ expect(result.protocol).toBe('testing');
544
+ });
545
+
546
+ it('is project-agnostic — accepts any supported framework', () => {
547
+ const frameworks = [
548
+ 'vitest',
549
+ 'jest',
550
+ 'pytest',
551
+ 'go-test',
552
+ 'cargo-test',
553
+ 'rspec',
554
+ 'bats',
555
+ 'other',
556
+ ] as const;
557
+ for (const framework of frameworks) {
558
+ const result = validateTestingProtocol(validEntry('testing'), {
559
+ framework,
560
+ testsRun: 1,
561
+ testsPassed: 1,
562
+ testsFailed: 0,
563
+ ivtLoopConverged: true,
564
+ });
565
+ expect(result.valid).toBe(true);
566
+ }
567
+ });
568
+
569
+ it('fails without a detected framework (TEST-001)', () => {
570
+ const result = validateTestingProtocol(validEntry('testing'), {
571
+ testsRun: 10,
572
+ testsPassed: 10,
573
+ testsFailed: 0,
574
+ ivtLoopConverged: true,
575
+ });
576
+ expect(result.valid).toBe(false);
577
+ expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'TEST-001' }));
578
+ });
579
+
580
+ it('fails when tests failed (TEST-004)', () => {
581
+ const result = validateTestingProtocol(validEntry('testing'), {
582
+ framework: 'vitest',
583
+ testsRun: 10,
584
+ testsPassed: 8,
585
+ testsFailed: 2,
586
+ ivtLoopConverged: false,
587
+ });
588
+ expect(result.valid).toBe(false);
589
+ expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'TEST-004' }));
590
+ });
591
+
592
+ it('fails when IVT loop has not converged (TEST-005)', () => {
593
+ const result = validateTestingProtocol(validEntry('testing'), {
594
+ framework: 'vitest',
595
+ ivtLoopConverged: false,
596
+ });
597
+ expect(result.valid).toBe(false);
598
+ expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'TEST-005' }));
599
+ });
600
+
601
+ it('warns on coverage below threshold (non-blocking)', () => {
602
+ const result = validateTestingProtocol(validEntry('testing'), {
603
+ framework: 'vitest',
604
+ testsRun: 10,
605
+ testsPassed: 10,
606
+ testsFailed: 0,
607
+ ivtLoopConverged: true,
608
+ coveragePercent: 70,
609
+ coverageThreshold: 80,
610
+ });
611
+ expect(result.violations).toContainEqual(
612
+ expect.objectContaining({ requirement: 'TEST-004', severity: 'warning' }),
613
+ );
614
+ });
615
+
616
+ it('fails with wrong agent_type (TEST-007)', () => {
617
+ const result = validateTestingProtocol(validEntry('implementation'), {
618
+ framework: 'vitest',
619
+ ivtLoopConverged: true,
620
+ });
621
+ expect(result.valid).toBe(false);
622
+ expect(result.violations).toContainEqual(expect.objectContaining({ requirement: 'TEST-007' }));
623
+ });
624
+ });
625
+
402
626
  // ============================================================
403
627
  // UNIFIED DISPATCHER
404
628
  // ============================================================
405
629
 
406
630
  describe('validateProtocol (unified dispatcher)', () => {
407
- it('dispatches to all 9 protocols', () => {
631
+ it('dispatches to all 12 protocols', () => {
408
632
  for (const protocol of PROTOCOL_TYPES) {
409
- const agentType = protocol === 'consensus' ? 'analysis' : protocol;
410
- const entry = validEntry(agentType);
633
+ // Map protocol name to expected agent_type
634
+ const agentTypeMap: Record<ProtocolType, string> = {
635
+ research: 'research',
636
+ consensus: 'analysis',
637
+ 'architecture-decision': 'decision',
638
+ specification: 'specification',
639
+ decomposition: 'decomposition',
640
+ implementation: 'implementation',
641
+ contribution: 'contribution',
642
+ validation: 'validation',
643
+ testing: 'testing',
644
+ release: 'release',
645
+ 'artifact-publish': 'artifact-publish',
646
+ provenance: 'provenance',
647
+ };
648
+ const entry = {
649
+ ...validEntry(agentTypeMap[protocol]),
650
+ consensus_manifest_id: 'mf_consensus_test',
651
+ };
411
652
  // All should not throw without strict mode
412
653
  const result = validateProtocol(protocol, entry);
413
654
  expect(result.protocol).toBe(protocol);
@@ -420,7 +661,7 @@ describe('validateProtocol (unified dispatcher)', () => {
420
661
  });
421
662
 
422
663
  it('uses correct exit codes for each protocol', () => {
423
- // Verify exit code mapping covers range 60-67
664
+ // Pipeline codes 60-67 + dedicated codes for cross-cutting protocols
424
665
  const exitCodes = new Set(Object.values(PROTOCOL_EXIT_CODES));
425
666
  expect(exitCodes.has(ExitCode.PROTOCOL_MISSING)).toBe(true); // 60
426
667
  expect(exitCodes.has(ExitCode.INVALID_RETURN_MESSAGE)).toBe(true); // 61
@@ -430,6 +671,10 @@ describe('validateProtocol (unified dispatcher)', () => {
430
671
  expect(exitCodes.has(ExitCode.HANDOFF_REQUIRED)).toBe(true); // 65
431
672
  expect(exitCodes.has(ExitCode.RESUME_FAILED)).toBe(true); // 66
432
673
  expect(exitCodes.has(ExitCode.CONCURRENT_SESSION)).toBe(true); // 67
674
+ expect(exitCodes.has(ExitCode.LIFECYCLE_GATE_FAILED)).toBe(true); // 80 (validation)
675
+ expect(exitCodes.has(ExitCode.PROVENANCE_REQUIRED)).toBe(true); // 84 (ADR)
676
+ expect(exitCodes.has(ExitCode.ARTIFACT_PUBLISH_FAILED)).toBe(true); // 88
677
+ expect(exitCodes.has(ExitCode.ATTESTATION_INVALID)).toBe(true); // 94
433
678
  });
434
679
 
435
680
  it('strict mode throws with correct exit code per protocol', () => {
@@ -441,7 +686,11 @@ describe('validateProtocol (unified dispatcher)', () => {
441
686
  { protocol: 'implementation', expectedCode: ExitCode.AUTONOMOUS_BOUNDARY },
442
687
  { protocol: 'contribution', expectedCode: ExitCode.HANDOFF_REQUIRED },
443
688
  { protocol: 'release', expectedCode: ExitCode.RESUME_FAILED },
444
- { protocol: 'artifact-publish', expectedCode: ExitCode.CONCURRENT_SESSION },
689
+ { protocol: 'testing', expectedCode: ExitCode.CONCURRENT_SESSION },
690
+ { protocol: 'validation', expectedCode: ExitCode.LIFECYCLE_GATE_FAILED },
691
+ { protocol: 'architecture-decision', expectedCode: ExitCode.PROVENANCE_REQUIRED },
692
+ { protocol: 'artifact-publish', expectedCode: ExitCode.ARTIFACT_PUBLISH_FAILED },
693
+ { protocol: 'provenance', expectedCode: ExitCode.ATTESTATION_INVALID },
445
694
  ];
446
695
 
447
696
  for (const { protocol, expectedCode } of testCases) {
@@ -457,14 +706,17 @@ describe('validateProtocol (unified dispatcher)', () => {
457
706
  }
458
707
  });
459
708
 
460
- it('PROTOCOL_TYPES contains all 9 protocols', () => {
461
- expect(PROTOCOL_TYPES).toHaveLength(9);
709
+ it('PROTOCOL_TYPES contains all 12 protocols', () => {
710
+ expect(PROTOCOL_TYPES).toHaveLength(12);
462
711
  expect(PROTOCOL_TYPES).toContain('research');
463
712
  expect(PROTOCOL_TYPES).toContain('consensus');
713
+ expect(PROTOCOL_TYPES).toContain('architecture-decision');
464
714
  expect(PROTOCOL_TYPES).toContain('specification');
465
715
  expect(PROTOCOL_TYPES).toContain('decomposition');
466
716
  expect(PROTOCOL_TYPES).toContain('implementation');
467
717
  expect(PROTOCOL_TYPES).toContain('contribution');
718
+ expect(PROTOCOL_TYPES).toContain('validation');
719
+ expect(PROTOCOL_TYPES).toContain('testing');
468
720
  expect(PROTOCOL_TYPES).toContain('release');
469
721
  expect(PROTOCOL_TYPES).toContain('artifact-publish');
470
722
  expect(PROTOCOL_TYPES).toContain('provenance');