filegrc 0.3.4 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  filegrc is a zero-dependency Node.js engine for Git-native GRC workspaces. It validates structured JSON records and their Markdown companions, renders a local web app, provides safe CRUD operations, and builds a read-only audit view.
4
4
 
5
- Program Readiness checks management-owned scope, policy adoption, control implementation, authoritative source configuration, and verified test captures without requiring an audit record. Audit Readiness starts after CPA engagement and checks the firm-agreed date or period, engagement-specific management documents, operating evidence, and Type 2 population completeness.
5
+ Program Readiness checks management-owned scope, policy adoption, control implementation, and authoritative evidence mapping without requiring an audit record. Audit Readiness starts after CPA engagement and checks the firm-agreed date or period, engagement-specific management documents, operating evidence, and Type 2 population completeness.
6
6
 
7
7
  Controls linked to filegrc obligations show whether their Work Queue schedules are waiting for policy approval, ready for implementation, running, paused, or mixed. Marking a fully configured control implemented starts its enabled schedules when their governing policies are effective.
8
8
 
@@ -26,7 +26,7 @@ npx filegrc list risk --json
26
26
  npx filegrc references risk-example --json
27
27
  npx filegrc describe risk
28
28
  npx filegrc search "access review"
29
- npx filegrc evidence-test-drafts --preview --json
29
+ npx filegrc evidence-map --json
30
30
  npx filegrc program-readiness --summary --json
31
31
  npx filegrc program-readiness --require-ready
32
32
  npx filegrc audit-readiness audit-id
@@ -34,27 +34,45 @@ npx filegrc prepare-audit audit-id
34
34
  npx filegrc evidence-packet --start 2026-01-01 --end 2026-06-30 --audit audit-id
