create-filegrc 0.11.1 → 0.12.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-filegrc",
3
- "version": "0.11.1",
3
+ "version": "0.12.0",
4
4
  "description": "Create a filegrc workspace for a SOC 2 program",
5
5
  "license": "MIT",
6
6
  "repository": {
package/src/defaults.js CHANGED
@@ -1125,24 +1125,39 @@ export function baselineRecordFiles(effectiveDate, starter = "security") {
1125
1125
  evidenceSourceKinds: FILEGRC_SOURCE_FAMILIES,
1126
1126
  evidenceOwnerIds: [POLICY_OWNER_APPOINTMENT_ID]
1127
1127
  };
1128
- const obligationRecords = obligations.map((obligation) => ({
1129
- id: obligation.id,
1130
- type: "obligation",
1131
- title: obligation.title,
1128
+ const obligationRecords = obligations.map((obligation) => {
1129
+ const ruleId = `${obligation.id.replace(/^obligation-/, "obligation-rule-")}-v1`;
1130
+ return {
1131
+ id: obligation.id,
1132
+ type: "obligation",
1133
+ title: obligation.title,
1134
+ status: "proposed",
1135
+ activityType: obligation.activityType,
1136
+ scheduleMode: "rule",
1137
+ ruleIds: [ruleId],
1138
+ ownerIds: obligation.ownerIds,
1139
+ ...(obligation.triggerPrompt ? { triggerPrompt: obligation.triggerPrompt } : {}),
1140
+ ...(obligation.eventRiskLevels ? { eventRiskLevels: obligation.eventRiskLevels } : {}),
1141
+ ...(obligation.scopeResourceIds ? { scopeResourceIds: obligation.scopeResourceIds } : {}),
1142
+ ...(obligation.templateResourceId ? { templateResourceId: obligation.templateResourceId } : {}),
1143
+ controlIds: obligation.controlIds,
1144
+ policyIds: obligation.policyIds
1145
+ };
1146
+ });
1147
+ const obligationRuleRecords = obligations.map((obligation) => ({
1148
+ id: `${obligation.id.replace(/^obligation-/, "obligation-rule-")}-v1`,
1149
+ type: "obligation-rule",
1150
+ title: `${obligation.title} rule v1`,
1132
1151
  status: "proposed",
1133
- activityType: obligation.activityType,
1152
+ obligationId: obligation.id,
1153
+ activityDefinitionVersion: "1",
1134
1154
  recurrence: obligation.recurrence.mode === "calendar"
1135
1155
  ? { ...obligation.recurrence, anchorDate: effectiveDate }
1136
1156
  : obligation.recurrence,
1137
- ownerIds: obligation.ownerIds,
1138
- startsOn: effectiveDate,
1139
- ...(obligation.triggerPrompt ? { triggerPrompt: obligation.triggerPrompt } : {}),
1140
- ...(obligation.eventRiskLevels ? { eventRiskLevels: obligation.eventRiskLevels } : {}),
1141
1157
  ...(obligation.window ? { window: obligation.window } : {}),
1142
- ...(obligation.scopeResourceIds ? { scopeResourceIds: obligation.scopeResourceIds } : {}),
1143
- ...(obligation.templateResourceId ? { templateResourceId: obligation.templateResourceId } : {}),
1144
- controlIds: obligation.controlIds,
1145
- policyIds: obligation.policyIds
1158
+ ...(starterObligationSelector(obligation.id) ? { selector: starterObligationSelector(obligation.id) } : {}),
1159
+ rationale: "Starter proposal derived from the linked Policy. Management must review the cadence, population, completion criteria, and timing before activation.",
1160
+ sourceResourceIds: [...(obligation.policyIds || [])]
1146
1161
  }));
1147
1162
  const sourceCoverageRecords = SOURCE_FAMILIES.map(([sourceFamilyId, title]) => {
1148
1163
  const filegrcManaged = FILEGRC_SOURCE_FAMILIES.includes(sourceFamilyId);
@@ -1201,10 +1216,29 @@ export function baselineRecordFiles(effectiveDate, starter = "security") {
1201
1216
  ...foundation,
1202
1217
  ...sourceCoverageRecords.map((record) => recordFile("source-coverage", record)),
1203
1218
  ...retentionScheduleItems.map((record) => recordFile("retention-schedule-items", record)),
1204
- ...obligationRecords.map((record) => recordFile("obligations", record))
1219
+ ...obligationRecords.map((record) => recordFile("obligations", record)),
1220
+ ...obligationRuleRecords.map((record) => recordFile("obligation-rules", record))
1205
1221
  ];
1206
1222
  }
1207
1223
 
1224
+ function starterObligationSelector(obligationId) {
1225
+ const definitions = {
1226
+ "obligation-annual-workforce-competence-review": { resourceType: "person", statuses: ["active"] },
1227
+ "obligation-annual-access-review": { resourceType: "system", statuses: ["active"], criticalities: ["high", "critical"] },
1228
+ "obligation-annual-network-access-review": { resourceType: "system", statuses: ["active"], criticalities: ["high", "critical"] },
1229
+ "obligation-quarterly-vulnerability-scan": { resourceType: "system", statuses: ["active"], criticalities: ["high", "critical"] },
1230
+ "obligation-quarterly-log-review": { resourceType: "system", statuses: ["active"], criticalities: ["high", "critical"] },
1231
+ "obligation-annual-backup-restoration-test": { resourceType: "system", statuses: ["active"], criticalities: ["high", "critical"] },
1232
+ "obligation-annual-critical-vendor-review": { resourceType: "vendor", statuses: ["active"], criticalities: ["high", "critical"] }
1233
+ };
1234
+ const definition = definitions[obligationId];
1235
+ return definition ? {
1236
+ ...definition,
1237
+ membershipMode: "as-of",
1238
+ cutoff: "window-end"
1239
+ } : null;
1240
+ }
1241
+
1208
1242
  export async function writeBaselineRecords(target, effectiveDate, starter = "security") {
1209
1243
  for (const { path: relativePath, record } of baselineRecordFiles(effectiveDate, starter)) {
1210
1244
  const path = join(target, relativePath);
package/src/index.js CHANGED
@@ -10,7 +10,7 @@ const execute = promisify(execFile);
10
10
  const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
11
11
  const textExtensions = new Set(["", ".json", ".md", ".txt", ".yml", ".yaml", ".gitignore"]);
12
12
  const STARTER_PROFILES = new Set(["foundation", "security"]);
13
- const SECURITY_TEMPLATE_COLLECTIONS = new Set(["collection-reviews", "documents", "policies", "training"]);
13
+ const SECURITY_TEMPLATE_COLLECTIONS = new Set(["collection-reviews", "documents", "policies", "reporting-route-sets", "training"]);
14
14
 
15
15
  export async function createFilegrc(options = {}) {
16
16
  const parameterConfig = JSON.parse(await readFile(join(packageRoot, "template-parameters.json"), "utf8"));
@@ -523,13 +523,13 @@ async function runCombinedSetup(target, input) {
523
523
  async function writeMinimalLockfile(target, name, versionRange) {
524
524
  const lock = {
525
525
  name,
526
- version: "0.11.1",
526
+ version: "0.12.0",
527
527
  lockfileVersion: 3,
528
528
  requires: true,
529
529
  packages: {
530
530
  "": {
531
531
  name,
532
- version: "0.11.1",
532
+ version: "0.12.0",
533
533
  dependencies: { filegrc: versionRange }
534
534
  }
535
535
  }
@@ -42,6 +42,10 @@ Read `data/AGENTS.md` before changing records. More specific instructions inside
42
42
 
43
43
  - Read `README.md` and run `npm run validate` before broad changes.
44
44
  - Treat `data/` as the source of truth. Do not hand-edit `.filegrc/` output.
45
+ - Let Git exclusively supply version-control facts, including authors, commit timestamps, messages, diffs, revisions, renames, and prior file versions. Do not copy them into records or maintain a parallel change log.
46
+ - Store each mutable program fact in one authoritative record and refer to it by ID. Policies state durable rules and outcomes instead of copying current people, vendors, systems, reporting channels, schedules, targets, or inventories.
47
+ - A Reporting Channel Set holds the normal and fallback ways people send a report for one purpose, such as a security email address and a hotline. Keep one revision for each Program and purpose. Commit its proposal before recording approval, use separate Appointment kinds for approval and ongoing responsibility, and create a successor instead of editing an approved revision.
48
+ - Keep an Obligation occurrence rolled up when one owner, window, population rule, and reconciliation conclusion govern the work. Split it only when a member needs its own owner, deadline, conclusion, or follow-up lifecycle.
45
49
  - Keep compliance records focused on business facts, decisions, scope, Controls, and Evidence. Do not mention filegrc versions, migrations, or workflow mechanics unless filegrc itself is the subject.
46
50
  - Use UTF-8 JSON for structured records and Markdown for long-form work.
47
51
  - Keep one resource in each JSON file.
@@ -70,7 +74,7 @@ Run `npm run check:milestone` in CI. Before an assurance goal is selected it che
70
74
 
71
75
  ## Git is the audit trail
72
76
 
73
- Git supplies file authors, commit timestamps, messages, diffs, and revisions. Do not add fields such as `createdAt`, `updatedAt`, `createdBy`, `updatedBy`, or a second change log.
77
+ Git exclusively supplies file authors, commit timestamps, messages, diffs, revisions, renames, and prior versions. Do not add fields such as `createdAt`, `updatedAt`, `createdBy`, `updatedBy`, or a second change log.
74
78
 
75
79
  Domain events still need explicit dates. Keep values such as `occurredOn`, `scheduledFor`, `approvedOn`, `completedOn`, and audit-period dates in their records.
76
80
 
@@ -115,7 +119,7 @@ npx filegrc migrate --to-model 8 --preview --json
115
119
 
116
120
  Older workspaces migrate one version at a time. Review every preview’s automatic, review-required, and unsupported classifications before applying it with the same options and `--yes`. The v8 migration preserves legacy retention prose as notes, renames Component processing operations, and creates no retention periods or disposition behavior.
117
121
 
118
- The [model v8 upgrade guide](https://github.com/Alignbase/filegrc/blob/main/docs/upgrading-to-model-v8.md) explains the structured retention and mapping changes.
122
+ The [model v10 upgrade guide](https://github.com/Alignbase/filegrc/blob/main/docs/upgrading-to-model-v10.md) explains Reporting Channel Sets and the legacy-route review. The [model v9 upgrade guide](https://github.com/Alignbase/filegrc/blob/main/docs/upgrading-to-model-v9.md) explains rolled-up Obligation occurrences, reviewed schedule rules, and temporal Collection Reviews.
119
123
 
120
124
  Run these commands when working with records:
121
125
 
@@ -127,11 +131,17 @@ npx filegrc list risk --json
127
131
  npx filegrc get risk-example
128
132
  npx filegrc get risk-example --mutation
129
133
  npx filegrc references risk-example --json
134
+ npx filegrc reporting-route-sets --json
135
+ npx filegrc reporting-route-set scaffold approve --id REPORTING_ROUTE_SET_ID
136
+ npx filegrc reporting-route-set scaffold cancel --id REPORTING_ROUTE_SET_ID
137
+ npx filegrc reporting-route-set scaffold successor --id SUCCESSOR_ROUTE_SET_ID
130
138
  npx filegrc describe risk
131
139
  npx filegrc search "access review"
132
140
  npm run serve
133
141
  ```
134
142
 
143
+ The Reporting Channel Set scaffolds are action-specific. Approval needs the exact committed proposal, current route-set revision, authorized Appointment, actual times, timezone, and verified fixed Evidence. Cancellation needs its own authority, time, reason, Evidence, and current revision. A successor approval also includes the predecessor cancellation authority, Evidence, and revision so FileGRC records the cutover atomically. Replace every placeholder before passing the payload to `reporting-route-set approve` or `reporting-route-set cancel`.
144
+
135
145
  Prefer existing fields. Put organization-specific values under `extensions` with a namespace owned by {{company_name}}. Add structure only when validation, filtering, relationships, due dates, or audit completeness need it. Variable procedures, interviews, observations, rationale, and detailed results belong in the record's Markdown companion.
136
146
 
137
147
  Never change a resource ID after it is committed. Create a replacement and link the records if identity truly changes.
@@ -282,7 +292,7 @@ Link a control test to its `audit-population` record when sampling applies. Link
282
292
 
283
293
  ## Content and approvals
284
294
 
285
- The initial program lead is {{policy_owner_name}}, {{policy_owner_job_title}}, at {{policy_owner_email}}. The separate Policy Owner Appointment records this person’s starting program authority, and the security reporting address is {{security_contact_email}}. Update the Person when their organizational position changes. End and replace Appointments when named authority moves to someone else.
295
+ The initial program lead is {{policy_owner_name}}, {{policy_owner_job_title}}, at {{policy_owner_email}}. The separate Policy Owner Appointment records this person’s starting program authority. The Reporting Channel Set holds the normal and fallback ways people send security concerns. Update the Person when their organizational position changes. End and replace Appointments when named authority moves to someone else.
286
296
 
287
297
  Appoint an independent management reviewer during policy review, not as a condition of defining the service boundary. The reviewer must be separate from the policy owner and able to challenge the owner’s decisions. Assign another internal leader or manager when a suitable reviewer is available. Otherwise, appoint a qualified external reviewer. The reviewer chairs Security and Risk Oversight and approves policies and governed documents.
288
298
 
@@ -19,7 +19,7 @@ npm run serve
19
19
 
20
20
  Requires Node.js 20 or newer and Git.
21
21
 
22
- Existing model v7 workspaces must run `npx filegrc migrate --to-model 8 --preview --json` after installing a model v8 package. The migration preserves legacy retention prose as notes and creates no retention periods or disposition behavior. Older workspaces migrate one model version at a time. See the [model v8 upgrade guide](https://github.com/Alignbase/filegrc/blob/main/docs/upgrading-to-model-v8.md).
22
+ Existing model v9 workspaces must run `npx filegrc migrate --to-model 10 --preview --json` after installing a model v10 package. The migration preserves prior Reporting Routes as legacy facts and asks management to create one reviewed Reporting Channel Set: the normal and fallback ways people send a report for one purpose. It does not infer missing Program, channel pairing, authority, or event-time facts. Older workspaces migrate one model version at a time. See the [model v10 upgrade guide](https://github.com/Alignbase/filegrc/blob/main/docs/upgrading-to-model-v10.md).
23
23
 
24
24
  ## How it works
25
25
 
@@ -27,7 +27,7 @@ The repository is the program. There is no separate application database.
27
27
 
28
28
  - **JSON** holds records that filegrc validates, filters, and connects.
29
29
  - **Markdown** holds policies, procedures, plans, minutes, and narratives.
30
- - **Git** supplies authors, timestamps, revisions, diffs, and commit messages.
30
+ - **Git** exclusively supplies authors, commit timestamps, revisions, diffs, renames, prior versions, and commit messages.
31
31
 
32
32
  Use the same source through the local web app, a text editor, the CLI, or CI. Browser and CLI actions call the same rules, so engineers and agents see the same validation and readiness results.
33
33
 
@@ -101,7 +101,7 @@ When `guide` returns a collection review requirement, review the listed type-spe
101
101
 
102
102
  Use Retention Schedule Items as the structured rows of the Data Retention Schedule. Keep a row `planned` until management has approved its Information Types, scope, cutoff, period, disposition action, instructions, sources, approver, date, and reviewed source revisions. Run `npx filegrc program-readiness --json` after changing an information use, source-coverage record, Commitment, Policy, or other source. FileGRC may identify missing or stale decisions, but it must never infer an organization-specific period or deletion behavior.
103
103
 
104
- Store a relationship only on its authoritative record. Control Tests store `auditId`; Evidence Artifacts store `auditIds`; Commitments store `systemIds` and `controlIds`; Controls store `policyIds`, `requirementIds`, `systemIds`, `componentIds`, and `evidenceSourceComponentIds`; Risks store `controlIds`; Components store their `vendorId` and `systemUses`. Use `references` to inspect derived inbound links.
104
+ Store a relationship only on its authoritative record. Control Tests store `auditId`; Evidence Artifacts store `auditIds`; Commitments store `systemIds` and `controlIds`; Controls store `policyIds`, `requirementIds`, `systemIds`, `componentIds`, and `evidenceSourceComponentIds`; Risks store `controlIds`; Components store their `vendorId` and `systemUses`; Reporting Channel Sets store the normal and fallback ways people send a report, the rules requiring them, and the responsible role. Use `references` to inspect derived inbound links.
105
105
 
106
106
  Use explicit business dates. Git records when a file changed, but it does not replace `occurredOn`, `scheduledFor`, `completedOn`, `approvedOn`, or similar fields.
107
107
 
@@ -188,8 +188,13 @@ Use `get RESOURCE_ID --mutation` and `update` so JSON and Markdown change togeth
188
188
 
189
189
  ```sh
190
190
  npx filegrc obligations --json
191
+ npx filegrc activate-obligation-rule RULE_ID --scaffold > activation.json
192
+ npx filegrc activate-obligation-rule RULE_ID activation.json
191
193
  npx filegrc complete OBLIGATION_ID --scaffold --window-start YYYY-MM-DD --completed-on YYYY-MM-DD > completion-mutation.json
192
194
  npx filegrc complete OBLIGATION_ID completion-mutation.json
195
+ npx filegrc reconcile-obligation OBLIGATION_ID --scaffold --window-start YYYY-MM-DD > occurrence.json
196
+ npx filegrc reconcile-obligation OBLIGATION_ID occurrence.json
197
+ npx filegrc reconcile-obligation OBLIGATION_ID --scaffold --window-start YYYY-MM-DD --correct-finalized > occurrence-correction.json
193
198
  npx filegrc trigger EVENT_TYPE --occurred-on YYYY-MM-DD --subject RESOURCE_ID --json
194
199
  npx filegrc complete-action ACTION_ITEM_ID --scaffold --completed-on YYYY-MM-DD > completion-mutation.json
195
200
  npx filegrc complete-action ACTION_ITEM_ID completion-mutation.json --completed-on YYYY-MM-DD
@@ -204,6 +209,10 @@ Fill the scaffold with the actual work, evidence, review, and every null or empt
204
209
  npx filegrc program-readiness --summary --json
205
210
  npx filegrc prepare-audit AUDIT_ID
206
211
  npx filegrc audit-readiness AUDIT_ID --json
212
+ npx filegrc reconcile-management-documents AUDIT_ID --scaffold > management-reconciliation.json
213
+ npx filegrc reconcile-management-documents AUDIT_ID management-reconciliation.json
214
+ npx filegrc correct-audit-population POPULATION_ID --scaffold > population-correction.json
215
+ npx filegrc correct-audit-population POPULATION_ID population-correction.json
207
216
  npx filegrc evidence-packet --audit AUDIT_ID --preview --json
208
217
  ```
209
218
 
@@ -0,0 +1,10 @@
1
+ {
2
+ "id": "collection-review-classification",
3
+ "type": "collection-review",
4
+ "title": "Information handling classifications review",
5
+ "status": "planned",
6
+ "resourceType": "classification",
7
+ "scopeResourceIds": [
8
+ "program-soc-2"
9
+ ]
10
+ }
@@ -4,11 +4,11 @@
4
4
 
5
5
  This plan coordinates reporting, response, recovery, and continuity when a security event or disruption affects {{company_name}} or an in-scope service. Supporting procedures, system records, and retained evidence document the actual technical configuration and operation.
6
6
 
7
- ## Reporting routes
7
+ ## Reporting channels
8
8
 
9
- The primary reporting route is {{security_contact_email}}.
9
+ People send suspected security concerns through the current approved normal reporting channel, such as the security email address. If that channel is unavailable, compromised, or involved in the concern, they use the approved fallback channel. The Reporting Channel Set is the source of truth for the current destinations, responsible role, and effective period.
10
10
 
11
- [Complete before activation: Name a usable alternate reporting route, its owner, protected location, and how workers can find it when the primary email, identity, or collaboration System is unavailable, compromised, or involved in the concern. Do not put plaintext credentials, private keys, tokens, or recovery codes in this plan.]
11
+ [Complete before activation: Describe how workers can find the fallback reporting channel when the normal email, identity, or collaboration System is unavailable, compromised, or involved in the concern. Do not copy the destination here or include plaintext credentials, private keys, tokens, or recovery codes.]
12
12
 
13
13
  Reports may describe suspected unauthorized access, malware, data loss, credential exposure, security-Control failure, service disruption, fraud affecting the service, or another policy violation. The recipient records the report, protects confidentiality, preserves relevant information, and assigns an initial owner.
14
14
 
@@ -4,10 +4,12 @@ An obligation is a reusable policy schedule or event template. It is not the rec
4
4
 
5
5
  - Calendar obligations need a valid recurrence anchor, owners, expected completion types, and policy or control links.
6
6
  - Event obligations need a stable lowercase `eventType`, a prompt, owners, expected completion types, and an explicit deadline window.
7
+ - Keep one rolled-up Obligation Occurrence per rule window when one queue-level owner, population rule, and reconciliation conclusion govern the work. Reconcile each selected member to dated completion proof, an approved Exception, or a reviewed non-applicability decision.
8
+ - Split the work only when a member needs its own queue owner, deadline, conclusion, or follow-up lifecycle.
7
9
  - Keep completed occurrences in `completionResourceIds`. Do not replace prior links when a new period starts.
8
10
  - Configure and enable Obligations during Step 3. An enabled Obligation remains dormant until every governing Policy and required program Document is active and effective and, when it names Controls, at least one linked Control is implemented. FileGRC starts calendar work from the latest Policy or governed Document effective date, so pre-cutover periods do not become overdue work.
9
11
  - Calendar Obligations generated with `status: proposed` contain suggested starting cadences. Review the scope and risk, edit the cadence when needed, and change the Obligation to `active` only when management accepts that schedule. A proposed Obligation never counts as a configured schedule.
10
- - When an approved cadence changes, update the policy, control, and obligation together.
12
+ - When an approved cadence changes, update its authoritative Obligation schedule. Keep the durable required outcome in the Policy and the implementation fact in the Control instead of copying the cadence across all three records.
11
13
  - Pause or retire a template only when the underlying policy work no longer applies. Do not delete historical templates that explain prior periods.
12
14
 
13
15
  Use `npx filegrc obligations --json` to inspect calculated recurring work and preview every Policy Event task, owner, deadline, and requested proof. Run `npx filegrc complete OBLIGATION_ID --scaffold --window-start YYYY-MM-DD --completed-on YYYY-MM-DD > completion-mutation.json`, fill the actual work and proof, then pass that file to `npx filegrc complete OBLIGATION_ID completion-mutation.json`. The scaffold includes the current Obligation revision, and the final command creates and links the dated occurrence in one validated write. Use `npx filegrc trigger EVENT_TYPE ...` only after the matching event occurs; it adds all configured Action Items to the Work Queue atomically.
@@ -17,6 +17,20 @@
17
17
  "document-security-incident-recovery-plan",
18
18
  "document-data-retention-schedule"
19
19
  ],
20
+ "reportingRouteRequirements": [
21
+ {
22
+ "purposeKey": "security-reporting",
23
+ "programScope": "all-programs",
24
+ "requiredLanes": [
25
+ "primary",
26
+ "alternate"
27
+ ],
28
+ "distinctChannels": true,
29
+ "independentDependencies": false,
30
+ "effectiveAt": "1970-01-01T00:00:00Z",
31
+ "timezone": "UTC"
32
+ }
33
+ ],
20
34
  "proposedEffectiveOn": "{{effective_date}}",
21
35
  "programRole": "required"
22
36
  }
@@ -50,7 +50,7 @@ Management obtains or generates, checks, and uses relevant information from inte
50
50
 
51
51
  Everyone in scope must act honestly, protect company and customer information, follow approved security processes, disclose conflicts that could affect security decisions, and preserve accurate records. Fraud, deliberate Control bypass, false Evidence, credential sharing, unauthorized access, concealment of a security event, and retaliation for a good-faith report are prohibited.
52
52
 
53
- Suspected security events, Control failures, fraud, or policy violations must be reported promptly through the primary route at {{security_contact_email}} or the usable alternate route documented in the Security Incident and Recovery Plan. A person may use the alternate route when the primary route is unavailable, compromised, or involved in the concern. Management investigates credible reports, limits disclosure to people who need the information, preserves relevant records, and records corrective action.
53
+ Suspected security events, Control failures, fraud, or policy violations must be reported promptly through the current normal Security Reporting Channel or its usable fallback. A person may use the fallback when the normal channel is unavailable, compromised, or involved in the concern. Management investigates credible reports, limits disclosure to people who need the information, preserves relevant records, and records corrective action.
54
54
 
55
55
  ## Risk Management and Compliance Policy
56
56
 
@@ -0,0 +1,23 @@
1
+ {
2
+ "id": "reporting-route-set-security-reporting",
3
+ "type": "reporting-route-set",
4
+ "title": "Security reporting channels",
5
+ "status": "draft",
6
+ "programId": "program-soc-2",
7
+ "purposeKey": "security-reporting",
8
+ "purposeLabel": "Security reporting",
9
+ "primaryLane": {
10
+ "channelKind": "email",
11
+ "destination": "{{security_contact_email}}"
12
+ },
13
+ "alternateLane": {
14
+ "channelKind": "other",
15
+ "destination": "TBD: protected alternate channel"
16
+ },
17
+ "authorityAppointmentKind": "policy-owner",
18
+ "approvalAppointmentKind": "independent-policy-reviewer",
19
+ "sourceResourceIds": [
20
+ "policy-information-security",
21
+ "document-security-incident-recovery-plan"
22
+ ]
23
+ }
@@ -0,0 +1,9 @@
1
+ # Security reporting channels
2
+
3
+ This record tells FileGRC where people should send security concerns. A channel can be an email address, phone number, web form, named in-person contact, or another clear destination.
4
+
5
+ - The normal channel is the method people should use first.
6
+ - The fallback channel must still work when the normal channel is unavailable, compromised, or involved in the concern.
7
+ - The responsible Appointment identifies the role that keeps both channels usable and known to the intended audience.
8
+
9
+ Before proposing this set, replace the fallback placeholder and confirm that people can find both channels. Do not store credentials, recovery codes, or other secrets here.
@@ -6,7 +6,7 @@ Security depends on the choices people make while using accounts, devices, data,
6
6
 
7
7
  This training applies to employees and contractors who use {{company_name}} systems or information. Complete it within 30 days after starting, at least annually, and again when assigned after a material change or incident.
8
8
 
9
- Questions and incident reports should be sent to {{security_contact_email}}.
9
+ Questions and incident reports use the current approved security reporting channel delivered with this assignment.
10
10
 
11
11
  ## Your responsibilities
12
12
 
@@ -176,7 +176,7 @@ Report any event that could affect the confidentiality, integrity, or availabili
176
176
  ## Reporting and first actions
177
177
 
178
178
  1. Stop the unsafe action. Do not continue entering credentials, sending data, or following the request.
179
- 2. Report the event immediately to {{security_contact_email}}. If that route is unavailable, contact the current Policy Owner through an approved alternate method.
179
+ 2. Report the event immediately through the approved security reporting channel delivered with this assignment. If that channel is unavailable, use the current approved fallback channel.
180
180
  3. State what happened, when it happened, the affected account, device, system, or data, and any action already taken.
181
181
  4. Preserve the message, file, screen, device, or other evidence. Take a screenshot only when it is safe and does not expose more sensitive data.
182
182
  5. Follow response-team instructions. Remain available for questions.
@@ -200,7 +200,7 @@ The person who reports an event should cooperate with the response but should no
200
200
  After reviewing this training:
201
201
 
202
202
  - Ask about any requirement you do not understand.
203
- - Confirm that you know how to reach {{security_contact_email}}.
203
+ - Confirm that you know how to use the security reporting channel delivered with this assignment.
204
204
  - Complete the assigned training acknowledgement.
205
205
 
206
206
  The acknowledgement records the exact training revision reviewed and any signed evidence required for the assignment.
@@ -1,5 +1,5 @@
1
1
  {
2
- "dataModelVersion": "8",
2
+ "dataModelVersion": "10",
3
3
  "id": "workspace",
4
4
  "type": "workspace",
5
5
  "title": "{{program_title}}",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "{{project_name}}",
3
- "version": "0.11.1",
3
+ "version": "0.12.0",
4
4
  "private": true,
5
5
  "description": "filegrc workspace for a SOC 2 program",
6
6
  "type": "module",