filegrc 0.1.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/model/v1.json ADDED
@@ -0,0 +1,1378 @@
1
+ {
2
+ "modelVersion": "1",
3
+ "title": "FileGRC data model",
4
+ "description": "Stable, query-worthy GRC metadata. Long-form work is stored as implicit Markdown companion files beside each structured JSON record.",
5
+ "recordContent": {
6
+ "slot": "record",
7
+ "label": "Record",
8
+ "defaultResourceTypes": ["system","control-test","finding","exception","policy-review","risk","risk-assessment","vendor-review","access-review","vulnerability","vulnerability-scan","incident","exercise","backup-test","penetration-test","data-request","audit-population"]
9
+ },
10
+ "auditReadiness": {
11
+ "managementDocuments": [
12
+ {"field":"systemDescriptionDocumentId","kind":"soc2-system-description","title":"System Description","engagementKinds":["soc-2-type-1","soc-2-type-2"],"timing":"Complete before the auditor finalizes the description of the system.","minimumWords":250,"requiredHeadings":["DC1","DC2","DC3","DC4","DC5","DC6","DC7","DC8","DC9"],"dateBinding":"engagement"},
13
+ {"field":"managementAssertionDocumentId","kind":"soc2-management-assertion","title":"Management Assertion","engagementKinds":["soc-2-type-1","soc-2-type-2"],"timing":"Agree on final wording with the auditor and approve it for the reporting date or period.","minimumWords":75,"dateBinding":"engagement"},
14
+ {"field":"periodCompletenessDocumentId","kind":"soc2-period-completeness","title":"Period Completeness Statement","engagementKinds":["soc-2-type-2"],"timing":"Complete after reconciling every audit population, including populations with zero items.","minimumWords":100,"dateBinding":"engagement"},
15
+ {"field":"managementRepresentationDocumentId","kind":"soc2-management-representation","title":"Management Representation Letter","engagementKinds":["soc-2-type-1","soc-2-type-2"],"timing":"Reconcile and sign the auditor-provided letter near the end of fieldwork.","minimumWords":100,"dateBinding":"engagement"}
16
+ ],
17
+ "populationTemplates": [
18
+ {"kind":"workforce-changes","title":"Workforce Starts, Role Changes, and Departures","sourcePrompt":"HR or workforce system","sourceKind":"workforce","timing":"Export after the period closes and before the auditor selects samples.","controlCodes":["HR-01","HR-02","HR-03","IAM-03"]},
19
+ {"kind":"access-changes","title":"Access Grants, Changes, Reviews, and Removals","sourcePrompt":"Identity provider and application access sources","sourceKind":"identity-access","timing":"Export after the period closes and before access samples are selected. Split this population when different systems require different queries.","controlCodes":["IAM-01","IAM-02","IAM-03"]},
20
+ {"kind":"production-changes","title":"Production and Infrastructure Changes","sourcePrompt":"Source control, deployment, and infrastructure change sources","sourceKind":"production-change","timing":"Export after the period closes and before change samples are selected. Split software and infrastructure populations when their source reports differ.","controlCodes":["CHG-01"]},
21
+ {"kind":"security-incidents","title":"Security Events and Incidents","sourcePrompt":"Incident and security monitoring sources","sourceKind":"security-monitoring","timing":"Export after the period closes, including a source report that proves a zero count when management identified no incidents.","controlCodes":["LOG-01","IR-01","IR-02"]},
22
+ {"kind":"vulnerability-activity","title":"Vulnerabilities and Security Scans","sourcePrompt":"Vulnerability, dependency, and scanning tools","sourceKind":"vulnerability-management","timing":"Export after the period closes and preserve scan coverage, findings, remediation, and exceptions.","controlCodes":["VUL-01","PEN-01"]},
23
+ {"kind":"vendor-changes","title":"Vendors and Vendor Changes","sourcePrompt":"Vendor inventory, contract, and purchasing sources","sourceKind":"vendor-management","timing":"Export after the period closes and reconcile additions, removals, material changes, and required reviews.","controlCodes":["VEN-01","VEN-02"]},
24
+ {"kind":"managed-assets","title":"Devices and Other Important Assets","sourcePrompt":"Device management and asset inventory sources","sourceKind":"endpoint-asset","timing":"Export after the period closes and reconcile assigned, active, lost, returned, and retired assets.","controlCodes":["OPS-01","OPS-02","DATA-01"]},
25
+ {"kind":"training-acknowledgements","title":"Training and Policy Acknowledgements","sourcePrompt":"Training, signature, and workforce sources","sourceKind":"training-acknowledgement","timing":"Export after the period closes and reconcile assignments, completions, acknowledgements, exceptions, and overdue work to the workforce population.","controlCodes":["GOV-03","HR-01","HR-02"]},
26
+ {"kind":"backup-recovery","title":"Backup Failures and Restoration Tests","sourcePrompt":"Backup, recovery, and monitoring sources","sourceKind":"backup-recovery","timing":"Export after the period closes and include scheduled jobs, failures, restorations, exercises, and follow-up work.","controlCodes":["BCP-01","BCP-02"]},
27
+ {"kind":"exceptions-findings","title":"Security Exceptions and Control Findings","sourcePrompt":"Exception, finding, ticketing, and risk sources","sourceKind":"exception-finding","timing":"Export after the period closes and reconcile open, closed, accepted, overdue, and remediated items.","controlCodes":["MON-01","EXC-01"]}
28
+ ],
29
+ "externalEvidence": [
30
+ {"id":"workforce","title":"Workforce","sourceKinds":["workforce"],"controlCodes":["HR-01","HR-03","IAM-03"],"description":"Catalog the HR or workforce system that is authoritative for starts, role changes, and departures. Bring the complete workforce-change population and source reports used to reconcile access and responsibilities.","timing":"Identify the source during scoping. Preserve event records as changes occur and export the complete Type 2 population after the period closes."},
31
+ {"id":"training-acknowledgement","title":"Training and Acknowledgements","sourceKinds":["training-acknowledgement"],"controlCodes":["GOV-03","HR-01","HR-02"],"description":"Catalog training, signature, and acknowledgement systems. Bring assignments, content revisions, completion records, signatures, exceptions, and overdue follow-up.","timing":"Identify sources before assignments begin. Preserve signatures and completion proof as work occurs, then reconcile the complete Type 2 population to the workforce population after close."},
32
+ {"id":"identity-access","title":"Identity and Access","sourceKinds":["identity-access"],"controlCodes":["IAM-01","IAM-02","IAM-03"],"description":"Catalog the identity provider and each important application that enforces access. Bring identity, role, privileged-access, authentication-setting, review, and removal exports.","timing":"Identify sources during scoping. Capture configuration near the Type 1 date or at the start and end of a Type 2 period; export complete change and review populations after the Type 2 period closes."},
33
+ {"id":"production-change","title":"Production and Change","sourceKinds":["production-change"],"controlCodes":["CHG-01"],"description":"Catalog source control, deployment, and infrastructure-change systems. Bring protection settings, reviews, test and approval records, deployments, emergency changes, and rollback evidence.","timing":"Identify sources before the audit period. Preserve per-change evidence as changes occur and export the complete period population after a Type 2 period closes."},
34
+ {"id":"security-monitoring","title":"Monitoring and Incidents","sourceKinds":["security-monitoring"],"controlCodes":["LOG-01","IR-01","IR-02"],"description":"Catalog logging, alerting, incident, and case-management systems. Bring configuration, coverage, alert delivery tests, alerts, investigations, incidents, recovery work, and zero-event proof.","timing":"Capture configuration and coverage at the Type 1 date or across the Type 2 period. Preserve cases as they occur and export complete alert and incident populations after close."},
35
+ {"id":"vulnerability-management","title":"Vulnerability Management","sourceKinds":["vulnerability-management"],"controlCodes":["VUL-01","PEN-01"],"description":"Catalog vulnerability, dependency, scanning, penetration-test, and remediation systems. Bring scope and configuration, scan results, findings, tickets, exceptions, retests, and independent reports.","timing":"Confirm coverage before the audit period. Preserve scan and remediation evidence when generated and export the complete Type 2 population after close."},
36
+ {"id":"endpoint-asset","title":"Endpoints and Assets","sourceKinds":["endpoint-asset"],"controlCodes":["PHY-01","OPS-01","OPS-02","DATA-01"],"description":"Catalog device-management, endpoint-compliance, and asset-inventory systems. Bring the complete device population, assignments, security configuration, compliance status, exceptions, loss, return, and disposal records.","timing":"Identify sources before devices receive access. Capture configuration near the Type 1 date or across the Type 2 period and export the complete Type 2 population after close."},
37
+ {"id":"backup-recovery","title":"Backup and Recovery","sourceKinds":["backup-recovery"],"controlCodes":["BCP-01","BCP-02"],"description":"Catalog backup, recovery, and continuity systems. Bring configuration, scheduled-job history, failures, restoration results, exercises, and follow-up work.","timing":"Capture configuration at the Type 1 date or across the Type 2 period. Preserve restoration and exercise results when performed and export complete job and failure history after period close."},
38
+ {"id":"vendor-management","title":"Vendors","sourceKinds":["vendor-management"],"controlCodes":["VEN-01","VEN-02"],"description":"Catalog procurement, contract, and vendor-risk systems. Bring the vendor population, contracts, reviews, assurance reports, bridge coverage, incidents, and follow-up.","timing":"Identify relevant subservice organizations during scoping. Obtain current assurance reports before fieldwork and bridge coverage through the report period when a report ends earlier."},
39
+ {"id":"exception-finding","title":"Exceptions and Findings","sourceKinds":["exception-finding"],"controlCodes":["MON-01","EXC-01"],"description":"Catalog the repository or ticket system authoritative for control exceptions, findings, risk acceptance, remediation, verification, and overdue work.","timing":"Record items as they arise. Reconcile open and closed records to their source throughout fieldwork and export the complete Type 2 population after the period closes."}
40
+ ]
41
+ },
42
+ "commonFields": {
43
+ "schemaVersion": {"type":"integer","required":true,"const":1,"label":"Schema version"},
44
+ "id": {"type":"string","format":"id","required":true,"label":"ID"},
45
+ "type": {"type":"string","required":true,"label":"Type"},
46
+ "title": {"type":"string","required":true,"label":"Title","search":true},
47
+ "ownerIds": {"type":"array","items":"id","relation":["person","team"],"label":"Owners","filter":true},
48
+ "tags": {"type":"array","items":"string","label":"Tags","filter":true,"search":true},
49
+ "relatedResourceIds": {"type":"array","items":"id","relation":["*"],"label":"Related resources"},
50
+ "extensions": {"type":"object","label":"Extensions"}
51
+ },
52
+ "groups": [
53
+ {"id":"program","title":"Program"},
54
+ {"id":"governance","title":"Governance"},
55
+ {"id":"risk","title":"Risk"},
56
+ {"id":"people-access","title":"People and Access"},
57
+ {"id":"systems-vendors","title":"Systems and Vendors"},
58
+ {"id":"security-operations","title":"Security Operations"},
59
+ {"id":"resilience","title":"Resilience"},
60
+ {"id":"evidence","title":"Evidence"},
61
+ {"id":"work","title":"Findings and Work"},
62
+ {"id":"audits","title":"Audits"},
63
+ {"id":"repository","title":"Repository"}
64
+ ],
65
+ "resources": {
66
+ "workspace": {
67
+ "title": "Workspace",
68
+ "pluralTitle": "Workspace",
69
+ "group": "repository",
70
+ "singleton": "workspace.json",
71
+ "description": "Program-wide settings used by validation and rendering, including the organization, time zone, risk method, and classification scheme.",
72
+ "guidance": {
73
+ "policyBasis": "The information security and data handling policies depend on these settings. Change the method or classifications with the related policies and controls.",
74
+ "cadence": "Review during the annual policy and risk reviews and after a material scope or methodology change.",
75
+ "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"],
76
+ "obligationActivityTypes": ["policy-review","risk-assessment"]
77
+ },
78
+ "required": ["dataModelVersion","organizationName","timezone"],
79
+ "fields": {
80
+ "dataModelVersion": {"type":"string","label":"Data model version"},
81
+ "organizationName": {"type":"string","label":"Organization","search":true},
82
+ "timezone": {"type":"string","format":"timezone","label":"Timezone"},
83
+ "description": {"type":"string","label":"Description","search":true},
84
+ "repositoryUrl": {"type":"string","label":"Repository URL"},
85
+ "riskMethodology": {"type":"object","label":"Risk methodology"},
86
+ "classificationDefinitions": {"type":"object","label":"Classifications"}
87
+ },
88
+ "listFields": ["title","organizationName","dataModelVersion"]
89
+ },
90
+ "renderer-settings": {
91
+ "title": "Renderer settings",
92
+ "pluralTitle": "Renderer settings",
93
+ "group": "repository",
94
+ "singleton": "renderer.json",
95
+ "description": "Committed settings that control optional renderer behavior without changing the underlying compliance records or Git workflow. Renderer settings are not required for SOC 2.",
96
+ "guidance": {
97
+ "policyBasis": "This record configures the local renderer. It is not a SOC 2 control, policy, audit record, or substitute for evidence.",
98
+ "cadence": "Change it when the team wants to rerun or suppress an optional renderer workflow, then review and commit the resulting diff."
99
+ },
100
+ "required": ["showOnboarding"],
101
+ "fields": {
102
+ "showOnboarding": {"type":"boolean","label":"Show onboarding"}
103
+ },
104
+ "listFields": ["title","showOnboarding"]
105
+ },
106
+ "person": {
107
+ "title": "Person",
108
+ "titleLabel": "Name",
109
+ "pluralTitle": "People",
110
+ "group": "people-access",
111
+ "collection": "people",
112
+ "description": "Minimal workforce records used for ownership, approval, training, access, attendance, and accountability without turning Git into an HR system.",
113
+ "guidance": {
114
+ "policyBasis": "The information security policy and employee handbook require named responsibility, onboarding, training, role changes, performance review, and offboarding.",
115
+ "cadence": "Create before assigning work or access, update after role changes, and mark inactive at departure. Training is due within 30 days of starting and annually.",
116
+ "sourceResourceIds": ["policy-information-security","policy-employee-handbook"],
117
+ "obligationActivityTypes": ["training","performance-review"]
118
+ },
119
+ "required": ["status"],
120
+ "fields": {
121
+ "status": {"type":"enum","values":["active","inactive","external"],"filter":true},
122
+ "email": {"type":"string","format":"email","search":true},
123
+ "role": {"type":"string","search":true},
124
+ "department": {"type":"string","filter":true},
125
+ "managerId": {"type":"id","relation":["person"]},
126
+ "startDate": {"type":"date"},
127
+ "endDate": {"type":"date"},
128
+ "employmentType": {"type":"string","filter":true},
129
+ "teamIds": {"type":"array","items":"id","relation":["team"]}
130
+ },
131
+ "listFields": ["title","status","role","department"]
132
+ },
133
+ "service-account": {
134
+ "title": "Service account",
135
+ "titleLabel": "Name",
136
+ "pluralTitle": "Service accounts",
137
+ "group": "people-access",
138
+ "collection": "service-accounts",
139
+ "description": "Non-human identities used by automation or applications, with purpose, ownership, system scope, authentication, privilege, and expiry. A separate service-account register is not required for SOC 2; use this page when non-human identities need their own inventory.",
140
+ "guidance": {
141
+ "policyBasis": "The information security policy requires important identities to be inventoried, owned, protected, reviewed, and removed when unneeded.",
142
+ "cadence": "Create before use. Review privileged and production access quarterly and other important access annually; retire or expire unused accounts.",
143
+ "sourceResourceIds": ["policy-information-security"],
144
+ "obligationActivityTypes": ["access-review","inventory-review"]
145
+ },
146
+ "required": ["status","purpose","ownerIds","systemIds"],
147
+ "fields": {
148
+ "status": {"type":"enum","values":["active","disabled","retired"],"filter":true},
149
+ "purpose": {"type":"string","search":true},
150
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
151
+ "accountIdentifier": {"type":"string","search":true},
152
+ "authenticationMethod": {"type":"string"},
153
+ "privileged": {"type":"boolean","filter":true},
154
+ "expiresOn": {"type":"date"},
155
+ "lastReviewedOn": {"type":"date"}
156
+ },
157
+ "listFields": ["title","status","purpose","privileged"]
158
+ },
159
+ "team": {
160
+ "title": "Team",
161
+ "titleLabel": "Name",
162
+ "pluralTitle": "Teams",
163
+ "group": "governance",
164
+ "collection": "teams",
165
+ "description": "Committees, response teams, and accountable groups used for shared ownership, governance decisions, and meeting records. A separate team register is not required for SOC 2; named people can hold these responsibilities directly.",
166
+ "guidance": {
167
+ "policyBasis": "The information security policy establishes a security and risk oversight group chaired by an external reviewer who is separate from the policy owner and control operators. The continuity plan assigns response and recovery roles.",
168
+ "cadence": "The security and risk oversight group meets at least quarterly. Update membership after responsibility or personnel changes, and preserve the independent chair.",
169
+ "sourceResourceIds": ["policy-information-security","document-business-continuity-disaster-recovery"],
170
+ "obligationActivityTypes": ["meeting"]
171
+ },
172
+ "required": ["status","purpose","memberIds"],
173
+ "fields": {
174
+ "status": {"type":"enum","values":["active","inactive"],"filter":true},
175
+ "purpose": {"type":"string","search":true},
176
+ "memberIds": {"type":"array","items":"id","relation":["person"]},
177
+ "chairIds": {"type":"array","items":"id","relation":["person"]},
178
+ "charterDocumentId": {"type":"id","relation":["document"]},
179
+ "meetingCadence": {"type":"object"}
180
+ },
181
+ "listFields": ["title","status","purpose"]
182
+ },
183
+ "system": {
184
+ "title": "System",
185
+ "titleLabel": "Name",
186
+ "pluralTitle": "Systems",
187
+ "group": "systems-vendors",
188
+ "collection": "systems",
189
+ "description": "Applications, services, infrastructure, business systems, and evidence sources used to define audit scope, ownership, data, vendors, recovery objectives, and authoritative reports.",
190
+ "guidance": {
191
+ "policyBasis": "The information security, data handling, and continuity policies require inventories of important systems with owners, criticality, classification, scope, and recovery needs.",
192
+ "cadence": "Review at least annually and after material architecture, data, vendor, service, recovery, or evidence-source changes. Confirm report access and extraction instructions before each audit period closes.",
193
+ "sourceResourceIds": ["policy-information-security","policy-data-protection-handling","document-business-continuity-disaster-recovery"],
194
+ "obligationActivityTypes": ["inventory-review"]
195
+ },
196
+ "required": ["status","criticality","ownerIds"],
197
+ "fields": {
198
+ "status": {"type":"enum","values":["planned","active","deprecated","retired"],"filter":true},
199
+ "criticality": {"type":"enum","values":["low","medium","high","critical"],"filter":true},
200
+ "description": {"type":"string","search":true},
201
+ "systemKind": {"type":"string","filter":true},
202
+ "environment": {"type":"string","filter":true},
203
+ "vendorId": {"type":"id","relation":["vendor"]},
204
+ "dataClassification": {"type":"string","filter":true},
205
+ "dataTypes": {"type":"array","items":"string","search":true},
206
+ "internetExposed": {"type":"boolean","filter":true},
207
+ "inScope": {"type":"boolean","filter":true},
208
+ "parentSystemId": {"type":"id","relation":["system"]},
209
+ "commitmentIds": {"type":"array","items":"id","relation":["commitment"]},
210
+ "subserviceVendorIds": {"type":"array","items":"id","relation":["vendor"]},
211
+ "evidenceSourceKinds": {"type":"array","items":"string","label":"Evidence source roles","filter":true,"search":true},
212
+ "evidenceOwnerIds": {"type":"array","items":"id","relation":["person","team"],"label":"Evidence access owners"},
213
+ "continuityObjectives": {"type":"object"}
214
+ },
215
+ "listFields": ["title","status","criticality","environment","inScope"]
216
+ },
217
+ "asset": {
218
+ "title": "Asset",
219
+ "titleLabel": "Name",
220
+ "pluralTitle": "Assets",
221
+ "group": "systems-vendors",
222
+ "collection": "assets",
223
+ "description": "Individually managed devices, media, software, records, or other physical and logical items with an owner, custodian, criticality, and lifecycle.",
224
+ "guidance": {
225
+ "policyBasis": "The information security, mobile computing, and data handling policies require important assets to be inventoried, protected according to classification, and securely returned or disposed.",
226
+ "cadence": "Record acquisition and assignment, review the inventory annually, update custody on change, and retire assets when use ends.",
227
+ "sourceResourceIds": ["policy-information-security","policy-mobile-computing-communications","policy-data-protection-handling"],
228
+ "obligationActivityTypes": ["inventory-review"]
229
+ },
230
+ "required": ["status","assetKind","criticality","ownerIds","custodianIds"],
231
+ "fields": {
232
+ "status": {"type":"enum","values":["active","lost","retired","disposed"],"filter":true},
233
+ "assetKind": {"type":"string","filter":true},
234
+ "criticality": {"type":"enum","values":["low","medium","high","critical"],"filter":true},
235
+ "custodianIds": {"type":"array","items":"id","relation":["person","team"]},
236
+ "businessPurpose": {"type":"string","search":true},
237
+ "serialOrAssetTag": {"type":"string","search":true},
238
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
239
+ "location": {"type":"string","filter":true},
240
+ "dataClassification": {"type":"string","filter":true},
241
+ "exceptionIds": {"type":"array","items":"id","relation":["exception"]},
242
+ "acquiredOn": {"type":"date"},
243
+ "retiredOn": {"type":"date"}
244
+ },
245
+ "listFields": ["title","status","assetKind","criticality","location"]
246
+ },
247
+ "document": {
248
+ "title": "Document",
249
+ "pluralTitle": "Documents",
250
+ "group": "governance",
251
+ "collection": "documents",
252
+ "description": "Governed charters, plans, procedures, standards, agreements, reports, and templates whose Markdown and approvals belong in Git. A general document catalog is not required for SOC 2; use it for governed material that is not a policy or another record type.",
253
+ "guidance": {
254
+ "policyBasis": "Policies use documents for detailed procedures, plans, acknowledgements, assertions, and reports while Git supplies revision history.",
255
+ "cadence": "Follow each record's review cadence. Starter governed documents are reviewed at least annually and after material changes or use, with an approver who is separate from the owner.",
256
+ "sourceResourceIds": ["policy-information-security","document-business-continuity-disaster-recovery"],
257
+ "obligationActivityTypes": ["policy-review","continuity-review"]
258
+ },
259
+ "required": ["status","documentKind","ownerIds"],
260
+ "fields": {
261
+ "status": {"type":"enum","values":["draft","active","superseded","retired"],"filter":true},
262
+ "documentKind": {"type":"string","filter":true},
263
+ "template": {"type":"boolean","filter":true},
264
+ "approverIds": {"type":"array","items":"id","relation":["person","team"],"disjointFrom":"ownerIds"},
265
+ "version": {"type":"string"},
266
+ "effectiveOn": {"type":"date","requiredWhen":{"status":"active"}},
267
+ "approvedOn": {"type":"date","requiredWhen":{"status":"active"}},
268
+ "reviewCadence": {"type":"object"},
269
+ "supersedesId": {"type":"id","relation":["document"]},
270
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
271
+ "controlIds": {"type":"array","items":"id","relation":["control"]},
272
+ "classification": {"type":"string","filter":true},
273
+ "relatedDocumentIds": {"type":"array","items":"id","relation":["document"]},
274
+ "audience": {"type":"array","items":"string","filter":true},
275
+ "acknowledgementRequired": {"type":"boolean","filter":true},
276
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]}
277
+ },
278
+ "listFields": ["title","status","documentKind","version","effectiveOn"],
279
+ "markdown": {
280
+ "content": {"label":"Document","primary":true,"required":true}
281
+ }
282
+ },
283
+ "evidence": {
284
+ "title": "Evidence",
285
+ "pluralTitle": "Evidence",
286
+ "group": "evidence",
287
+ "collection": "evidence",
288
+ "recordPath": "{id}/evidence.json",
289
+ "description": "Screenshots, signed forms, reports, exports, and other proof, bound to source records, dates, systems, controls, audits, files, and Git revisions. Population exports also record their exact report parameters, timezone, count, and completeness and accuracy checks.",
290
+ "guidance": {
291
+ "policyBasis": "The information security policy requires retained audit evidence. Acknowledgement and training workflows require signatures or repository revisions tied to the exact content reviewed.",
292
+ "cadence": "Collect when a control or activity operates, verify before audit use, cover the stated period, and expire or retain according to classification and record rules.",
293
+ "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"]
294
+ },
295
+ "required": ["status","evidenceKind","source","collectedOn","classification","collectorIds"],
296
+ "oneOf": [
297
+ ["filePaths","externalReference","$markdown:content"]
298
+ ],
299
+ "fields": {
300
+ "status": {"type":"enum","values":["collected","verified","expired","withdrawn"],"filter":true},
301
+ "evidenceKind": {"type":"string","filter":true},
302
+ "source": {"type":"string","search":true},
303
+ "collectedOn": {"type":"date"},
304
+ "classification": {"type":"string","filter":true},
305
+ "filePaths": {"type":"array","items":"data-path"},
306
+ "externalReference": {"type":"object"},
307
+ "periodStart": {"type":"date","requiredWhen":{"evidenceKind":"population-export"}},
308
+ "periodEnd": {"type":"date","requiredWhen":{"evidenceKind":"population-export"}},
309
+ "generatedAt": {"type":"timestamp","label":"Generated at","requiredWhen":{"evidenceKind":"population-export"}},
310
+ "timezone": {"type":"string","format":"timezone","label":"Report timezone","requiredWhen":{"evidenceKind":"population-export"}},
311
+ "queryDescription": {"type":"string","label":"Query or report parameters","search":true,"requiredWhen":{"evidenceKind":"population-export"}},
312
+ "populationCount": {"type":"integer","minimum":0,"label":"Population count","requiredWhen":{"evidenceKind":"population-export"}},
313
+ "completenessValidation": {"type":"string","label":"Completeness validation","search":true,"requiredWhen":{"evidenceKind":"population-export"}},
314
+ "accuracyValidation": {"type":"string","label":"Accuracy validation","search":true,"requiredWhen":{"evidenceKind":"population-export"}},
315
+ "sourceSystemId": {"type":"id","relation":["system"],"label":"Source system","requiredWhen":{"evidenceKind":"population-export"}},
316
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
317
+ "controlIds": {"type":"array","items":"id","relation":["control"]},
318
+ "auditIds": {"type":"array","items":"id","relation":["audit"]},
319
+ "collectorIds": {"type":"array","items":"id","relation":["person"]},
320
+ "verifierIds": {"type":"array","items":"id","relation":["person"],"requiredWhen":{"status":"verified"}},
321
+ "verifiedOn": {"type":"date","requiredWhen":{"status":"verified"}},
322
+ "expiresOn": {"type":"date"},
323
+ "sourceResourceIds": {"type":"array","items":"id","relation":["*"]},
324
+ "sourceCommit": {"type":"string"},
325
+ "capture": {"type":"object"}
326
+ },
327
+ "listFields": ["title","status","evidenceKind","collectedOn","classification"],
328
+ "markdown": {
329
+ "content": {"label":"Evidence","primary":true,"required":false}
330
+ }
331
+ },
332
+ "obligation": {
333
+ "title": "Obligation",
334
+ "pluralTitle": "Obligations",
335
+ "group": "work",
336
+ "collection": "obligations",
337
+ "description": "Recurring or event-driven work generated from policy commitments, including meetings, reviews, scans, tests, training, and exercises. Obligation records are not required for SOC 2; they are FileGRC's scheduling layer for policy work.",
338
+ "guidance": {
339
+ "policyBasis": "Obligations turn policy language into an owned schedule and link each task to its policies, controls, scope, and completion records.",
340
+ "cadence": "Use the recurrence and start date on each record. Create separate completion records for every period instead of overwriting the obligation.",
341
+ "sourceResourceIds": ["policy-information-security","policy-data-protection-handling","document-business-continuity-disaster-recovery"]
342
+ },
343
+ "required": ["status","activityType","recurrence","ownerIds"],
344
+ "fields": {
345
+ "status": {"type":"enum","values":["active","paused","retired"],"filter":true},
346
+ "activityType": {"type":"string","filter":true},
347
+ "recurrence": {"type":"object"},
348
+ "triggerPrompt": {"type":"string","search":true},
349
+ "window": {"type":"object"},
350
+ "completionResourceTypes": {"type":"array","items":"string"},
351
+ "scopeResourceIds": {"type":"array","items":"id","relation":["*"]},
352
+ "templateResourceId": {"type":"id","relation":["*"]},
353
+ "controlIds": {"type":"array","items":"id","relation":["control"]},
354
+ "policyIds": {"type":"array","items":"id","relation":["policy"]},
355
+ "startsOn": {"type":"date"},
356
+ "endsOn": {"type":"date"},
357
+ "completionResourceIds": {"type":"array","items":"id","relation":["*"]}
358
+ },
359
+ "listFields": ["title","status","activityType","startsOn"],
360
+ "markdown": {
361
+ "instructions": {"label":"Instructions","primary":true,"required":false}
362
+ }
363
+ },
364
+ "obligation-event": {
365
+ "title": "Obligation event",
366
+ "pluralTitle": "Obligation events",
367
+ "group": "work",
368
+ "collection": "obligation-events",
369
+ "description": "One occurrence of a policy-triggering event, with its subject, applicable obligation templates, generated action checklist, owners, and completion state. Obligation-event records are not required for SOC 2; they keep event-driven policy work complete and auditable.",
370
+ "guidance": {
371
+ "policyBasis": "Event runs make onboarding, offboarding, material changes, incidents, and similar policy triggers explicit and auditable.",
372
+ "cadence": "Create when the event occurs or is scheduled. Complete every generated action within its policy window, then close the event."
373
+ },
374
+ "required": ["status","eventType","occurredOn","obligationIds","ownerIds"],
375
+ "fields": {
376
+ "status": {"type":"enum","values":["open","complete","canceled"],"filter":true},
377
+ "eventType": {"type":"string","filter":true,"search":true},
378
+ "occurredOn": {"type":"date"},
379
+ "occurredAt": {"type":"timestamp"},
380
+ "subjectResourceIds": {"type":"array","items":"id","relation":["*"]},
381
+ "obligationIds": {"type":"array","items":"id","relation":["obligation"]},
382
+ "actionItemIds": {"type":"array","items":"id","relation":["action-item"]},
383
+ "completedOn": {"type":"date","requiredWhen":{"status":"complete"}}
384
+ },
385
+ "listFields": ["title","status","eventType","occurredOn","ownerIds"]
386
+ },
387
+ "framework": {
388
+ "title": "Framework",
389
+ "titleLabel": "Name",
390
+ "pluralTitle": "Frameworks",
391
+ "group": "program",
392
+ "collection": "frameworks",
393
+ "description": "External criteria sets and versions used to define program and audit scope.",
394
+ "guidance": {
395
+ "policyBasis": "Frameworks come from the selected audit criteria, not an internal policy. The starter includes SOC 2 Security and system-description references without licensed criteria text.",
396
+ "cadence": "Add or retire a version only through a deliberate scope decision. Reconfirm the selected version when planning each audit."
397
+ },
398
+ "required": ["status","version"],
399
+ "fields": {
400
+ "status": {"type":"enum","values":["active","retired"],"filter":true},
401
+ "version": {"type":"string"},
402
+ "publisher": {"type":"string"},
403
+ "description": {"type":"string","search":true},
404
+ "sourceReference": {"type":"object"},
405
+ "effectiveOn": {"type":"date"},
406
+ "retiredOn": {"type":"date"}
407
+ },
408
+ "listFields": ["title","status","version","publisher"]
409
+ },
410
+ "requirement": {
411
+ "title": "Requirement",
412
+ "pluralTitle": "Requirements",
413
+ "group": "program",
414
+ "collection": "requirements",
415
+ "description": "Individual criterion references used to document applicability and map controls, commitments, audits, and findings.",
416
+ "guidance": {
417
+ "policyBasis": "Requirements come from the selected framework. Controls explain how policy and actual operation address each applicable criterion. Starter descriptions are plain-language orientation only; use the publisher's official criteria for the examination.",
418
+ "cadence": "Review applicability during audit planning and after material scope, service, system, or framework changes."
419
+ },
420
+ "required": ["frameworkId","reference","applicability"],
421
+ "fields": {
422
+ "frameworkId": {"type":"id","relation":["framework"]},
423
+ "reference": {"type":"string","search":true},
424
+ "applicability": {"type":"enum","values":["applicable","not-applicable","undetermined"],"filter":true},
425
+ "description": {"type":"string","search":true},
426
+ "parentRequirementId": {"type":"id","relation":["requirement"]},
427
+ "applicabilityRationale": {"type":"string"},
428
+ "controlIds": {"type":"array","items":"id","relation":["control"]}
429
+ },
430
+ "listFields": ["description","applicability","frameworkId"]
431
+ },
432
+ "commitment": {
433
+ "title": "Commitment",
434
+ "pluralTitle": "Commitments",
435
+ "group": "program",
436
+ "collection": "commitments",
437
+ "description": "Customer-facing commitments, internal system requirements, and business objectives that controls and the system description must support.",
438
+ "guidance": {
439
+ "policyBasis": "Policies define baseline safeguards; contracts, service descriptions, and approved business decisions supply the specific commitment.",
440
+ "cadence": "Create before relying on a promise, review during audit scoping, and supersede it when the service or agreement changes.",
441
+ "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"]
442
+ },
443
+ "required": ["status","commitmentKind","statement","ownerIds"],
444
+ "fields": {
445
+ "status": {"type":"enum","values":["active","superseded","retired"],"filter":true},
446
+ "commitmentKind": {"type":"enum","values":["service","system-requirement","business-objective"],"filter":true},
447
+ "statement": {"type":"string","search":true},
448
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
449
+ "sourceDocumentIds": {"type":"array","items":"id","relation":["document"]},
450
+ "requirementIds": {"type":"array","items":"id","relation":["requirement"]},
451
+ "controlIds": {"type":"array","items":"id","relation":["control"]},
452
+ "customerFacing": {"type":"boolean","filter":true},
453
+ "effectiveOn": {"type":"date","requiredWhen":{"status":"active"}},
454
+ "supersedesId": {"type":"id","relation":["commitment"]}
455
+ },
456
+ "listFields": ["title","status","commitmentKind","customerFacing"]
457
+ },
458
+ "complementary-control": {
459
+ "title": "Complementary control",
460
+ "pluralTitle": "Complementary controls",
461
+ "group": "program",
462
+ "collection": "complementary-controls",
463
+ "description": "Controls expected from customers or subservice organizations and needed for the service organization's controls and commitments to work as described. A complementary-control record is not required for SOC 2 when no such dependency applies.",
464
+ "guidance": {
465
+ "policyBasis": "The system description and vendor model define these dependencies. Internal policies still require owners to identify, communicate, and monitor them.",
466
+ "cadence": "Review for every audit and after material customer-responsibility, vendor, contract, integration, or service changes.",
467
+ "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"]
468
+ },
469
+ "required": ["status","responsibleParty","statement","systemIds"],
470
+ "fields": {
471
+ "status": {"type":"enum","values":["active","superseded","retired"],"filter":true},
472
+ "responsibleParty": {"type":"enum","values":["user-entity","subservice-organization"],"filter":true},
473
+ "statement": {"type":"string","search":true},
474
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
475
+ "vendorId": {"type":"id","relation":["vendor"]},
476
+ "requirementIds": {"type":"array","items":"id","relation":["requirement"]},
477
+ "commitmentIds": {"type":"array","items":"id","relation":["commitment"]},
478
+ "relatedControlIds": {"type":"array","items":"id","relation":["control"]},
479
+ "sourceDocumentIds": {"type":"array","items":"id","relation":["document"]},
480
+ "effectiveOn": {"type":"date"}
481
+ },
482
+ "listFields": ["title","status","responsibleParty"]
483
+ },
484
+ "control": {
485
+ "title": "Control",
486
+ "pluralTitle": "Controls",
487
+ "group": "program",
488
+ "collection": "controls",
489
+ "description": "Testable operating statements that translate policies and requirements into owned activities, system scope, frequency, and expected evidence.",
490
+ "guidance": {
491
+ "policyBasis": "Controls implement the linked policies and map that operation to applicable criteria. A policy statement alone does not prove implementation.",
492
+ "cadence": "Operate at the frequency on each control. Review ownership, scope, design, and evidence during annual risk and policy reviews and after material changes.",
493
+ "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"],
494
+ "obligationActivityTypes": ["risk-assessment","policy-review"]
495
+ },
496
+ "required": ["status","statement","ownerIds","requirementIds","activity","operationMode","frequency"],
497
+ "fields": {
498
+ "status": {"type":"enum","values":["planned","implemented","partially-implemented","not-applicable","retired"],"filter":true},
499
+ "statement": {"type":"string","search":true},
500
+ "requirementIds": {"type":"array","items":"id","relation":["requirement"]},
501
+ "code": {"type":"string","search":true},
502
+ "activity": {"type":"string","search":true},
503
+ "controlType": {"type":"enum","values":["preventive","detective","corrective"],"filter":true},
504
+ "operationMode": {"type":"enum","values":["manual","automated","hybrid"],"filter":true},
505
+ "frequency": {"type":"string","filter":true},
506
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
507
+ "commitmentIds": {"type":"array","items":"id","relation":["commitment"]},
508
+ "complementaryControlIds": {"type":"array","items":"id","relation":["complementary-control"]},
509
+ "policyIds": {"type":"array","items":"id","relation":["policy"]},
510
+ "riskIds": {"type":"array","items":"id","relation":["risk"]},
511
+ "effectiveOn": {"type":"date","requiredWhen":{"status":"implemented"}},
512
+ "retiredOn": {"type":"date"}
513
+ },
514
+ "listFields": ["code","title","status","controlType","operationMode","frequency"]
515
+ },
516
+ "control-test": {
517
+ "title": "Control test",
518
+ "pluralTitle": "Control tests",
519
+ "group": "program",
520
+ "collection": "control-tests",
521
+ "description": "Management, internal-audit, or service-auditor tests of one control's design or operation for an as-of date or period. Management-run control-test records are not required for SOC 2; the auditor performs independent testing, while these records support readiness and internal assurance.",
522
+ "guidance": {
523
+ "policyBasis": "The information security policy requires control monitoring and audit evidence. Tests link procedures, samples, evidence, exceptions, findings, and review.",
524
+ "cadence": "Plan from control frequency, risk, and audit scope. Record the exact period or as-of date, link the complete population and sampled items when sampling applies, and complete review before relying on the result.",
525
+ "sourceResourceIds": ["policy-information-security"]
526
+ },
527
+ "required": ["status","controlId","testKinds","performedBy"],
528
+ "fields": {
529
+ "status": {"type":"enum","values":["planned","in-progress","complete","not-performed","canceled"],"filter":true},
530
+ "controlId": {"type":"id","relation":["control"]},
531
+ "testKinds": {"type":"array","items":"string","filter":true},
532
+ "performedBy": {"type":"enum","values":["management","internal-audit","service-auditor"],"filter":true},
533
+ "asOfDate": {"type":"date"},
534
+ "periodStart": {"type":"date"},
535
+ "periodEnd": {"type":"date"},
536
+ "outcome": {
537
+ "type": "outcome",
538
+ "requiredWhen": {"status":"complete"},
539
+ "filter": true
540
+ },
541
+ "auditId": {"type":"id","relation":["audit"]},
542
+ "testerIds": {"type":"array","items":"id","relation":["person"]},
543
+ "externalTester": {"type":"object"},
544
+ "sampleSize": {"type":"integer","minimum":0},
545
+ "populationId": {"type":"id","relation":["audit-population"]},
546
+ "sampleEvidenceIds": {"type":"array","items":"id","relation":["evidence"]},
547
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
548
+ "exceptionCount": {"type":"integer","minimum":0},
549
+ "findingIds": {"type":"array","items":"id","relation":["finding"]},
550
+ "reviewerIds": {"type":"array","items":"id","relation":["person"]},
551
+ "reviewedOn": {"type":"date"},
552
+ "completedOn": {"type":"date"},
553
+ "sourceCommit": {"type":"string"},
554
+ "notPerformedReason": {
555
+ "type": "string",
556
+ "requiredWhen": {"status":"not-performed"}
557
+ }
558
+ },
559
+ "listFields": ["title","status","controlId","performedBy","outcome","completedOn"]
560
+ },
561
+ "finding": {
562
+ "title": "Finding",
563
+ "pluralTitle": "Findings",
564
+ "group": "work",
565
+ "collection": "findings",
566
+ "description": "Audit exceptions, control deficiencies, review issues, and other gaps that need ownership, severity, remediation, evidence, and independent verification. A finding record is not required for SOC 2 when no gap has been identified.",
567
+ "guidance": {
568
+ "policyBasis": "The information security policy requires issues from monitoring, audits, incidents, scans, and reviews to be tracked through corrective action.",
569
+ "cadence": "Create when identified, assign a risk-based due date, review while open, and close only after remediation is verified.",
570
+ "sourceResourceIds": ["policy-information-security"]
571
+ },
572
+ "required": ["status","severity","sourceResourceId","description","ownerIds"],
573
+ "fields": {
574
+ "status": {"type":"enum","values":["open","accepted","remediating","resolved","closed"],"filter":true},
575
+ "severity": {"type":"rating","filter":true},
576
+ "sourceResourceId": {"type":"id","relation":["*"]},
577
+ "description": {"type":"string","search":true},
578
+ "controlIds": {"type":"array","items":"id","relation":["control"]},
579
+ "riskIds": {"type":"array","items":"id","relation":["risk"]},
580
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
581
+ "identifiedOn": {"type":"date"},
582
+ "dueOn": {"type":"date"},
583
+ "actionItemIds": {"type":"array","items":"id","relation":["action-item"]},
584
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
585
+ "resolvedOn": {"type":"date"},
586
+ "verifiedByIds": {"type":"array","items":"id","relation":["person"]},
587
+ "verifiedOn": {"type":"date"}
588
+ },
589
+ "listFields": ["title","status","severity","identifiedOn","dueOn"]
590
+ },
591
+ "exception": {
592
+ "title": "Exception",
593
+ "pluralTitle": "Exceptions",
594
+ "group": "risk",
595
+ "collection": "exceptions",
596
+ "description": "Approved, time-bound departures from a policy or control, with scope, rationale, risk, compensating controls, owner, approval, and expiry. An exception record is not required for SOC 2 unless the organization approves a departure.",
597
+ "guidance": {
598
+ "policyBasis": "The information security and data handling policies require a business reason, risk assessment, compensating controls, suitable approval, and an expiration or review date.",
599
+ "cadence": "Approve before the departure begins, review through its stated cadence or expiry, and close or renew it through a new risk decision.",
600
+ "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"]
601
+ },
602
+ "required": ["status","scopeResourceIds","requestorIds","ownerIds","rationale"],
603
+ "fields": {
604
+ "status": {"type":"enum","values":["requested","approved","expired","revoked","closed"],"filter":true},
605
+ "scopeResourceIds": {"type":"array","items":"id","relation":["*"]},
606
+ "requestorIds": {"type":"array","items":"id","relation":["person"]},
607
+ "rationale": {"type":"string","search":true},
608
+ "riskIds": {"type":"array","items":"id","relation":["risk"]},
609
+ "requestedOn": {"type":"date"},
610
+ "approvedByIds": {"type":"array","items":"id","relation":["person","team"]},
611
+ "approvedOn": {"type":"date"},
612
+ "expiresOn": {"type":"date"},
613
+ "reviewCadence": {"type":"object"},
614
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
615
+ "actionItemIds": {"type":"array","items":"id","relation":["action-item"]},
616
+ "closedOn": {"type":"date"}
617
+ },
618
+ "listFields": ["title","status","expiresOn"]
619
+ },
620
+ "action-item": {
621
+ "title": "Action item",
622
+ "pluralTitle": "Action items",
623
+ "group": "work",
624
+ "collection": "action-items",
625
+ "description": "Owned follow-up work from findings, risks, incidents, meetings, reviews, tests, exceptions, audits, and other GRC activity. A separate action-item tracker is not required for SOC 2; use this page when follow-up should stay linked to its source and evidence.",
626
+ "guidance": {
627
+ "policyBasis": "Starter policies require material issues and review decisions to produce named owners, due dates, evidence, and tracked corrective work.",
628
+ "cadence": "Create when work is assigned, review until complete, record blockers, and link completion evidence before closing."
629
+ },
630
+ "required": ["status","assigneeIds","sourceResourceId"],
631
+ "fields": {
632
+ "status": {"type":"enum","values":["open","in-progress","blocked","done","canceled"],"filter":true},
633
+ "assigneeIds": {"type":"array","items":"id","relation":["person","team"]},
634
+ "sourceResourceId": {"type":"id","relation":["*"]},
635
+ "description": {"type":"string","search":true},
636
+ "priority": {"type":"rating","filter":true},
637
+ "obligationId": {"type":"id","relation":["obligation"]},
638
+ "dueWindowStart": {"type":"date"},
639
+ "dueWindowEnd": {"type":"date"},
640
+ "overdueOn": {"type":"date"},
641
+ "dueWindowStartAt": {"type":"timestamp"},
642
+ "dueWindowEndAt": {"type":"timestamp"},
643
+ "overdueAt": {"type":"timestamp"},
644
+ "dueOn": {"type":"date"},
645
+ "completedOn": {"type":"date"},
646
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
647
+ "completionResourceIds": {"type":"array","items":"id","relation":["*"]},
648
+ "blockingResourceIds": {"type":"array","items":"id","relation":["*"]}
649
+ },
650
+ "listFields": ["title","status","priority","dueOn","assigneeIds"]
651
+ },
652
+ "policy": {
653
+ "title": "Policy",
654
+ "pluralTitle": "Policies",
655
+ "group": "governance",
656
+ "collection": "policies",
657
+ "description": "Approved rules and responsibilities with Markdown content, owners, approvers, audience, acknowledgement rules, related controls, and Git history.",
658
+ "guidance": {
659
+ "policyBasis": "Policies set the program's required behavior. Control, obligation, training, document, and attestation records make those requirements operational and auditable.",
660
+ "cadence": "Review at least annually and after material changes. The approver must be separate from the owner. Record approval and require a new acknowledgement when a material update affects the audience.",
661
+ "sourceResourceIds": ["policy-information-security"],
662
+ "obligationActivityTypes": ["policy-review"]
663
+ },
664
+ "required": ["status","ownerIds","approverIds"],
665
+ "fields": {
666
+ "status": {"type":"enum","values":["draft","in-review","approved","active","superseded","retired"],"filter":true},
667
+ "approverIds": {"type":"array","items":"id","relation":["person","team"],"disjointFrom":"ownerIds"},
668
+ "policyNumber": {"type":"string","search":true},
669
+ "policyKind": {"type":"string","filter":true},
670
+ "version": {"type":"string"},
671
+ "effectiveOn": {"type":"date","requiredWhen":{"status":"active"}},
672
+ "approvedOn": {"type":"date","requiredWhen":{"status":"active"}},
673
+ "reviewCadence": {"type":"object"},
674
+ "nextReviewConstraint": {"type":"object"},
675
+ "supersedesId": {"type":"id","relation":["policy"]},
676
+ "parentPolicyId": {"type":"id","relation":["policy"]},
677
+ "relatedPolicyIds": {"type":"array","items":"id","relation":["policy"]},
678
+ "relatedDocumentIds": {"type":"array","items":"id","relation":["document"]},
679
+ "controlIds": {"type":"array","items":"id","relation":["control"]},
680
+ "requirementIds": {"type":"array","items":"id","relation":["requirement"]},
681
+ "audience": {"type":"array","items":"string","filter":true},
682
+ "acknowledgementRequired": {"type":"boolean","filter":true}
683
+ },
684
+ "listFields": ["title","status","policyKind","version","effectiveOn"],
685
+ "markdown": {
686
+ "content": {"label":"Policy","primary":true,"required":true}
687
+ }
688
+ },
689
+ "policy-review": {
690
+ "title": "Policy review",
691
+ "pluralTitle": "Policy reviews",
692
+ "group": "governance",
693
+ "collection": "policy-reviews",
694
+ "description": "Evidence that named reviewers checked governed policies or documents, recorded the result, approved changes, and assigned follow-up work.",
695
+ "guidance": {
696
+ "policyBasis": "Each starter policy and the continuity plan requires review at least annually and after specified material changes.",
697
+ "cadence": "Complete annually and after a triggering change, incident, disruption, or policy condition. Link the exact scope, reviewers, result, and evidence.",
698
+ "sourceResourceIds": ["policy-information-security","document-business-continuity-disaster-recovery"],
699
+ "obligationActivityTypes": ["policy-review"]
700
+ },
701
+ "required": ["status","scopeResourceIds","reviewerIds","reviewedOn"],
702
+ "fields": {
703
+ "status": {"type":"enum","values":["planned","in-progress","complete","canceled"],"filter":true},
704
+ "scopeResourceIds": {"type":"array","items":"id","relation":["policy","document"]},
705
+ "reviewerIds": {"type":"array","items":"id","relation":["person"]},
706
+ "reviewedOn": {"type":"date"},
707
+ "outcome": {
708
+ "type": "outcome",
709
+ "requiredWhen": {"status":"complete"},
710
+ "filter": true
711
+ },
712
+ "periodStart": {"type":"date"},
713
+ "periodEnd": {"type":"date"},
714
+ "changesRequired": {"type":"boolean"},
715
+ "changeSummary": {"type":"string"},
716
+ "approverIds": {"type":"array","items":"id","relation":["person","team"]},
717
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
718
+ "findingIds": {"type":"array","items":"id","relation":["finding"]},
719
+ "actionItemIds": {"type":"array","items":"id","relation":["action-item"]}
720
+ },
721
+ "listFields": ["title","status","reviewedOn","outcome","changesRequired"]
722
+ },
723
+ "attestation": {
724
+ "title": "Attestation",
725
+ "pluralTitle": "Attestations",
726
+ "group": "governance",
727
+ "collection": "attestations",
728
+ "description": "Per-person proof of policy acknowledgement, training completion, certification, or assigned work, tied to exact content revisions and signed evidence when needed.",
729
+ "guidance": {
730
+ "policyBasis": "The information security, data handling, workforce, and training materials require workers to review assigned content and acknowledge applicable responsibilities.",
731
+ "cadence": "Assign during onboarding, within 30 days for security training, annually for recurring training, and after material content changes that require acknowledgement.",
732
+ "sourceResourceIds": ["policy-information-security","policy-data-protection-handling","policy-employee-handbook"],
733
+ "obligationActivityTypes": ["training"]
734
+ },
735
+ "required": ["status","subjectResourceIds","personId","attestationKind"],
736
+ "fields": {
737
+ "status": {"type":"enum","values":["pending","completed","waived","overdue"],"filter":true},
738
+ "subjectResourceIds": {"type":"array","items":"id","relation":["policy","document","training","action-item"]},
739
+ "personId": {"type":"id","relation":["person"]},
740
+ "attestationKind": {"type":"string","filter":true},
741
+ "assignedOn": {"type":"date"},
742
+ "dueOn": {"type":"date"},
743
+ "completedOn": {"type":"date"},
744
+ "attestationMethod": {"type":"enum","values":["git-approval","signed-document","external-record"],"filter":true},
745
+ "contentRevisions": {"type":"object"},
746
+ "attestedCommit": {"type":"string"},
747
+ "expiresOn": {"type":"date"},
748
+ "waivedByIds": {"type":"array","items":"id","relation":["person"]},
749
+ "waiverReason": {"type":"string"},
750
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]}
751
+ },
752
+ "listFields": ["title","status","personId","attestationKind","dueOn","completedOn"],
753
+ "markdown": {
754
+ "statement": {"label":"Statement","primary":true,"required":false}
755
+ }
756
+ },
757
+ "meeting": {
758
+ "title": "Meeting",
759
+ "pluralTitle": "Meetings",
760
+ "group": "governance",
761
+ "collection": "meetings",
762
+ "description": "Governance meeting records with schedule, chair, attendees, agenda, minutes, decisions, risks, findings, evidence, and assigned actions.",
763
+ "guidance": {
764
+ "policyBasis": "The information security policy requires formal security and risk oversight minutes. The continuity plan requires oversight review of exercises and unresolved risks.",
765
+ "cadence": "Hold security and risk oversight meetings at least quarterly. Create one immutable meeting record and Markdown minutes for each occurrence.",
766
+ "sourceResourceIds": ["policy-information-security","document-business-continuity-disaster-recovery"],
767
+ "obligationActivityTypes": ["meeting"]
768
+ },
769
+ "required": ["status","teamId","scheduledOn","chairIds"],
770
+ "fields": {
771
+ "status": {"type":"enum","values":["planned","complete","canceled"],"filter":true},
772
+ "teamId": {"type":"id","relation":["team"]},
773
+ "scheduledOn": {"type":"date"},
774
+ "chairIds": {"type":"array","items":"id","relation":["person"]},
775
+ "startedAt": {"type":"timestamp"},
776
+ "endedAt": {"type":"timestamp"},
777
+ "attendeeIds": {"type":"array","items":"id","relation":["person"]},
778
+ "externalAttendees": {"type":"array","items":"object"},
779
+ "decisionSummary": {"type":"string","search":true},
780
+ "riskIds": {"type":"array","items":"id","relation":["risk"]},
781
+ "findingIds": {"type":"array","items":"id","relation":["finding"]},
782
+ "actionItemIds": {"type":"array","items":"id","relation":["action-item"]},
783
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]}
784
+ },
785
+ "listFields": ["title","status","teamId","scheduledOn"],
786
+ "markdown": {
787
+ "agenda": {"label":"Agenda","primary":false,"required":false},
788
+ "minutes": {"label":"Minutes","primary":true,"required":false}
789
+ }
790
+ },
791
+ "training": {
792
+ "title": "Training",
793
+ "titleLabel": "Name",
794
+ "pluralTitle": "Training",
795
+ "group": "governance",
796
+ "collection": "training",
797
+ "description": "Reusable Markdown training with audience, assignment trigger, recurrence, completion window, linked policies and controls, and passing criteria.",
798
+ "guidance": {
799
+ "policyBasis": "The information security and data handling policies require security training, acknowledgements, and added role-based training where responsibilities or data warrant it.",
800
+ "cadence": "Assign security training at onboarding, complete it within 30 days, repeat at least annually, and reassign after relevant material changes or incidents.",
801
+ "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"],
802
+ "obligationActivityTypes": ["training"]
803
+ },
804
+ "required": ["status","ownerIds"],
805
+ "fields": {
806
+ "status": {"type":"enum","values":["draft","active","retired"],"filter":true},
807
+ "audience": {"type":"array","items":"string","filter":true},
808
+ "assignmentTrigger": {"type":"string","filter":true},
809
+ "recurrence": {"type":"object"},
810
+ "completionWindowDays": {"type":"integer"},
811
+ "policyIds": {"type":"array","items":"id","relation":["policy"]},
812
+ "controlIds": {"type":"array","items":"id","relation":["control"]},
813
+ "passingCriteria": {"type":"string"},
814
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]}
815
+ },
816
+ "listFields": ["title","status","audience","assignmentTrigger","completionWindowDays"],
817
+ "markdown": {
818
+ "content": {"label":"Training","primary":true,"required":true}
819
+ }
820
+ },
821
+ "risk": {
822
+ "title": "Risk",
823
+ "pluralTitle": "Risks",
824
+ "group": "risk",
825
+ "collection": "risks",
826
+ "description": "Identified threats and business impacts with ownership, inherent and residual ratings, response, acceptance, affected scope, controls, and follow-up work.",
827
+ "guidance": {
828
+ "policyBasis": "The information security and data handling policies require risk identification, treatment, ownership, approval, target dates, and time-bound acceptance.",
829
+ "cadence": "Assess the register at least annually and after material changes. Review High and Critical risks at least quarterly and accepted risks by their review date.",
830
+ "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"],
831
+ "obligationActivityTypes": ["risk-assessment"]
832
+ },
833
+ "required": ["status","description","ownerIds","categories","response","inherentRating"],
834
+ "fields": {
835
+ "status": {"type":"enum","values":["draft","open","monitoring","accepted","closed","archived"],"filter":true},
836
+ "description": {"type":"string","search":true},
837
+ "categories": {"type":"array","items":"string","filter":true},
838
+ "response": {"type":"enum","values":["avoid","mitigate","transfer","accept","monitor"],"filter":true},
839
+ "inherentRating": {"type":"object"},
840
+ "residualRating": {"type":"object"},
841
+ "acceptanceRationale": {"type":"string"},
842
+ "acceptedByIds": {"type":"array","items":"id","relation":["person","team"]},
843
+ "acceptedOn": {"type":"date"},
844
+ "acceptanceExpiresOn": {"type":"date"},
845
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
846
+ "vendorIds": {"type":"array","items":"id","relation":["vendor"]},
847
+ "controlIds": {"type":"array","items":"id","relation":["control"]},
848
+ "commitmentIds": {"type":"array","items":"id","relation":["commitment"]},
849
+ "requirementIds": {"type":"array","items":"id","relation":["requirement"]},
850
+ "findingIds": {"type":"array","items":"id","relation":["finding"]},
851
+ "actionItemIds": {"type":"array","items":"id","relation":["action-item"]},
852
+ "reviewCadence": {"type":"object"}
853
+ },
854
+ "listFields": ["title","status","response","inherentRating","residualRating"]
855
+ },
856
+ "risk-assessment": {
857
+ "title": "Risk assessment",
858
+ "pluralTitle": "Risk assessments",
859
+ "group": "risk",
860
+ "collection": "risk-assessments",
861
+ "description": "Point-in-time assessment records for a defined scope, methodology, participants, systems, vendors, risks, conclusions, evidence, and approval.",
862
+ "guidance": {
863
+ "policyBasis": "The information security and data handling policies require assessment of threats, assets, obligations, controls, likelihood, impact, treatment, and material changes.",
864
+ "cadence": "Complete at least annually and after a material change that could alter risk. Record new and changed risks instead of hiding them in the summary.",
865
+ "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"],
866
+ "obligationActivityTypes": ["risk-assessment"]
867
+ },
868
+ "required": ["status","assessmentDate","assessmentKind","scope","assessorIds","reviewerIds"],
869
+ "fields": {
870
+ "status": {"type":"enum","values":["planned","in-progress","complete","canceled"],"filter":true},
871
+ "assessmentDate": {"type":"date"},
872
+ "assessmentKind": {"type":"enum","values":["enterprise-risk","system-risk","privacy-impact","vendor-risk","business-impact"],"filter":true},
873
+ "scope": {"type":"string","search":true},
874
+ "assessorIds": {"type":"array","items":"id","relation":["person"]},
875
+ "reviewerIds": {"type":"array","items":"id","relation":["person"],"disjointFrom":"assessorIds"},
876
+ "methodology": {"type":"string","requiredWhen":{"status":"complete"}},
877
+ "trigger": {"type":"string"},
878
+ "attendeeIds": {"type":"array","items":"id","relation":["person"]},
879
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
880
+ "vendorIds": {"type":"array","items":"id","relation":["vendor"]},
881
+ "commitmentIds": {"type":"array","items":"id","relation":["commitment"]},
882
+ "riskIds": {"type":"array","items":"id","relation":["risk"]},
883
+ "newRiskIds": {"type":"array","items":"id","relation":["risk"]},
884
+ "changedRiskIds": {"type":"array","items":"id","relation":["risk"]},
885
+ "summary": {"type":"string","search":true},
886
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
887
+ "findingIds": {"type":"array","items":"id","relation":["finding"]},
888
+ "actionItemIds": {"type":"array","items":"id","relation":["action-item"]},
889
+ "approvedOn": {"type":"date","requiredWhen":{"status":"complete"}},
890
+ "sourceCommit": {"type":"string"}
891
+ },
892
+ "listFields": ["title","status","assessmentKind","assessmentDate"]
893
+ },
894
+ "vendor": {
895
+ "title": "Vendor",
896
+ "titleLabel": "Name",
897
+ "pluralTitle": "Vendors",
898
+ "group": "systems-vendors",
899
+ "collection": "vendors",
900
+ "description": "Third parties that provide products or services, with ownership, service, criticality, data, systems, contracts, subprocessors, continuity, and review cadence.",
901
+ "guidance": {
902
+ "policyBasis": "The information security and data handling policies require vendor inventory, risk-based review before access, suitable contract terms, and monitoring of important providers.",
903
+ "cadence": "Create before access or reliance. Review Critical and High-risk vendors at least annually and after material service changes or incidents.",
904
+ "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"],
905
+ "obligationActivityTypes": ["inventory-review","vendor-review"]
906
+ },
907
+ "required": ["status","category","criticality","ownerIds"],
908
+ "fields": {
909
+ "status": {"type":"enum","values":["evaluating","active","deprecated","terminated"],"filter":true},
910
+ "category": {"type":"string","filter":true},
911
+ "criticality": {"type":"enum","values":["low","medium","high","critical"],"filter":true},
912
+ "description": {"type":"string","search":true},
913
+ "service": {"type":"string","search":true},
914
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
915
+ "dataClassification": {"type":"string","filter":true},
916
+ "dataTypes": {"type":"array","items":"string","search":true},
917
+ "subprocessor": {"type":"boolean","filter":true},
918
+ "standardAgreement": {"type":"boolean"},
919
+ "agreementDocumentId": {"type":"id","relation":["document"]},
920
+ "backupVendorId": {"type":"id","relation":["vendor"]},
921
+ "startDate": {"type":"date"},
922
+ "endDate": {"type":"date"},
923
+ "reviewCadence": {"type":"object"}
924
+ },
925
+ "listFields": ["title","status","category","criticality","subprocessor"]
926
+ },
927
+ "vendor-review": {
928
+ "title": "Vendor review",
929
+ "pluralTitle": "Vendor reviews",
930
+ "group": "systems-vendors",
931
+ "collection": "vendor-reviews",
932
+ "description": "Pre-access due diligence and periodic vendor reviews covering service, data, access, assurance, recovery, incidents, contracts, risks, evidence, and follow-up.",
933
+ "guidance": {
934
+ "policyBasis": "The information security and data handling policies require review before a vendor handles sensitive data and periodic review of Critical and High-risk providers.",
935
+ "cadence": "Complete before access, at least annually for Critical and High-risk vendors, and after material service changes or incidents.",
936
+ "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"],
937
+ "obligationActivityTypes": ["vendor-review"]
938
+ },
939
+ "required": ["status","vendorIds","reviewerIds","reviewedOn"],
940
+ "fields": {
941
+ "status": {"type":"enum","values":["planned","in-progress","approved","conditional","rejected","complete"],"filter":true},
942
+ "vendorIds": {"type":"array","items":"id","relation":["vendor"]},
943
+ "reviewerIds": {"type":"array","items":"id","relation":["person"]},
944
+ "reviewedOn": {"type":"date"},
945
+ "outcome": {"type":"outcome","filter":true},
946
+ "periodStart": {"type":"date"},
947
+ "periodEnd": {"type":"date"},
948
+ "scope": {"type":"string"},
949
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
950
+ "riskIds": {"type":"array","items":"id","relation":["risk"]},
951
+ "findingIds": {"type":"array","items":"id","relation":["finding"]},
952
+ "actionItemIds": {"type":"array","items":"id","relation":["action-item"]},
953
+ "nextReviewConstraint": {"type":"object"}
954
+ },
955
+ "listFields": ["title","status","vendorIds","reviewedOn","outcome"]
956
+ },
957
+ "access-grant": {
958
+ "title": "Access grant",
959
+ "pluralTitle": "Access grants",
960
+ "group": "people-access",
961
+ "collection": "access-grants",
962
+ "description": "One person's or service account's access to one system, including business role, privilege, request, approval, provisioning, expiry, removal, ticket, and evidence.",
963
+ "guidance": {
964
+ "policyBasis": "The information security and data handling policies require unique identity, business need, least privilege, approval, authorized provisioning, and prompt removal.",
965
+ "cadence": "Record every grant and material change. Remove access at or before notice for involuntary or high-risk departures and within 24 hours for other departures.",
966
+ "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"]
967
+ },
968
+ "required": ["status","subjectKind","subjectId","systemId","accessLevel","privileged"],
969
+ "fields": {
970
+ "status": {"type":"enum","values":["requested","approved","active","revoked","expired"],"filter":true},
971
+ "subjectKind": {"type":"enum","values":["person","service-account"],"filter":true},
972
+ "subjectId": {"type":"id","relation":["person","service-account"]},
973
+ "systemId": {"type":"id","relation":["system"]},
974
+ "accessLevel": {"type":"string","filter":true},
975
+ "privileged": {"type":"boolean","filter":true},
976
+ "role": {"type":"string"},
977
+ "requestedOn": {"type":"date"},
978
+ "approvedByIds": {"type":"array","items":"id","relation":["person"]},
979
+ "approvedOn": {"type":"date"},
980
+ "provisionedByIds": {"type":"array","items":"id","relation":["person"]},
981
+ "provisionedOn": {"type":"date"},
982
+ "expiresOn": {"type":"date"},
983
+ "deprovisionedByIds": {"type":"array","items":"id","relation":["person"]},
984
+ "deprovisionedOn": {"type":"date"},
985
+ "deprovisionReason": {"type":"string"},
986
+ "ticketReference": {"type":"string"},
987
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]}
988
+ },
989
+ "listFields": ["title","status","subjectId","systemId","accessLevel","privileged"]
990
+ },
991
+ "access-review": {
992
+ "title": "Access review",
993
+ "pluralTitle": "Access reviews",
994
+ "group": "people-access",
995
+ "collection": "access-reviews",
996
+ "description": "Point-in-time review of a defined access population, with systems, reviewers, period, grant decisions, exceptions, approval, evidence, and source revision.",
997
+ "guidance": {
998
+ "policyBasis": "The information security and data handling policies require owners to confirm least privilege and remove dormant, expired, excessive, or unneeded access.",
999
+ "cadence": "Review privileged and production access at least quarterly and other important-system access at least annually.",
1000
+ "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"],
1001
+ "obligationActivityTypes": ["access-review"]
1002
+ },
1003
+ "required": ["status","reviewDate","reviewerIds","systemIds"],
1004
+ "fields": {
1005
+ "status": {"type":"enum","values":["planned","in-progress","complete","canceled"],"filter":true},
1006
+ "reviewDate": {"type":"date"},
1007
+ "reviewerIds": {"type":"array","items":"id","relation":["person"]},
1008
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
1009
+ "scope": {"type":"string"},
1010
+ "outcome": {
1011
+ "type": "outcome",
1012
+ "requiredWhen": {"status":"complete"},
1013
+ "filter": true
1014
+ },
1015
+ "periodStart": {"type":"date"},
1016
+ "periodEnd": {"type":"date"},
1017
+ "grantDecisions": {"type":"array","items":"object"},
1018
+ "populationCount": {"type":"integer","minimum":0},
1019
+ "exceptionCount": {"type":"integer","minimum":0},
1020
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
1021
+ "findingIds": {"type":"array","items":"id","relation":["finding"]},
1022
+ "actionItemIds": {"type":"array","items":"id","relation":["action-item"]},
1023
+ "approvedByIds": {"type":"array","items":"id","relation":["person"]},
1024
+ "approvedOn": {"type":"date"},
1025
+ "sourceCommit": {"type":"string"}
1026
+ },
1027
+ "listFields": ["title","status","reviewDate","outcome","exceptionCount"]
1028
+ },
1029
+ "vulnerability": {
1030
+ "title": "Vulnerability",
1031
+ "pluralTitle": "Vulnerabilities",
1032
+ "group": "security-operations",
1033
+ "collection": "vulnerabilities",
1034
+ "description": "Confirmed weaknesses with severity, affected systems, source, dates, external IDs, owner, due date, risk treatment, evidence, and remediation verification. A separate FileGRC vulnerability register is not required for SOC 2 when a scanner or ticket system remains the source of truth and retains usable audit evidence.",
1035
+ "guidance": {
1036
+ "policyBasis": "The information security policy requires owned, risk-based remediation or a documented exception with compensating controls and approval.",
1037
+ "cadence": "Remediate Critical, High, Medium, and Low vulnerabilities within 7, 14, 30, and 30 days unless an approved exception applies.",
1038
+ "sourceResourceIds": ["policy-information-security"]
1039
+ },
1040
+ "required": ["status","severity","description","systemIds","ownerIds","discoveredOn"],
1041
+ "fields": {
1042
+ "status": {"type":"enum","values":["open","in-progress","risk-accepted","remediated","closed","false-positive"],"filter":true},
1043
+ "severity": {"type":"enum","values":["informational","low","medium","high","critical","unknown"],"filter":true},
1044
+ "description": {"type":"string","search":true},
1045
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
1046
+ "discoveredOn": {"type":"date"},
1047
+ "source": {"type":"string","filter":true},
1048
+ "externalIdentifier": {"type":"string","search":true},
1049
+ "cveIds": {"type":"array","items":"string","search":true},
1050
+ "cvss": {"type":"number"},
1051
+ "exploitability": {"type":"string"},
1052
+ "dueOn": {"type":"date"},
1053
+ "riskId": {"type":"id","relation":["risk"]},
1054
+ "acceptedByIds": {"type":"array","items":"id","relation":["person"]},
1055
+ "acceptanceExpiresOn": {"type":"date"},
1056
+ "remediatedOn": {"type":"date"},
1057
+ "verifiedByIds": {"type":"array","items":"id","relation":["person"]},
1058
+ "verifiedOn": {"type":"date"},
1059
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
1060
+ "actionItemIds": {"type":"array","items":"id","relation":["action-item"]}
1061
+ },
1062
+ "listFields": ["title","status","severity","systemIds","discoveredOn","dueOn"]
1063
+ },
1064
+ "vulnerability-scan": {
1065
+ "title": "Vulnerability scan",
1066
+ "pluralTitle": "Vulnerability scans",
1067
+ "group": "security-operations",
1068
+ "collection": "vulnerability-scans",
1069
+ "description": "Scan activities with kind, tools, scope, systems, operator, timestamps, severity counts, resulting vulnerabilities, evidence, failure reason, and review.",
1070
+ "guidance": {
1071
+ "policyBasis": "The information security policy requires monitoring for vulnerabilities and scanning internet-facing and production systems.",
1072
+ "cadence": "Scan at least quarterly and after material changes when practical. Review failures and create vulnerability or finding records for confirmed results.",
1073
+ "sourceResourceIds": ["policy-information-security"],
1074
+ "obligationActivityTypes": ["vulnerability-scan"]
1075
+ },
1076
+ "required": ["status","scanKind","scope","operatorIds"],
1077
+ "fields": {
1078
+ "status": {"type":"enum","values":["planned","running","complete","failed"],"filter":true},
1079
+ "scanKind": {"type":"string","filter":true},
1080
+ "scope": {"type":"string","search":true},
1081
+ "operatorIds": {"type":"array","items":"id","relation":["person"]},
1082
+ "tools": {"type":"array","items":"string"},
1083
+ "scheduledOn": {"type":"date"},
1084
+ "startedAt": {"type":"timestamp"},
1085
+ "completedAt": {"type":"timestamp"},
1086
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
1087
+ "resultSummary": {"type":"string","search":true},
1088
+ "findingCountBySeverity": {"type":"object"},
1089
+ "vulnerabilityIds": {"type":"array","items":"id","relation":["vulnerability"]},
1090
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
1091
+ "failureReason": {"type":"string"},
1092
+ "reviewerIds": {"type":"array","items":"id","relation":["person"]},
1093
+ "reviewedOn": {"type":"date"}
1094
+ },
1095
+ "listFields": ["title","status","scanKind","scheduledOn","completedAt"]
1096
+ },
1097
+ "incident": {
1098
+ "title": "Incident",
1099
+ "pluralTitle": "Incidents",
1100
+ "group": "security-operations",
1101
+ "collection": "incidents",
1102
+ "description": "Suspected and confirmed security or privacy events with severity, chronology, scope, ownership, evidence, affected systems and vendors, findings, and corrective work. An incident record is not required for SOC 2 when no incident has occurred.",
1103
+ "guidance": {
1104
+ "policyBasis": "The information security and data handling policies require immediate reporting, investigation, containment, recovery, evidence preservation, and notification review.",
1105
+ "cadence": "Create on report or detection, update material events as they progress, and complete a retrospective within one week after a material incident.",
1106
+ "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"]
1107
+ },
1108
+ "required": ["status","severity","ownerIds","detectedAt","description"],
1109
+ "fields": {
1110
+ "status": {"type":"enum","values":["suspected","declared","contained","eradicated","recovered","closed"],"filter":true},
1111
+ "severity": {"type":"rating","filter":true},
1112
+ "detectedAt": {"type":"timestamp"},
1113
+ "description": {"type":"string","search":true},
1114
+ "occurredAt": {"type":"timestamp"},
1115
+ "declaredAt": {"type":"timestamp"},
1116
+ "containedAt": {"type":"timestamp"},
1117
+ "recoveredAt": {"type":"timestamp"},
1118
+ "closedAt": {"type":"timestamp"},
1119
+ "reportedBy": {"type":"object"},
1120
+ "detectionSource": {"type":"string"},
1121
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
1122
+ "vendorIds": {"type":"array","items":"id","relation":["vendor"]},
1123
+ "dataClassification": {"type":"string"},
1124
+ "riskIds": {"type":"array","items":"id","relation":["risk"]},
1125
+ "vulnerabilityIds": {"type":"array","items":"id","relation":["vulnerability"]},
1126
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
1127
+ "findingIds": {"type":"array","items":"id","relation":["finding"]},
1128
+ "actionItemIds": {"type":"array","items":"id","relation":["action-item"]}
1129
+ },
1130
+ "listFields": ["title","status","severity","detectedAt","closedAt"]
1131
+ },
1132
+ "exercise": {
1133
+ "title": "Exercise",
1134
+ "pluralTitle": "Exercises",
1135
+ "group": "resilience",
1136
+ "collection": "exercises",
1137
+ "description": "Continuity, recovery, incident, privacy, and other simulations with scenario, objective, participants, scope, result, evidence, findings, and actions.",
1138
+ "guidance": {
1139
+ "policyBasis": "The information security policy requires annual incident testing. The continuity plan requires annual exercises and review after material change or disruption.",
1140
+ "cadence": "Test incident response and continuity at least annually. Repeat after a material change when the prior exercise no longer represents the environment.",
1141
+ "sourceResourceIds": ["policy-information-security","document-business-continuity-disaster-recovery"],
1142
+ "obligationActivityTypes": ["exercise"]
1143
+ },
1144
+ "required": ["status","exerciseKind","scheduledOn","facilitatorIds"],
1145
+ "fields": {
1146
+ "status": {"type":"enum","values":["planned","in-progress","complete","canceled"],"filter":true},
1147
+ "exerciseKind": {"type":"string","filter":true},
1148
+ "scheduledOn": {"type":"date"},
1149
+ "facilitatorIds": {"type":"array","items":"id","relation":["person"]},
1150
+ "scenario": {"type":"string"},
1151
+ "objective": {"type":"string"},
1152
+ "outcome": {
1153
+ "type": "outcome",
1154
+ "requiredWhen": {"status":"complete"},
1155
+ "filter": true
1156
+ },
1157
+ "participantIds": {"type":"array","items":"id","relation":["person"]},
1158
+ "teamIds": {"type":"array","items":"id","relation":["team"]},
1159
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
1160
+ "startedAt": {"type":"timestamp"},
1161
+ "completedAt": {"type":"timestamp"},
1162
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
1163
+ "findingIds": {"type":"array","items":"id","relation":["finding"]},
1164
+ "actionItemIds": {"type":"array","items":"id","relation":["action-item"]}
1165
+ },
1166
+ "listFields": ["title","status","exerciseKind","scheduledOn","outcome"]
1167
+ },
1168
+ "backup-test": {
1169
+ "title": "Backup test",
1170
+ "pluralTitle": "Backup tests",
1171
+ "group": "resilience",
1172
+ "collection": "backup-tests",
1173
+ "description": "Restore and recovery tests with systems, operators, date, timing, recovery results, reviewer, evidence, findings, and follow-up work.",
1174
+ "guidance": {
1175
+ "policyBasis": "The information security policy and continuity plan require protected backups, failure monitoring, and proof that data can be restored and used.",
1176
+ "cadence": "Test restoration at least annually for important systems and after recovery changes that could invalidate prior evidence.",
1177
+ "sourceResourceIds": ["policy-information-security","document-business-continuity-disaster-recovery"],
1178
+ "obligationActivityTypes": ["backup-test"]
1179
+ },
1180
+ "required": ["status","systemIds","testDate","operatorIds"],
1181
+ "fields": {
1182
+ "status": {"type":"enum","values":["planned","running","passed","failed"],"filter":true},
1183
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
1184
+ "testDate": {"type":"date"},
1185
+ "operatorIds": {"type":"array","items":"id","relation":["person"]},
1186
+ "outcome": {"type":"outcome","filter":true},
1187
+ "reviewerIds": {"type":"array","items":"id","relation":["person"]},
1188
+ "startedAt": {"type":"timestamp"},
1189
+ "completedAt": {"type":"timestamp"},
1190
+ "recoveryTimeMinutes": {"type":"integer"},
1191
+ "recoveryPointMinutes": {"type":"integer"},
1192
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
1193
+ "findingIds": {"type":"array","items":"id","relation":["finding"]},
1194
+ "actionItemIds": {"type":"array","items":"id","relation":["action-item"]}
1195
+ },
1196
+ "listFields": ["title","status","testDate","outcome","recoveryTimeMinutes"]
1197
+ },
1198
+ "penetration-test": {
1199
+ "title": "Penetration test",
1200
+ "pluralTitle": "Penetration tests",
1201
+ "group": "security-operations",
1202
+ "collection": "penetration-tests",
1203
+ "description": "Internal or external penetration tests with scope, period, provider, method, result, affected systems, evidence, vulnerabilities, findings, and review.",
1204
+ "guidance": {
1205
+ "policyBasis": "The information security policy requires an independent test of the in-scope service's external attack surface and tracked resolution of results.",
1206
+ "cadence": "Perform at least annually and reconsider scope after material attack-surface or architecture changes.",
1207
+ "sourceResourceIds": ["policy-information-security"],
1208
+ "obligationActivityTypes": ["penetration-test"]
1209
+ },
1210
+ "required": ["status","testKind","scope","periodStart","periodEnd","ownerIds"],
1211
+ "fields": {
1212
+ "status": {"type":"enum","values":["planned","in-progress","complete","canceled"],"filter":true},
1213
+ "testKind": {"type":"string","filter":true},
1214
+ "scope": {"type":"string","search":true},
1215
+ "periodStart": {"type":"date"},
1216
+ "periodEnd": {"type":"date"},
1217
+ "provider": {"type":"string"},
1218
+ "outcome": {
1219
+ "type": "outcome",
1220
+ "requiredWhen": {"status":"complete"},
1221
+ "filter": true
1222
+ },
1223
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
1224
+ "rulesOfEngagementDocumentId": {"type":"id","relation":["document"]},
1225
+ "methodology": {"type":"string"},
1226
+ "resultSummary": {"type":"string","search":true},
1227
+ "findingIds": {"type":"array","items":"id","relation":["finding"]},
1228
+ "vulnerabilityIds": {"type":"array","items":"id","relation":["vulnerability"]},
1229
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
1230
+ "reviewerIds": {"type":"array","items":"id","relation":["person"]},
1231
+ "reviewedOn": {"type":"date"}
1232
+ },
1233
+ "listFields": ["title","status","testKind","periodStart","periodEnd","outcome"]
1234
+ },
1235
+ "data-request": {
1236
+ "title": "Data request",
1237
+ "pluralTitle": "Data requests",
1238
+ "group": "governance",
1239
+ "collection": "data-requests",
1240
+ "description": "Privacy, contractual, or other requests concerning data, tracked by opaque reference with scope, jurisdiction, due date, decision, evidence, and completion. Data-request tracking is not required for a SOC 2 Security-only report; use it when privacy criteria, law, or contracts make the workflow relevant.",
1241
+ "guidance": {
1242
+ "policyBasis": "The data handling policy requires requests to reach the responsible owner and keeps erasable personal data out of immutable Git history.",
1243
+ "cadence": "Create on receipt, set the deadline from applicable law or contract, verify identity outside this repository when needed, and record completion.",
1244
+ "sourceResourceIds": ["policy-data-protection-handling"]
1245
+ },
1246
+ "required": ["status","requestKind","receivedOn","ownerIds","requesterReference"],
1247
+ "fields": {
1248
+ "status": {"type":"enum","values":["received","verifying","in-progress","completed","denied","canceled"],"filter":true},
1249
+ "requestKind": {"type":"string","filter":true},
1250
+ "receivedOn": {"type":"date"},
1251
+ "requesterReference": {"type":"string","search":true},
1252
+ "jurisdiction": {"type":"string","filter":true},
1253
+ "dueOn": {"type":"date"},
1254
+ "verifiedOn": {"type":"date"},
1255
+ "scope": {"type":"string"},
1256
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
1257
+ "vendorIds": {"type":"array","items":"id","relation":["vendor"]},
1258
+ "decision": {"type":"string"},
1259
+ "decisionRationale": {"type":"string"},
1260
+ "completedOn": {"type":"date"},
1261
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
1262
+ "actionItemIds": {"type":"array","items":"id","relation":["action-item"]}
1263
+ },
1264
+ "listFields": ["title","status","requestKind","receivedOn","dueOn"]
1265
+ },
1266
+ "audit": {
1267
+ "title": "Audit",
1268
+ "pluralTitle": "Audits",
1269
+ "group": "audits",
1270
+ "collection": "audits",
1271
+ "description": "One SOC 2 engagement from auditor selection and scope through requests, fieldwork, evidence, findings, and the final report.",
1272
+ "guidance": {
1273
+ "policyBasis": "An independent CPA firm performs the examination against the selected criteria. Policies, controls, operating records, and evidence show how the organization meets them.",
1274
+ "cadence": "Engage the auditor early enough to agree on scope, timing, and evidence expectations. Create one record per engagement, using an as-of date for Type 1 or a start and end period for Type 2.",
1275
+ "sourceResourceIds": ["policy-information-security"]
1276
+ },
1277
+ "required": ["status","auditKind","frameworkIds","scope","ownerIds"],
1278
+ "fields": {
1279
+ "status": {"type":"enum","values":["planned","in-progress","fieldwork","complete"],"filter":true},
1280
+ "auditKind": {"type":"enum","values":["readiness","soc-2-type-1","soc-2-type-2"],"filter":true},
1281
+ "frameworkIds": {"type":"array","items":"id","relation":["framework"]},
1282
+ "scope": {"type":"string","search":true},
1283
+ "auditor": {"type":"object"},
1284
+ "auditorVendorId": {"type":"id","relation":["vendor"]},
1285
+ "typeOneAsOf": {"type":"date"},
1286
+ "periodStart": {"type":"date"},
1287
+ "periodEnd": {"type":"date"},
1288
+ "fieldworkStart": {"type":"date"},
1289
+ "fieldworkEnd": {"type":"date"},
1290
+ "reportDate": {"type":"date"},
1291
+ "systemIds": {"type":"array","items":"id","relation":["system"]},
1292
+ "requirementIds": {"type":"array","items":"id","relation":["requirement"]},
1293
+ "controlIds": {"type":"array","items":"id","relation":["control"]},
1294
+ "contactIds": {"type":"array","items":"id","relation":["person"]},
1295
+ "assessmentCoverage": {"type":"object"},
1296
+ "systemDescriptionDocumentId": {"type":"id","relation":["document"]},
1297
+ "managementAssertionDocumentId": {"type":"id","relation":["document"]},
1298
+ "periodCompletenessDocumentId": {"type":"id","relation":["document"]},
1299
+ "managementRepresentationDocumentId": {"type":"id","relation":["document"]},
1300
+ "complementaryControlIds": {"type":"array","items":"id","relation":["complementary-control"]},
1301
+ "complementaryControlsConclusion": {"type":"enum","values":["identified","not-applicable"],"label":"Complementary controls conclusion"},
1302
+ "subserviceVendorIds": {"type":"array","items":"id","relation":["vendor"]},
1303
+ "subserviceMethod": {"type":"enum","values":["carve-out","inclusive","not-applicable"]},
1304
+ "controlTestIds": {"type":"array","items":"id","relation":["control-test"]},
1305
+ "opinion": {"type":"enum","values":["unmodified","qualified","adverse","disclaimer","not-issued"],"filter":true},
1306
+ "opinionDate": {"type":"date"},
1307
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
1308
+ "findingIds": {"type":"array","items":"id","relation":["finding"]},
1309
+ "reportEvidenceId": {"type":"id","relation":["evidence"]},
1310
+ "managementResponseDocumentId": {"type":"id","relation":["document"]},
1311
+ "supplementalDocumentIds": {"type":"array","items":"id","relation":["document"]}
1312
+ },
1313
+ "listFields": ["title","status","auditKind","periodStart","periodEnd","opinion"]
1314
+ },
1315
+ "audit-population": {
1316
+ "title": "Audit population",
1317
+ "pluralTitle": "Audit populations",
1318
+ "group": "audits",
1319
+ "collection": "audit-populations",
1320
+ "description": "One complete population of events or items for a Type 2 period. Management records the authoritative source, exact query, count, reconciliation, and fixed export, including when the count is zero.",
1321
+ "guidance": {
1322
+ "policyBasis": "Management must supply complete and accurate populations so the auditor can select samples and test controls. The linked population-export evidence remains the fixed source artifact.",
1323
+ "cadence": "Plan at the start of the engagement, export for the exact audit period, reconcile before fieldwork, and retain proof for zero-event populations."
1324
+ },
1325
+ "required": ["status","auditId","populationKind","periodStart","periodEnd","ownerIds"],
1326
+ "fields": {
1327
+ "status": {"type":"enum","values":["planned","reconciled","incomplete","not-applicable"],"filter":true},
1328
+ "auditId": {"type":"id","relation":["audit"]},
1329
+ "populationKind": {"type":"string","filter":true,"search":true},
1330
+ "periodStart": {"type":"date"},
1331
+ "periodEnd": {"type":"date"},
1332
+ "controlIds": {"type":"array","items":"id","relation":["control"]},
1333
+ "sourceSystemId": {"type":"id","relation":["system"],"label":"Authoritative source system","requiredWhen":{"status":"reconciled"}},
1334
+ "sourceEvidenceId": {"type":"id","relation":["evidence"],"requiredWhen":{"status":"reconciled"}},
1335
+ "reconciledByIds": {"type":"array","items":"id","relation":["person"],"requiredWhen":{"status":"reconciled"}},
1336
+ "reconciledOn": {"type":"date","requiredWhen":{"status":"reconciled"}},
1337
+ "conclusion": {"type":"enum","values":["complete","complete-with-exceptions","incomplete"],"requiredWhen":{"status":"reconciled"},"filter":true},
1338
+ "reconciliationSummary": {"type":"string","search":true},
1339
+ "notApplicableReason": {"type":"string","requiredWhen":{"status":"not-applicable"},"search":true}
1340
+ },
1341
+ "listFields": ["title","status","populationKind","periodStart","periodEnd","conclusion"]
1342
+ },
1343
+ "audit-request": {
1344
+ "title": "Audit request",
1345
+ "pluralTitle": "Audit requests",
1346
+ "group": "audits",
1347
+ "collection": "audit-requests",
1348
+ "description": "One auditor request or prepared-by-client item with engagement, reference, description, owner, due date, response, criteria, controls, evidence, and follow-up. A separate FileGRC request tracker is not required for SOC 2 when the auditor's system remains the source of truth.",
1349
+ "guidance": {
1350
+ "policyBasis": "Audit requests turn the engagement scope into owned deliverables and preserve the exact evidence and response supplied to the auditor.",
1351
+ "cadence": "Create on receipt, assign immediately, meet the auditor due date, bind evidence to the requested period and Git revision, and close only after acceptance."
1352
+ },
1353
+ "required": ["status","auditId","requestReference","description","ownerIds"],
1354
+ "fields": {
1355
+ "status": {"type":"enum","values":["open","in-progress","submitted","accepted","needs-follow-up","closed"],"filter":true},
1356
+ "auditId": {"type":"id","relation":["audit"]},
1357
+ "requestReference": {"type":"string","search":true},
1358
+ "description": {"type":"string","search":true},
1359
+ "requestedOn": {"type":"date"},
1360
+ "dueOn": {"type":"date"},
1361
+ "submittedOn": {"type":"date"},
1362
+ "closedOn": {"type":"date"},
1363
+ "requirementIds": {"type":"array","items":"id","relation":["requirement"]},
1364
+ "controlIds": {"type":"array","items":"id","relation":["control"]},
1365
+ "periodStart": {"type":"date"},
1366
+ "periodEnd": {"type":"date"},
1367
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
1368
+ "auditorNotes": {"type":"string"},
1369
+ "actionItemIds": {"type":"array","items":"id","relation":["action-item"]}
1370
+ },
1371
+ "listFields": ["requestReference","title","status","dueOn","submittedOn"],
1372
+ "markdown": {
1373
+ "response": {"label":"Response","primary":true,"required":false}
1374
+ }
1375
+ }
1376
+ },
1377
+ "primitives": {"rating":["low","medium","high","critical"],"outcome":["passed","passed-with-exceptions","failed","not-applicable","inconclusive"]}
1378
+ }