35
35
  ```
36
36
 
37
+ ## Upgrade an existing workspace
38
+
39
+ The normal runtime uses data model v3. Start a model v2 upgrade with a read-only preview:
40
+
41
+ ```sh
42
+ npx filegrc migrate --to-model 3 --preview --json
43
+ ```
44
+
45
+ Review every automatic, review-required, and unsupported item. Resolve unsupported items before applying the same migration with `--yes`. The migration writes one atomic batch, validates model v3, changes no Git history, and is safe to rerun. The [model v3 upgrade guide](https://github.com/Sunpeak-AI/filegrc/blob/main/docs/upgrading-to-model-v3.md) explains every migration class and the review that follows.
46
+
47
+ A model v1 workspace must migrate to v2 first:
48
+
49
+ ```sh
50
+ npx filegrc migrate --to-model 2 --preview --json
51
+ ```
52
+
53
+ Follow the [model v2 upgrade guide](https://github.com/Sunpeak-AI/filegrc/blob/main/docs/upgrading-to-model-v2.md), then run the model v3 preview.
54
+
37
55
  `filegrc serve --help` prints bind, port, environment, and safety options without starting the server. The editable server defaults to `127.0.0.1:8787`; set `FILEGRC_HOST`, `FILEGRC_PORT`, or the matching flags when needed. In trunk mode, browser saves synchronize, commit, and push from the authoritative branch. Use `--allow-non-authoritative-writes` for local development in a task checkout; the override never commits or pushes.
38
56
 
39
57
  `filegrc setup` provides the headless equivalent of browser onboarding. Run it without arguments for guided terminal setup, or pass all initial service-boundary fields and a management program goal as flags or a JSON payload. Add `--preview` to validate and inspect the planned service and workspace writes without saving. Add `--summary --json` for compact agent output. Selecting Type 1 or Type 2 updates the workspace goal and selected systems. Setup does not select framework records, link controls, create evidence, or create an audit record.
40
58
 
41
- `filegrc program-path --next --json` gives an agent the current step and first action without loading the full lifecycle. Use `--summary` for compact status across all six steps, `--current` for the full current-step guide, or no compact flag for every step. `filegrc guide <type>` repeats the matching page guidance and adds fields, relationship candidates, Markdown slots, and timing for that record type.
59
+ `filegrc program-path --next --json` gives an agent the current step and first action without loading the full lifecycle. Use `--summary` for compact status across all five steps, `--current` for the full current-step guide, or no compact flag for every step. `filegrc guide <type>` repeats the matching page guidance and adds fields, relationship candidates, Markdown slots, and timing for that record type.
42
60
 
43
61
  `filegrc program-readiness` reports whether management can start a candidate Type 2 period. Add `--summary --json` for compact stage counts and next actions, or omit `--summary` for every readiness item. Use `--require-ready` in automation. The command does not require an audit ID or CPA firm.
44
62
 
45
- `filegrc evidence-test-drafts --preview --json` reports the missing draft tests for external evidence without writing them. Run `filegrc evidence-test-drafts` after confirming applicable controls and authoritative source Systems. When a Step 5 operating record exists, put the fixed artifact in an External Evidence record and link it from that operating record.
63
+ Control implementation includes each selected Control family’s expected evidence, authoritative source Systems, and source-readiness checks. `filegrc evidence-map --json` provides a focused read-only diagnostic for those checks. Fix gaps in the Control and System records. During Step 4, create External Evidence only when a real artifact exists, then link it to the supporting operating record when applicable.
46
64
 
47
65
  `filegrc obligations` shows recurring work and a task-level preview for each Policy Event, including owners, deadlines, and requested proof. `filegrc trigger` adds the event and all of its Action Items to the Work Queue atomically, then prints the created task IDs and deadlines.
48
66
 
49
67
  Long-form Markdown lives beside its JSON record. filegrc derives the Markdown path, so records do not store it.
50
68
 
51
- Headless creates and updates accept either a record or `{ "record": {...}, "content": {...} }`, the same mutation shape used by the web app. Run `filegrc get <id> --mutation` before an update to include JSON and Markdown revision hashes; stale writes are rejected. Use `filegrc content <type> <id>` to read a companion and `--write <file|->` to replace it. `filegrc guide --json` is the compact action and resource index for agents.
69
+ Headless creates and updates require the `{ "record": {...}, "content": {...}, "revision": "...", "contentRevisions": {...} }` mutation envelope used by the web app. Run `filegrc scaffold` for a new mutation or `filegrc get <id> --mutation` before an update; stale record and Markdown writes are rejected. Use `filegrc content <type> <id>` to read a companion and `--write <file|->` to replace it. `filegrc guide --json` is the compact action and resource index for agents.
52
70
 
53
71
  Use `filegrc attach <evidence-id> <source-file>` to copy a fixed evidence file under its record and update `filePaths` without overwriting an existing attachment.
54
72
 
55
73
  Use `filegrc detach <evidence-id> <attachment-name> --yes` for explicit removal. Evidence records with linked local attachments cannot be deleted.
56
74
 
57
- The package requires Node.js 20 or newer. It uses Git for authors, commit timestamps, messages, diffs, and revisions. New workspaces use trunk mode, which fetches and fast-forwards before each browser mutation, validates and commits the saved change, then pushes. Existing settings without `repositoryMode` keep manual browser Git behavior. Agents and terminal users use Git directly; the filegrc CLI does not wrap pull, commit, or push.
75
+ The package requires Node.js 20 or newer. It uses Git for authors, commit timestamps, messages, diffs, and revisions. New workspaces use trunk mode, which fetches and fast-forwards before each browser mutation, validates and commits the saved change, then pushes. Agents and terminal users use Git directly; the filegrc CLI does not wrap pull, commit, or push.
58
76
 
59
77
  The editable server has no authentication and binds to loopback by default. Put it behind trusted authentication before exposing it on a network, or publish the read-only static build.
60
78
 
package/model/index.js CHANGED
@@ -1,9 +1,47 @@
1
1
  import { readFileSync } from "node:fs";
2
2
 
3
- export function loadModel(version = "1") {
3
+ export const ACTIVE_MODEL_VERSION = "3";
4
+ export const SUPPORTED_MODEL_VERSIONS = Object.freeze(["2", ACTIVE_MODEL_VERSION]);
5
+
6
+ export function loadModel(version = ACTIVE_MODEL_VERSION) {
4
7
  const requested = String(version);
5
- if (requested !== "1") throw new Error(`Unsupported data model version "${requested}". Available version: 1`);
6
- return JSON.parse(readFileSync(new URL("./v1.json", import.meta.url), "utf8"));
8
+ if (!SUPPORTED_MODEL_VERSIONS.includes(requested)) {
9
+ const migrationTarget = requested === "1" ? "2" : "3";
10
+ throw new Error(
11
+ `Unsupported data model version "${requested}". This filegrc release supports models v2 and v3. `
12
+ + `Run \`npx filegrc migrate --to-model ${migrationTarget} --preview --json\` from the workspace root.`
13
+ );
14
+ }
15
+ const model = JSON.parse(readFileSync(new URL(`./v${requested}.json`, import.meta.url), "utf8"));
16
+ for (const [type, definition] of Object.entries(model.resources)) {
17
+ for (const [name, field] of Object.entries({ ...model.commonFields, ...definition.fields })) {
18
+ expandRegistryReference(model, field, `${type}.${name}`);
19
+ if (field.relationGroup) {
20
+ const relation = model.relationGroups?.[field.relationGroup];
21
+ if (!Array.isArray(relation) || relation.length === 0) {
22
+ throw new Error(`Model field ${type}.${name} uses unknown relation group "${field.relationGroup}".`);
23
+ }
24
+ field.relation = [...relation];
25
+ }
26
+ }
27
+ }
28
+ for (const [objectType, schema] of Object.entries(model.objectTypes || {})) {
29
+ for (const [name, field] of Object.entries(schema.properties || {})) {
30
+ expandRegistryReference(model, field, `${objectType}.${name}`);
31
+ }
32
+ }
33
+ return model;
34
+ }
35
+
36
+ function expandRegistryReference(model, field, path) {
37
+ if (!field.registry) return;
38
+ const registry = model[field.registry];
39
+ if (!registry || Array.isArray(registry) || typeof registry !== "object") {
40
+ throw new Error(`Model field ${path} uses unknown registry "${field.registry}".`);
41
+ }
42
+ const values = Object.keys(registry);
43
+ if (!values.length) throw new Error(`Model registry "${field.registry}" cannot be empty.`);
44
+ field.values = values;
7
45
  }
8
46
 
9
47
  export function getResourceDefinition(model, type) {
package/model/v1.json CHANGED
@@ -28,27 +28,27 @@
28
28
  ]
29
29
  },
