filegrc 0.3.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,37 @@ 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
- `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.
37
+ ## Upgrade a model v1 workspace
38
+
39
+ The normal runtime uses data model v2. A model v1 workspace must be migrated before other commands can change it. Start with a read-only preview:
40
+
41
+ ```sh
42
+ npx filegrc migrate --to-model 2 --preview --json
43
+ ```
44
+
45
+ Resolve every item in `missing`, `conflicts`, and `manualActions`. Then rerun the same command with `--yes`. The migration writes one atomic batch, validates model v2, changes no Git history, and is safe to rerun. The [model v2 upgrade guide](https://github.com/Sunpeak-AI/filegrc/blob/main/docs/upgrading-to-model-v2.md) lists every field mapping and review step.
46
+
47
+ `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
48
 
39
49
  `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
50
 
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.
51
+ `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
52
 
43
53
  `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
54
 
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.
55
+ 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
56
 
47
57
  `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
58
 
49
59
  Long-form Markdown lives beside its JSON record. filegrc derives the Markdown path, so records do not store it.
50
60
 
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.
61
+ 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
62
 
53
63
  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
64
 
55
65
  Use `filegrc detach <evidence-id> <attachment-name> --yes` for explicit removal. Evidence records with linked local attachments cannot be deleted.
56
66
 
57
- The package requires Node.js 20 or newer. It uses Git for authors, commit timestamps, messages, diffs, and revisions. Browser commits are explicit. Without a remote they remain local; with a remote the browser commits and pushes together. Browser pulls use rebase. Agents and terminal users use Git directly; the filegrc CLI does not wrap pull, commit, or push.
67
+ 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
68
 
59
69
  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
70
 
package/model/index.js CHANGED
@@ -1,9 +1,43 @@
1
1
  import { readFileSync } from "node:fs";
2
2
 
3
- export function loadModel(version = "1") {
3
+ export function loadModel(version = "2") {
4
4
  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"));
5
+ if (requested !== "2") {
6
+ throw new Error(
7
+ `Unsupported data model version "${requested}". This filegrc release uses model v2. `
8
+ + "Run `npx filegrc migrate --to-model 2 --preview --json` from the workspace root."
9
+ );
10
+ }
11
+ const model = JSON.parse(readFileSync(new URL("./v2.json", import.meta.url), "utf8"));
12
+ for (const [type, definition] of Object.entries(model.resources)) {
13
+ for (const [name, field] of Object.entries({ ...model.commonFields, ...definition.fields })) {
14
+ expandRegistryReference(model, field, `${type}.${name}`);
15
+ if (field.relationGroup) {
16
+ const relation = model.relationGroups?.[field.relationGroup];
17
+ if (!Array.isArray(relation) || relation.length === 0) {
18
+ throw new Error(`Model field ${type}.${name} uses unknown relation group "${field.relationGroup}".`);
19
+ }
20
+ field.relation = [...relation];
21
+ }
22
+ }
23
+ }
24
+ for (const [objectType, schema] of Object.entries(model.objectTypes || {})) {
25
+ for (const [name, field] of Object.entries(schema.properties || {})) {
26
+ expandRegistryReference(model, field, `${objectType}.${name}`);
27
+ }
28
+ }
29
+ return model;
30
+ }
31
+
32
+ function expandRegistryReference(model, field, path) {
33
+ if (!field.registry) return;
34
+ const registry = model[field.registry];
35
+ if (!registry || Array.isArray(registry) || typeof registry !== "object") {
36
+ throw new Error(`Model field ${path} uses unknown registry "${field.registry}".`);
37
+ }
38
+ const values = Object.keys(registry);
39
+ if (!values.length) throw new Error(`Model registry "${field.registry}" cannot be empty.`);
40
+ field.values = values;
7
41
  }
8
42
 
9
43
  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"}
@@ -104,17 +104,20 @@
104
104
  "pluralTitle": "Renderer settings",
105
105
  "group": "repository",
106
106
  "singleton": "renderer.json",
107
- "description": "Optional local interface settings, including onboarding visibility and manually completed Step pages. Renderer settings are not required for SOC 2 and do not change compliance records.",
107
+ "description": "Optional local interface and browser repository settings, including onboarding visibility, manually completed Step pages, and authoritative-branch synchronization. Renderer settings are not required for SOC 2 and do not change compliance records.",
108
108
  "guidance": {
109
- "policyBasis": "Renderer settings are a filegrc convenience, not a SOC 2 requirement, control, audit record, or substitute for evidence.",
110
- "cadence": "Change it when the team wants to rerun or suppress an optional renderer workflow, then review and commit the resulting diff."
109
+ "policyBasis": "Renderer settings are a filegrc convenience, not a SOC 2 requirement, control, audit record, or substitute for evidence. Record lifecycle status represents approval; Git branches do not.",
110
+ "cadence": "Change it when the team wants to rerun or suppress an optional renderer workflow or change repository synchronization. Existing workspaces without repositoryMode keep manual browser Git behavior."
111
111
  },
112
112
  "required": ["showOnboarding"],
113
113
  "fields": {
114
114
  "showOnboarding": {"type":"boolean","label":"Show onboarding"},
115
- "completedStagePageIds": {"type":"array","items":"string","label":"Manually completed program pages"}
115
+ "completedStagePageIds": {"type":"array","items":"string","label":"Manually completed program pages"},
116
+ "repositoryMode": {"type":"enum","values":["trunk","manual"],"label":"Repository mode"},
117
+ "authoritativeBranch": {"type":"string","format":"git-name","label":"Authoritative branch (defaults to main)"},
118
+ "repositoryRemote": {"type":"string","format":"git-name","label":"Repository remote (defaults to origin)"}
116
119
  },
117
- "listFields": ["title","showOnboarding","completedStagePageIds"]
120
+ "listFields": ["title","showOnboarding","repositoryMode","authoritativeBranch","repositoryRemote","completedStagePageIds"]
118
121
  },
