create-filegrc 0.3.3 → 0.4.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 (52) hide show
  1. package/README.md +6 -5
  2. package/package.json +1 -1
  3. package/src/cli.js +34 -5
  4. package/src/defaults.js +81 -112
  5. package/src/index.js +66 -14
  6. package/template/AGENTS.md +38 -16
  7. package/template/README.md +14 -5
  8. package/template/data/AGENTS.md +36 -12
  9. package/template/data/action-items/AGENTS.md +2 -2
  10. package/template/data/appointments/appointment-policy-owner.json +11 -0
  11. package/template/data/audits/AGENTS.md +1 -1
  12. package/template/data/documents/document-business-continuity-disaster-recovery.json +12 -12
  13. package/template/data/documents/document-business-continuity-disaster-recovery.md +1 -1
  14. package/template/data/documents/document-contractor-policy-acknowledgement.json +10 -11
  15. package/template/data/documents/document-contractor-training-acknowledgement.json +13 -12
  16. package/template/data/documents/document-data-retention-schedule.json +9 -11
  17. package/template/data/documents/document-employee-handbook-acknowledgement.json +10 -11
  18. package/template/data/documents/document-employee-policy-acknowledgement.json +10 -11
  19. package/template/data/documents/document-employee-training-acknowledgement.json +13 -12
  20. package/template/data/documents/document-incident-response-plan.json +12 -12
  21. package/template/data/documents/document-incident-response-plan.md +2 -2
  22. package/template/data/documents/document-soc2-management-assertion.json +2 -3
  23. package/template/data/documents/document-soc2-management-representation.json +2 -3
  24. package/template/data/documents/document-soc2-period-completeness.json +2 -3
  25. package/template/data/documents/document-soc2-system-description.json +2 -3
  26. package/template/data/evidence/AGENTS.md +3 -3
  27. package/template/data/obligation-events/AGENTS.md +2 -2
  28. package/template/data/obligations/AGENTS.md +1 -1
  29. package/template/data/people/person-program-lead.json +9 -0
  30. package/template/data/policies/AGENTS.md +1 -1
  31. package/template/data/policies/policy-anti-bribery-corruption.json +9 -15
  32. package/template/data/policies/policy-anti-bribery-corruption.md +1 -1
  33. package/template/data/policies/policy-clear-desk-screen.json +8 -14
  34. package/template/data/policies/policy-clear-desk-screen.md +1 -1
  35. package/template/data/policies/policy-data-protection-handling.json +10 -22
  36. package/template/data/policies/policy-data-protection-handling.md +2 -2
  37. package/template/data/policies/policy-employee-handbook.json +6 -16
  38. package/template/data/policies/policy-information-security.json +8 -40
  39. package/template/data/policies/policy-information-security.md +2 -2
  40. package/template/data/policies/policy-mobile-computing-communications.json +8 -18
  41. package/template/data/policies/policy-mobile-computing-communications.md +1 -1
  42. package/template/data/renderer.json +3 -1
  43. package/template/data/training/training-anti-bribery-high-risk-roles.json +1 -2
  44. package/template/data/training/training-privileged-sensitive-roles.json +1 -2
  45. package/template/data/training/training-secure-development.json +1 -2
  46. package/template/data/training/training-security-awareness.json +7 -9
  47. package/template/data/training/training-security-awareness.md +1 -1
  48. package/template/data/workspace.json +19 -8
  49. package/template/docs/filegrc-home.png +0 -0
  50. package/template/package.json +1 -1
  51. package/template-parameters.json +6 -1
  52. 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";
@@ -72,7 +73,7 @@ const controls = [
72
73
  activity: "Assign an independent reviewer who is separate from program ownership and record quarterly oversight decisions, approvals, and actions.",
73
74
  controlType: "preventive",
74
75
  operationMode: "manual",
75
- frequency: "Quarterly",
76
+ operationPattern: "scheduled",
76
77
  policies: [INFORMATION_SECURITY_POLICY_ID, "policy-anti-bribery-corruption"]
77
78
  },