30
30
  "evidenceSourceFamilies": [
31
- {"id":"workforce","title":"Workforce System","sourceKinds":["workforce"],"controlCodes":["HR-01","HR-03","IAM-03"],"testEvidenceKind":"test-export","testPrompt":"Export a workforce-change report from the HR or workforce system containing starters, role changes, and departures.","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."},
32
- {"id":"training-acknowledgement","title":"Training and Acknowledgements","sourceKinds":["training-acknowledgement"],"controlCodes":["GOV-03","HR-01","HR-02"],"testEvidenceKind":"test-export","testPrompt":"Export assignments and completions tied to a specific training or policy revision.","collectionTestRequired":false,"operationRecordTypes":["training","attestation"],"description":"filegrc records training assignments, content revisions, completions, acknowledgements, exceptions, and overdue follow-up during Step 5.","timing":"Set up training and acknowledgement records before assignments begin. Preserve completion proof as work occurs, then reconcile the complete Type 2 population to the workforce population after close."},
33
- {"id":"identity-access","title":"Identity and Access Systems","sourceKinds":["identity-access"],"controlCodes":["IAM-01","IAM-02","IAM-03"],"testEvidenceKind":"test-export","testPrompt":"Export users, roles, privileged access, or authentication settings from the identity provider or an in-scope application.","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."},
34
- {"id":"production-change","title":"Production Change Systems","sourceKinds":["production-change"],"controlCodes":["CHG-01"],"testEvidenceKind":"test-capture","testPrompt":"Capture a change from the source control or deployment system showing review, testing, approval, deployment, and rollback information.","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."},
35
- {"id":"security-monitoring","title":"Security Monitoring Systems","sourceKinds":["security-monitoring"],"controlCodes":["LOG-01","IR-01","IR-02"],"testEvidenceKind":"test-capture","testPrompt":"Capture logging or alert configuration and a delivered test alert from the monitoring system.","description":"Catalog logging and alerting systems. Bring configuration, coverage, alert delivery tests, alerts, investigations, and zero-event proof. filegrc records qualifying incidents and their response during Step 5.","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."},
36
- {"id":"vulnerability-management","title":"Vulnerability Management","sourceKinds":["vulnerability-management"],"controlCodes":["VUL-01","PEN-01"],"testEvidenceKind":"test-export","testPrompt":"Export a result from the vulnerability or dependency scanner showing scope, coverage, findings, and severity.","collectionTestRequired":false,"operationRecordTypes":["vulnerability-scan","penetration-test"],"description":"filegrc records vulnerability scans and penetration tests during Step 5. Put the scanner output or independent report in an External Evidence record and link it from the operating record rather than creating a separate collection test.","timing":"Confirm coverage before the audit period. Preserve scan and remediation evidence when generated and export the complete Type 2 population after close."},
37
- {"id":"endpoint-asset","title":"Endpoint Management Systems","sourceKinds":["endpoint-asset"],"controlCodes":["PHY-01","OPS-01","OPS-02","DATA-01"],"testEvidenceKind":"test-export","testPrompt":"Export devices, security configuration, and compliance status from the endpoint-management system.","description":"Catalog device-management and endpoint-compliance systems. Bring the complete device population, security configuration, compliance status, and exceptions. filegrc records asset ownership, custody, loss, return, and disposal during Step 5.","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."},
38
- {"id":"backup-recovery","title":"Backup and Recovery","sourceKinds":["backup-recovery"],"controlCodes":["BCP-01","BCP-02"],"testEvidenceKind":"test-export","testPrompt":"Export job history from the backup system showing scheduled runs, successes, failures, and follow-up.","collectionTestRequired":false,"operationRecordTypes":["backup-test","exercise"],"description":"filegrc records restoration tests and continuity exercises during Step 5. Put backup-system output in an External Evidence record and link it from the operating record rather than creating a separate collection test.","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."},
39
- {"id":"vendor-management","title":"Vendors","sourceKinds":["vendor-management"],"controlCodes":["VEN-01","VEN-02"],"testEvidenceKind":"test-capture","testPrompt":"Capture a completed vendor review with its contract, assurance report, risk decision, and follow-up.","collectionTestRequired":false,"operationRecordTypes":["vendor-review"],"description":"filegrc records vendor reviews, risk decisions, supporting reports, exceptions, and follow-up during Step 5.","timing":"Identify relevant subservice organizations during scoping. Complete reviews during operation, obtain current assurance reports before fieldwork, and document bridge coverage when a report ends before the report period."},
40
- {"id":"exception-finding","title":"Exceptions and Findings","sourceKinds":["exception-finding"],"controlCodes":["MON-01","EXC-01"],"testEvidenceKind":"test-export","testPrompt":"Export open and closed exceptions or findings with owners, status, dates, and remediation verification.","collectionTestRequired":false,"operationRecordTypes":["exception","finding","action-item"],"description":"filegrc records control exceptions, findings, risk acceptance, remediation, verification, and overdue work during Step 5.","timing":"Record items as they arise. Keep their status and follow-up current, then include the complete period population in fieldwork."},
41
- {"id":"data-handling","title":"Data Protection Configuration","sourceKinds":["data-handling"],"controlCodes":["DATA-02","DATA-03"],"testEvidenceKind":"test-capture","testPrompt":"Capture encryption and retention settings from an in-scope System.","description":"Catalog the systems authoritative for encryption settings and retention rules. Bring current configuration and approved schedules. Preserve completed disposal actions, exceptions, and verification during Step 5.","timing":"Confirm configuration and retention rules before the audit period. Preserve disposal evidence when work occurs and capture configuration near the Type 1 date or across the Type 2 period."},
42
- {"id":"network-security","title":"Network Security Systems","sourceKinds":["network-security"],"controlCodes":["NET-01"],"testEvidenceKind":"test-capture","testPrompt":"Capture current firewall or network-access rules from the network system and confirm that remote and production access paths appear.","description":"Catalog the systems authoritative for network boundaries, firewall rules, and remote access. Bring current configuration, rule reviews, approvals, changes, and exceptions.","timing":"Confirm boundary and remote-access configuration before the audit period. Preserve rule changes as they occur and capture current configuration near the Type 1 date or across the Type 2 period."},
43
- {"id":"governance","title":"Governance","sourceKinds":["governance"],"controlCodes":["GOV-01","GOV-02"],"testEvidenceKind":"test-capture","testPrompt":"Capture one completed oversight review or policy approval with the participants, decisions, dates, and follow-up work.","collectionTestRequired":false,"operationRecordTypes":["policy-review","meeting"],"description":"filegrc records policy approvals, oversight reviews, meetings, decisions, assigned actions, and completion proof in Steps 2 and 5.","timing":"Approve policies before they take effect. Preserve oversight records and decisions when the work occurs."},
44
- {"id":"risk-management","title":"Risk Management","sourceKinds":["risk-management"],"controlCodes":["RSK-01"],"testEvidenceKind":"test-export","testPrompt":"Export the risk register with owners, ratings, treatment decisions, review dates, and open actions.","collectionTestRequired":false,"operationRecordTypes":["risk-assessment","risk"],"description":"filegrc records risk assessments, risks, treatment decisions, reviews, and follow-up during Step 5.","timing":"Complete the initial assessment while operating the program. Preserve risk changes and reviews as they occur, then include the current register in fieldwork."}
31
+ {"id":"workforce","title":"Workforce System","sourceKinds":["workforce"],"controlCodes":["HR-01","HR-03","IAM-03"],"evidenceKind":"export","evidencePrompt":"Export a workforce-change report from the HR or workforce system containing starters, role changes, and departures.","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."},
32
+ {"id":"training-acknowledgement","title":"Training and Acknowledgements","sourceKinds":["training-acknowledgement"],"controlCodes":["GOV-03","HR-01","HR-02"],"evidenceKind":"export","evidencePrompt":"Export assignments and completions tied to a specific training or policy revision.","filegrcManaged":true,"operationRecordTypes":["training","attestation"],"description":"filegrc records training assignments, content revisions, completions, acknowledgements, exceptions, and overdue follow-up during Step 4.","timing":"Set up training and acknowledgement records before assignments begin. Preserve completion proof as work occurs, then reconcile the complete Type 2 population to the workforce population after close."},
33
+ {"id":"identity-access","title":"Identity and Access Systems","sourceKinds":["identity-access"],"controlCodes":["IAM-01","IAM-02","IAM-03"],"evidenceKind":"export","evidencePrompt":"Export users, roles, privileged access, or authentication settings from the identity provider or an in-scope application.","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."},
34
+ {"id":"production-change","title":"Production Change Systems","sourceKinds":["production-change"],"controlCodes":["CHG-01"],"evidenceKind":"capture","evidencePrompt":"Capture a change from the source control or deployment system showing review, testing, approval, deployment, and rollback information.","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."},
35
+ {"id":"security-monitoring","title":"Security Monitoring Systems","sourceKinds":["security-monitoring"],"controlCodes":["LOG-01","IR-01","IR-02"],"evidenceKind":"capture","evidencePrompt":"Capture logging or alert configuration and a delivered test alert from the monitoring system.","description":"Catalog logging and alerting systems. Bring configuration, coverage, alert delivery tests, alerts, investigations, and zero-event proof. filegrc records qualifying incidents and their response during Step 4.","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."},
36
+ {"id":"vulnerability-management","title":"Vulnerability Management","sourceKinds":["vulnerability-management"],"controlCodes":["VUL-01","PEN-01"],"evidenceKind":"export","evidencePrompt":"Export a result from the vulnerability or dependency scanner showing scope, coverage, findings, and severity.","filegrcManaged":true,"operationRecordTypes":["vulnerability-scan","penetration-test"],"description":"filegrc records vulnerability scans and penetration tests during Step 4. Put the scanner output or independent report in an External Evidence record and link it from the operating record when fixed supporting proof is needed.","timing":"Confirm coverage before the audit period. Preserve scan and remediation evidence when generated and export the complete Type 2 population after close."},
37
+ {"id":"endpoint-asset","title":"Endpoint Management Systems","sourceKinds":["endpoint-asset"],"controlCodes":["PHY-01","OPS-01","OPS-02","DATA-01"],"evidenceKind":"export","evidencePrompt":"Export devices, security configuration, and compliance status from the endpoint-management system.","description":"Catalog device-management and endpoint-compliance systems. Bring the complete device population, security configuration, compliance status, and exceptions. filegrc records asset ownership, custody, loss, return, and disposal during Step 4.","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."},
38
+ {"id":"backup-recovery","title":"Backup and Recovery","sourceKinds":["backup-recovery"],"controlCodes":["BCP-01","BCP-02"],"evidenceKind":"export","evidencePrompt":"Export job history from the backup system showing scheduled runs, successes, failures, and follow-up.","filegrcManaged":true,"operationRecordTypes":["backup-test","exercise"],"description":"filegrc records restoration tests and continuity exercises during Step 4. Put backup-system output in an External Evidence record and link it from the operating record when fixed supporting proof is needed.","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."},
39
+ {"id":"vendor-management","title":"Vendors","sourceKinds":["vendor-management"],"controlCodes":["VEN-01","VEN-02"],"evidenceKind":"capture","evidencePrompt":"Capture a completed vendor review with its contract, assurance report, risk decision, and follow-up.","filegrcManaged":true,"operationRecordTypes":["vendor-review"],"description":"filegrc records vendor reviews, risk decisions, supporting reports, exceptions, and follow-up during Step 4.","timing":"Identify relevant subservice organizations during scoping. Complete reviews during operation, obtain current assurance reports before fieldwork, and document bridge coverage when a report ends before the report period."},
40
+ {"id":"exception-finding","title":"Exceptions and Findings","sourceKinds":["exception-finding"],"controlCodes":["MON-01","EXC-01"],"evidenceKind":"export","evidencePrompt":"Export open and closed exceptions or findings with owners, status, dates, and remediation verification.","filegrcManaged":true,"operationRecordTypes":["exception","finding","action-item"],"description":"filegrc records control exceptions, findings, risk acceptance, remediation, verification, and overdue work during Step 4.","timing":"Record items as they arise. Keep their status and follow-up current, then include the complete period population in fieldwork."},
41
+ {"id":"data-handling","title":"Data Protection Configuration","sourceKinds":["data-handling"],"controlCodes":["DATA-02","DATA-03"],"evidenceKind":"capture","evidencePrompt":"Capture encryption and retention settings from an in-scope System.","description":"Catalog the systems authoritative for encryption settings and retention rules. Bring current configuration and approved schedules. Preserve completed disposal actions, exceptions, and verification during Step 4.","timing":"Confirm configuration and retention rules before the audit period. Preserve disposal evidence when work occurs and capture configuration near the Type 1 date or across the Type 2 period."},
42
+ {"id":"network-security","title":"Network Security Systems","sourceKinds":["network-security"],"controlCodes":["NET-01"],"evidenceKind":"capture","evidencePrompt":"Capture current firewall or network-access rules from the network system and confirm that remote and production access paths appear.","description":"Catalog the systems authoritative for network boundaries, firewall rules, and remote access. Bring current configuration, rule reviews, approvals, changes, and exceptions.","timing":"Confirm boundary and remote-access configuration before the audit period. Preserve rule changes as they occur and capture current configuration near the Type 1 date or across the Type 2 period."},
43
+ {"id":"governance","title":"Governance","sourceKinds":["governance"],"controlCodes":["GOV-01","GOV-02"],"evidenceKind":"capture","evidencePrompt":"Capture one completed oversight review or policy approval with the participants, decisions, dates, and follow-up work.","filegrcManaged":true,"operationRecordTypes":["policy-review","meeting"],"description":"filegrc records policy approvals, oversight reviews, meetings, decisions, assigned actions, and completion proof in Steps 2 and 4.","timing":"Approve policies before they take effect. Preserve oversight records and decisions when the work occurs."},
44
+ {"id":"risk-management","title":"Risk Management","sourceKinds":["risk-management"],"controlCodes":["RSK-01"],"evidenceKind":"export","evidencePrompt":"Export the risk register with owners, ratings, treatment decisions, review dates, and open actions.","filegrcManaged":true,"operationRecordTypes":["risk-assessment","risk"],"description":"filegrc records risk assessments, risks, treatment decisions, reviews, and follow-up during Step 4.","timing":"Complete the initial assessment while operating the program. Preserve risk changes and reviews as they occur, then include the current register in fieldwork."}
45
45
  ],
