@h9-foundry/agentforge-schemas 0.6.0 → 0.7.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.
package/dist/index.js CHANGED
@@ -15,13 +15,29 @@ export const lifecycleArtifactKindSchema = z.enum([
15
15
  "planning-brief",
16
16
  "design-record",
17
17
  "implementation-proposal",
18
+ "incident-brief",
19
+ "qa-report",
20
+ "security-report",
18
21
  "review-report",
19
22
  "release-report",
20
23
  "maintenance-report"
21
24
  ]);
22
- export const lifecycleDomainSchema = z.enum(["plan", "design", "build", "review", "release", "maintain"]);
25
+ export const lifecycleDomainSchema = z.enum(["plan", "design", "build", "test", "security", "review", "release", "operate", "maintain"]);
23
26
  export const lifecycleArtifactSourceTypeSchema = z.enum(["workflow-run", "manual-input", "imported"]);
24
27
  export const lifecycleArtifactStatusSchema = z.enum(["draft", "complete", "superseded", "cancelled"]);
28
+ export const githubReferenceKindSchema = z.enum(["issue", "pull_request"]);
29
+ export const githubWorkflowStatusSchema = z.enum(["planned", "in_progress", "blocked", "completed", "failed"]);
30
+ export const githubActionsRunStatusSchema = z.enum(["queued", "in_progress", "completed"]);
31
+ export const githubActionsConclusionSchema = z.enum([
32
+ "success",
33
+ "failure",
34
+ "neutral",
35
+ "cancelled",
36
+ "skipped",
37
+ "timed_out",
38
+ "action_required",
39
+ "stale"
40
+ ]);
25
41
  export const catalogDomainSchema = z.enum([
26
42
  "foundation",
27
43
  "plan",
@@ -295,6 +311,13 @@ export const qaRequestSchema = z.object({
295
311
  constraints: z.array(z.string().min(1)).default([]),
296
312
  releaseContext: z.enum(["none", "candidate", "blocking"]).default("none")
297
313
  });
314
+ export const securityRequestSchema = z.object({
315
+ targetRef: z.string().min(1),
316
+ evidenceSources: z.array(z.string().min(1)).default([]),
317
+ focusAreas: z.array(z.string().min(1)).default([]),
318
+ constraints: z.array(z.string().min(1)).default([]),
319
+ releaseContext: z.enum(["none", "candidate", "blocking"]).default("none")
320
+ });
298
321
  export const normalizedValidationCommandSchema = z.object({
299
322
  command: z.string().min(1),
300
323
  source: z.enum(["request", "package-script", "workspace-script"]),
@@ -310,6 +333,96 @@ export const implementationInventorySchema = z.object({
310
333
  policySurfaces: z.array(z.string().min(1)).default([]),
311
334
  discoveredValidationCommands: z.array(normalizedValidationCommandSchema).default([])
312
335
  });
336
+ export const githubActionsJobEvidenceSchema = z.object({
337
+ name: z.string().min(1),
338
+ status: githubActionsRunStatusSchema,
339
+ conclusion: githubActionsConclusionSchema.optional(),
340
+ htmlUrl: z.string().url().optional(),
341
+ startedAt: z.string().datetime().optional(),
342
+ completedAt: z.string().datetime().optional()
343
+ });
344
+ export const githubActionsCheckRunEvidenceSchema = z.object({
345
+ name: z.string().min(1),
346
+ status: githubActionsRunStatusSchema,
347
+ conclusion: githubActionsConclusionSchema.optional(),
348
+ detailsUrl: z.string().url().optional()
349
+ });
350
+ export const githubActionsEvidenceSchema = z.object({
351
+ sourcePath: z.string().min(1).optional(),
352
+ repository: z.string().min(1),
353
+ workflowName: z.string().min(1),
354
+ workflowRunId: z.number().int().positive(),
355
+ runAttempt: z.number().int().positive().default(1),
356
+ event: z.string().min(1).optional(),
357
+ headBranch: z.string().min(1).optional(),
358
+ headSha: z.string().min(1).optional(),
359
+ status: githubActionsRunStatusSchema,
360
+ conclusion: githubActionsConclusionSchema.optional(),
361
+ htmlUrl: z.string().url(),
362
+ jobs: z.array(githubActionsJobEvidenceSchema).default([]),
363
+ checkRuns: z.array(githubActionsCheckRunEvidenceSchema).default([])
364
+ });
365
+ export const githubActionsEvidenceNormalizationSchema = z.object({
366
+ evidence: z.array(githubActionsEvidenceSchema).default([]),
367
+ workflowNames: z.array(z.string().min(1)).default([]),
368
+ failingChecks: z.array(z.string().min(1)).default([]),
369
+ provenanceRefs: z.array(z.string().min(1)).default([])
370
+ });
371
+ export const qaEvidenceNormalizationSchema = z.object({
372
+ targetRef: z.string().min(1),
373
+ targetType: z.enum(["artifact-bundle", "validation-output", "local-reference"]),
374
+ referencedArtifactKinds: z.array(z.string().min(1)).default([]),
375
+ normalizedEvidenceSources: z.array(z.string().min(1)).default([]),
376
+ missingEvidenceSources: z.array(z.string().min(1)).default([]),
377
+ normalizedExecutedChecks: z.array(z.string().min(1)).default([]),
378
+ unrecognizedExecutedChecks: z.array(z.string().min(1)).default([]),
379
+ affectedPackages: z.array(z.string().min(1)).default([]),
380
+ allowedValidationCommands: z.array(normalizedValidationCommandSchema).default([]),
381
+ githubActions: githubActionsEvidenceNormalizationSchema.default({
382
+ evidence: [],
383
+ workflowNames: [],
384
+ failingChecks: [],
385
+ provenanceRefs: []
386
+ })
387
+ });
388
+ export const securityEvidenceNormalizationSchema = z.object({
389
+ targetRef: z.string().min(1),
390
+ targetType: z.enum(["artifact-bundle", "local-reference"]),
391
+ referencedArtifactKinds: z.array(z.string().min(1)).default([]),
392
+ normalizedEvidenceSources: z.array(z.string().min(1)).default([]),
393
+ missingEvidenceSources: z.array(z.string().min(1)).default([]),
394
+ normalizedFocusAreas: z.array(z.string().min(1)).default([]),
395
+ securitySignals: z.array(z.string().min(1)).default([]),
396
+ provenanceRefs: z.array(z.string().min(1)).default([]),
397
+ affectedPackages: z.array(z.string().min(1)).default([])
398
+ });
399
+ export const incidentEvidenceNormalizationSchema = z.object({
400
+ incidentSummary: z.string().min(1),
401
+ severityHint: z.enum(["unknown", "low", "medium", "high", "critical"]),
402
+ normalizedEvidenceSources: z.array(z.string().min(1)).default([]),
403
+ missingEvidenceSources: z.array(z.string().min(1)).default([]),
404
+ releaseReportRefs: z.array(z.string().min(1)).default([]),
405
+ timelineSummary: z.array(z.string().min(1)).default([]),
406
+ likelyImpactedAreas: z.array(z.string().min(1)).default([]),
407
+ followUpWorkflowRefs: z.array(z.string().min(1)).default([]),
408
+ provenanceRefs: z.array(z.string().min(1)).default([]),
409
+ redactionCategories: z.array(z.string().min(1)).default([]),
410
+ referencedArtifactKinds: z.array(z.string().min(1)).default([])
411
+ });
412
+ export const maintenanceEvidenceNormalizationSchema = z.object({
413
+ maintenanceGoal: z.string().min(1),
414
+ dependencyAlertRefs: z.array(z.string().min(1)).default([]),
415
+ docsTaskRefs: z.array(z.string().min(1)).default([]),
416
+ releaseReportRefs: z.array(z.string().min(1)).default([]),
417
+ normalizedEvidenceSources: z.array(z.string().min(1)).default([]),
418
+ missingEvidenceSources: z.array(z.string().min(1)).default([]),
419
+ referencedArtifactKinds: z.array(z.string().min(1)).default([]),
420
+ affectedPackagesOrDocs: z.array(z.string().min(1)).default([]),
421
+ maintenanceSignals: z.array(z.string().min(1)).default([]),
422
+ followUpWorkflowRefs: z.array(z.string().min(1)).default([]),
423
+ routingRecommendation: z.string().min(1),
424
+ provenanceRefs: z.array(z.string().min(1)).default([])
425
+ });
313
426
  export const repoMetadataSchema = z.object({
314
427
  root: z.string().min(1),
315
428
  name: z.string().min(1),
@@ -384,11 +497,46 @@ export const lifecycleArtifactWorkflowReferenceSchema = z.object({
384
497
  name: z.string().min(1),
385
498
  displayName: z.string().min(1).optional()
386
499
  });
500
+ export const githubReferenceSchema = z.object({
501
+ platform: z.literal("github"),
502
+ host: z.string().min(1).default("github.com"),
503
+ owner: z.string().min(1),
504
+ repo: z.string().min(1),
505
+ kind: githubReferenceKindSchema,
506
+ number: z.number().int().positive(),
507
+ canonical: z.string().min(1),
508
+ url: z.string().url(),
509
+ source: z.string().min(1)
510
+ });
511
+ export const githubWorkflowStatusMappingSchema = z.object({
512
+ workflow: z.string().min(1),
513
+ localRunStatus: runStatusSchema,
514
+ githubStatus: githubWorkflowStatusSchema,
515
+ reason: z.string().min(1)
516
+ });
517
+ export const githubHandoffArtifactKindSchema = z.enum(["planning-brief", "design-record", "incident-brief", "qa-report", "release-report"]);
518
+ export const githubHandoffSectionSchema = z.object({
519
+ heading: z.string().min(1),
520
+ lines: z.array(z.string().min(1)).default([])
521
+ });
522
+ export const githubHandoffSummarySchema = z.object({
523
+ artifactKind: githubHandoffArtifactKindSchema,
524
+ workflow: z.string().min(1),
525
+ githubStatus: githubWorkflowStatusSchema,
526
+ title: z.string().min(1),
527
+ summary: z.string().min(1),
528
+ body: z.string().min(1),
529
+ issueRefs: z.array(githubReferenceSchema).default([]),
530
+ pullRequestRefs: z.array(githubReferenceSchema).default([]),
531
+ provenanceRefs: z.array(z.string().min(1)).default([]),
532
+ sections: z.array(githubHandoffSectionSchema).default([])
533
+ });
387
534
  export const lifecycleArtifactSourceReferenceSchema = z.object({
388
535
  sourceType: lifecycleArtifactSourceTypeSchema,
389
536
  runId: z.string().min(1).optional(),
390
537
  inputRefs: z.array(z.string()).default([]),
391
- issueRefs: z.array(z.string()).default([])
538
+ issueRefs: z.array(z.string()).default([]),
539
+ githubRefs: z.array(githubReferenceSchema).default([])
392
540
  });
393
541
  export const lifecycleArtifactRepoReferenceSchema = z.object({
394
542
  root: z.string().min(1),
@@ -460,6 +608,24 @@ export const reviewArtifactPayloadSchema = z.object({
460
608
  securityConcerns: z.array(z.string().min(1)).default([]),
461
609
  approvalRecommendations: z.array(z.string().min(1)).default([])
462
610
  });
611
+ export const qaArtifactPayloadSchema = z.object({
612
+ targetRef: z.string().min(1),
613
+ evidenceSources: z.array(z.string().min(1)).default([]),
614
+ executedChecks: z.array(z.string().min(1)).default([]),
615
+ findings: z.array(findingSchema).default([]),
616
+ coverageGaps: z.array(z.string().min(1)).default([]),
617
+ recommendedNextChecks: z.array(z.string().min(1)).default([]),
618
+ releaseImpact: z.string().min(1)
619
+ });
620
+ export const securityArtifactPayloadSchema = z.object({
621
+ targetRef: z.string().min(1),
622
+ evidenceSources: z.array(z.string().min(1)).default([]),
623
+ findings: z.array(findingSchema).default([]),
624
+ severitySummary: z.string().min(1),
625
+ mitigations: z.array(z.string().min(1)).default([]),
626
+ releaseImpact: z.string().min(1),
627
+ followUpWork: z.array(z.string().min(1)).default([])
628
+ });
463
629
  export const implementationArtifactPayloadSchema = z.object({
464
630
  designRecordRef: z.string().min(1),
465
631
  implementationGoal: z.string().min(1),
@@ -470,6 +636,14 @@ export const implementationArtifactPayloadSchema = z.object({
470
636
  risks: z.array(z.string().min(1)).default([]),
471
637
  openQuestions: z.array(z.string().min(1)).default([])
472
638
  });
639
+ export const incidentArtifactPayloadSchema = z.object({
640
+ incidentSummary: z.string().min(1),
641
+ evidenceSources: z.array(z.string().min(1)).default([]),
642
+ timelineSummary: z.array(z.string().min(1)).default([]),
643
+ likelyImpactedAreas: z.array(z.string().min(1)).default([]),
644
+ followUpWorkflowRefs: z.array(z.string().min(1)).default([]),
645
+ openQuestions: z.array(z.string().min(1)).default([])
646
+ });
473
647
  export const releaseVerificationCheckSchema = z.object({
474
648
  name: z.string().min(1),
475
649
  status: z.enum(["passed", "failed", "skipped"]),
@@ -479,11 +653,59 @@ export const releaseVersionTargetSchema = z.object({
479
653
  name: z.string().min(1),
480
654
  version: z.string().min(1)
481
655
  });
656
+ export const releaseVersionResolutionSchema = z.object({
657
+ name: z.string().min(1),
658
+ targetVersion: z.string().min(1),
659
+ currentVersion: z.string().min(1).optional(),
660
+ status: z.enum(["matches-target", "pending-version-bump", "package-missing"])
661
+ });
662
+ export const releaseApprovalRecommendationSchema = z.object({
663
+ action: z.string().min(1),
664
+ classification: z.enum(["allow", "approval_required", "deny"]),
665
+ reason: z.string().min(1)
666
+ });
667
+ export const releaseRequestSchema = z.object({
668
+ releaseScope: z.string().min(1),
669
+ versionTargets: z.array(releaseVersionTargetSchema).min(1),
670
+ qaReportRefs: z.array(z.string().min(1)).default([]),
671
+ securityReportRefs: z.array(z.string().min(1)).default([]),
672
+ evidenceSources: z.array(z.string().min(1)).default([]),
673
+ constraints: z.array(z.string().min(1)).default([])
674
+ });
675
+ export const incidentRequestSchema = z.object({
676
+ incidentSummary: z.string().min(1),
677
+ severityHint: z.enum(["unknown", "low", "medium", "high", "critical"]).default("unknown"),
678
+ evidenceSources: z.array(z.string().min(1)).default([]),
679
+ releaseReportRefs: z.array(z.string().min(1)).default([]),
680
+ issueRefs: z.array(z.string().min(1)).default([]),
681
+ constraints: z.array(z.string().min(1)).default([])
682
+ });
683
+ export const maintenanceRequestSchema = z.object({
684
+ maintenanceGoal: z.string().min(1),
685
+ dependencyAlertRefs: z.array(z.string().min(1)).default([]),
686
+ docsTaskRefs: z.array(z.string().min(1)).default([]),
687
+ releaseReportRefs: z.array(z.string().min(1)).default([]),
688
+ issueRefs: z.array(z.string().min(1)).default([]),
689
+ constraints: z.array(z.string().min(1)).default([])
690
+ });
691
+ export const releaseEvidenceNormalizationSchema = z.object({
692
+ qaReportRefs: z.array(z.string().min(1)).default([]),
693
+ securityReportRefs: z.array(z.string().min(1)).default([]),
694
+ normalizedEvidenceSources: z.array(z.string().min(1)).default([]),
695
+ missingEvidenceSources: z.array(z.string().min(1)).default([]),
696
+ versionResolutions: z.array(releaseVersionResolutionSchema).default([]),
697
+ localReadinessChecks: z.array(releaseVerificationCheckSchema).default([]),
698
+ readinessStatus: z.enum(["ready", "blocked", "partial"]),
699
+ approvalRecommendations: z.array(releaseApprovalRecommendationSchema).default([]),
700
+ provenanceRefs: z.array(z.string().min(1)).default([])
701
+ });
482
702
  export const releaseArtifactPayloadSchema = z.object({
483
703
  releaseScope: z.string().min(1),
484
704
  versionTargets: z.array(releaseVersionTargetSchema).min(1),
485
705
  readinessStatus: z.enum(["ready", "blocked", "partial"]),
486
706
  verificationChecks: z.array(releaseVerificationCheckSchema).default([]),
707
+ versionResolutions: z.array(releaseVersionResolutionSchema).default([]),
708
+ approvalRecommendations: z.array(releaseApprovalRecommendationSchema).default([]),
487
709
  publishingPlan: z.array(z.string().min(1)).default([]),
488
710
  trustStatus: z.string().min(1),
489
711
  publishedPackages: z.array(z.string().min(1)).default([]),
@@ -494,8 +716,13 @@ export const releaseArtifactPayloadSchema = z.object({
494
716
  });
495
717
  export const maintenanceArtifactPayloadSchema = z.object({
496
718
  maintenanceScope: z.string().min(1),
719
+ evidenceSources: z.array(z.string().min(1)).default([]),
720
+ affectedPackagesOrDocs: z.array(z.string().min(1)).default([]),
497
721
  currentFindings: z.array(z.string().min(1)).default([]),
498
722
  recommendedActions: z.array(z.string().min(1)).default([]),
723
+ routingRecommendation: z.string().min(1),
724
+ followUpWorkflowRefs: z.array(z.string().min(1)).default([]),
725
+ risks: z.array(z.string().min(1)).default([]),
499
726
  priorityAssessment: z.string().min(1),
500
727
  dependencyUpdates: z.array(z.string().min(1)).default([]),
501
728
  docsUpdates: z.array(z.string().min(1)).default([]),
@@ -517,6 +744,21 @@ export const implementationArtifactSchema = lifecycleArtifactEnvelopeSchema.exte
517
744
  lifecycleDomain: z.literal("build"),
518
745
  payload: implementationArtifactPayloadSchema
519
746
  });
747
+ export const incidentArtifactSchema = lifecycleArtifactEnvelopeSchema.extend({
748
+ artifactKind: z.literal("incident-brief"),
749
+ lifecycleDomain: z.literal("operate"),
750
+ payload: incidentArtifactPayloadSchema
751
+ });
752
+ export const qaArtifactSchema = lifecycleArtifactEnvelopeSchema.extend({
753
+ artifactKind: z.literal("qa-report"),
754
+ lifecycleDomain: z.literal("test"),
755
+ payload: qaArtifactPayloadSchema
756
+ });
757
+ export const securityArtifactSchema = lifecycleArtifactEnvelopeSchema.extend({
758
+ artifactKind: z.literal("security-report"),
759
+ lifecycleDomain: z.literal("security"),
760
+ payload: securityArtifactPayloadSchema
761
+ });
520
762
  export const reviewArtifactSchema = lifecycleArtifactEnvelopeSchema.extend({
521
763
  artifactKind: z.literal("review-report"),
522
764
  lifecycleDomain: z.literal("review"),
@@ -536,6 +778,9 @@ export const lifecycleArtifactSchema = z.discriminatedUnion("artifactKind", [
536
778
  planningArtifactSchema,
537
779
  designArtifactSchema,
538
780
  implementationArtifactSchema,
781
+ incidentArtifactSchema,
782
+ qaArtifactSchema,
783
+ securityArtifactSchema,
539
784
  reviewArtifactSchema,
540
785
  releaseArtifactSchema,
541
786
  maintenanceArtifactSchema
@@ -572,6 +817,14 @@ export const schemaRegistry = {
572
817
  auditComponent: auditComponentSchema,
573
818
  auditProvenance: auditProvenanceSchema,
574
819
  auditRedaction: auditRedactionSchema,
820
+ githubReference: githubReferenceSchema,
821
+ githubActionsJobEvidence: githubActionsJobEvidenceSchema,
822
+ githubActionsCheckRunEvidence: githubActionsCheckRunEvidenceSchema,
823
+ githubActionsEvidence: githubActionsEvidenceSchema,
824
+ githubActionsEvidenceNormalization: githubActionsEvidenceNormalizationSchema,
825
+ githubHandoffSection: githubHandoffSectionSchema,
826
+ githubHandoffSummary: githubHandoffSummarySchema,
827
+ githubWorkflowStatusMapping: githubWorkflowStatusMappingSchema,
575
828
  lifecycleArtifactWorkflowReference: lifecycleArtifactWorkflowReferenceSchema,
576
829
  lifecycleArtifactSourceReference: lifecycleArtifactSourceReferenceSchema,
577
830
  lifecycleArtifactRepoReference: lifecycleArtifactRepoReferenceSchema,
@@ -582,14 +835,23 @@ export const schemaRegistry = {
582
835
  designArtifactOption: designArtifactOptionSchema,
583
836
  designArtifactPayload: designArtifactPayloadSchema,
584
837
  implementationArtifactPayload: implementationArtifactPayloadSchema,
838
+ incidentArtifactPayload: incidentArtifactPayloadSchema,
839
+ qaArtifactPayload: qaArtifactPayloadSchema,
840
+ securityArtifactPayload: securityArtifactPayloadSchema,
585
841
  reviewArtifactPayload: reviewArtifactPayloadSchema,
586
842
  releaseVerificationCheck: releaseVerificationCheckSchema,
587
843
  releaseVersionTarget: releaseVersionTargetSchema,
844
+ releaseVersionResolution: releaseVersionResolutionSchema,
845
+ releaseApprovalRecommendation: releaseApprovalRecommendationSchema,
846
+ releaseEvidenceNormalization: releaseEvidenceNormalizationSchema,
588
847
  releaseArtifactPayload: releaseArtifactPayloadSchema,
589
848
  maintenanceArtifactPayload: maintenanceArtifactPayloadSchema,
590
849
  planningArtifact: planningArtifactSchema,
591
850
  designArtifact: designArtifactSchema,
592
851
  implementationArtifact: implementationArtifactSchema,
852
+ incidentArtifact: incidentArtifactSchema,
853
+ qaArtifact: qaArtifactSchema,
854
+ securityArtifact: securityArtifactSchema,
593
855
  reviewArtifact: reviewArtifactSchema,
594
856
  releaseArtifact: releaseArtifactSchema,
595
857
  maintenanceArtifact: maintenanceArtifactSchema,
@@ -602,8 +864,16 @@ export const schemaRegistry = {
602
864
  designRequest: designRequestSchema,
603
865
  implementationRequest: implementationRequestSchema,
604
866
  qaRequest: qaRequestSchema,
867
+ securityRequest: securityRequestSchema,
868
+ releaseRequest: releaseRequestSchema,
869
+ incidentRequest: incidentRequestSchema,
870
+ maintenanceRequest: maintenanceRequestSchema,
605
871
  normalizedValidationCommand: normalizedValidationCommandSchema,
606
872
  implementationInventory: implementationInventorySchema,
873
+ qaEvidenceNormalization: qaEvidenceNormalizationSchema,
874
+ securityEvidenceNormalization: securityEvidenceNormalizationSchema,
875
+ incidentEvidenceNormalization: incidentEvidenceNormalizationSchema,
876
+ maintenanceEvidenceNormalization: maintenanceEvidenceNormalizationSchema,
607
877
  policyDocument: policyDocumentSchema,
608
878
  effectivePolicySnapshot: effectivePolicySnapshotSchema,
609
879
  workflowDefinition: workflowDefinitionSchema,
@@ -626,7 +896,20 @@ const lifecycleArtifactFixtureBase = {
626
896
  sourceType: "workflow-run",
627
897
  runId: "run-123",
628
898
  inputRefs: ["docs/ROADMAP.md"],
629
- issueRefs: ["#78"]
899
+ issueRefs: ["#78"],
900
+ githubRefs: [
901
+ {
902
+ platform: "github",
903
+ host: "github.com",
904
+ owner: "H9-Foundry",
905
+ repo: "AgentForge",
906
+ kind: "issue",
907
+ number: 78,
908
+ canonical: "H9-Foundry/AgentForge#78",
909
+ url: "https://github.com/H9-Foundry/AgentForge/issues/78",
910
+ source: "#78"
911
+ }
912
+ ]
630
913
  },
631
914
  status: "complete",
632
915
  generatedAt: "2026-03-17T12:00:00.000Z",
@@ -711,6 +994,79 @@ const implementationArtifactFixture = {
711
994
  openQuestions: ["Which validation commands should become allowlisted in the next slice?"]
712
995
  }
713
996
  };
997
+ const incidentArtifactFixture = {
998
+ ...lifecycleArtifactFixtureBase,
999
+ artifactKind: "incident-brief",
1000
+ lifecycleDomain: "operate",
1001
+ summary: "Incident brief prepared for elevated 500s after the latest release candidate.",
1002
+ payload: {
1003
+ incidentSummary: "Customers saw elevated 500s after the latest release candidate.",
1004
+ evidenceSources: [
1005
+ ".agentops/evidence/incident-summary.md",
1006
+ ".agentops/evidence/alerts.json",
1007
+ ".agentops/runs/run-release/bundle.json"
1008
+ ],
1009
+ timelineSummary: [
1010
+ "Severity hint: high.",
1011
+ "Two staged evidence sources and one release-report reference were validated before reasoning."
1012
+ ],
1013
+ likelyImpactedAreas: ["release-readiness", "maintenance-triage", "packages/cli"],
1014
+ followUpWorkflowRefs: ["maintenance-triage", "security-review"],
1015
+ openQuestions: ["Which release candidate introduced the first reproducible 500 response?"]
1016
+ }
1017
+ };
1018
+ const qaArtifactFixture = {
1019
+ ...lifecycleArtifactFixtureBase,
1020
+ artifactKind: "qa-report",
1021
+ lifecycleDomain: "test",
1022
+ summary: "QA report for the bounded implementation proposal handoff.",
1023
+ payload: {
1024
+ targetRef: ".agentops/runs/run-789/bundle.json",
1025
+ evidenceSources: [".agentops/runs/run-789/summary.md"],
1026
+ executedChecks: ["pnpm test"],
1027
+ findings: [
1028
+ {
1029
+ id: "qa-finding-1",
1030
+ title: "Coverage evidence still needs review",
1031
+ summary: "The bounded QA handoff references validation output, but coverage evidence still needs interpretation.",
1032
+ severity: "medium",
1033
+ rationale: "The MVP QA workflow is read-only and request-driven, so it cannot infer full coverage status without normalized evidence.",
1034
+ confidence: 0.82,
1035
+ location: ".agentops/requests/qa.yaml",
1036
+ tags: ["qa", "coverage"]
1037
+ }
1038
+ ],
1039
+ coverageGaps: ["Coverage evidence was referenced but not normalized into a deterministic summary."],
1040
+ recommendedNextChecks: ["Review the referenced validation output before promotion.", "Confirm release-risk expectations with the owning maintainer."],
1041
+ releaseImpact: "candidate release requires QA follow-up before promotion."
1042
+ }
1043
+ };
1044
+ const securityArtifactFixture = {
1045
+ ...lifecycleArtifactFixtureBase,
1046
+ artifactKind: "security-report",
1047
+ lifecycleDomain: "security",
1048
+ summary: "Security report for the bounded implementation proposal handoff.",
1049
+ payload: {
1050
+ targetRef: ".agentops/runs/run-790/bundle.json",
1051
+ evidenceSources: [".agentops/runs/run-790/summary.md"],
1052
+ findings: [
1053
+ {
1054
+ id: "security-finding-1",
1055
+ title: "Dependency risk still needs bounded interpretation",
1056
+ summary: "The security workflow synthesized a dependency-risk concern from validated references.",
1057
+ severity: "medium",
1058
+ rationale: "This slice emits a structured security report from validated evidence references before deterministic evidence normalization lands.",
1059
+ confidence: 0.78,
1060
+ location: ".agentops/requests/security.yaml",
1061
+ tags: ["security", "dependency-risk"]
1062
+ }
1063
+ ],
1064
+ severitySummary: "highest severity: medium; 1 synthesized security finding.",
1065
+ mitigations: ["Review dependency-risk evidence before release promotion."],
1066
+ releaseImpact: "candidate release requires explicit security review before promotion.",
1067
+ followUpWork: ["Use deterministic security evidence normalization outputs before broader promotion."]
1068
+ }
1069
+ };
714
1070
  const reviewArtifactFixture = {
715
1071
  ...lifecycleArtifactFixtureBase,
716
1072
  artifactKind: "review-report",
@@ -744,8 +1100,28 @@ const releaseArtifactFixture = {
744
1100
  versionTargets: [{ name: "@h9-foundry/agentforge-schemas", version: "0.4.1" }],
745
1101
  readinessStatus: "ready",
746
1102
  verificationChecks: [{ name: "release-verify", status: "passed" }],
1103
+ versionResolutions: [
1104
+ {
1105
+ name: "@h9-foundry/agentforge-schemas",
1106
+ targetVersion: "0.4.1",
1107
+ currentVersion: "0.4.0",
1108
+ status: "pending-version-bump"
1109
+ }
1110
+ ],
1111
+ approvalRecommendations: [
1112
+ {
1113
+ action: "publish-packages",
1114
+ classification: "approval_required",
1115
+ reason: "Package publication remains outside the default read-only workflow path."
1116
+ }
1117
+ ],
747
1118
  publishingPlan: ["Merge version PR", "Let GitHub Actions publish"],
748
- trustStatus: "trusted-publishing-configured"
1119
+ trustStatus: "trusted-publishing-configured",
1120
+ publishedPackages: [],
1121
+ tagRefs: [],
1122
+ provenanceRefs: [".agentops/runs/run-321/bundle.json"],
1123
+ rollbackNotes: ["Pause the release if the verification set changes before publish."],
1124
+ externalDependencies: ["Trusted publishing remains configured in GitHub Actions."]
749
1125
  }
750
1126
  };
751
1127
  const maintenanceArtifactFixture = {
@@ -755,8 +1131,20 @@ const maintenanceArtifactFixture = {
755
1131
  summary: "Maintenance report for documentation and dependency hygiene.",
756
1132
  payload: {
757
1133
  maintenanceScope: "Docs and dependency hygiene",
1134
+ evidenceSources: [
1135
+ ".agentops/evidence/dependency-alerts.json",
1136
+ ".agentops/evidence/docs-task.md",
1137
+ ".agentops/runs/run-release/bundle.json"
1138
+ ],
1139
+ affectedPackagesOrDocs: ["docs/quickstart.md", "packages/cli"],
758
1140
  currentFindings: ["README needs clearer first-run guidance"],
759
1141
  recommendedActions: ["Rewrite quickstart", "Refresh sample repo docs"],
1142
+ routingRecommendation: "implementation-proposal",
1143
+ followUpWorkflowRefs: ["implementation-proposal", "release-readiness"],
1144
+ risks: [
1145
+ "Release-linked maintenance follow-up may drift if the latest release report is not revisited.",
1146
+ "Docs debt can diverge from implemented behavior if maintenance triage is deferred."
1147
+ ],
760
1148
  priorityAssessment: "high",
761
1149
  dependencyUpdates: ["vitest@4.1.0"],
762
1150
  docsUpdates: ["docs/quickstart.md"],
@@ -795,12 +1183,117 @@ const qaRequestFixture = {
795
1183
  constraints: ["Keep QA evidence collection read-only"],
796
1184
  releaseContext: "candidate"
797
1185
  };
1186
+ const securityRequestFixture = {
1187
+ targetRef: ".agentops/runs/run-790/bundle.json",
1188
+ evidenceSources: [".agentops/runs/run-790/summary.md"],
1189
+ focusAreas: ["dependency-risk", "release-readiness"],
1190
+ constraints: ["Keep security evidence collection read-only"],
1191
+ releaseContext: "candidate"
1192
+ };
1193
+ const releaseRequestFixture = {
1194
+ releaseScope: "Prepare the 0.7.0 candidate for maintainer review",
1195
+ versionTargets: [{ name: "@h9-foundry/agentforge-cli", version: "0.7.0" }],
1196
+ qaReportRefs: [".agentops/runs/run-789/bundle.json"],
1197
+ securityReportRefs: [".agentops/runs/run-790/bundle.json"],
1198
+ evidenceSources: [".agentops/runs/run-790/summary.md"],
1199
+ constraints: ["Keep release readiness read-only by default"]
1200
+ };
1201
+ const incidentRequestFixture = {
1202
+ incidentSummary: "Customers saw elevated 500s after the last release candidate.",
1203
+ severityHint: "high",
1204
+ evidenceSources: [".agentops/evidence/incident-summary.md", ".agentops/evidence/alerts.json"],
1205
+ releaseReportRefs: [".agentops/runs/run-release/bundle.json"],
1206
+ issueRefs: ["#144"],
1207
+ constraints: ["Keep staged incident evidence read-only"]
1208
+ };
1209
+ const maintenanceRequestFixture = {
1210
+ maintenanceGoal: "Triage dependency and docs hygiene follow-up after the latest release.",
1211
+ dependencyAlertRefs: [".agentops/evidence/dependency-alerts.json"],
1212
+ docsTaskRefs: [".agentops/evidence/docs-task.md"],
1213
+ releaseReportRefs: [".agentops/runs/run-release/bundle.json"],
1214
+ issueRefs: ["#145"],
1215
+ constraints: ["Keep maintenance triage read-only"]
1216
+ };
798
1217
  const normalizedValidationCommandFixture = {
799
1218
  command: "pnpm test",
800
1219
  source: "request",
801
1220
  classification: "approval_required",
802
1221
  reason: "Requested command matches a discovered allowlisted validation script."
803
1222
  };
1223
+ const githubReferenceFixture = {
1224
+ platform: "github",
1225
+ host: "github.com",
1226
+ owner: "H9-Foundry",
1227
+ repo: "AgentForge",
1228
+ kind: "issue",
1229
+ number: 142,
1230
+ canonical: "H9-Foundry/AgentForge#142",
1231
+ url: "https://github.com/H9-Foundry/AgentForge/issues/142",
1232
+ source: "#142"
1233
+ };
1234
+ const githubWorkflowStatusMappingFixture = {
1235
+ workflow: "planning-discovery",
1236
+ localRunStatus: "success",
1237
+ githubStatus: "completed",
1238
+ reason: "Successful local workflow runs map to completed GitHub handoff status."
1239
+ };
1240
+ const githubActionsEvidenceFixture = {
1241
+ sourcePath: ".agentops/evidence/github-actions-ci.json",
1242
+ repository: "H9-Foundry/AgentForge",
1243
+ workflowName: "CI",
1244
+ workflowRunId: 123456789,
1245
+ runAttempt: 1,
1246
+ event: "pull_request",
1247
+ headBranch: "main",
1248
+ headSha: "caf36447a49fc6e9fc308c34b98424958237aa1e",
1249
+ status: "completed",
1250
+ conclusion: "failure",
1251
+ htmlUrl: "https://github.com/H9-Foundry/AgentForge/actions/runs/123456789",
1252
+ jobs: [
1253
+ {
1254
+ name: "test",
1255
+ status: "completed",
1256
+ conclusion: "success",
1257
+ htmlUrl: "https://github.com/H9-Foundry/AgentForge/actions/runs/123456789/job/1"
1258
+ },
1259
+ {
1260
+ name: "lint",
1261
+ status: "completed",
1262
+ conclusion: "failure",
1263
+ htmlUrl: "https://github.com/H9-Foundry/AgentForge/actions/runs/123456789/job/2"
1264
+ }
1265
+ ],
1266
+ checkRuns: [
1267
+ {
1268
+ name: "validate-public-packages",
1269
+ status: "completed",
1270
+ conclusion: "success",
1271
+ detailsUrl: "https://github.com/H9-Foundry/AgentForge/actions/runs/123456789/job/3"
1272
+ }
1273
+ ]
1274
+ };
1275
+ const githubHandoffSummaryFixture = {
1276
+ artifactKind: "planning-brief",
1277
+ workflow: "planning-discovery",
1278
+ githubStatus: "completed",
1279
+ title: "Planning handoff for H9-Foundry/AgentForge#78",
1280
+ summary: "Planning brief scoped the next bounded workflow slice.",
1281
+ body: [
1282
+ "Planning handoff for `planning-discovery`.",
1283
+ "",
1284
+ "Summary:",
1285
+ "- Planning brief scoped the next bounded workflow slice."
1286
+ ].join("\n"),
1287
+ issueRefs: [githubReferenceFixture],
1288
+ pullRequestRefs: [],
1289
+ provenanceRefs: [".agentops/runs/run-123/bundle.json", "docs/ROADMAP.md"],
1290
+ sections: [
1291
+ {
1292
+ heading: "Summary",
1293
+ lines: ["Planning brief scoped the next bounded workflow slice."]
1294
+ }
1295
+ ]
1296
+ };
804
1297
  const implementationInventoryFixture = {
805
1298
  requestedTargetPaths: ["packages/cli", "packages/runtime"],
806
1299
  resolvedAffectedPaths: ["packages/cli/src/index.ts", "packages/runtime/src/index.ts"],
@@ -818,6 +1311,150 @@ const implementationInventoryFixture = {
818
1311
  }
819
1312
  ]
820
1313
  };
1314
+ const qaEvidenceNormalizationFixture = {
1315
+ targetRef: ".agentops/runs/run-789/bundle.json",
1316
+ targetType: "artifact-bundle",
1317
+ referencedArtifactKinds: ["implementation-proposal"],
1318
+ normalizedEvidenceSources: [".agentops/runs/run-789/bundle.json", ".agentops/runs/run-789/summary.md"],
1319
+ missingEvidenceSources: [],
1320
+ normalizedExecutedChecks: ["pnpm test"],
1321
+ unrecognizedExecutedChecks: [],
1322
+ affectedPackages: ["packages/cli"],
1323
+ allowedValidationCommands: [
1324
+ normalizedValidationCommandFixture,
1325
+ {
1326
+ command: "pnpm build",
1327
+ source: "package-script",
1328
+ classification: "approval_required",
1329
+ reason: "Discovered from a bounded repository script; execution would still require approval."
1330
+ }
1331
+ ],
1332
+ githubActions: {
1333
+ evidence: [githubActionsEvidenceFixture],
1334
+ workflowNames: ["CI"],
1335
+ failingChecks: ["CI / lint"],
1336
+ provenanceRefs: [
1337
+ ".agentops/evidence/github-actions-ci.json",
1338
+ "https://github.com/H9-Foundry/AgentForge/actions/runs/123456789",
1339
+ "https://github.com/H9-Foundry/AgentForge/actions/runs/123456789/job/1",
1340
+ "https://github.com/H9-Foundry/AgentForge/actions/runs/123456789/job/2",
1341
+ "https://github.com/H9-Foundry/AgentForge/actions/runs/123456789/job/3"
1342
+ ]
1343
+ }
1344
+ };
1345
+ const securityEvidenceNormalizationFixture = {
1346
+ targetRef: ".agentops/runs/run-790/bundle.json",
1347
+ targetType: "artifact-bundle",
1348
+ referencedArtifactKinds: ["implementation-proposal"],
1349
+ normalizedEvidenceSources: [".agentops/runs/run-790/bundle.json", ".agentops/runs/run-790/summary.md"],
1350
+ missingEvidenceSources: [],
1351
+ normalizedFocusAreas: ["dependency-risk", "release-readiness"],
1352
+ securitySignals: [
1353
+ "Referenced artifact kinds: implementation-proposal",
1354
+ "Affected packages inferred from bounded artifact payloads: packages/cli, packages/runtime"
1355
+ ],
1356
+ provenanceRefs: [
1357
+ ".agentops/runs/run-790/bundle.json#implementation-proposal",
1358
+ ".agentops/runs/run-790/summary.md"
1359
+ ],
1360
+ affectedPackages: ["packages/cli", "packages/runtime"]
1361
+ };
1362
+ const incidentEvidenceNormalizationFixture = {
1363
+ incidentSummary: "Customers saw elevated 500s after the last release candidate.",
1364
+ severityHint: "high",
1365
+ normalizedEvidenceSources: [
1366
+ ".agentops/evidence/incident-summary.md",
1367
+ ".agentops/evidence/alerts.json",
1368
+ ".agentops/runs/run-release/bundle.json"
1369
+ ],
1370
+ missingEvidenceSources: [],
1371
+ releaseReportRefs: [".agentops/runs/run-release/bundle.json"],
1372
+ timelineSummary: [
1373
+ "Severity hint: high.",
1374
+ "Normalized staged incident evidence and release-report references before reasoning.",
1375
+ "Observed source .agentops/evidence/incident-summary.md during deterministic intake.",
1376
+ "Observed source .agentops/evidence/alerts.json during deterministic intake.",
1377
+ "Observed source .agentops/runs/run-release/bundle.json during deterministic intake."
1378
+ ],
1379
+ likelyImpactedAreas: ["release-readiness", "staged-operational-evidence", "security-follow-up"],
1380
+ followUpWorkflowRefs: ["maintenance-triage", "release-readiness", "security-review"],
1381
+ provenanceRefs: [
1382
+ ".agentops/evidence/incident-summary.md",
1383
+ ".agentops/evidence/alerts.json",
1384
+ ".agentops/runs/run-release/bundle.json#release-report"
1385
+ ],
1386
+ redactionCategories: ["github-token", "api-key", "aws-key", "bearer-token", "password", "private-key", "operational-sensitive"],
1387
+ referencedArtifactKinds: ["release-report"]
1388
+ };
1389
+ const maintenanceEvidenceNormalizationFixture = {
1390
+ maintenanceGoal: "Triage dependency and docs hygiene follow-up after the latest release.",
1391
+ dependencyAlertRefs: [".agentops/evidence/dependency-alerts.json"],
1392
+ docsTaskRefs: [".agentops/evidence/docs-task.md"],
1393
+ releaseReportRefs: [".agentops/runs/run-release/bundle.json"],
1394
+ normalizedEvidenceSources: [
1395
+ ".agentops/evidence/dependency-alerts.json",
1396
+ ".agentops/evidence/docs-task.md",
1397
+ ".agentops/runs/run-release/bundle.json"
1398
+ ],
1399
+ missingEvidenceSources: [],
1400
+ referencedArtifactKinds: ["release-report"],
1401
+ affectedPackagesOrDocs: ["docs/quickstart.md", "packages/cli"],
1402
+ maintenanceSignals: [
1403
+ "Observed source .agentops/evidence/dependency-alerts.json during deterministic intake.",
1404
+ "Observed source .agentops/evidence/docs-task.md during deterministic intake.",
1405
+ "Observed source .agentops/runs/run-release/bundle.json during deterministic intake.",
1406
+ "Release report references contribute bounded maintenance follow-up context."
1407
+ ],
1408
+ followUpWorkflowRefs: ["implementation-proposal", "release-readiness"],
1409
+ routingRecommendation: "implementation-proposal",
1410
+ provenanceRefs: [
1411
+ ".agentops/evidence/dependency-alerts.json",
1412
+ ".agentops/evidence/docs-task.md",
1413
+ ".agentops/runs/run-release/bundle.json#release-report"
1414
+ ]
1415
+ };
1416
+ const releaseEvidenceNormalizationFixture = {
1417
+ qaReportRefs: [".agentops/runs/run-789/bundle.json"],
1418
+ securityReportRefs: [".agentops/runs/run-790/bundle.json"],
1419
+ normalizedEvidenceSources: [
1420
+ ".agentops/runs/run-789/bundle.json",
1421
+ ".agentops/runs/run-790/bundle.json",
1422
+ ".agentops/runs/run-790/summary.md"
1423
+ ],
1424
+ missingEvidenceSources: [],
1425
+ versionResolutions: [
1426
+ {
1427
+ name: "@h9-foundry/agentforge-cli",
1428
+ targetVersion: "0.7.0",
1429
+ currentVersion: "0.6.0",
1430
+ status: "pending-version-bump"
1431
+ }
1432
+ ],
1433
+ localReadinessChecks: [
1434
+ { name: "qa-report-refs", status: "passed", detail: "Using one validated QA report reference." },
1435
+ { name: "security-report-refs", status: "passed", detail: "Using one validated security report reference." },
1436
+ { name: "workspace-version-targets", status: "passed", detail: "Resolved one workspace version target." }
1437
+ ],
1438
+ readinessStatus: "ready",
1439
+ approvalRecommendations: [
1440
+ {
1441
+ action: "publish-packages",
1442
+ classification: "approval_required",
1443
+ reason: "Package publication remains outside the default read-only workflow path."
1444
+ },
1445
+ {
1446
+ action: "promote-release",
1447
+ classification: "approval_required",
1448
+ reason: "Promotion remains a release-significant side effect and requires explicit maintainer approval."
1449
+ }
1450
+ ],
1451
+ provenanceRefs: [
1452
+ ".agentops/runs/run-789/bundle.json",
1453
+ ".agentops/runs/run-790/bundle.json",
1454
+ ".agentops/runs/run-790/summary.md",
1455
+ "packages/cli/package.json"
1456
+ ]
1457
+ };
821
1458
  export const schemaFixtures = {
822
1459
  finding: {
823
1460
  id: "finding-1",
@@ -924,12 +1561,28 @@ export const schemaFixtures = {
924
1561
  },
925
1562
  implementationRequest: implementationRequestFixture,
926
1563
  qaRequest: qaRequestFixture,
1564
+ securityRequest: securityRequestFixture,
1565
+ releaseRequest: releaseRequestFixture,
1566
+ incidentRequest: incidentRequestFixture,
1567
+ maintenanceRequest: maintenanceRequestFixture,
1568
+ githubReference: githubReferenceFixture,
1569
+ githubActionsEvidence: githubActionsEvidenceFixture,
1570
+ githubHandoffSummary: githubHandoffSummaryFixture,
1571
+ githubWorkflowStatusMapping: githubWorkflowStatusMappingFixture,
927
1572
  normalizedValidationCommand: normalizedValidationCommandFixture,
928
1573
  implementationInventory: implementationInventoryFixture,
1574
+ qaEvidenceNormalization: qaEvidenceNormalizationFixture,
1575
+ securityEvidenceNormalization: securityEvidenceNormalizationFixture,
1576
+ incidentEvidenceNormalization: incidentEvidenceNormalizationFixture,
1577
+ maintenanceEvidenceNormalization: maintenanceEvidenceNormalizationFixture,
1578
+ releaseEvidenceNormalization: releaseEvidenceNormalizationFixture,
929
1579
  lifecycleArtifactEnvelope: planningArtifactFixture,
930
1580
  planningArtifact: planningArtifactFixture,
931
1581
  designArtifact: designArtifactFixture,
932
1582
  implementationArtifact: implementationArtifactFixture,
1583
+ incidentArtifact: incidentArtifactFixture,
1584
+ qaArtifact: qaArtifactFixture,
1585
+ securityArtifact: securityArtifactFixture,
933
1586
  reviewArtifact: reviewArtifactFixture,
934
1587
  releaseArtifact: releaseArtifactFixture,
935
1588
  maintenanceArtifact: maintenanceArtifactFixture,