78
79
  {
@@ -84,7 +85,7 @@ const controls = [
84
85
  activity: "Review, approve, communicate, and version policies and plans.",
85
86
  controlType: "preventive",
86
87
  operationMode: "manual",
87
- frequency: "Annually and after material changes",
88
+ operationPattern: "mixed",
88
89
  policies: [
89
90
  "policy-anti-bribery-corruption",
90
91
  "policy-clear-desk-screen",
@@ -102,7 +103,7 @@ const controls = [
102
103
  activity: "Maintain reporting routes and communicate policies, changes, and security information.",
103
104
  controlType: "preventive",
104
105
  operationMode: "hybrid",
105
- frequency: "Ongoing and after material changes",
106
+ operationPattern: "mixed",
106
107
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
107
108
  },
108
109
  {
@@ -114,7 +115,7 @@ const controls = [
114
115
  activity: "Complete screening when appropriate, agreements, policy acknowledgement, and corrective action.",
115
116
  controlType: "preventive",
116
117
  operationMode: "manual",
117
- frequency: "Before access and on material change",
118
+ operationPattern: "event-driven",
118
119
  policies: [INFORMATION_SECURITY_POLICY_ID, "policy-anti-bribery-corruption"]
119
120
  },
120
121
  {
@@ -126,7 +127,7 @@ const controls = [
126
127
  activity: "Assign general and role-based training, document non-applicability where needed, collect completion attestations, and follow up on overdue assignments.",
127
128
  controlType: "preventive",
128
129
  operationMode: "manual",
129
- frequency: "Onboarding and annually",
130
+ operationPattern: "mixed",
130
131
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID, "policy-anti-bribery-corruption"]
131
132
  },
132
133
  {
@@ -138,7 +139,7 @@ const controls = [
138
139
  activity: "Complete and retain annual performance reviews and resulting corrective work.",
139
140
  controlType: "detective",
140
141
  operationMode: "manual",
141
- frequency: "Annually",
142
+ operationPattern: "scheduled",
142
143
  policies: [INFORMATION_SECURITY_POLICY_ID]
143
144
  },
144
145
  {
@@ -150,7 +151,7 @@ const controls = [
150
151
  activity: "Identify threats and changes, score risk, select treatment, and track review dates.",
151
152
  controlType: "detective",
152
153
  operationMode: "manual",
153
- frequency: "Annually, quarterly for high risks, and after material changes",
154
+ operationPattern: "mixed",
154
155
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
155
156
  },
156
157
  {
@@ -162,7 +163,7 @@ const controls = [
162
163
  activity: "Review control evidence and track deficiencies, owners, due dates, and verification.",
163
164
  controlType: "detective",
164
165
  operationMode: "manual",
165
- frequency: "Quarterly and as issues arise",
166
+ operationPattern: "mixed",
166
167
  policies: [INFORMATION_SECURITY_POLICY_ID]
167
168
  },
168
169
  {
@@ -174,7 +175,7 @@ const controls = [
174
175
  activity: "Request, approve, provision, change, and record access.",
175
176
  controlType: "preventive",
176
177
  operationMode: "hybrid",
177
- frequency: "Per access event",
178
+ operationPattern: "event-driven",
178
179
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
179
180
  },
180
181
  {
@@ -186,7 +187,7 @@ const controls = [
186
187
  activity: "Configure and monitor authentication, credential storage, and privileged roles.",
187
188
  controlType: "preventive",
188
189
  operationMode: "hybrid",
189
- frequency: "Continuous",
190
+ operationPattern: "continuous",
190
191
  policies: [INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
191
192
  },
192
193
  {
@@ -198,7 +199,7 @@ const controls = [
198
199
  activity: "Review access populations, record decisions, and remove dormant, expired, or unneeded access.",
199
200
  controlType: "detective",
200
201
  operationMode: "manual",
201
- frequency: "Quarterly, annually, and per workforce event",
202
+ operationPattern: "mixed",
202
203
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
203
204
  },
204
205
  {
@@ -210,7 +211,7 @@ const controls = [
210
211
  activity: "Control visitors and facilities, secure workspaces, and report loss or exposure.",
211
212
  controlType: "preventive",
212
213
  operationMode: "manual",
213
- frequency: "Continuous",
214
+ operationPattern: "continuous",
214
215
  policies: [INFORMATION_SECURITY_POLICY_ID, "policy-clear-desk-screen", "policy-mobile-computing-communications"]
215
216
  },
216
217
  {
@@ -222,7 +223,7 @@ const controls = [
222
223
  activity: "Maintain classification, ownership, system, vendor, and processing records.",
223
224
  controlType: "preventive",
224
225
  operationMode: "manual",
225
- frequency: "Annually and after material changes",
226
+ operationPattern: "mixed",
226
227
  policies: [DATA_POLICY_ID, INFORMATION_SECURITY_POLICY_ID]
227
228
  },
228
229
  {
@@ -234,7 +235,7 @@ const controls = [
234
235
  activity: "Configure encryption and approved transfer methods based on classification.",
235
236
  controlType: "preventive",
236
237
  operationMode: "automated",
237
- frequency: "Continuous",
238
+ operationPattern: "continuous",
238
239
  policies: [DATA_POLICY_ID, INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
239
240
  },
240
241
  {
@@ -246,7 +247,7 @@ const controls = [
246
247
  activity: "Apply approved retention and disposal methods to active, local, backup, and vendor-held copies.",
247
248
  controlType: "preventive",
248
249
  operationMode: "hybrid",
249
- frequency: "Per retention event",
250
+ operationPattern: "event-driven",
250
251
  policies: [DATA_POLICY_ID, INFORMATION_SECURITY_POLICY_ID]
251
252
  },
252
253
  {
@@ -258,7 +259,7 @@ const controls = [
258
259
  activity: "Maintain inventories, baselines, ownership, classification, and approved deviations.",
259
260
  controlType: "preventive",
260
261
  operationMode: "hybrid",
261
- frequency: "Ongoing with annual review",
262
+ operationPattern: "mixed",
262
263
  policies: [INFORMATION_SECURITY_POLICY_ID]
263
264
  },
264
265
  {
@@ -270,7 +271,7 @@ const controls = [
270
271
  activity: "Manage endpoint safeguards and perform a full or equivalent malware scan at least monthly.",
271
272
  controlType: "preventive",
272
273
  operationMode: "automated",
273
- frequency: "Continuous with monthly scanning",
274
+ operationPattern: "mixed",
274
275
  policies: [INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
275
276
  },
276
277
  {
@@ -282,7 +283,7 @@ const controls = [
282
283
  activity: "Manage boundaries, firewall rules, wireless safeguards, and remote production access.",
283
284
  controlType: "preventive",
284
285
  operationMode: "hybrid",
285
- frequency: "Continuous with annual review",
286
+ operationPattern: "mixed",
286
287
  policies: [INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
287
288
  },
288
289
  {
@@ -294,7 +295,7 @@ const controls = [
294
295
  activity: "Record the reason, author, reviewer, test result, deployment, and rollback method.",
295
296
  controlType: "preventive",
296
297
  operationMode: "hybrid",
297
- frequency: "Per change",
298
+ operationPattern: "event-driven",
298
299
  policies: [INFORMATION_SECURITY_POLICY_ID]
299
300
  },
300
301
  {
@@ -306,7 +307,7 @@ const controls = [
306
307
  activity: "Identify, validate, prioritize, remediate, or approve time-bound exceptions for vulnerabilities.",
307
308
  controlType: "detective",
308
309
  operationMode: "hybrid",
309
- frequency: "Quarterly and after material changes",
310
+ operationPattern: "mixed",
310
311
  policies: [INFORMATION_SECURITY_POLICY_ID]
311
312
  },
312
313
  {
@@ -318,7 +319,7 @@ const controls = [
318
319
  activity: "Define scope, perform independent testing, review results, and track findings.",
319
320
  controlType: "detective",
320
321
  operationMode: "manual",
321
- frequency: "Annually",
322
+ operationPattern: "scheduled",
322
323
  policies: [INFORMATION_SECURITY_POLICY_ID]
323
324
  },
324
325
  {
@@ -330,7 +331,7 @@ const controls = [
330
331
  activity: "Collect, protect, alert on, test, and review important log output and access.",
331
332
  controlType: "detective",
332
333
  operationMode: "hybrid",
333
- frequency: "Continuous with quarterly review",
334
+ operationPattern: "mixed",
334
335
  policies: [INFORMATION_SECURITY_POLICY_ID]
335
336
  },
336
337
  {
@@ -342,7 +343,7 @@ const controls = [
342
343
  activity: "Triage events, preserve evidence, coordinate response and notification review, and complete retrospectives.",
343
344
  controlType: "corrective",
344
345
  operationMode: "hybrid",
345
- frequency: "Per event",
346
+ operationPattern: "event-driven",
346
347
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
347
348
  },
348
349
  {
@@ -354,7 +355,7 @@ const controls = [
354
355
  activity: "Plan, conduct, review, and document an incident response and alert-path exercise.",
355
356
  controlType: "detective",
356
357
  operationMode: "manual",
357
- frequency: "Annually",
358
+ operationPattern: "scheduled",
358
359
  policies: [INFORMATION_SECURITY_POLICY_ID]
359
360
  },
360
361
  {
@@ -366,7 +367,7 @@ const controls = [
366
367
  activity: "Protect and monitor backups, then test retrieval and use of restored data.",
367
368
  controlType: "corrective",
368
369
  operationMode: "hybrid",
369
- frequency: "Daily with annual restoration test",
370
+ operationPattern: "scheduled",
370
371
  policies: [INFORMATION_SECURITY_POLICY_ID]
371
372
  },
372
373
  {
@@ -378,7 +379,7 @@ const controls = [
378
379
  activity: "Maintain the plan, contacts, recovery objectives, exercises, results, and follow-up work.",
379
380
  controlType: "corrective",
380
381
  operationMode: "manual",
381
- frequency: "Annually and after material disruption",
382
+ operationPattern: "mixed",
382
383
  policies: [INFORMATION_SECURITY_POLICY_ID]
383
384
  },
384
385
  {
@@ -390,7 +391,7 @@ const controls = [
390
391
  activity: "Assess service, data, access, assurance, recovery, incidents, and contract terms before access.",
391
392
  controlType: "preventive",
392
393
  operationMode: "manual",
393
- frequency: "Before access and after material changes",
394
+ operationPattern: "event-driven",
394
395
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
395
396
  },
396
397
  {
@@ -402,7 +403,7 @@ const controls = [
402
403
  activity: "Review vendor performance, assurance, recovery, access, incidents, and contract obligations.",
403
404
  controlType: "detective",
404
405
  operationMode: "manual",
405
- frequency: "Annually and after material changes or incidents",
406
+ operationPattern: "mixed",
406
407
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
407
408
  },
408
409
  {
@@ -414,7 +415,7 @@ const controls = [
414
415
  activity: "Request, assess, approve, monitor, and close time-bound exceptions.",
415
416
  controlType: "preventive",
416
417
  operationMode: "manual",
417
- frequency: "Per exception",
418
+ operationPattern: "event-driven",
418
419
  policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
419
420
  }
420
421
  ];
@@ -435,7 +436,7 @@ const obligations = [
435
436
  title: "Annual policy and governed-plan review",
436
437
  activityType: "policy-review",
437
438
  recurrence: calendar("year", 1),
438
- ownerIds: [OWNER_ID],
439
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
439
440
  scopeResourceIds: [
440
441
  "policy-anti-bribery-corruption",
441
442
  "policy-clear-desk-screen",
@@ -463,7 +464,7 @@ const obligations = [
463
464
  title: "Annual security awareness training",
464
465
  activityType: "training",
465
466
  recurrence: calendar("year", 1),
466
- ownerIds: [OWNER_ID],
467
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
467
468
  scopeResourceIds: ["training-security-awareness"],
468
469
  templateResourceId: "training-security-awareness",
469
470
  controlIds: ["control-security-training"],
@@ -474,7 +475,7 @@ const obligations = [
474
475
  title: "Annual workforce performance review",
475
476
  activityType: "performance-review",
476
477
  recurrence: calendar("year", 1),
477
- ownerIds: [OWNER_ID],
478
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
478
479
  controlIds: ["control-performance-review"],
479
480
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
480
481
  },
@@ -483,7 +484,7 @@ const obligations = [
483
484
  title: "Quarterly privileged and production access review",
484
485
  activityType: "access-review",
485
486
  recurrence: calendar("month", 3),
486
- ownerIds: [OWNER_ID],
487
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
487
488
  controlIds: ["control-access-review-offboarding"],
488
489
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
489
490
  },
@@ -492,7 +493,7 @@ const obligations = [
492
493
  title: "Annual important-system access review",
493
494
  activityType: "access-review",
494
495
  recurrence: calendar("year", 1),
495
- ownerIds: [OWNER_ID],
496
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
496
497
  controlIds: ["control-access-review-offboarding"],
497
498
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
498
499
  },
@@ -501,7 +502,7 @@ const obligations = [
501
502
  title: "Annual system, company and personal device, vendor, and data inventory review",
502
503
  activityType: "inventory-review",
503
504
  recurrence: calendar("year", 1),
504
- ownerIds: [OWNER_ID],
505
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
505
506
  controlIds: ["control-inventory-configuration", "control-data-classification-inventory"],
506
507
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
507
508
  },
@@ -510,7 +511,7 @@ const obligations = [
510
511
  title: "Monthly endpoint malware scan",
511
512
  activityType: "security-scan",
512
513
  recurrence: calendar("month", 1),
513
- ownerIds: [OWNER_ID],
514
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
514
515
  controlIds: ["control-endpoint-protection"],
515
516
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
516
517
  },
@@ -519,7 +520,7 @@ const obligations = [
519
520
  title: "Annual firewall and network access review",
520
521
  activityType: "network-review",
521
522
  recurrence: calendar("year", 1),
522
- ownerIds: [OWNER_ID],
523
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
523
524
  controlIds: ["control-network-security"],
524
525
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
525
526
  },
@@ -528,7 +529,7 @@ const obligations = [
528
529
  title: "Quarterly vulnerability scan",
529
530
  activityType: "vulnerability-scan",
530
531
  recurrence: calendar("month", 3),
531
- ownerIds: [OWNER_ID],
532
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
532
533
  controlIds: ["control-vulnerability-management"],
533
534
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
534
535
  },
@@ -537,7 +538,7 @@ const obligations = [
537
538
  title: "Annual independent penetration test",
538
539
  activityType: "penetration-test",
539
540
  recurrence: calendar("year", 1),
540
- ownerIds: [OWNER_ID],
541
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
541
542
  controlIds: ["control-penetration-testing"],
542
543
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
543
544
  },
@@ -546,7 +547,7 @@ const obligations = [
546
547
  title: "Quarterly security log and log-access review",
547
548
  activityType: "log-review",
548
549
  recurrence: calendar("month", 3),
549
- ownerIds: [OWNER_ID],
550
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
550
551
  controlIds: ["control-logging-monitoring"],
551
552
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
552
553
  },
@@ -555,7 +556,7 @@ const obligations = [
555
556
  title: "Annual incident response and alert-path exercise",
556
557
  activityType: "exercise",
557
558
  recurrence: calendar("year", 1),
558
- ownerIds: [OWNER_ID],
559
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
559
560
  scopeResourceIds: ["document-incident-response-plan"],
560
561
  templateResourceId: "document-incident-response-plan",
561
562
  controlIds: ["control-incident-exercise", "control-logging-monitoring"],
@@ -566,7 +567,7 @@ const obligations = [
566
567
  title: "Annual backup restoration test",
567
568
  activityType: "backup-test",
568
569
  recurrence: calendar("year", 1),
569
- ownerIds: [OWNER_ID],
570
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
570
571
  controlIds: ["control-backup-restoration"],
571
572
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
572
573
  },
@@ -586,7 +587,7 @@ const obligations = [
586
587
  title: "Annual critical and high-risk vendor review",
587
588
  activityType: "vendor-review",
588
589
  recurrence: calendar("year", 1),
589
- ownerIds: [OWNER_ID],
590
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
590
591
  controlIds: ["control-vendor-monitoring"],
591
592
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
592
593
  },
@@ -595,7 +596,7 @@ const obligations = [
595
596
  title: "Annual emergency contact review",
596
597
  activityType: "continuity-review",
597
598
  recurrence: calendar("year", 1),
598
- ownerIds: [OWNER_ID],
599
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
599
600
  scopeResourceIds: ["document-business-continuity-disaster-recovery"],
600
601
  controlIds: ["control-continuity-exercise"],
601
602
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
@@ -607,8 +608,7 @@ const obligations = [
607
608
  recurrence: event("person-started"),
608
609
  triggerPrompt: "New employee or contractor?",
609
610
  window: eventWindow(0),
610
- completionResourceTypes: ["attestation", "evidence"],
611
- ownerIds: [OWNER_ID],
611
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
612
612
  controlIds: ["control-workforce-expectations"],
613
613
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
614
614
  },
@@ -619,8 +619,7 @@ const obligations = [
619
619
  recurrence: event("person-started"),
620
620
  triggerPrompt: "New employee or contractor?",
621
621
  window: eventWindow(0),
622
- completionResourceTypes: ["access-grant", "evidence"],
623
- ownerIds: [OWNER_ID],
622
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
624
623
  controlIds: ["control-access-authorization"],
625
624
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
626
625
  },
@@ -631,8 +630,7 @@ const obligations = [
631
630
  recurrence: event("person-started"),
632
631
  triggerPrompt: "New employee or contractor?",
633
632
  window: eventWindow(0),
634
- completionResourceTypes: ["asset"],
635
- ownerIds: [OWNER_ID],
633
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
636
634
  controlIds: ["control-inventory-configuration"],
637
635
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
638
636
  },
@@ -643,8 +641,7 @@ const obligations = [
643
641
  recurrence: event("person-started"),
644
642
  triggerPrompt: "New employee or contractor?",
645
643
  window: eventWindow(30),
646
- completionResourceTypes: ["attestation", "evidence"],
647
- ownerIds: [OWNER_ID],
644
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
648
645
  scopeResourceIds: ["training-security-awareness"],
649
646
  templateResourceId: "training-security-awareness",
650
647
  controlIds: ["control-security-training"],
@@ -657,8 +654,7 @@ const obligations = [
657
654
  recurrence: event("person-started"),
658
655
  triggerPrompt: "New employee or contractor?",
659
656
  window: eventWindow(30),
660
- completionResourceTypes: ["attestation", "evidence"],
661
- ownerIds: [OWNER_ID],
657
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
662
658
  scopeResourceIds: ROLE_TRAINING_IDS,
663
659
  controlIds: ["control-security-training"],
664
660
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID, "policy-anti-bribery-corruption"]
@@ -670,8 +666,7 @@ const obligations = [
670
666
  recurrence: event("person-ended"),
671
667
  triggerPrompt: "Employee or contractor departing?",
672
668
  window: eventWindowHours(24),
673
- completionResourceTypes: ["access-grant", "evidence"],
674
- ownerIds: [OWNER_ID],
669
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
675
670
  controlIds: ["control-access-review-offboarding"],
676
671
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
677
672
  },
@@ -682,8 +677,7 @@ const obligations = [
682
677
  recurrence: event("person-ended"),
683
678
  triggerPrompt: "Employee or contractor departing?",
684
679
  window: eventWindow(7),
685
- completionResourceTypes: ["asset", "evidence"],
686
- ownerIds: [OWNER_ID],
680
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
687
681
  controlIds: ["control-access-review-offboarding", "control-inventory-configuration"],
688
682
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
689
683
  },
@@ -694,8 +688,7 @@ const obligations = [
694
688
  recurrence: event("high-risk-person-ended"),
695
689
  triggerPrompt: "Involuntary or high-risk departure?",
696
690
  window: eventWindowHours(0),
697
- completionResourceTypes: ["access-grant", "evidence"],
698
- ownerIds: [OWNER_ID],
691
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
699
692
  controlIds: ["control-access-review-offboarding"],
700
693
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
701
694
  },
@@ -706,8 +699,7 @@ const obligations = [
706
699
  recurrence: event("person-role-changed"),
707
700
  triggerPrompt: "Worker role changed?",
708
701
  window: eventWindow(3),
709
- completionResourceTypes: ["access-grant", "evidence"],
710
- ownerIds: [OWNER_ID],
702
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
711
703
  controlIds: ["control-access-authorization", "control-access-review-offboarding"],
712
704
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
713
705
  },
@@ -718,8 +710,7 @@ const obligations = [
718
710
  recurrence: event("person-role-changed"),
719
711
  triggerPrompt: "Worker role changed?",
720
712
  window: eventWindow(30),
721
- completionResourceTypes: ["attestation", "evidence"],
722
- ownerIds: [OWNER_ID],
713
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
723
714
  scopeResourceIds: ROLE_TRAINING_IDS,
724
715
  controlIds: ["control-security-training"],
725
716
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID, "policy-anti-bribery-corruption"]
@@ -731,8 +722,7 @@ const obligations = [
731
722
  recurrence: event("personal-device-access-planned"),
732
723
  triggerPrompt: "Personal device needs company access?",
733
724
  window: eventWindow(0),
734
- completionResourceTypes: ["evidence"],
735
- ownerIds: [OWNER_ID],
725
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
736
726
  controlIds: ["control-access-authorization", "control-endpoint-protection"],
737
727
  policyIds: [INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
738
728
  },
@@ -743,8 +733,7 @@ const obligations = [
743
733
  recurrence: event("personal-device-access-planned"),
744
734
  triggerPrompt: "Personal device needs company access?",
745
735
  window: eventWindow(0),
746
- completionResourceTypes: ["asset", "evidence"],
747
- ownerIds: [OWNER_ID],
736
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
748
737
  controlIds: ["control-inventory-configuration", "control-endpoint-protection"],
749
738
  policyIds: [INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
750
739
  },
@@ -755,8 +744,7 @@ const obligations = [
755
744
  recurrence: event("vendor-access-planned"),
756
745
  triggerPrompt: "New vendor access or data use?",
757
746
  window: eventWindow(0),
758
- completionResourceTypes: ["vendor-review", "evidence"],
759
- ownerIds: [OWNER_ID],
747
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
760
748
  controlIds: ["control-vendor-due-diligence"],
761
749
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
762
750
  },
@@ -767,8 +755,7 @@ const obligations = [
767
755
  recurrence: event("vendor-access-planned"),
768
756
  triggerPrompt: "New vendor access or data use?",
769
757
  window: eventWindow(0),
770
- completionResourceTypes: ["document", "vendor"],
771
- ownerIds: [OWNER_ID],
758
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
772
759
  controlIds: ["control-vendor-due-diligence"],
773
760
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
774
761
  },
@@ -779,8 +766,7 @@ const obligations = [
779
766
  recurrence: event("vendor-reassessment-needed"),
780
767
  triggerPrompt: "Vendor changed materially or had an incident?",
781
768
  window: eventWindow(30),
782
- completionResourceTypes: ["vendor-review", "evidence"],
783
- ownerIds: [OWNER_ID],
769
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
784
770
  controlIds: ["control-vendor-monitoring"],
785
771
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
786
772
  },
@@ -791,8 +777,7 @@ const obligations = [
791
777
  recurrence: event("vendor-reassessment-needed"),
792
778
  triggerPrompt: "Vendor changed materially or had an incident?",
793
779
  window: eventWindow(30),
794
- completionResourceTypes: ["vendor", "risk", "document", "action-item", "evidence"],
795
- ownerIds: [OWNER_ID],
780
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
796
781
  controlIds: ["control-vendor-monitoring", "control-data-classification-inventory"],
797
782
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
798
783
  },
@@ -803,7 +788,6 @@ const obligations = [
803
788
  recurrence: event("system-material-change"),
804
789
  triggerPrompt: "Material system, service, or data-use change?",
805
790
  window: eventWindow(30),
806
- completionResourceTypes: ["risk-assessment", "risk", "evidence"],
807
791
  ownerIds: [OVERSIGHT_TEAM_ID],
808
792
  controlIds: ["control-risk-assessment"],
809
793
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
@@ -815,8 +799,7 @@ const obligations = [
815
799
  recurrence: event("system-material-change"),
816
800
  triggerPrompt: "Material system, service, or data-use change?",
817
801
  window: eventWindow(30),
818
- completionResourceTypes: ["vulnerability-scan", "evidence"],
819
- ownerIds: [OWNER_ID],
802
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
820
803
  controlIds: ["control-vulnerability-management"],
821
804
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
822
805
  },
@@ -827,7 +810,6 @@ const obligations = [
827
810
  recurrence: event("system-material-change"),
828
811
  triggerPrompt: "Material system, service, or data-use change?",
829
812
  window: eventWindow(30),
830
- completionResourceTypes: ["meeting", "policy", "control", "evidence"],
831
813
  ownerIds: [OVERSIGHT_TEAM_ID],
832
814
  controlIds: ["control-policy-management", "control-security-communication"],
833
815
  policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
@@ -839,8 +821,7 @@ const obligations = [
839
821
  recurrence: event("system-material-change"),
840
822
  triggerPrompt: "Material system, service, or data-use change?",
841
823
  window: eventWindow(30),
842
- completionResourceTypes: ["document", "evidence"],
843
- ownerIds: [OWNER_ID],
824
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
844
825
  scopeResourceIds: [RETENTION_SCHEDULE_ID],
845
826
  templateResourceId: RETENTION_SCHEDULE_ID,
846
827
  controlIds: ["control-data-retention-disposal", "control-data-classification-inventory"],
@@ -853,8 +834,7 @@ const obligations = [
853
834
  recurrence: event("system-material-change"),
854
835
  triggerPrompt: "Material system, service, or data-use change?",
855
836
  window: eventWindow(30),
856
- completionResourceTypes: ["control-test", "exercise", "evidence"],
857
- ownerIds: [OWNER_ID],
837
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
858
838
  controlIds: ["control-logging-monitoring", "control-incident-exercise"],
859
839
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
860
840
  },
@@ -865,7 +845,6 @@ const obligations = [
865
845
  recurrence: event("material-incident"),
866
846
  triggerPrompt: "Material security incident?",
867
847
  window: eventWindow(7),
868
- completionResourceTypes: ["incident", "document", "evidence"],
869
848
  ownerIds: [OVERSIGHT_TEAM_ID],
870
849
  controlIds: ["control-incident-response"],
871
850
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
@@ -877,7 +856,6 @@ const obligations = [
877
856
  recurrence: event("material-incident"),
878
857
  triggerPrompt: "Material security incident?",
879
858
  window: eventWindow(7),
880
- completionResourceTypes: ["action-item", "finding"],
881
859
  ownerIds: [OVERSIGHT_TEAM_ID],
882
860
  controlIds: ["control-monitoring-remediation"],
883
861
  policyIds: [INFORMATION_SECURITY_POLICY_ID]
@@ -890,7 +868,6 @@ export function baselineRecordPaths(starter = "security") {
890
868
 
891
869
  export function baselineRecordFiles(effectiveDate, starter = "security") {
892
870
  const framework = {
893
- schemaVersion: 1,
894
871
  id: FRAMEWORK_ID,
895
872
  type: "framework",
896
873
  title: "AICPA Trust Services Criteria",
@@ -904,7 +881,6 @@ export function baselineRecordFiles(effectiveDate, starter = "security") {
904
881
  }
905
882
  };
906
883
  const descriptionFramework = {
907
- schemaVersion: 1,
908
884
  id: DESCRIPTION_FRAMEWORK_ID,
909
885
  type: "framework",
910
886
  title: "AICPA SOC 2 Description Criteria",
@@ -918,7 +894,6 @@ export function baselineRecordFiles(effectiveDate, starter = "security") {
918
894
  }
919
895
  };
920
896
  const commonRequirements = commonCriteria.map(([reference, name, description]) => ({
921
- schemaVersion: 1,
922
897
  id: requirementId(reference),
923
898
  type: "requirement",
924
899
  title: `${reference}: ${name}`,
@@ -930,7 +905,6 @@ export function baselineRecordFiles(effectiveDate, starter = "security") {
930
905
  tags: ["security", "common-criteria"]
931
906
  }));
932
907
  const descriptionRequirements = descriptionCriteria.map(([reference, name, description]) => ({
933
- schemaVersion: 1,
934
908
  id: requirementId(reference),
935
909
  type: "requirement",
936
910
  title: `${reference}: ${name}`,
@@ -942,51 +916,45 @@ export function baselineRecordFiles(effectiveDate, starter = "security") {
942
916
  tags: ["description-criteria"]
943
917
  }));
944
918
  const controlRecords = controls.map((control) => ({
945
- schemaVersion: 1,
946
919
  id: control.id,
947
920
  type: "control",
948
921
  title: control.title,
949
922
  status: "planned",
950
923
  statement: control.statement,
951
- ownerIds: [OWNER_ID],
924
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
952
925
  requirementIds: control.requirements.map(requirementId),
953
926
  code: control.code,
954
927
  activity: control.activity,
955
928
  controlType: control.controlType,
956
929
  operationMode: control.operationMode,
957
- frequency: control.frequency,
930
+ operationPattern: control.operationPattern,
958
931
  policyIds: control.policies
959
932
  }));
960
933
  const team = {
961
- schemaVersion: 1,
962
934
  id: OVERSIGHT_TEAM_ID,
963
935
  type: "team",
964
936
  title: "Security and Risk Oversight",
965
- status: "inactive",
937
+ status: "planned",
966
938
  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)
939
+ memberIds: [PROGRAM_LEAD_ID],
940
+ chairIds: []
970
941
  };
971
942
  const programRepository = {
972
- schemaVersion: 1,
973
943
  id: "system-filegrc-program-repository",
974
944
  type: "system",
975
945
  title: "filegrc Program Repository",
976
946
  status: "active",
977
947
  criticality: "high",
978
- ownerIds: [OWNER_ID],
948
+ ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
979
949
  description: "The Git repository that is authoritative for filegrc governance records, approvals, exceptions, findings, acknowledgements, evidence indexes, and their revision history.",
980
950
  systemKind: "governance-system-of-record",
981
951
  environment: "Git repository",
982
- dataClassification: "Confidential",
952
+ classificationId: "confidential",
983
953
  internetExposed: false,
984
- inScope: false,
985
954
  evidenceSourceKinds: ["training-acknowledgement", "exception-finding"],
986
- evidenceOwnerIds: [OWNER_ID]
955
+ evidenceOwnerIds: [POLICY_OWNER_APPOINTMENT_ID]
987
956
  };
988
957
  const obligationRecords = obligations.map((obligation) => ({
989
- schemaVersion: 1,
990
958
  id: obligation.id,
991
959
  type: "obligation",
992
960
  title: obligation.title,
@@ -999,7 +967,6 @@ export function baselineRecordFiles(effectiveDate, starter = "security") {
999
967
  startsOn: effectiveDate,
1000
968
  ...(obligation.triggerPrompt ? { triggerPrompt: obligation.triggerPrompt } : {}),
1001
969
  ...(obligation.window ? { window: obligation.window } : {}),
1002
- ...(obligation.completionResourceTypes ? { completionResourceTypes: obligation.completionResourceTypes } : {}),
1003
970
  ...(obligation.scopeResourceIds ? { scopeResourceIds: obligation.scopeResourceIds } : {}),
1004
971
  ...(obligation.templateResourceId ? { templateResourceId: obligation.templateResourceId } : {}),
1005
972
  controlIds: obligation.controlIds,
@@ -1044,17 +1011,19 @@ function event(eventType) {
1044
1011
  return { mode: "event", eventType };
1045
1012
  }
1046
1013
 
1047
- function eventWindow(endOffsetDays = 30) {
1014
+ function eventWindow(dueAfter = 30) {
1048
1015
  return {
1049
- startOffsetDays: 0,
1050
- endOffsetDays
1016
+ precision: "date",
1017
+ startsAfter: 0,
1018
+ dueAfter
1051
1019
  };
1052
1020
  }
1053
1021
 
1054
- function eventWindowHours(endOffsetHours) {
1022
+ function eventWindowHours(dueAfter) {
1055
1023
  return {
1056
- startOffsetHours: 0,
1057
- endOffsetHours
1024
+ precision: "timestamp",
1025
+ startsAfter: 0,
1026
+ dueAfter
1058
1027
  };
1059
1028
  }
1060
1029