46
46
  "commonFields": {
47
47
  "schemaVersion": {"type":"integer","required":true,"const":1,"label":"Schema version"},
48
48
  "id": {"type":"string","format":"id","required":true,"label":"ID"},
49
49
  "type": {"type":"string","required":true,"label":"Type"},
50
50
  "title": {"type":"string","required":true,"label":"Title","search":true},
51
- "ownerIds": {"type":"array","items":"id","relation":["person","team"],"label":"Owners","filter":true},
51
+ "ownerIds": {"type":"array","items":"id","relation":["person","team","appointment"],"label":"Owners","filter":true},
52
52
  "tags": {"type":"array","items":"string","label":"Tags","filter":true,"search":true},
53
53
  "relatedResourceIds": {"type":"array","items":"id","relation":["*"],"label":"Related resources"},
54
54
  "extensions": {"type":"object","label":"Extensions"}
@@ -125,10 +125,10 @@
125
125
  "pluralTitle": "People",
126
126
  "group": "people-access",
127
127
  "collection": "people",
128
- "description": "People who own, approve, review, or perform program work, or receive access and training. Keep detailed personnel records in the HR system.",
128
+ "description": "People who own, approve, review, or perform program work, or receive access and training. Record each person’s actual organization job title here and keep named program authority in dated Appointments. Keep detailed personnel records in the HR system.",
129
129
  "guidance": {
130
130
  "policyBasis": "The information security policy and employee handbook assign work to named people and require onboarding, training, role-change, and offboarding records.",
131
- "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.",
131
+ "cadence": "Create before assigning work or access, update the job title after organizational changes, review Appointments separately, and mark inactive only after active Appointments are ended or transferred. Training is due within 30 days of starting and annually.",
132
132
  "sourceResourceIds": ["policy-information-security","policy-employee-handbook"],
133
133
  "obligationActivityTypes": ["training","performance-review"]
134
134
  },
@@ -136,15 +136,42 @@
136
136
  "fields": {
137
137
  "status": {"type":"enum","values":["active","inactive","external"],"filter":true},
138
138
  "email": {"type":"string","format":"email","search":true},
139
- "role": {"type":"string","search":true},
139
+ "jobTitle": {"type":"string","label":"Organization job title","search":true},
140
+ "role": {"type":"string","label":"Legacy role","search":true,"legacy":true,"authoritativeFields":["person.jobTitle","appointment.appointmentKind"]},
140
141
  "department": {"type":"string","filter":true},
141
142
  "managerId": {"type":"id","relation":["person"]},
142
143
  "startDate": {"type":"date"},
143
144
  "endDate": {"type":"date"},
144
145
  "employmentType": {"type":"string","filter":true},
145
- "teamIds": {"type":"array","items":"id","relation":["team"]}
146
+ "organization": {"type":"string","search":true},
147
+ "teamIds": {"type":"array","items":"id","relation":["team"],"label":"Legacy teams","legacy":true,"authoritativeFields":["team.memberIds","team.chairIds"]}
146
148
  },
147
- "listFields": ["title","status","role","department"]
149
+ "listFields": ["title","status","jobTitle","department"]
150
+ },
151
+ "appointment": {
152
+ "title": "Appointment",
153
+ "pluralTitle": "Appointments",
154
+ "group": "governance",
155
+ "collection": "appointments",
156
+ "description": "One person’s dated appointment to a named organizational or program responsibility, such as CISO, DPO, Policy Owner, or team chair. Use the Person job title for the person’s ordinary organizational position.",
157
+ "guidance": {
158
+ "policyBasis": "The information security policy assigns named authority and accountability, while workforce procedures require responsibility changes and departures to be reviewed and transferred.",
159
+ "cadence": "Create when management assigns a named responsibility. End the Appointment and create a new one when the holder changes. Reassign every linked responsibility before a holder departs.",
160
+ "sourceResourceIds": ["policy-information-security","policy-employee-handbook"]
161
+ },
162
+ "required": ["status","appointmentKind","holderId","scopeResourceIds"],
163
+ "fields": {
164
+ "status": {"type":"enum","values":["planned","active","ended"],"filter":true},
165
+ "appointmentKind": {"type":"string","format":"id","label":"Appointment kind","filter":true,"search":true},
166
+ "holderId": {"type":"id","relation":["person"],"label":"Holder"},
167
+ "scopeResourceIds": {"type":"array","items":"id","relation":["*"],"label":"Scope"},
168
+ "startsOn": {"type":"date","requiredWhen":{"status":["active","ended"]}},
169
+ "endsOn": {"type":"date","requiredWhen":{"status":"ended"}},
170
+ "appointedByIds": {"type":"array","items":"id","relation":["person","team"],"label":"Appointed by"},
171
+ "responsibilities": {"type":"string","search":true},
172
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"]}
173
+ },
174
+ "listFields": ["title","status","appointmentKind","holderId","startsOn","endsOn"]
148
175
  },
