create-filegrc 0.3.4 → 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.
- package/README.md +4 -3
- package/package.json +1 -1
- package/src/cli.js +5 -3
- package/src/defaults.js +81 -112
- package/src/index.js +13 -12
- package/template/AGENTS.md +23 -16
- package/template/README.md +10 -7
- package/template/data/AGENTS.md +35 -13
- package/template/data/action-items/AGENTS.md +2 -2
- package/template/data/appointments/appointment-policy-owner.json +11 -0
- package/template/data/audits/AGENTS.md +1 -1
- package/template/data/documents/document-business-continuity-disaster-recovery.json +12 -12
- package/template/data/documents/document-business-continuity-disaster-recovery.md +1 -1
- package/template/data/documents/document-contractor-policy-acknowledgement.json +10 -11
- package/template/data/documents/document-contractor-training-acknowledgement.json +13 -12
- package/template/data/documents/document-data-retention-schedule.json +9 -11
- package/template/data/documents/document-employee-handbook-acknowledgement.json +10 -11
- package/template/data/documents/document-employee-policy-acknowledgement.json +10 -11
- package/template/data/documents/document-employee-training-acknowledgement.json +13 -12
- package/template/data/documents/document-incident-response-plan.json +12 -12
- package/template/data/documents/document-incident-response-plan.md +2 -2
- package/template/data/documents/document-soc2-management-assertion.json +2 -3
- package/template/data/documents/document-soc2-management-representation.json +2 -3
- package/template/data/documents/document-soc2-period-completeness.json +2 -3
- package/template/data/documents/document-soc2-system-description.json +2 -3
- package/template/data/evidence/AGENTS.md +3 -3
- package/template/data/obligation-events/AGENTS.md +2 -2
- package/template/data/obligations/AGENTS.md +1 -1
- package/template/data/people/person-program-lead.json +9 -0
- package/template/data/policies/AGENTS.md +1 -1
- package/template/data/policies/policy-anti-bribery-corruption.json +9 -15
- package/template/data/policies/policy-anti-bribery-corruption.md +1 -1
- package/template/data/policies/policy-clear-desk-screen.json +8 -14
- package/template/data/policies/policy-clear-desk-screen.md +1 -1
- package/template/data/policies/policy-data-protection-handling.json +10 -22
- package/template/data/policies/policy-data-protection-handling.md +2 -2
- package/template/data/policies/policy-employee-handbook.json +6 -16
- package/template/data/policies/policy-information-security.json +8 -40
- package/template/data/policies/policy-information-security.md +2 -2
- package/template/data/policies/policy-mobile-computing-communications.json +8 -18
- package/template/data/policies/policy-mobile-computing-communications.md +1 -1
- package/template/data/renderer.json +0 -1
- package/template/data/training/training-anti-bribery-high-risk-roles.json +1 -2
- package/template/data/training/training-privileged-sensitive-roles.json +1 -2
- package/template/data/training/training-secure-development.json +1 -2
- package/template/data/training/training-security-awareness.json +7 -9
- package/template/data/training/training-security-awareness.md +1 -1
- package/template/data/workspace.json +19 -8
- package/template/docs/filegrc-home.png +0 -0
- package/template/package.json +1 -1
- package/template-parameters.json +6 -1
- 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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: [
|
|
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
|
-
|
|
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: "
|
|
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: [
|
|
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: [
|
|
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
|
-
|
|
952
|
+
classificationId: "confidential",
|
|
983
953
|
internetExposed: false,
|
|
984
|
-
inScope: false,
|
|
985
954
|
evidenceSourceKinds: ["training-acknowledgement", "exception-finding"],
|
|
986
|
-
evidenceOwnerIds: [
|
|
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(
|
|
1014
|
+
function eventWindow(dueAfter = 30) {
|
|
1048
1015
|
return {
|
|
1049
|
-
|
|
1050
|
-
|
|
1016
|
+
precision: "date",
|
|
1017
|
+
startsAfter: 0,
|
|
1018
|
+
dueAfter
|
|
1051
1019
|
};
|
|
1052
1020
|
}
|
|
1053
1021
|
|
|
1054
|
-
function eventWindowHours(
|
|
1022
|
+
function eventWindowHours(dueAfter) {
|
|
1055
1023
|
return {
|
|
1056
|
-
|
|
1057
|
-
|
|
1024
|
+
precision: "timestamp",
|
|
1025
|
+
startsAfter: 0,
|
|
1026
|
+
dueAfter
|
|
1058
1027
|
};
|
|
1059
1028
|
}
|
|
1060
1029
|
|