119
122
  "person": {
120
123
  "title": "Person",
@@ -122,10 +125,10 @@
122
125
  "pluralTitle": "People",
123
126
  "group": "people-access",
124
127
  "collection": "people",
125
- "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.",
126
129
  "guidance": {
127
130
  "policyBasis": "The information security policy and employee handbook assign work to named people and require onboarding, training, role-change, and offboarding records.",
128
- "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.",
129
132
  "sourceResourceIds": ["policy-information-security","policy-employee-handbook"],
130
133
  "obligationActivityTypes": ["training","performance-review"]
131
134
  },
@@ -133,15 +136,42 @@
133
136
  "fields": {
134
137
  "status": {"type":"enum","values":["active","inactive","external"],"filter":true},
135
138
  "email": {"type":"string","format":"email","search":true},
136
- "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"]},
137
141
  "department": {"type":"string","filter":true},
138
142
  "managerId": {"type":"id","relation":["person"]},
139
143
  "startDate": {"type":"date"},
140
144
  "endDate": {"type":"date"},
141
145
  "employmentType": {"type":"string","filter":true},
142
- "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"]}
143
148
  },
144
- "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"]
145
175
  },
146
176
  "service-account": {
147
177
  "title": "Service account",
@@ -187,11 +217,12 @@
187
217
  "status": {"type":"enum","values":["active","inactive"],"filter":true},
188
218
  "purpose": {"type":"string","search":true},
189
219
  "memberIds": {"type":"array","items":"id","relation":["person"]},
190
- "chairIds": {"type":"array","items":"id","relation":["person"]},
220
+ "chairIds": {"type":"array","items":"id","relation":["person","appointment"]},
191
221
  "charterDocumentId": {"type":"id","relation":["document"]},
192
222
  "meetingCadence": {"type":"object"}
193
223
  },
194
- "listFields": ["title","status","purpose"]
224
+ "listFields": ["title","status","purpose"],
225
+ "formFields": ["chairIds"]
195
226
  },