149
176
  "service-account": {
150
177
  "title": "Service account",
@@ -190,11 +217,12 @@
190
217
  "status": {"type":"enum","values":["active","inactive"],"filter":true},
191
218
  "purpose": {"type":"string","search":true},
192
219
  "memberIds": {"type":"array","items":"id","relation":["person"]},
193
- "chairIds": {"type":"array","items":"id","relation":["person"]},
220
+ "chairIds": {"type":"array","items":"id","relation":["person","appointment"]},
194
221
  "charterDocumentId": {"type":"id","relation":["document"]},
195
222
  "meetingCadence": {"type":"object"}
196
223
  },
197
- "listFields": ["title","status","purpose"]
224
+ "listFields": ["title","status","purpose"],
225
+ "formFields": ["chairIds"]
198
226
  },
199
227
  "system": {
200
228
  "title": "System",
@@ -202,10 +230,10 @@
202
230
  "pluralTitle": "Systems",
203
231
  "group": "systems-vendors",
204
232
  "collection": "systems",
205
- "description": "Applications, services, and platforms that support the scoped service, operate controls, or produce evidence. Record vendor-provided software as a System and link it to its Vendor.",
233
+ "description": "Applications, services, and platforms that support the scoped service, operate controls, or produce evidence. Record vendor-provided software as a System and link it to its Vendor. Before implementing a Control that relies on a System for evidence, add the System’s evidence source roles and access owners and document repeatable retrieval instructions in Record Markdown.",
206
234
  "guidance": {
207
235
  "policyBasis": "The information security, data handling, and continuity policies require management to know which Systems are in scope, who owns them, what data they handle, how critical they are, and where evidence comes from.",
208
- "cadence": "Complete the in-scope inventory before policy approval and control implementation. Review it at least annually and after material architecture, data, vendor, service, recovery, or evidence-source changes. Test report access and extraction before the candidate period begins.",
236
+ "cadence": "Complete the in-scope inventory before policy approval and control implementation. For each authoritative evidence source, assign its source roles and current access owners, document the exact report, filters, date range, timezone, export format, and reconciliation steps in Record Markdown, and test retrieval before implementing the linked Controls. Review the inventory at least annually and after material architecture, data, vendor, service, recovery, or evidence-source changes.",
209
237
  "sourceResourceIds": ["policy-information-security","policy-data-protection-handling","document-business-continuity-disaster-recovery"],
210
238
  "obligationActivityTypes": ["inventory-review"]
211
239
  },
@@ -222,13 +250,14 @@
222
250
  "internetExposed": {"type":"boolean","filter":true},
223
251
  "inScope": {"type":"boolean","filter":true},
224
252
  "parentSystemId": {"type":"id","relation":["system"]},
225
- "commitmentIds": {"type":"array","items":"id","relation":["commitment"]},
253
+ "commitmentIds": {"type":"array","items":"id","relation":["commitment"],"label":"Legacy commitments","legacy":true,"authoritativeFields":["commitment.systemIds"]},
226
254
  "subserviceVendorIds": {"type":"array","items":"id","relation":["vendor"]},
227
255
  "evidenceSourceKinds": {"type":"array","items":"string","label":"Evidence source roles","filter":true,"search":true},
228
- "evidenceOwnerIds": {"type":"array","items":"id","relation":["person","team"],"label":"Evidence access owners"},
256
+ "evidenceOwnerIds": {"type":"array","items":"id","relation":["person","team","appointment"],"label":"Evidence access owners"},
229
257
  "continuityObjectives": {"type":"object"}
230
258
  },
