create-filegrc 0.3.4 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +4 -3
  2. package/package.json +1 -1
  3. package/src/cli.js +12 -4
  4. package/src/defaults.js +299 -123
  5. package/src/index.js +30 -17
  6. package/template/AGENTS.md +55 -17
  7. package/template/README.md +20 -9
  8. package/template/WORKSPACE.md +13 -0
  9. package/template/data/AGENTS.md +41 -11
  10. package/template/data/action-items/AGENTS.md +2 -2
  11. package/template/data/appointments/appointment-independent-policy-reviewer.json +11 -0
  12. package/template/data/appointments/appointment-policy-owner.json +11 -0
  13. package/template/data/audits/AGENTS.md +1 -1
  14. package/template/data/collection-reviews/collection-review-complementary-control.json +10 -0
  15. package/template/data/collection-reviews/collection-review-framework.json +10 -0
  16. package/template/data/collection-reviews/collection-review-person.json +10 -0
  17. package/template/data/collection-reviews/collection-review-system.json +10 -0
  18. package/template/data/collection-reviews/collection-review-vendor.json +10 -0
  19. package/template/data/documents/document-business-continuity-disaster-recovery.json +14 -13
  20. package/template/data/documents/document-business-continuity-disaster-recovery.md +3 -1
  21. package/template/data/documents/document-contractor-policy-acknowledgement.json +12 -12
  22. package/template/data/documents/document-contractor-training-acknowledgement.json +15 -13
  23. package/template/data/documents/document-data-retention-schedule.json +11 -12
  24. package/template/data/documents/document-employee-handbook-acknowledgement.json +12 -12
  25. package/template/data/documents/document-employee-policy-acknowledgement.json +12 -12
  26. package/template/data/documents/document-employee-training-acknowledgement.json +15 -13
  27. package/template/data/documents/document-incident-response-plan.json +14 -13
  28. package/template/data/documents/document-incident-response-plan.md +4 -2
  29. package/template/data/documents/document-soc2-management-assertion.json +3 -3
  30. package/template/data/documents/document-soc2-management-representation.json +3 -3
  31. package/template/data/documents/document-soc2-period-completeness.json +3 -3
  32. package/template/data/documents/document-soc2-system-description.json +3 -3
  33. package/template/data/evidence/AGENTS.md +3 -3
  34. package/template/data/obligation-events/AGENTS.md +2 -2
  35. package/template/data/obligations/AGENTS.md +1 -1
  36. package/template/data/people/person-program-lead.json +9 -0
  37. package/template/data/policies/AGENTS.md +1 -1
  38. package/template/data/policies/policy-anti-bribery-corruption.json +10 -15
  39. package/template/data/policies/policy-anti-bribery-corruption.md +1 -1
  40. package/template/data/policies/policy-clear-desk-screen.json +9 -14
  41. package/template/data/policies/policy-clear-desk-screen.md +1 -1
  42. package/template/data/policies/policy-data-protection-handling.json +13 -24
  43. package/template/data/policies/policy-data-protection-handling.md +2 -2
  44. package/template/data/policies/policy-employee-handbook.json +9 -18
  45. package/template/data/policies/policy-information-security.json +11 -42
  46. package/template/data/policies/policy-information-security.md +3 -3
  47. package/template/data/policies/policy-mobile-computing-communications.json +9 -18
  48. package/template/data/policies/policy-mobile-computing-communications.md +1 -1
  49. package/template/data/renderer.json +1 -3
  50. package/template/data/systems/system-filegrc-program-repository.md +2 -2
  51. package/template/data/training/training-anti-bribery-high-risk-roles.json +1 -2
  52. package/template/data/training/training-privileged-sensitive-roles.json +1 -2
  53. package/template/data/training/training-secure-development.json +1 -2
  54. package/template/data/training/training-security-awareness.json +7 -9
  55. package/template/data/training/training-security-awareness.md +1 -1
  56. package/template/data/workspace.json +19 -8
  57. package/template/docs/filegrc-home.png +0 -0
  58. package/template/package.json +3 -2
  59. package/template-parameters.json +6 -1
  60. package/template/data/people/person-policy-owner.json +0 -10
package/src/defaults.js CHANGED
@@ -3,7 +3,8 @@ import { mkdir, writeFile } from "node:fs/promises";
3
3
 
4
4
  const FRAMEWORK_ID = "framework-aicpa-trust-services-criteria";
5
5
  const DESCRIPTION_FRAMEWORK_ID = "framework-aicpa-soc2-description-criteria";
6
- const OWNER_ID = "person-policy-owner";
6
+ const PROGRAM_LEAD_ID = "person-program-lead";
7
+ const POLICY_OWNER_APPOINTMENT_ID = "appointment-policy-owner";
7
8
  const OVERSIGHT_TEAM_ID = "team-security-risk-oversight";
8
9
  const INFORMATION_SECURITY_POLICY_ID = "policy-information-security";
9
10
  const DATA_POLICY_ID = "policy-data-protection-handling";
@@ -13,6 +14,41 @@ const ROLE_TRAINING_IDS = [
13
14
  "training-privileged-sensitive-roles",
14
15
  "training-anti-bribery-high-risk-roles"
15
16
  ];
17
+ const FILEGRC_SOURCE_FAMILIES = [
18
+ "training-acknowledgement",
19
+ "exception-finding",
20
+ "governance",
21
+ "risk-management",
22
+ "vendor-management"
23
+ ];
24
+ const FILEGRC_SOURCE_CONTROL_CODES = new Set([
25
+ "GOV-01",
26
+ "GOV-02",
27
+ "GOV-03",
28
+ "HR-01",
29
+ "HR-02",
30
+ "RSK-01",
31
+ "MON-01",
32
+ "EXC-01",
33
+ "VEN-01",
34
+ "VEN-02"
35
+ ]);
36
+ const SOURCE_FAMILIES = [
37
+ ["workforce", "Workforce System"],
38
+ ["training-acknowledgement", "Training and Acknowledgements"],
39
+ ["identity-access", "Identity and Access Systems"],
40
+ ["production-change", "Production Change Systems"],
41
+ ["security-monitoring", "Security Monitoring Systems"],
42
+ ["vulnerability-management", "Vulnerability Management"],
43
+ ["endpoint-asset", "Endpoint Management Systems"],
44
+ ["backup-recovery", "Backup and Recovery"],
45
+ ["vendor-management", "Vendors"],
46
+ ["exception-finding", "Exceptions and Findings"],
47
+ ["data-handling", "Data Protection Configuration"],
48
+ ["network-security", "Network Security Systems"],
49
+ ["governance", "Governance"],
50
+ ["risk-management", "Risk Management"]
51
+ ];
16
52
 