196
227
  "system": {
197
228
  "title": "System",
@@ -199,10 +230,10 @@
199
230
  "pluralTitle": "Systems",
200
231
  "group": "systems-vendors",
201
232
  "collection": "systems",
202
- "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.",
203
234
  "guidance": {
204
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.",
205
- "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.",
206
237
  "sourceResourceIds": ["policy-information-security","policy-data-protection-handling","document-business-continuity-disaster-recovery"],
207
238
  "obligationActivityTypes": ["inventory-review"]
208
239
  },
@@ -219,13 +250,14 @@
219
250
  "internetExposed": {"type":"boolean","filter":true},
220
251
  "inScope": {"type":"boolean","filter":true},
221
252
  "parentSystemId": {"type":"id","relation":["system"]},
222
- "commitmentIds": {"type":"array","items":"id","relation":["commitment"]},
253
+ "commitmentIds": {"type":"array","items":"id","relation":["commitment"],"label":"Legacy commitments","legacy":true,"authoritativeFields":["commitment.systemIds"]},
223
254
  "subserviceVendorIds": {"type":"array","items":"id","relation":["vendor"]},
224
255
  "evidenceSourceKinds": {"type":"array","items":"string","label":"Evidence source roles","filter":true,"search":true},
225
- "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"},
226
257
  "continuityObjectives": {"type":"object"}
227
258
  },
228
- "listFields": ["title","status","criticality","environment","inScope"]
259
+ "listFields": ["title","status","criticality","environment","inScope","evidenceSourceKinds","evidenceOwnerIds"],
260
+ "formFields": ["vendorId","evidenceSourceKinds","evidenceOwnerIds"]
229
261
  },
230
262
  "asset": {
231
263
  "title": "Asset",
@@ -245,7 +277,7 @@
245
277
  "status": {"type":"enum","values":["active","lost","retired","disposed"],"filter":true},
246
278
  "assetKind": {"type":"string","filter":true},
247
279
  "criticality": {"type":"enum","values":["low","medium","high","critical"],"filter":true},
248
- "custodianIds": {"type":"array","items":"id","relation":["person","team"]},
280
+ "custodianIds": {"type":"array","items":"id","relation":["person","team","appointment"]},
249
281
  "businessPurpose": {"type":"string","search":true},
250
282
  "serialOrAssetTag": {"type":"string","search":true},
251
283
  "systemIds": {"type":"array","items":"id","relation":["system"]},
@@ -299,10 +331,10 @@
299
331
  "group": "evidence",
300
332
  "collection": "evidence",
301
333
  "recordPath": "{id}/evidence.json",
302
- "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.",
303
335
  "guidance": {
304
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.",
305
- "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.",
306
338
  "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"]
307
339
  },
308
340
  "required": ["status","evidenceKind"],
@@ -312,8 +344,8 @@
312
344
  "fields": {
313
345
  "status": {"type":"enum","values":["draft","collected","verified","expired","withdrawn"],"filter":true},
314
346
  "evidenceKind": {"type":"string","filter":true},
315
- "collectionTestFamilyId": {"type":"string","label":"Collection test family","filter":true},
316
- "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},
317
349
  "source": {"type":"string","search":true,"requiredWhen":{"status":["collected","verified","expired","withdrawn"]}},
318
350
  "collectedOn": {"type":"date","requiredWhen":{"status":["collected","verified","expired","withdrawn"]}},
319
351
  "classification": {"type":"string","filter":true,"requiredWhen":{"status":["collected","verified","expired","withdrawn"]}},
@@ -327,7 +359,7 @@
327
359
  "populationCount": {"type":"integer","minimum":0,"label":"Population count","requiredWhen":{"evidenceKind":"population-export"}},
328
360
  "completenessValidation": {"type":"string","label":"Completeness validation","search":true,"requiredWhen":{"evidenceKind":"population-export"}},
329
361
  "accuracyValidation": {"type":"string","label":"Accuracy validation","search":true,"requiredWhen":{"evidenceKind":"population-export"}},
330
- "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"]}},
331
363
  "systemIds": {"type":"array","items":"id","relation":["system"]},