231
- "listFields": ["title","status","criticality","environment","inScope"]
259
+ "listFields": ["title","status","criticality","environment","inScope","evidenceSourceKinds","evidenceOwnerIds"],
260
+ "formFields": ["vendorId","evidenceSourceKinds","evidenceOwnerIds"]
232
261
  },
233
262
  "asset": {
234
263
  "title": "Asset",
@@ -248,7 +277,7 @@
248
277
  "status": {"type":"enum","values":["active","lost","retired","disposed"],"filter":true},
249
278
  "assetKind": {"type":"string","filter":true},
250
279
  "criticality": {"type":"enum","values":["low","medium","high","critical"],"filter":true},
251
- "custodianIds": {"type":"array","items":"id","relation":["person","team"]},
280
+ "custodianIds": {"type":"array","items":"id","relation":["person","team","appointment"]},
252
281
  "businessPurpose": {"type":"string","search":true},
253
282
  "serialOrAssetTag": {"type":"string","search":true},
254
283
  "systemIds": {"type":"array","items":"id","relation":["system"]},
@@ -302,10 +331,10 @@
302
331
  "group": "evidence",
303
332
  "collection": "evidence",
304
333
  "recordPath": "{id}/evidence.json",
305
- "description": "External Evidence holds exports, reports, screenshots, signed files, and approved external references collected from other Systems. Step 5 records created in filegrc do not need a separate record here. Step 6 reviews and packages both evidence paths for the CPA firm.",
334
+ "description": "External Evidence holds exports, reports, screenshots, signed files, and approved external references collected from other Systems. Step 4 records created in filegrc do not need a separate record here. Step 5 reviews and packages both evidence paths for the CPA firm.",
306
335
  "guidance": {
307
336
  "policyBasis": "The information security and data handling policies require retained proof from authoritative Systems when filegrc's own operating records do not contain the full result.",
308
- "cadence": "Before the candidate period begins, test each selected control family that relies on evidence from outside filegrc. Once operation starts, collect external evidence whenever the control runs, keep filegrc operating records current, verify evidence before audit use, cover the stated period, and retain it according to classification and record rules.",
337
+ "cadence": "Create External Evidence only when a real export, report, screenshot, signed file, or approved external reference exists. Select its authoritative source System, link the Controls and operating record it supports, record collection facts, verify it before audit use, cover the stated date or period, and retain it according to classification and record rules.",
309
338
  "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"]
310
339
  },