17
53
  const commonCriteria = [
18
54
  ["CC1.1", "Integrity and ethical values", "Set, communicate, and enforce standards for integrity and ethical conduct."],
@@ -72,7 +108,7 @@ const controls = [
72
108
  activity: "Assign an independent reviewer who is separate from program ownership and record quarterly oversight decisions, approvals, and actions.",
73
109
  controlType: "preventive",
74
110
  operationMode: "manual",
75
- frequency: "Quarterly",
111
+ operationPattern: "scheduled",
76
112
  policies: [INFORMATION_SECURITY_POLICY_ID, "policy-anti-bribery-corruption"]
77
113
  },
78
114
  {
@@ -84,7 +120,7 @@ const controls = [
84
120
  activity: "Review, approve, communicate, and version policies and plans.",
85
121
  controlType: "preventive",
86
122
  operationMode: "manual",
87
- frequency: "Annually and after material changes",
123
+ operationPattern: "mixed",
88
124
  policies: [
89
125
  "policy-anti-bribery-corruption",
90
126
  "policy-clear-desk-screen",
@@ -102,7 +138,7 @@ const controls = [
102
138
  activity: "Maintain reporting routes and communicate policies, changes, and security information.",
103
139
  controlType: "preventive",
104
140
  operationMode: "hybrid",
105
- frequency: "Ongoing and after material changes",
141
+ operationPattern: "mixed",
106
142
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
107
143
  },
108
144
  {
@@ -114,7 +150,7 @@ const controls = [
114
150
  activity: "Complete screening when appropriate, agreements, policy acknowledgement, and corrective action.",
115
151
  controlType: "preventive",
116
152
  operationMode: "manual",
117
- frequency: "Before access and on material change",
153
+ operationPattern: "event-driven",
118
154
  policies: [INFORMATION_SECURITY_POLICY_ID, "policy-anti-bribery-corruption"]
119
155
  },
120
156
  {
@@ -126,7 +162,7 @@ const controls = [
126
162
  activity: "Assign general and role-based training, document non-applicability where needed, collect completion attestations, and follow up on overdue assignments.",
127
163
  controlType: "preventive",
128
164
  operationMode: "manual",
129
- frequency: "Onboarding and annually",
165
+ operationPattern: "mixed",
130
166
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID, "policy-anti-bribery-corruption"]
131
167
  },
132
168
  {
@@ -138,7 +174,7 @@ const controls = [
138
174
  activity: "Complete and retain annual performance reviews and resulting corrective work.",
139
175
  controlType: "detective",
140
176
  operationMode: "manual",
141
- frequency: "Annually",
177
+ operationPattern: "scheduled",
142
178
  policies: [INFORMATION_SECURITY_POLICY_ID]
143
179
  },
144
180
  {
@@ -150,7 +186,7 @@ const controls = [
150
186
  activity: "Identify threats and changes, score risk, select treatment, and track review dates.",
151
187
  controlType: "detective",
152
188
  operationMode: "manual",
153
- frequency: "Annually, quarterly for high risks, and after material changes",
189
+ operationPattern: "mixed",
154
190
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
155
191
  },
156
192
  {
@@ -162,7 +198,7 @@ const controls = [
162
198
  activity: "Review control evidence and track deficiencies, owners, due dates, and verification.",
163
199
  controlType: "detective",
164
200
  operationMode: "manual",
165
- frequency: "Quarterly and as issues arise",
201
+ operationPattern: "mixed",
166
202
  policies: [INFORMATION_SECURITY_POLICY_ID]
167
203
  },
168
204
  {
@@ -174,7 +210,7 @@ const controls = [
174
210
  activity: "Request, approve, provision, change, and record access.",
175
211
  controlType: "preventive",
176
212
  operationMode: "hybrid",
177
- frequency: "Per access event",
213
+ operationPattern: "event-driven",
178
214
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
179
215
  },
180
216
  {
@@ -186,7 +222,7 @@ const controls = [
186
222
  activity: "Configure and monitor authentication, credential storage, and privileged roles.",
187
223
  controlType: "preventive",
188
224
  operationMode: "hybrid",
189
- frequency: "Continuous",
225
+ operationPattern: "continuous",
190
226
  policies: [INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
191
227
  },
192
228
  {
@@ -198,7 +234,7 @@ const controls = [
198
234
  activity: "Review access populations, record decisions, and remove dormant, expired, or unneeded access.",
199
235
  controlType: "detective",
200
236
  operationMode: "manual",
201
- frequency: "Quarterly, annually, and per workforce event",
237
+ operationPattern: "mixed",
202
238
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
203
239
  },
204
240
  {
@@ -210,7 +246,7 @@ const controls = [
210
246
  activity: "Control visitors and facilities, secure workspaces, and report loss or exposure.",
211
247
  controlType: "preventive",
212
248
  operationMode: "manual",
213
- frequency: "Continuous",
249
+ operationPattern: "continuous",
214
250
  policies: [INFORMATION_SECURITY_POLICY_ID, "policy-clear-desk-screen", "policy-mobile-computing-communications"]
215
251
  },
216
252
  {
@@ -222,7 +258,7 @@ const controls = [
222
258
  activity: "Maintain classification, ownership, system, vendor, and processing records.",
223
259
  controlType: "preventive",
224
260
  operationMode: "manual",
225
- frequency: "Annually and after material changes",
261
+ operationPattern: "mixed",
226
262
  policies: [DATA_POLICY_ID, INFORMATION_SECURITY_POLICY_ID]
227
263
  },
228
264
  {
@@ -234,7 +270,7 @@ const controls = [
234
270
  activity: "Configure encryption and approved transfer methods based on classification.",
235
271
  controlType: "preventive",
236
272
  operationMode: "automated",
237
- frequency: "Continuous",
273
+ operationPattern: "continuous",
238
274
  policies: [DATA_POLICY_ID, INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
239
275
  },
240
276
  {
@@ -246,7 +282,7 @@ const controls = [
246
282
  activity: "Apply approved retention and disposal methods to active, local, backup, and vendor-held copies.",
247
283
  controlType: "preventive",
248
284
  operationMode: "hybrid",
249
- frequency: "Per retention event",
285
+ operationPattern: "event-driven",
250
286
  policies: [DATA_POLICY_ID, INFORMATION_SECURITY_POLICY_ID]
251
287
  },
252
288
  {
@@ -258,7 +294,7 @@ const controls = [
258
294
  activity: "Maintain inventories, baselines, ownership, classification, and approved deviations.",
259
295
  controlType: "preventive",
260
296
  operationMode: "hybrid",
261
- frequency: "Ongoing with annual review",
297
+ operationPattern: "mixed",
262
298
  policies: [INFORMATION_SECURITY_POLICY_ID]
263
299
  },
264
300
  {
@@ -270,7 +306,7 @@ const controls = [
270
306
  activity: "Manage endpoint safeguards and perform a full or equivalent malware scan at least monthly.",
271
307
  controlType: "preventive",
272
308
  operationMode: "automated",
273
- frequency: "Continuous with monthly scanning",
309
+ operationPattern: "mixed",
274
310
  policies: [INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
275
311
  },
276
312
  {
@@ -282,7 +318,7 @@ const controls = [
282
318
  activity: "Manage boundaries, firewall rules, wireless safeguards, and remote production access.",
283
319
  controlType: "preventive",
284
320
  operationMode: "hybrid",
285
- frequency: "Continuous with annual review",
321
+ operationPattern: "mixed",
286
322
  policies: [INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
287
323
  },
288
324
  {
@@ -294,7 +330,7 @@ const controls = [
294
330
  activity: "Record the reason, author, reviewer, test result, deployment, and rollback method.",
295
331
  controlType: "preventive",
296
332
  operationMode: "hybrid",
297
- frequency: "Per change",
333
+ operationPattern: "event-driven",
298
334
  policies: [INFORMATION_SECURITY_POLICY_ID]
299
335
  },
300
336
  {
@@ -306,7 +342,7 @@ const controls = [
306
342
  activity: "Identify, validate, prioritize, remediate, or approve time-bound exceptions for vulnerabilities.",
307
343
  controlType: "detective",
308
344
  operationMode: "hybrid",
309
- frequency: "Quarterly and after material changes",
345
+ operationPattern: "mixed",
310
346
  policies: [INFORMATION_SECURITY_POLICY_ID]
311
347
  },
312
348
  {
@@ -318,7 +354,7 @@ const controls = [
318
354
  activity: "Define scope, perform independent testing, review results, and track findings.",
319
355
  controlType: "detective",
320
356
  operationMode: "manual",
321
- frequency: "Annually",
357
+ operationPattern: "scheduled",
322
358
  policies: [INFORMATION_SECURITY_POLICY_ID]
323
359
  },
324
360
  {
@@ -330,7 +366,7 @@ const controls = [
330
366
  activity: "Collect, protect, alert on, test, and review important log output and access.",
331
367
  controlType: "detective",
332
368
  operationMode: "hybrid",
333
- frequency: "Continuous with quarterly review",
369
+ operationPattern: "mixed",
334
370
  policies: [INFORMATION_SECURITY_POLICY_ID]
335
371
  },
336
372
  {
@@ -342,7 +378,7 @@ const controls = [
342
378
  activity: "Triage events, preserve evidence, coordinate response and notification review, and complete retrospectives.",
343
379
  controlType: "corrective",
344
380
  operationMode: "hybrid",
345
- frequency: "Per event",
381
+ operationPattern: "event-driven",
346
382
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
347
383
  },
348
384
  {
@@ -354,7 +390,7 @@ const controls = [
354
390
  activity: "Plan, conduct, review, and document an incident response and alert-path exercise.",
355
391
  controlType: "detective",
356
392
  operationMode: "manual",
357
- frequency: "Annually",
393
+ operationPattern: "scheduled",
358
394
  policies: [INFORMATION_SECURITY_POLICY_ID]
359
395
  },
360
396
  {
@@ -366,7 +402,7 @@ const controls = [
366
402
  activity: "Protect and monitor backups, then test retrieval and use of restored data.",
367
403
  controlType: "corrective",
368
404
  operationMode: "hybrid",
369
- frequency: "Daily with annual restoration test",
405
+ operationPattern: "scheduled",
370
406
  policies: [INFORMATION_SECURITY_POLICY_ID]
371
407
  },
372
408
  {
@@ -378,7 +414,7 @@ const controls = [
378
414
  activity: "Maintain the plan, contacts, recovery objectives, exercises, results, and follow-up work.",
379
415
  controlType: "corrective",
380
416
  operationMode: "manual",
381
- frequency: "Annually and after material disruption",
417
+ operationPattern: "mixed",
382
418
  policies: [INFORMATION_SECURITY_POLICY_ID]
383
419
  },
384
420
  {
@@ -390,7 +426,7 @@ const controls = [
390
426
  activity: "Assess service, data, access, assurance, recovery, incidents, and contract terms before access.",
391
427
  controlType: "preventive",
392
428
  operationMode: "manual",
393
- frequency: "Before access and after material changes",
429
+ operationPattern: "event-driven",
394
430
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
395
431
  },
396
432
  {
@@ -402,7 +438,7 @@ const controls = [
402
438
  activity: "Review vendor performance, assurance, recovery, access, incidents, and contract obligations.",
403
439
  controlType: "detective",
404
440
  operationMode: "manual",
405
- frequency: "Annually and after material changes or incidents",
441
+ operationPattern: "mixed",
406
442
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
407
443
  },
408
444
  {
@@ -414,7 +450,7 @@ const controls = [
414
450
  activity: "Request, assess, approve, monitor, and close time-bound exceptions.",
415
451
  controlType: "preventive",
416
452
  operationMode: "manual",
417
- frequency: "Per exception",
453
+ operationPattern: "event-driven",
418
454
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
419
455
  }
420
456
  ];
@@ -435,7 +471,7 @@ const obligations = [
435
471
  title: "Annual policy and governed-plan review",
436
472
  activityType: "policy-review",
437
473
  recurrence: calendar("year", 1),
438
- ownerIds: [OWNER_ID],
474
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
439
475
  scopeResourceIds: [
440
476
  "policy-anti-bribery-corruption",
441
477
  "policy-clear-desk-screen",
@@ -463,10 +499,14 @@ const obligations = [
463
499
  title: "Annual security awareness training",
464
500
  activityType: "training",
465
501
  recurrence: calendar("year", 1),
466
- ownerIds: [OWNER_ID],
502
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
467
503
  scopeResourceIds: ["training-security-awareness"],
468
504
  templateResourceId: "training-security-awareness",
469
- controlIds: ["control-security-training"],
505
+ controlIds: [
506
+ "control-security-communication",
507
+ "control-workforce-expectations",
508
+ "control-security-training"
509
+ ],
470
510
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
471
511
  },
472
512
  {
@@ -474,7 +514,7 @@ const obligations = [
474
514
  title: "Annual workforce performance review",
475
515
  activityType: "performance-review",
476
516
  recurrence: calendar("year", 1),
477
- ownerIds: [OWNER_ID],
517
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
478
518
  controlIds: ["control-performance-review"],
479
519
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
480
520
  },
@@ -483,7 +523,7 @@ const obligations = [
483
523
  title: "Quarterly privileged and production access review",
484
524
  activityType: "access-review",
485
525
  recurrence: calendar("month", 3),
486
- ownerIds: [OWNER_ID],
526
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
487
527
  controlIds: ["control-access-review-offboarding"],
488
528
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
489
529
  },
@@ -492,7 +532,7 @@ const obligations = [
492
532
  title: "Annual important-system access review",
493
533
  activityType: "access-review",
494
534
  recurrence: calendar("year", 1),
495
- ownerIds: [OWNER_ID],
535
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
496
536
  controlIds: ["control-access-review-offboarding"],
497
537
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
498
538
  },
@@ -501,7 +541,7 @@ const obligations = [
501
541
  title: "Annual system, company and personal device, vendor, and data inventory review",
502
542
  activityType: "inventory-review",
503
543
  recurrence: calendar("year", 1),
504
- ownerIds: [OWNER_ID],
544
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
505
545
  controlIds: ["control-inventory-configuration", "control-data-classification-inventory"],
506
546
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
507
547
  },
@@ -510,7 +550,7 @@ const obligations = [
510
550
  title: "Monthly endpoint malware scan",
511
551
  activityType: "security-scan",
512
552
  recurrence: calendar("month", 1),
513
- ownerIds: [OWNER_ID],
553
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
514
554
  controlIds: ["control-endpoint-protection"],
515
555
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
516
556
  },
@@ -519,7 +559,7 @@ const obligations = [
519
559
  title: "Annual firewall and network access review",
520
560
  activityType: "network-review",
521
561
  recurrence: calendar("year", 1),
522
- ownerIds: [OWNER_ID],
562
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
523
563
  controlIds: ["control-network-security"],
524
564
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
525
565
  },
@@ -528,7 +568,7 @@ const obligations = [
528
568
  title: "Quarterly vulnerability scan",
529
569
  activityType: "vulnerability-scan",
530
570
  recurrence: calendar("month", 3),
531
- ownerIds: [OWNER_ID],
571
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
532
572
  controlIds: ["control-vulnerability-management"],
533
573
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
534
574
  },
@@ -537,7 +577,7 @@ const obligations = [
537
577
  title: "Annual independent penetration test",
538
578
  activityType: "penetration-test",
539
579
  recurrence: calendar("year", 1),
540
- ownerIds: [OWNER_ID],
580
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
541
581
  controlIds: ["control-penetration-testing"],
542
582
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
543
583
  },
@@ -546,7 +586,7 @@ const obligations = [
546
586
  title: "Quarterly security log and log-access review",
547
587
  activityType: "log-review",
548
588
  recurrence: calendar("month", 3),
549
- ownerIds: [OWNER_ID],
589
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
550
590
  controlIds: ["control-logging-monitoring"],
551
591
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
552
592
  },
@@ -555,7 +595,7 @@ const obligations = [
555
595
  title: "Annual incident response and alert-path exercise",
556
596
  activityType: "exercise",
557
597
  recurrence: calendar("year", 1),
558
- ownerIds: [OWNER_ID],
598
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
559
599
  scopeResourceIds: ["document-incident-response-plan"],
560
600
  templateResourceId: "document-incident-response-plan",
561
601
  controlIds: ["control-incident-exercise", "control-logging-monitoring"],
@@ -566,7 +606,7 @@ const obligations = [
566
606
  title: "Annual backup restoration test",
567
607
  activityType: "backup-test",
568
608
  recurrence: calendar("year", 1),
569
- ownerIds: [OWNER_ID],
609
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
570
610
  controlIds: ["control-backup-restoration"],
571
611
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
572
612
  },
@@ -586,8 +626,8 @@ const obligations = [
586
626
  title: "Annual critical and high-risk vendor review",
587
627
  activityType: "vendor-review",
588
628
  recurrence: calendar("year", 1),
589
- ownerIds: [OWNER_ID],
590
- controlIds: ["control-vendor-monitoring"],
629
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
630
+ controlIds: ["control-vendor-due-diligence", "control-vendor-monitoring"],
591
631
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
592
632
  },
593
633
  {
@@ -595,7 +635,7 @@ const obligations = [
595
635
  title: "Annual emergency contact review",
596
636
  activityType: "continuity-review",
597
637
  recurrence: calendar("year", 1),
598
- ownerIds: [OWNER_ID],
638
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
599
639
  scopeResourceIds: ["document-business-continuity-disaster-recovery"],
600
640
  controlIds: ["control-continuity-exercise"],
601
641
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
@@ -607,8 +647,7 @@ const obligations = [
607
647
  recurrence: event("person-started"),
608
648
  triggerPrompt: "New employee or contractor?",
609
649
  window: eventWindow(0),
610
- completionResourceTypes: ["attestation", "evidence"],
611
- ownerIds: [OWNER_ID],
650
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
612
651
  controlIds: ["control-workforce-expectations"],
613
652
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
614
653
  },
@@ -619,8 +658,7 @@ const obligations = [
619
658
  recurrence: event("person-started"),
620
659
  triggerPrompt: "New employee or contractor?",
621
660
  window: eventWindow(0),
622
- completionResourceTypes: ["access-grant", "evidence"],
623
- ownerIds: [OWNER_ID],
661
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
624
662
  controlIds: ["control-access-authorization"],
625
663
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
626
664
  },
@@ -631,8 +669,7 @@ const obligations = [
631
669
  recurrence: event("person-started"),
632
670
  triggerPrompt: "New employee or contractor?",
633
671
  window: eventWindow(0),
634
- completionResourceTypes: ["asset"],
635
- ownerIds: [OWNER_ID],
672
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
636
673
  controlIds: ["control-inventory-configuration"],
637
674
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
638
675
  },
@@ -643,8 +680,7 @@ const obligations = [
643
680
  recurrence: event("person-started"),
644
681
  triggerPrompt: "New employee or contractor?",
645
682
  window: eventWindow(30),
646
- completionResourceTypes: ["attestation", "evidence"],
647
- ownerIds: [OWNER_ID],
683
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
648
684
  scopeResourceIds: ["training-security-awareness"],
649
685
  templateResourceId: "training-security-awareness",
650
686
  controlIds: ["control-security-training"],
@@ -657,8 +693,7 @@ const obligations = [
657
693
  recurrence: event("person-started"),
658
694
  triggerPrompt: "New employee or contractor?",
659
695
  window: eventWindow(30),
660
- completionResourceTypes: ["attestation", "evidence"],
661
- ownerIds: [OWNER_ID],
696
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
662
697
  scopeResourceIds: ROLE_TRAINING_IDS,
663
698
  controlIds: ["control-security-training"],
664
699
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID, "policy-anti-bribery-corruption"]
@@ -670,8 +705,7 @@ const obligations = [
670
705
  recurrence: event("person-ended"),
671
706
  triggerPrompt: "Employee or contractor departing?",
672
707
  window: eventWindowHours(24),
673
- completionResourceTypes: ["access-grant", "evidence"],
674
- ownerIds: [OWNER_ID],
708
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
675
709
  controlIds: ["control-access-review-offboarding"],
676
710
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
677
711
  },
@@ -682,8 +716,7 @@ const obligations = [
682
716
  recurrence: event("person-ended"),
683
717
  triggerPrompt: "Employee or contractor departing?",
684
718
  window: eventWindow(7),
685
- completionResourceTypes: ["asset", "evidence"],
686
- ownerIds: [OWNER_ID],
719
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
687
720
  controlIds: ["control-access-review-offboarding", "control-inventory-configuration"],
688
721
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
689
722
  },
@@ -691,11 +724,11 @@ const obligations = [
691
724
  id: "obligation-high-risk-departure-access",
692
725
  title: "Revoke access at or before departure notice",
693
726
  activityType: "access-removal",
694
- recurrence: event("high-risk-person-ended"),
727
+ recurrence: event("person-ended"),
728
+ eventRiskLevels: ["high"],
695
729
  triggerPrompt: "Involuntary or high-risk departure?",
696
730
  window: eventWindowHours(0),
697
- completionResourceTypes: ["access-grant", "evidence"],
698
- ownerIds: [OWNER_ID],
731
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
699
732
  controlIds: ["control-access-review-offboarding"],
700
733
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
701
734
  },
@@ -706,8 +739,7 @@ const obligations = [
706
739
  recurrence: event("person-role-changed"),
707
740
  triggerPrompt: "Worker role changed?",
708
741
  window: eventWindow(3),
709
- completionResourceTypes: ["access-grant", "evidence"],
710
- ownerIds: [OWNER_ID],
742
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
711
743
  controlIds: ["control-access-authorization", "control-access-review-offboarding"],
712
744
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
713
745
  },
@@ -718,8 +750,7 @@ const obligations = [
718
750
  recurrence: event("person-role-changed"),
719
751
  triggerPrompt: "Worker role changed?",
720
752
  window: eventWindow(30),
721
- completionResourceTypes: ["attestation", "evidence"],
722
- ownerIds: [OWNER_ID],
753
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
723
754
  scopeResourceIds: ROLE_TRAINING_IDS,
724
755
  controlIds: ["control-security-training"],
725
756
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID, "policy-anti-bribery-corruption"]
@@ -731,8 +762,7 @@ const obligations = [
731
762
  recurrence: event("personal-device-access-planned"),
732
763
  triggerPrompt: "Personal device needs company access?",
733
764
  window: eventWindow(0),
734
- completionResourceTypes: ["evidence"],
735
- ownerIds: [OWNER_ID],
765
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
736
766
  controlIds: ["control-access-authorization", "control-endpoint-protection"],
737
767
  policyIds: [INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
738
768
  },
@@ -743,8 +773,7 @@ const obligations = [
743
773
  recurrence: event("personal-device-access-planned"),
744
774
  triggerPrompt: "Personal device needs company access?",
745
775
  window: eventWindow(0),
746
- completionResourceTypes: ["asset", "evidence"],
747
- ownerIds: [OWNER_ID],
776
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
748
777
  controlIds: ["control-inventory-configuration", "control-endpoint-protection"],
749
778
  policyIds: [INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
750
779
  },
@@ -755,8 +784,7 @@ const obligations = [
755
784
  recurrence: event("vendor-access-planned"),
756
785
  triggerPrompt: "New vendor access or data use?",
757
786
  window: eventWindow(0),
758
- completionResourceTypes: ["vendor-review", "evidence"],
759
- ownerIds: [OWNER_ID],
787
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
760
788
  controlIds: ["control-vendor-due-diligence"],
761
789
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
762
790
  },
@@ -767,8 +795,7 @@ const obligations = [
767
795
  recurrence: event("vendor-access-planned"),
768
796
  triggerPrompt: "New vendor access or data use?",
769
797
  window: eventWindow(0),
770
- completionResourceTypes: ["document", "vendor"],
771
- ownerIds: [OWNER_ID],
798
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
772
799
  controlIds: ["control-vendor-due-diligence"],
773
800
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
774
801
  },
@@ -779,8 +806,7 @@ const obligations = [
779
806
  recurrence: event("vendor-reassessment-needed"),
780
807
  triggerPrompt: "Vendor changed materially or had an incident?",
781
808
  window: eventWindow(30),
782
- completionResourceTypes: ["vendor-review", "evidence"],
783
- ownerIds: [OWNER_ID],
809
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
784
810
  controlIds: ["control-vendor-monitoring"],
785
811
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
786
812
  },
@@ -791,8 +817,7 @@ const obligations = [
791
817
  recurrence: event("vendor-reassessment-needed"),
792
818
  triggerPrompt: "Vendor changed materially or had an incident?",
793
819
  window: eventWindow(30),
794
- completionResourceTypes: ["vendor", "risk", "document", "action-item", "evidence"],
795
- ownerIds: [OWNER_ID],
820
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
796
821
  controlIds: ["control-vendor-monitoring", "control-data-classification-inventory"],
797
822
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
798
823
  },
@@ -803,7 +828,6 @@ const obligations = [
803
828
  recurrence: event("system-material-change"),
804
829
  triggerPrompt: "Material system, service, or data-use change?",
805
830
  window: eventWindow(30),
806
- completionResourceTypes: ["risk-assessment", "risk", "evidence"],
807
831
  ownerIds: [OVERSIGHT_TEAM_ID],
808
832
  controlIds: ["control-risk-assessment"],
809
833
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
@@ -815,8 +839,7 @@ const obligations = [
815
839
  recurrence: event("system-material-change"),
816
840
  triggerPrompt: "Material system, service, or data-use change?",
817
841
  window: eventWindow(30),
818
- completionResourceTypes: ["vulnerability-scan", "evidence"],
819
- ownerIds: [OWNER_ID],
842
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
820
843
  controlIds: ["control-vulnerability-management"],
821
844
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
822
845
  },
@@ -827,7 +850,6 @@ const obligations = [
827
850
  recurrence: event("system-material-change"),
828
851
  triggerPrompt: "Material system, service, or data-use change?",
829
852
  window: eventWindow(30),
830
- completionResourceTypes: ["meeting", "policy", "control", "evidence"],
831
853
  ownerIds: [OVERSIGHT_TEAM_ID],
832
854
  controlIds: ["control-policy-management", "control-security-communication"],
833
855
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
@@ -839,8 +861,7 @@ const obligations = [
839
861
  recurrence: event("system-material-change"),
840
862
  triggerPrompt: "Material system, service, or data-use change?",
841
863
  window: eventWindow(30),
842
- completionResourceTypes: ["document", "evidence"],
843
- ownerIds: [OWNER_ID],
864
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
844
865
  scopeResourceIds: [RETENTION_SCHEDULE_ID],
845
866
  templateResourceId: RETENTION_SCHEDULE_ID,
846
867
  controlIds: ["control-data-retention-disposal", "control-data-classification-inventory"],
@@ -853,8 +874,7 @@ const obligations = [
853
874
  recurrence: event("system-material-change"),
854
875
  triggerPrompt: "Material system, service, or data-use change?",
855
876
  window: eventWindow(30),
856
- completionResourceTypes: ["control-test", "exercise", "evidence"],
857
- ownerIds: [OWNER_ID],
877
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
858
878
  controlIds: ["control-logging-monitoring", "control-incident-exercise"],
859
879
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
860
880
  },
@@ -865,7 +885,6 @@ const obligations = [
865
885
  recurrence: event("material-incident"),
866
886
  triggerPrompt: "Material security incident?",
867
887
  window: eventWindow(7),
868
- completionResourceTypes: ["incident", "document", "evidence"],
869
888
  ownerIds: [OVERSIGHT_TEAM_ID],
870
889
  controlIds: ["control-incident-response"],
871
890
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
@@ -877,9 +896,151 @@ const obligations = [
877
896
  recurrence: event("material-incident"),
878
897
  triggerPrompt: "Material security incident?",
879
898
  window: eventWindow(7),
880
- completionResourceTypes: ["action-item", "finding"],
881
899
  ownerIds: [OVERSIGHT_TEAM_ID],
882
- controlIds: ["control-monitoring-remediation"],
900
+ controlIds: ["control-monitoring-remediation", "control-security-exceptions"],
901
+ policyIds: [INFORMATION_SECURITY_POLICY_ID]
902
+ },
903
+ {
904
+ id: "obligation-vendor-activation-review",
905
+ title: "Complete vendor activation review",
906
+ activityType: "vendor-review",
907
+ recurrence: event("vendor-activated"),
908
+ triggerPrompt: "Vendor activated?",
909
+ window: eventWindow(30),
910
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
911
+ controlIds: ["control-vendor-due-diligence", "control-vendor-monitoring"],
912
+ policyIds: [INFORMATION_SECURITY_POLICY_ID]
913
+ },
914
+ {
915
+ id: "obligation-vendor-termination-closeout",
916
+ title: "Revoke vendor access and confirm data return or disposal",
917
+ activityType: "access-removal",
918
+ recurrence: event("vendor-terminated"),
919
+ triggerPrompt: "Vendor terminated?",
920
+ window: eventWindow(7),
921
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
922
+ controlIds: ["control-vendor-monitoring", "control-access-review-offboarding"],
923
+ policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
924
+ },
925
+ {
926
+ id: "obligation-data-use-change-assessment",
927
+ title: "Assess the changed data use and control impact",
928
+ activityType: "risk-assessment",
929
+ recurrence: event("material-data-use-change"),
930
+ triggerPrompt: "Material data-use change?",
931
+ window: eventWindow(30),
932
+ ownerIds: [OVERSIGHT_TEAM_ID],
933
+ controlIds: ["control-risk-assessment", "control-data-classification-inventory"],
934
+ policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
935
+ },
936
+ {
937
+ id: "obligation-incident-closure-review",
938
+ title: "Complete incident closure and lessons-learned review",
939
+ activityType: "incident-retrospective",
940
+ recurrence: event("incident-closed"),
941
+ triggerPrompt: "Incident closed?",
942
+ window: eventWindow(7),
943
+ ownerIds: [OVERSIGHT_TEAM_ID],
944
+ controlIds: ["control-incident-response", "control-monitoring-remediation"],
945
+ policyIds: [INFORMATION_SECURITY_POLICY_ID]
946
+ },
947
+ {
948
+ id: "obligation-policy-revision-approval",
949
+ title: "Review and approve the revised policy",
950
+ activityType: "policy-review",
951
+ recurrence: event("policy-revised"),
952
+ triggerPrompt: "Policy materially revised?",
953
+ window: eventWindow(30),
954
+ ownerIds: [OVERSIGHT_TEAM_ID],
955
+ controlIds: ["control-policy-management"],
956
+ policyIds: [INFORMATION_SECURITY_POLICY_ID]
957
+ },
958
+ {
959
+ id: "obligation-emergency-change-review",
960
+ title: "Complete emergency-change post-review",
961
+ activityType: "change-review",
962
+ recurrence: event("emergency-change"),
963
+ triggerPrompt: "Emergency change completed?",
964
+ window: eventWindow(2),
965
+ ownerIds: [OVERSIGHT_TEAM_ID],
966
+ controlIds: ["control-change-management"],
967
+ policyIds: [INFORMATION_SECURITY_POLICY_ID]
968
+ },
969
+ {
970
+ id: "obligation-exception-expiry-review",
971
+ title: "Review expired exception and compensating controls",
972
+ activityType: "exception-review",
973
+ recurrence: event("exception-expired"),
974
+ triggerPrompt: "Exception expired?",
975
+ window: eventWindow(1),
976
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
977
+ controlIds: ["control-monitoring-remediation", "control-security-exceptions"],
978
+ policyIds: [INFORMATION_SECURITY_POLICY_ID]
979
+ },
980
+ {
981
+ id: "obligation-service-account-creation-review",
982
+ title: "Authorize and review the new service account",
983
+ activityType: "access-provisioning",
984
+ recurrence: event("service-account-created"),
985
+ triggerPrompt: "Service account created?",
986
+ window: eventWindow(3),
987
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
988
+ controlIds: ["control-access-authorization"],
989
+ policyIds: [INFORMATION_SECURITY_POLICY_ID]
990
+ },
991
+ {
992
+ id: "obligation-service-account-expiry",
993
+ title: "Disable or renew the expired service account",
994
+ activityType: "access-removal",
995
+ recurrence: event("service-account-expired"),
996
+ triggerPrompt: "Service account expired?",
997
+ window: eventWindow(1),
998
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
999
+ controlIds: ["control-access-review-offboarding"],
1000
+ policyIds: [INFORMATION_SECURITY_POLICY_ID]
1001
+ },
1002
+ {
1003
+ id: "obligation-vulnerability-confirmed-remediation",
1004
+ title: "Assign confirmed vulnerability remediation",
1005
+ activityType: "remediation",
1006
+ recurrence: event("vulnerability-confirmed"),
1007
+ triggerPrompt: "Vulnerability confirmed?",
1008
+ window: eventWindow(3),
1009
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
1010
+ controlIds: ["control-vulnerability-management"],
1011
+ policyIds: [INFORMATION_SECURITY_POLICY_ID]
1012
+ },
1013
+ {
1014
+ id: "obligation-vulnerability-overdue-escalation",
1015
+ title: "Escalate overdue vulnerability remediation",
1016
+ activityType: "remediation",
1017
+ recurrence: event("vulnerability-overdue"),
1018
+ triggerPrompt: "Vulnerability remediation overdue?",
1019
+ window: eventWindow(1),
1020
+ ownerIds: [OVERSIGHT_TEAM_ID],
1021
+ controlIds: ["control-vulnerability-management", "control-monitoring-remediation"],
1022
+ policyIds: [INFORMATION_SECURITY_POLICY_ID]
1023
+ },
1024
+ {
1025
+ id: "obligation-asset-disposal-proof",
1026
+ title: "Record asset sanitization and disposal proof",
1027
+ activityType: "asset-recovery",
1028
+ recurrence: event("asset-disposed"),
1029
+ triggerPrompt: "Asset disposed?",
1030
+ window: eventWindow(7),
1031
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
1032
+ controlIds: ["control-inventory-configuration", "control-data-retention-disposal"],
1033
+ policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
1034
+ },
1035
+ {
1036
+ id: "obligation-continuity-activation-review",
1037
+ title: "Review continuity activation, recovery, and follow-up",
1038
+ activityType: "continuity-review",
1039
+ recurrence: event("continuity-activated"),
1040
+ triggerPrompt: "Continuity plan activated?",
1041
+ window: eventWindow(7),
1042
+ ownerIds: [OVERSIGHT_TEAM_ID],
1043
+ controlIds: ["control-continuity-exercise", "control-monitoring-remediation"],
883
1044
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
884
1045
  }
885
1046
  ];
@@ -890,7 +1051,6 @@ export function baselineRecordPaths(starter = "security") {
890
1051
 
891
1052
  export function baselineRecordFiles(effectiveDate, starter = "security") {
892
1053
  const framework = {
893
- schemaVersion: 1,
894
1054
  id: FRAMEWORK_ID,
895
1055
  type: "framework",
896
1056
  title: "AICPA Trust Services Criteria",
@@ -904,7 +1064,6 @@ export function baselineRecordFiles(effectiveDate, starter = "security") {
904
1064
  }
905
1065
  };
906
1066
  const descriptionFramework = {
907
- schemaVersion: 1,
908
1067
  id: DESCRIPTION_FRAMEWORK_ID,
909
1068
  type: "framework",
910
1069
  title: "AICPA SOC 2 Description Criteria",
@@ -918,79 +1077,74 @@ export function baselineRecordFiles(effectiveDate, starter = "security") {
918
1077
  }
919
1078
  };
920
1079
  const commonRequirements = commonCriteria.map(([reference, name, description]) => ({
921
- schemaVersion: 1,
922
1080
  id: requirementId(reference),
923
1081
  type: "requirement",
924
1082
  title: `${reference}: ${name}`,
925
1083
  frameworkId: FRAMEWORK_ID,
926
1084
  reference,
927
- applicability: "applicable",
1085
+ applicability: "undetermined",
928
1086
  description,
929
- applicabilityRationale: "Included in the default SOC 2 Security baseline. Confirm applicability and exact interpretation with the selected auditor.",
1087
+ applicabilityRationale: "Confirm applicability against the selected service, scope, and auditor guidance before accepting this starter criterion.",
930
1088
  tags: ["security", "common-criteria"]
931
1089
  }));
932
1090
  const descriptionRequirements = descriptionCriteria.map(([reference, name, description]) => ({
933
- schemaVersion: 1,
934
1091
  id: requirementId(reference),
935
1092
  type: "requirement",
936
1093
  title: `${reference}: ${name}`,
937
1094
  frameworkId: DESCRIPTION_FRAMEWORK_ID,
938
1095
  reference,
939
- applicability: "applicable",
1096
+ applicability: "undetermined",
940
1097
  description,
941
- applicabilityRationale: "Included for preparing the system description. Confirm the official criterion and expected presentation with the selected auditor.",
1098
+ applicabilityRationale: "Confirm applicability against the selected service and auditor guidance before accepting this starter description criterion.",
942
1099
  tags: ["description-criteria"]
943
1100
  }));
944
1101
  const controlRecords = controls.map((control) => ({
945
- schemaVersion: 1,
946
1102
  id: control.id,
947
1103
  type: "control",
948
1104
  title: control.title,
949
1105
  status: "planned",
950
1106
  statement: control.statement,
951
- ownerIds: [OWNER_ID],
1107
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
952
1108
  requirementIds: control.requirements.map(requirementId),
953
1109
  code: control.code,
954
1110
  activity: control.activity,
955
1111
  controlType: control.controlType,
956
1112
  operationMode: control.operationMode,
957
- frequency: control.frequency,
958
- policyIds: control.policies
1113
+ operationPattern: control.operationPattern,
1114
+ policyIds: control.policies,
1115
+ ...(FILEGRC_SOURCE_CONTROL_CODES.has(control.code)
1116
+ ? { evidenceSourceIds: ["system-filegrc-program-repository"] }
1117
+ : {})
959
1118
  }));
960
1119
  const team = {
961
- schemaVersion: 1,
962
1120
  id: OVERSIGHT_TEAM_ID,
963
1121
  type: "team",
964
1122
  title: "Security and Risk Oversight",
965
- status: "inactive",
1123
+ status: "planned",
966
1124
  purpose: "Provide independent oversight of the security program, risk register, incidents, findings, vendor and access reviews, policy changes, exercises, and overdue work. The chair must be separate from the policy owner and people who operate the controls under review.",
967
- memberIds: [OWNER_ID],
968
- chairIds: [],
969
- meetingCadence: calendar("month", 3, effectiveDate)
1125
+ memberIds: [PROGRAM_LEAD_ID],
1126
+ chairIds: []
970
1127
  };
971
1128
  const programRepository = {
972
- schemaVersion: 1,
973
1129
  id: "system-filegrc-program-repository",
974
1130
  type: "system",
975
1131
  title: "filegrc Program Repository",
976
1132
  status: "active",
977
1133
  criticality: "high",
978
- ownerIds: [OWNER_ID],
1134
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
979
1135
  description: "The Git repository that is authoritative for filegrc governance records, approvals, exceptions, findings, acknowledgements, evidence indexes, and their revision history.",
980
1136
  systemKind: "governance-system-of-record",
981
1137
  environment: "Git repository",
982
- dataClassification: "Confidential",
1138
+ classificationId: "confidential",
983
1139
  internetExposed: false,
984
- inScope: false,
985
- evidenceSourceKinds: ["training-acknowledgement", "exception-finding"],
986
- evidenceOwnerIds: [OWNER_ID]
1140
+ evidenceSourceKinds: FILEGRC_SOURCE_FAMILIES,
1141
+ evidenceOwnerIds: [POLICY_OWNER_APPOINTMENT_ID]
987
1142
  };
988
1143
  const obligationRecords = obligations.map((obligation) => ({
989
- schemaVersion: 1,
990
1144
  id: obligation.id,
991
1145
  type: "obligation",
992
1146
  title: obligation.title,
993
- status: "active",
1147
+ status: "proposed",
994
1148
  activityType: obligation.activityType,
995
1149
  recurrence: obligation.recurrence.mode === "calendar"
996
1150
  ? { ...obligation.recurrence, anchorDate: effectiveDate }
@@ -998,13 +1152,32 @@ export function baselineRecordFiles(effectiveDate, starter = "security") {
998
1152
  ownerIds: obligation.ownerIds,
999
1153
  startsOn: effectiveDate,
1000
1154
  ...(obligation.triggerPrompt ? { triggerPrompt: obligation.triggerPrompt } : {}),
1155
+ ...(obligation.eventRiskLevels ? { eventRiskLevels: obligation.eventRiskLevels } : {}),
1001
1156
  ...(obligation.window ? { window: obligation.window } : {}),
1002
- ...(obligation.completionResourceTypes ? { completionResourceTypes: obligation.completionResourceTypes } : {}),
1003
1157
  ...(obligation.scopeResourceIds ? { scopeResourceIds: obligation.scopeResourceIds } : {}),
1004
1158
  ...(obligation.templateResourceId ? { templateResourceId: obligation.templateResourceId } : {}),
1005
1159
  controlIds: obligation.controlIds,
1006
1160
  policyIds: obligation.policyIds
1007
1161
  }));
1162
+ const sourceCoverageRecords = SOURCE_FAMILIES.map(([sourceFamilyId, title]) => {
1163
+ const filegrcManaged = FILEGRC_SOURCE_FAMILIES.includes(sourceFamilyId);
1164
+ return {
1165
+ id: `source-coverage-${sourceFamilyId}`,
1166
+ type: "source-coverage",
1167
+ title: `${title} coverage`,
1168
+ status: filegrcManaged ? "active" : "planned",
1169
+ sourceFamilyId,
1170
+ coverageKind: filegrcManaged ? "filegrc" : "external-system",
1171
+ scopeResourceIds: ["workspace"],
1172
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
1173
+ ...(filegrcManaged ? {
1174
+ collectionCadence: "Record work when it occurs and export the complete population for the audit period.",
1175
+ retention: "Keep records for the period defined in the approved Data Retention Schedule.",
1176
+ reconciliationMethod: "Export the complete filegrc source-family population, compare it with related in-scope records and Work Queue activity, and investigate omissions or duplicates.",
1177
+ validFrom: effectiveDate
1178
+ } : {})
1179
+ };
1180
+ });
1008
1181
 
1009
1182
  const foundation = [
1010
1183
  recordFile("systems", programRepository),
@@ -1019,6 +1192,7 @@ export function baselineRecordFiles(effectiveDate, starter = "security") {
1019
1192
  ...descriptionRequirements.map((record) => recordFile("requirements", record)),
1020
1193
  ...controlRecords.map((record) => recordFile("controls", record)),
1021
1194
  ...foundation,
1195
+ ...sourceCoverageRecords.map((record) => recordFile("source-coverage", record)),
1022
1196
  ...obligationRecords.map((record) => recordFile("obligations", record))
1023
1197
  ];
1024
1198
  }
@@ -1044,17 +1218,19 @@ function event(eventType) {
1044
1218
  return { mode: "event", eventType };
1045
1219
  }
1046
1220
 
1047
- function eventWindow(endOffsetDays = 30) {
1221
+ function eventWindow(dueAfter = 30) {
1048
1222
  return {
1049
- startOffsetDays: 0,
1050
- endOffsetDays
1223
+ precision: "date",
1224
+ startsAfter: 0,
1225
+ dueAfter
1051
1226
  };
1052
1227
  }
1053
1228
 
1054
- function eventWindowHours(endOffsetHours) {
1229
+ function eventWindowHours(dueAfter) {
1055
1230
  return {
1056
- startOffsetHours: 0,
1057
- endOffsetHours
1231
+ precision: "timestamp",
1232
+ startsAfter: 0,
1233
+ dueAfter
1058
1234
  };
1059
1235
  }
1060
1236