332
364
  "controlIds": {"type":"array","items":"id","relation":["control"]},
333
365
  "auditIds": {"type":"array","items":"id","relation":["audit"]},
@@ -340,6 +372,7 @@
340
372
  "capture": {"type":"object"}
341
373
  },
342
374
  "listFields": ["title","status","evidenceKind","collectedOn","classification"],
375
+ "formFields": ["auditIds"],
343
376
  "markdown": {
344
377
  "content": {"label":"Evidence","primary":true,"required":false}
345
378
  }
@@ -439,7 +472,7 @@
439
472
  "description": {"type":"string","search":true},
440
473
  "parentRequirementId": {"type":"id","relation":["requirement"]},
441
474
  "applicabilityRationale": {"type":"string"},
442
- "controlIds": {"type":"array","items":"id","relation":["control"]}
475
+ "controlIds": {"type":"array","items":"id","relation":["control"],"label":"Legacy controls","legacy":true,"authoritativeFields":["control.requirementIds"]}
443
476
  },
444
477
  "listFields": ["description","applicability","frameworkId"]
445
478
  },
@@ -467,7 +500,8 @@
467
500
  "effectiveOn": {"type":"date","requiredWhen":{"status":"active"}},
468
501
  "supersedesId": {"type":"id","relation":["commitment"]}
469
502
  },
470
- "listFields": ["title","status","commitmentKind","customerFacing"]
503
+ "listFields": ["title","status","commitmentKind","customerFacing"],
504
+ "formFields": ["systemIds","controlIds"]
471
505
  },
472
506
  "complementary-control": {
473
507
  "title": "Complementary control",
@@ -500,10 +534,10 @@
500
534
  "pluralTitle": "Controls",
501
535
  "group": "program",
502
536
  "collection": "controls",
503
- "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.",
504
538
  "guidance": {
505
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.",
506
- "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.",
507
541
  "sourceResourceIds": ["policy-information-security","policy-data-protection-handling"],
508
542
  "obligationActivityTypes": ["risk-assessment","policy-review"]
509
543
  },
@@ -522,13 +556,14 @@
522
556
  "frequency": {"type":"string","filter":true},
523
557
  "systemIds": {"type":"array","items":"id","relation":["system"],"requiredWhen":{"status":"implemented"}},
524
558
  "evidenceSourceIds": {"type":"array","items":"id","relation":["system"],"label":"Authoritative evidence sources","requiredWhen":{"status":"implemented"}},
525
- "commitmentIds": {"type":"array","items":"id","relation":["commitment"]},
559
+ "commitmentIds": {"type":"array","items":"id","relation":["commitment"],"label":"Legacy commitments","legacy":true,"authoritativeFields":["commitment.controlIds"]},
526
560
  "policyIds": {"type":"array","items":"id","relation":["policy"]},
527
- "riskIds": {"type":"array","items":"id","relation":["risk"]},
561
+ "riskIds": {"type":"array","items":"id","relation":["risk"],"label":"Legacy risks","legacy":true,"authoritativeFields":["risk.controlIds"]},
528
562
  "effectiveOn": {"type":"date","requiredWhen":{"status":"implemented"}},
529
563
  "retiredOn": {"type":"date"}
530
564
  },
531
- "listFields": ["code","title","status","controlType","operationMode","frequency"]
565
+ "listFields": ["code","title","status","controlType","operationMode","frequency","evidenceSourceIds"],
566
+ "formFields": ["policyIds"]
532
567
  },
533
568
  "control-test": {
534
569
  "title": "Control test",
@@ -572,7 +607,8 @@
572
607
  "requiredWhen": {"status":"not-performed"}
573
608
  }
574
609
  },