311
340
  "required": ["status","evidenceKind"],
@@ -315,8 +344,8 @@
315
344
  "fields": {
316
345
  "status": {"type":"enum","values":["draft","collected","verified","expired","withdrawn"],"filter":true},
317
346
  "evidenceKind": {"type":"string","filter":true},
318
- "collectionTestFamilyId": {"type":"string","label":"Collection test family","filter":true},
319
- "collectionTestPrompt": {"type":"string","label":"What to collect","search":true},
347
+ "collectionTestFamilyId": {"type":"string","label":"Legacy collection family","filter":true},
348
+ "collectionTestPrompt": {"type":"string","label":"Legacy collection prompt","search":true},
320
349
  "source": {"type":"string","search":true,"requiredWhen":{"status":["collected","verified","expired","withdrawn"]}},
321
350
  "collectedOn": {"type":"date","requiredWhen":{"status":["collected","verified","expired","withdrawn"]}},
322
351
  "classification": {"type":"string","filter":true,"requiredWhen":{"status":["collected","verified","expired","withdrawn"]}},
@@ -330,7 +359,7 @@
330
359
  "populationCount": {"type":"integer","minimum":0,"label":"Population count","requiredWhen":{"evidenceKind":"population-export"}},
331
360
  "completenessValidation": {"type":"string","label":"Completeness validation","search":true,"requiredWhen":{"evidenceKind":"population-export"}},
332
361
  "accuracyValidation": {"type":"string","label":"Accuracy validation","search":true,"requiredWhen":{"evidenceKind":"population-export"}},
333
- "sourceSystemId": {"type":"id","relation":["system"],"label":"Source system","requiredWhen":{"evidenceKind":["population-export","test-export","test-capture"],"status":["collected","verified","expired","withdrawn"]}},
362
+ "sourceSystemId": {"type":"id","relation":["system"],"label":"Source system","showWhenInactive":true,"requiredWhen":{"evidenceKind":["population-export","test-export","test-capture"],"status":["collected","verified","expired","withdrawn"]}},
334
363
  "systemIds": {"type":"array","items":"id","relation":["system"]},
335
364
  "controlIds": {"type":"array","items":"id","relation":["control"]},
336
365
  "auditIds": {"type":"array","items":"id","relation":["audit"]},
@@ -343,6 +372,7 @@
343
372
  "capture": {"type":"object"}
344
373
  },
345
374
  "listFields": ["title","status","evidenceKind","collectedOn","classification"],
375
+ "formFields": ["auditIds"],
346
376
  "markdown": {
347
377
  "content": {"label":"Evidence","primary":true,"required":false}
348
378
  }
@@ -442,7 +472,7 @@
442
472
  "description": {"type":"string","search":true},
443
473
  "parentRequirementId": {"type":"id","relation":["requirement"]},
444
474
  "applicabilityRationale": {"type":"string"},
445
- "controlIds": {"type":"array","items":"id","relation":["control"]}
475
+ "controlIds": {"type":"array","items":"id","relation":["control"],"label":"Legacy controls","legacy":true,"authoritativeFields":["control.requirementIds"]}
446
476
  },
447
477
  "listFields": ["description","applicability","frameworkId"]
448
478
  },
@@ -470,7 +500,8 @@
470
500
  "effectiveOn": {"type":"date","requiredWhen":{"status":"active"}},
471
501
  "supersedesId": {"type":"id","relation":["commitment"]}
472
502
  },
473
- "listFields": ["title","status","commitmentKind","customerFacing"]
503
+ "listFields": ["title","status","commitmentKind","customerFacing"],
504
+ "formFields": ["systemIds","controlIds"]
474
505
  },
475
506
  "complementary-control": {
476
507
  "title": "Complementary control",
@@ -503,10 +534,10 @@
503
534
  "pluralTitle": "Controls",
504
535
  "group": "program",
505
536
  "collection": "controls",
506
- "description": "Management’s actual safeguards and procedures, mapped to Policies, Requirements, Systems, and evidence sources. The Work Queue schedules recurring operation where configured; Evidence shows that operation occurred.",
537
+ "description": "Management’s actual safeguards and procedures, mapped to Policies, Requirements, Systems, and authoritative evidence sources. The Work Queue schedules recurring operation where configured; Evidence shows that operation occurred. A Control is ready for implementation only when each source System is active, has the required evidence role and current access owners, and includes repeatable retrieval instructions.",
507
538
  "guidance": {
508
539
  "policyBasis": "Controls translate approved Policies and applicable Requirements into owned procedures that management can operate and prove. Policy text alone does not show implementation.",
509
- "cadence": "Before marking a control implemented, record its owner, actual procedure in Record Markdown, system scope, cadence, authoritative evidence sources, and implementation date. filegrc-managed controls also require enabled schedules with effective governing policies. Marking the control implemented starts eligible schedules.",
540
+ "cadence": "Before marking a Control implemented, record its owner, actual procedure in Record Markdown, system scope, cadence, authoritative evidence source Systems, and implementation date. Confirm each source System is active, has the evidence role required by the Control family and current access owners, and includes repeatable retrieval instructions in Record Markdown. filegrc-managed Controls also require enabled schedules with effective governing policies. Marking the Control implemented starts eligible schedules.",
510
541
  "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"],
511
542
  "obligationActivityTypes": ["risk-assessment","policy-review"]
512
543
  },