575
- "listFields": ["title","status","controlId","performedBy","outcome","completedOn"]
610
+ "listFields": ["title","status","controlId","performedBy","outcome","completedOn"],
611
+ "formFields": ["auditId"]
576
612
  },
577
613
  "finding": {
578
614
  "title": "Finding",
@@ -644,7 +680,7 @@
644
680
  "required": ["status","assigneeIds","sourceResourceId"],
645
681
  "fields": {
646
682
  "status": {"type":"enum","values":["open","in-progress","blocked","done","canceled"],"filter":true},
647
- "assigneeIds": {"type":"array","items":"id","relation":["person","team"]},
683
+ "assigneeIds": {"type":"array","items":"id","relation":["person","team","appointment"]},
648
684
  "sourceResourceId": {"type":"id","relation":["*"]},
649
685
  "description": {"type":"string","search":true},
650
686
  "priority": {"type":"rating","filter":true},
@@ -693,7 +729,7 @@
693
729
  "parentPolicyId": {"type":"id","relation":["policy"]},
694
730
  "relatedPolicyIds": {"type":"array","items":"id","relation":["policy"]},
695
731
  "relatedDocumentIds": {"type":"array","items":"id","relation":["document"]},
696
- "controlIds": {"type":"array","items":"id","relation":["control"]},
732
+ "controlIds": {"type":"array","items":"id","relation":["control"],"label":"Legacy controls","legacy":true,"authoritativeFields":["control.policyIds"]},
697
733
  "requirementIds": {"type":"array","items":"id","relation":["requirement"]},
698
734
  "audience": {"type":"array","items":"string","filter":true},
699
735
  "acknowledgementRequired": {"type":"boolean","filter":true}
@@ -862,7 +898,8 @@
862
898
  "requirementIds": {"type":"array","items":"id","relation":["requirement"]},
863
899
  "reviewCadence": {"type":"object"}
864
900
  },
865
- "listFields": ["title","status","response","inherentRating","residualRating"]
901
+ "listFields": ["title","status","response","inherentRating","residualRating"],
902
+ "formFields": ["controlIds"]
866
903
  },
867
904
  "risk-assessment": {
868
905
  "title": "Risk assessment",
@@ -920,7 +957,7 @@
920
957
  "criticality": {"type":"enum","values":["low","medium","high","critical"],"filter":true},
921
958
  "description": {"type":"string","search":true},
922
959
  "service": {"type":"string","search":true},
923
- "systemIds": {"type":"array","items":"id","relation":["system"]},
960
+ "systemIds": {"type":"array","items":"id","relation":["system"],"label":"Legacy systems","legacy":true,"authoritativeFields":["system.vendorId"]},
924
961
  "dataClassification": {"type":"string","filter":true},
925
962
  "dataTypes": {"type":"array","items":"string","search":true},
926
963
  "subprocessor": {"type":"boolean","filter":true},
@@ -1297,10 +1334,10 @@
1297
1334
  "complementaryControlsConclusion": {"type":"enum","values":["identified","not-applicable"],"label":"Complementary controls conclusion"},
1298
1335
  "subserviceVendorIds": {"type":"array","items":"id","relation":["vendor"]},
1299
1336
  "subserviceMethod": {"type":"enum","values":["carve-out","inclusive","not-applicable"]},
1300
- "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"]},
1301
1338
  "opinion": {"type":"enum","values":["unmodified","qualified","adverse","disclaimer","not-issued"],"filter":true},
1302
1339
  "opinionDate": {"type":"date"},
1303
- "evidenceIds": {"type":"array","items":"id","relation":["evidence"]},
1340
+ "evidenceIds": {"type":"array","items":"id","relation":["evidence"],"label":"Legacy evidence","legacy":true,"authoritativeFields":["evidence.auditIds"]},
1304
1341
  "reportEvidenceId": {"type":"id","relation":["evidence"]},
1305
1342
  "managementResponseDocumentId": {"type":"id","relation":["document"]},
1306
1343
  "supplementalDocumentIds": {"type":"array","items":"id","relation":["document"]}