@@ -525,13 +556,14 @@
525
556
  "frequency": {"type":"string","filter":true},
526
557
  "systemIds": {"type":"array","items":"id","relation":["system"],"requiredWhen":{"status":"implemented"}},
527
558
  "evidenceSourceIds": {"type":"array","items":"id","relation":["system"],"label":"Authoritative evidence sources","requiredWhen":{"status":"implemented"}},
528
- "commitmentIds": {"type":"array","items":"id","relation":["commitment"]},
559
+ "commitmentIds": {"type":"array","items":"id","relation":["commitment"],"label":"Legacy commitments","legacy":true,"authoritativeFields":["commitment.controlIds"]},
529
560
  "policyIds": {"type":"array","items":"id","relation":["policy"]},
530
- "riskIds": {"type":"array","items":"id","relation":["risk"]},
561
+ "riskIds": {"type":"array","items":"id","relation":["risk"],"label":"Legacy risks","legacy":true,"authoritativeFields":["risk.controlIds"]},
531
562
  "effectiveOn": {"type":"date","requiredWhen":{"status":"implemented"}},
532
563
  "retiredOn": {"type":"date"}
533
564
  },
534
- "listFields": ["code","title","status","controlType","operationMode","frequency"]
565
+ "listFields": ["code","title","status","controlType","operationMode","frequency","evidenceSourceIds"],
566
+ "formFields": ["policyIds"]
535
567
  },
536
568
  "control-test": {
537
569
  "title": "Control test",
@@ -575,7 +607,8 @@
575
607
  "requiredWhen": {"status":"not-performed"}
576
608
  }
577
609
  },
578
- "listFields": ["title","status","controlId","performedBy","outcome","completedOn"]
610
+ "listFields": ["title","status","controlId","performedBy","outcome","completedOn"],
611
+ "formFields": ["auditId"]
579
612
  },
580
613
  "finding": {
581
614
  "title": "Finding",
@@ -647,7 +680,7 @@
647
680
  "required": ["status","assigneeIds","sourceResourceId"],
648
681
  "fields": {
649
682
  "status": {"type":"enum","values":["open","in-progress","blocked","done","canceled"],"filter":true},
650
- "assigneeIds": {"type":"array","items":"id","relation":["person","team"]},
683
+ "assigneeIds": {"type":"array","items":"id","relation":["person","team","appointment"]},
651
684
  "sourceResourceId": {"type":"id","relation":["*"]},
652
685
  "description": {"type":"string","search":true},
653
686
  "priority": {"type":"rating","filter":true},
@@ -696,7 +729,7 @@
696
729
  "parentPolicyId": {"type":"id","relation":["policy"]},
697
730
  "relatedPolicyIds": {"type":"array","items":"id","relation":["policy"]},
698
731
  "relatedDocumentIds": {"type":"array","items":"id","relation":["document"]},
699
- "controlIds": {"type":"array","items":"id","relation":["control"]},
732
+ "controlIds": {"type":"array","items":"id","relation":["control"],"label":"Legacy controls","legacy":true,"authoritativeFields":["control.policyIds"]},
700
733
  "requirementIds": {"type":"array","items":"id","relation":["requirement"]},
701
734
  "audience": {"type":"array","items":"string","filter":true},
702
735
  "acknowledgementRequired": {"type":"boolean","filter":true}
@@ -865,7 +898,8 @@
865
898
  "requirementIds": {"type":"array","items":"id","relation":["requirement"]},
866
899
  "reviewCadence": {"type":"object"}
867
900
  },
868
- "listFields": ["title","status","response","inherentRating","residualRating"]
901
+ "listFields": ["title","status","response","inherentRating","residualRating"],
902
+ "formFields": ["controlIds"]
869
903
  },
870
904
  "risk-assessment": {
871
905
  "title": "Risk assessment",
@@ -923,7 +957,7 @@
923
957
  "criticality": {"type":"enum","values":["low","medium","high","critical"],"filter":true},
924
958
  "description": {"type":"string","search":true},
925
959
  "service": {"type":"string","search":true},
926
- "systemIds": {"type":"array","items":"id","relation":["system"]},
960
+ "systemIds": {"type":"array","items":"id","relation":["system"],"label":"Legacy systems","legacy":true,"authoritativeFields":["system.vendorId"]},
927
961
  "dataClassification": {"type":"string","filter":true},
928
962
  "dataTypes": {"type":"array","items":"string","search":true},
929
963
  "subprocessor": {"type":"boolean","filter":true},
@@ -1300,10 +1334,10 @@
1300
1334
  "complementaryControlsConclusion": {"type":"enum","values":["identified","not-applicable"],"label":"Complementary controls conclusion"},
1301
1335
  "subserviceVendorIds": {"type":"array","items":"id","relation":["vendor"]},
1302
1336
  "subserviceMethod": {"type":"enum","values":["carve-out","inclusive","not-applicable"]},
1303
- "controlTestIds": {"type":"array","items":"id","relation":["control-test"]},
1337
+ "controlTestIds": {"type":"array","items":"id","relation":["control-test"],"label":"Legacy control tests","legacy":true,"authoritativeFields":["control-test.auditId"]},
1304
1338
  "opinion": {"type":"enum","values":["unmodified","qualified","adverse","disclaimer","not-issued"],"filter":true},
1305
1339
  "opinionDate": {"type":"date"},
1306
- "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
1340
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"],"label":"Legacy evidence","legacy":true,"authoritativeFields":["evidence.auditIds"]},
1307
1341
  "reportEvidenceId": {"type":"id","relation":["evidence"]},
1308
1342
  "managementResponseDocumentId": {"type":"id","relation":["document"]},
1309
1343
  "supplementalDocumentIds": {"type":"array","items":"id","relation":["document"]}