create-filegrc 0.2.0 → 0.3.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/LICENSE +1 -1
- package/README.md +3 -3
- package/package.json +3 -3
- package/src/cli.js +29 -13
- package/src/defaults.js +5 -6
- package/src/index.js +68 -16
- package/template/AGENTS.md +20 -20
- package/template/README.md +21 -19
- package/template/WORKSPACE.md +4 -4
- package/template/data/AGENTS.md +8 -8
- package/template/data/action-items/AGENTS.md +2 -2
- package/template/data/audits/AGENTS.md +3 -3
- package/template/data/documents/document-business-continuity-disaster-recovery.json +0 -1
- package/template/data/documents/document-contractor-policy-acknowledgement.json +0 -1
- package/template/data/documents/document-contractor-training-acknowledgement.json +0 -1
- package/template/data/documents/document-data-retention-schedule.json +0 -1
- package/template/data/documents/document-employee-handbook-acknowledgement.json +0 -1
- package/template/data/documents/document-employee-policy-acknowledgement.json +0 -1
- package/template/data/documents/document-employee-training-acknowledgement.json +0 -1
- package/template/data/documents/document-incident-response-plan.json +0 -1
- package/template/data/documents/document-soc2-management-assertion.json +0 -3
- package/template/data/documents/document-soc2-management-representation.json +0 -3
- package/template/data/documents/document-soc2-period-completeness.json +0 -3
- package/template/data/documents/document-soc2-period-completeness.md +2 -2
- package/template/data/documents/document-soc2-system-description.json +0 -3
- package/template/data/documents/document-soc2-system-description.md +3 -3
- package/template/data/evidence/AGENTS.md +3 -3
- package/template/data/obligation-events/AGENTS.md +1 -1
- package/template/data/people/person-policy-owner.json +1 -1
- package/template/data/policies/policy-anti-bribery-corruption.json +0 -1
- package/template/data/policies/policy-clear-desk-screen.json +0 -1
- package/template/data/policies/policy-data-protection-handling.json +0 -1
- package/template/data/policies/policy-employee-handbook.json +0 -1
- package/template/data/policies/policy-information-security.json +0 -1
- package/template/data/policies/policy-mobile-computing-communications.json +0 -1
- package/template/data/systems/system-filegrc-program-repository.md +3 -3
- package/template/data/workspace.json +1 -1
- package/template/docs/filegrc-audit.png +0 -0
- package/template/docs/filegrc-home.png +0 -0
- package/template/docs/filegrc-social-preview.png +0 -0
- package/template/package.json +2 -2
- package/template-parameters.json +14 -2
- package/template/data/people/person-independent-approver.json +0 -9
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# create-filegrc
|
|
2
2
|
|
|
3
|
-
Create a Git-native
|
|
3
|
+
Create a Git-native filegrc workspace for a SOC 2 program:
|
|
4
4
|
|
|
5
5
|
```sh
|
|
6
6
|
npx create-filegrc@latest company-grc
|
|
@@ -9,12 +9,12 @@ npm run validate
|
|
|
9
9
|
npm run serve
|
|
10
10
|
```
|
|
11
11
|
|
|
12
|
-
Setup asks for the
|
|
12
|
+
Setup asks for the legal organization name, the initial policy owner and their email, a security reporting address, and the program timezone. The generated private project includes a starter Security program, Program Readiness, a policy-driven Work Queue, Policy Events that add linked tasks, later audit preparation, evidence packets, and one dependency: `filegrc`.
|
|
13
13
|
|
|
14
14
|
Generated workspaces also include layered `AGENTS.md` instructions and model-driven headless commands. `filegrc program-path` gives agents the same six steps, exact page guidance, current status, and next actions shown in the renderer. Agents can define program scope, approve policies, implement controls, test External Evidence, complete policy work, trigger event tasks, and prepare later audit packets through the same domain functions used by the renderer.
|
|
15
15
|
|
|
16
16
|
Git is initialized when needed. The browser can create local commits before a remote is configured.
|
|
17
17
|
|
|
18
|
-
Creation output reports the resolved
|
|
18
|
+
Creation output reports the resolved filegrc version, program timezone, starter record counts, whether installation ran, and whether the target joined an existing Git worktree or received a new repository.
|
|
19
19
|
|
|
20
20
|
Use `npx create-filegrc@latest --help` for non-interactive options.
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-filegrc",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Create a
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Create a filegrc workspace for a SOC 2 program",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "git+https://github.com/Sunpeak-AI/
|
|
8
|
+
"url": "git+https://github.com/Sunpeak-AI/filegrc.git"
|
|
9
9
|
},
|
|
10
10
|
"type": "module",
|
|
11
11
|
"bin": {
|
package/src/cli.js
CHANGED
|
@@ -1,23 +1,35 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
|
-
import {
|
|
2
|
+
import { createFilegrc } from "./index.js";
|
|
3
3
|
|
|
4
4
|
export async function runCli(argv = process.argv.slice(2)) {
|
|
5
5
|
const { target, options } = parseArgs(argv);
|
|
6
6
|
if (options.help) return printHelp();
|
|
7
7
|
if (options.version) return printVersion();
|
|
8
|
-
const result = await
|
|
8
|
+
const result = await createFilegrc({ target, ...options });
|
|
9
9
|
console.log(`Created ${result.target}`);
|
|
10
|
-
console.log(`
|
|
10
|
+
console.log(`filegrc ${result.engineVersion}: ${result.install === "installed" ? "installed" : "installation skipped"}`);
|
|
11
11
|
console.log(`Git: ${result.gitMode === "existing-worktree" ? "joined existing worktree" : "initialized new repository"}`);
|
|
12
|
+
console.log(`Timezone: ${result.values.timezone}`);
|
|
13
|
+
console.log(
|
|
14
|
+
`Program baseline: ${result.resourceCounts.total} records, including ` +
|
|
15
|
+
`${result.resourceCounts.byType.requirement || 0} requirements, ` +
|
|
16
|
+
`${result.resourceCounts.byType.control || 0} controls, and ` +
|
|
17
|
+
`${result.resourceCounts.byType.obligation || 0} obligations.`
|
|
18
|
+
);
|
|
12
19
|
console.log("");
|
|
13
|
-
console.log(` cd ${result.target}`);
|
|
20
|
+
console.log(` cd ${shellQuote(result.target)}`);
|
|
14
21
|
if (options.install === false) console.log(" npm install");
|
|
22
|
+
console.log(" npx filegrc setup");
|
|
15
23
|
console.log(" npm run validate");
|
|
16
24
|
console.log(" npm run serve");
|
|
17
25
|
console.log("");
|
|
18
26
|
console.log("Review the starter drafts, then commit the approved baseline.");
|
|
19
27
|
}
|
|
20
28
|
|
|
29
|
+
function shellQuote(value) {
|
|
30
|
+
return `'${String(value).replaceAll("'", "'\\''")}'`;
|
|
31
|
+
}
|
|
32
|
+
|
|
21
33
|
function parseArgs(argv) {
|
|
22
34
|
let target;
|
|
23
35
|
const options = {};
|
|
@@ -36,7 +48,9 @@ function parseArgs(argv) {
|
|
|
36
48
|
else if (name === "no-install") options.install = false;
|
|
37
49
|
else if (name === "company-name") options.companyName = next();
|
|
38
50
|
else if (name === "policy-owner-name") options.policyOwnerName = next();
|
|
51
|
+
else if (name === "policy-owner-email") options.policyOwnerEmail = next();
|
|
39
52
|
else if (name === "security-contact-email") options.securityContactEmail = next();
|
|
53
|
+
else if (name === "timezone") options.timezone = next();
|
|
40
54
|
else if (name === "filegrc-version") options.filegrcVersion = next();
|
|
41
55
|
else throw new Error(`Unknown option "${value}".`);
|
|
42
56
|
}
|
|
@@ -46,18 +60,20 @@ function parseArgs(argv) {
|
|
|
46
60
|
function printHelp() {
|
|
47
61
|
console.log(`create-filegrc [directory] [options]
|
|
48
62
|
|
|
49
|
-
Create a
|
|
63
|
+
Create a filegrc workspace for a SOC 2 program.
|
|
50
64
|
|
|
51
65
|
Options:
|
|
52
|
-
--company-name <name>
|
|
53
|
-
--policy-owner-name <name>
|
|
54
|
-
--
|
|
66
|
+
--company-name <legal-name> Legal organization name
|
|
67
|
+
--policy-owner-name <name> Initial policy owner
|
|
68
|
+
--policy-owner-email <email> Policy owner's email address
|
|
69
|
+
--security-contact-email <email> Security reporting address
|
|
70
|
+
--timezone <iana-timezone> Program timezone, such as America/Chicago
|
|
55
71
|
--filegrc-version <version> Override resolved engine version
|
|
56
|
-
--no-install
|
|
57
|
-
--force
|
|
58
|
-
--yes
|
|
59
|
-
--version
|
|
60
|
-
--help
|
|
72
|
+
--no-install Write files and a preliminary lockfile only
|
|
73
|
+
--force Allow a non-empty target without overwriting files
|
|
74
|
+
--yes Use generic prompt defaults
|
|
75
|
+
--version Show the package version
|
|
76
|
+
--help Show this help`);
|
|
61
77
|
}
|
|
62
78
|
|
|
63
79
|
async function printVersion() {
|
package/src/defaults.js
CHANGED
|
@@ -4,7 +4,6 @@ import { mkdir, writeFile } from "node:fs/promises";
|
|
|
4
4
|
const FRAMEWORK_ID = "framework-aicpa-trust-services-criteria";
|
|
5
5
|
const DESCRIPTION_FRAMEWORK_ID = "framework-aicpa-soc2-description-criteria";
|
|
6
6
|
const OWNER_ID = "person-policy-owner";
|
|
7
|
-
const INDEPENDENT_APPROVER_ID = "person-independent-approver";
|
|
8
7
|
const OVERSIGHT_TEAM_ID = "team-security-risk-oversight";
|
|
9
8
|
const INFORMATION_SECURITY_POLICY_ID = "policy-information-security";
|
|
10
9
|
const DATA_POLICY_ID = "policy-data-protection-handling";
|
|
@@ -963,21 +962,21 @@ export function baselineRecordFiles(effectiveDate) {
|
|
|
963
962
|
id: OVERSIGHT_TEAM_ID,
|
|
964
963
|
type: "team",
|
|
965
964
|
title: "Security and Risk Oversight",
|
|
966
|
-
status: "
|
|
965
|
+
status: "inactive",
|
|
967
966
|
purpose: "Provide independent oversight of the security program, risk register, incidents, findings, vendor and access reviews, policy changes, exercises, and overdue work. The chair must be separate from the policy owner and people who operate the controls under review.",
|
|
968
|
-
memberIds: [OWNER_ID
|
|
969
|
-
chairIds: [
|
|
967
|
+
memberIds: [OWNER_ID],
|
|
968
|
+
chairIds: [],
|
|
970
969
|
meetingCadence: calendar("month", 3, effectiveDate)
|
|
971
970
|
};
|
|
972
971
|
const programRepository = {
|
|
973
972
|
schemaVersion: 1,
|
|
974
973
|
id: "system-filegrc-program-repository",
|
|
975
974
|
type: "system",
|
|
976
|
-
title: "
|
|
975
|
+
title: "filegrc Program Repository",
|
|
977
976
|
status: "active",
|
|
978
977
|
criticality: "high",
|
|
979
978
|
ownerIds: [OWNER_ID],
|
|
980
|
-
description: "The Git repository that is authoritative for
|
|
979
|
+
description: "The Git repository that is authoritative for filegrc governance records, approvals, exceptions, findings, acknowledgements, evidence indexes, and their revision history.",
|
|
981
980
|
systemKind: "governance-system-of-record",
|
|
982
981
|
environment: "Git repository",
|
|
983
982
|
dataClassification: "Confidential",
|
package/src/index.js
CHANGED
|
@@ -10,14 +10,14 @@ const execute = promisify(execFile);
|
|
|
10
10
|
const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
11
11
|
const textExtensions = new Set(["", ".json", ".md", ".txt", ".yml", ".yaml", ".gitignore"]);
|
|
12
12
|
|
|
13
|
-
export async function
|
|
13
|
+
export async function createFilegrc(options = {}) {
|
|
14
14
|
const parameterConfig = JSON.parse(await readFile(join(packageRoot, "template-parameters.json"), "utf8"));
|
|
15
15
|
const target = resolve(options.target ?? "filegrc-program");
|
|
16
16
|
await assertWritableTarget(target, Boolean(options.force));
|
|
17
17
|
if (options.force) await assertNoTemplateCollisions(target);
|
|
18
18
|
|
|
19
19
|
const prompted = await resolvePromptValues(parameterConfig.parameters, options);
|
|
20
|
-
const engineVersion = await
|
|
20
|
+
const engineVersion = await resolveFilegrcVersion(options.filegrcVersion);
|
|
21
21
|
const values = {
|
|
22
22
|
...prompted,
|
|
23
23
|
effective_date: options.effectiveDate ?? new Date().toISOString().slice(0, 10),
|
|
@@ -30,6 +30,7 @@ export async function createFileGRC(options = {}) {
|
|
|
30
30
|
await copyTemplate(target);
|
|
31
31
|
await renderTemplate(target, parameterConfig, values);
|
|
32
32
|
await writeBaselineRecords(target, values.effective_date);
|
|
33
|
+
const resourceCounts = await summarizeResources(target);
|
|
33
34
|
|
|
34
35
|
const installed = options.install !== false;
|
|
35
36
|
if (installed) {
|
|
@@ -43,12 +44,13 @@ export async function createFileGRC(options = {}) {
|
|
|
43
44
|
target,
|
|
44
45
|
values,
|
|
45
46
|
engineVersion,
|
|
47
|
+
resourceCounts,
|
|
46
48
|
install: installed ? "installed" : "skipped",
|
|
47
49
|
gitMode: joinedExistingWorktree ? "existing-worktree" : "initialized"
|
|
48
50
|
};
|
|
49
51
|
}
|
|
50
52
|
|
|
51
|
-
export async function
|
|
53
|
+
export async function resolveFilegrcVersion(explicitVersion) {
|
|
52
54
|
if (explicitVersion) return cleanVersion(explicitVersion);
|
|
53
55
|
try {
|
|
54
56
|
const { stdout } = await execute("npm", ["view", "filegrc", "version", "--json"], {
|
|
@@ -67,7 +69,9 @@ async function resolvePromptValues(parameters, options) {
|
|
|
67
69
|
const mapped = {
|
|
68
70
|
company_name: options.companyName,
|
|
69
71
|
policy_owner_name: options.policyOwnerName,
|
|
70
|
-
|
|
72
|
+
policy_owner_email: options.policyOwnerEmail,
|
|
73
|
+
security_contact_email: options.securityContactEmail,
|
|
74
|
+
timezone: options.timezone
|
|
71
75
|
};
|
|
72
76
|
if (options.yes) {
|
|
73
77
|
mapped.company_name ??= "Example Company";
|
|
@@ -77,21 +81,29 @@ async function resolvePromptValues(parameters, options) {
|
|
|
77
81
|
for (const key of Object.keys(mapped)) {
|
|
78
82
|
if (mapped[key] !== undefined && mapped[key] !== null) mapped[key] = String(mapped[key]).trim();
|
|
79
83
|
}
|
|
80
|
-
|
|
81
|
-
if (missing.length) {
|
|
82
|
-
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
83
|
-
throw new Error(`Missing required values: ${missing.map(({ key }) => key).join(", ")}`);
|
|
84
|
-
}
|
|
84
|
+
if (process.stdin.isTTY && process.stdout.isTTY) {
|
|
85
85
|
const prompt = createInterface({ input: process.stdin, output: process.stdout });
|
|
86
86
|
try {
|
|
87
|
-
for (const parameter of
|
|
87
|
+
for (const parameter of parameters.filter(({ required, key }) => required && !mapped[key])) {
|
|
88
|
+
const defaultValue = parameterDefault(parameter, mapped);
|
|
89
|
+
const suffix = defaultValue ? ` [${defaultValue}]` : "";
|
|
88
90
|
let value = "";
|
|
89
|
-
while (!value)
|
|
91
|
+
while (!value) {
|
|
92
|
+
value = (await prompt.question(`${parameter.prompt}${suffix}: `)).trim() || defaultValue;
|
|
93
|
+
}
|
|
90
94
|
mapped[parameter.key] = value;
|
|
91
95
|
}
|
|
92
96
|
} finally {
|
|
93
97
|
prompt.close();
|
|
94
98
|
}
|
|
99
|
+
} else {
|
|
100
|
+
for (const parameter of parameters.filter(({ required, key }) => required && !mapped[key])) {
|
|
101
|
+
mapped[parameter.key] = parameterDefault(parameter, mapped);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const missing = parameters.filter(({ key, required }) => required && !mapped[key]);
|
|
105
|
+
if (missing.length) {
|
|
106
|
+
throw new Error(`Missing required values: ${missing.map(({ key }) => key).join(", ")}`);
|
|
95
107
|
}
|
|
96
108
|
for (const key of ["company_name", "policy_owner_name"]) {
|
|
97
109
|
if (/[\u0000-\u001f\u007f]/.test(mapped[key])) {
|
|
@@ -102,12 +114,39 @@ async function resolvePromptValues(parameters, options) {
|
|
|
102
114
|
throw new Error(`${key} cannot contain template token syntax.`);
|
|
103
115
|
}
|
|
104
116
|
}
|
|
105
|
-
|
|
106
|
-
|
|
117
|
+
for (const [key, label] of [
|
|
118
|
+
["policy_owner_email", "Policy owner email"],
|
|
119
|
+
["security_contact_email", "Security contact email"]
|
|
120
|
+
]) {
|
|
121
|
+
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mapped[key])) {
|
|
122
|
+
throw new Error(`${label} must be a valid email address.`);
|
|
123
|
+
}
|
|
107
124
|
}
|
|
125
|
+
if (!isTimezone(mapped.timezone)) throw new Error("Program timezone must be a valid IANA time zone.");
|
|
108
126
|
return mapped;
|
|
109
127
|
}
|
|
110
128
|
|
|
129
|
+
function parameterDefault(parameter, mapped) {
|
|
130
|
+
if (parameter.defaultFrom) return mapped[parameter.defaultFrom] || "";
|
|
131
|
+
if (parameter.defaultSource === "local-timezone") return localTimezone();
|
|
132
|
+
return "";
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function localTimezone() {
|
|
136
|
+
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
137
|
+
return isTimezone(timezone) ? timezone : "UTC";
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function isTimezone(value) {
|
|
141
|
+
if (!value) return false;
|
|
142
|
+
try {
|
|
143
|
+
new Intl.DateTimeFormat("en-US", { timeZone: value }).format();
|
|
144
|
+
return true;
|
|
145
|
+
} catch {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
111
150
|
async function assertWritableTarget(target, force) {
|
|
112
151
|
try {
|
|
113
152
|
if ((await lstat(target)).isSymbolicLink()) {
|
|
@@ -213,16 +252,29 @@ async function collectFiles(directory) {
|
|
|
213
252
|
return result;
|
|
214
253
|
}
|
|
215
254
|
|
|
255
|
+
async function summarizeResources(target) {
|
|
256
|
+
const counts = {};
|
|
257
|
+
let total = 0;
|
|
258
|
+
for (const path of await collectFiles(join(target, "data"))) {
|
|
259
|
+
if (extname(path) !== ".json") continue;
|
|
260
|
+
const record = JSON.parse(await readFile(path, "utf8"));
|
|
261
|
+
if (!record?.id || !record?.type || !record?.schemaVersion) continue;
|
|
262
|
+
total += 1;
|
|
263
|
+
counts[record.type] = (counts[record.type] || 0) + 1;
|
|
264
|
+
}
|
|
265
|
+
return { total, byType: counts };
|
|
266
|
+
}
|
|
267
|
+
|
|
216
268
|
async function writeMinimalLockfile(target, name, versionRange) {
|
|
217
269
|
const lock = {
|
|
218
270
|
name,
|
|
219
|
-
version: "0.
|
|
271
|
+
version: "0.3.0",
|
|
220
272
|
lockfileVersion: 3,
|
|
221
273
|
requires: true,
|
|
222
274
|
packages: {
|
|
223
275
|
"": {
|
|
224
276
|
name,
|
|
225
|
-
version: "0.
|
|
277
|
+
version: "0.3.0",
|
|
226
278
|
dependencies: { filegrc: versionRange }
|
|
227
279
|
}
|
|
228
280
|
}
|
|
@@ -251,7 +303,7 @@ async function run(command, args, cwd) {
|
|
|
251
303
|
function cleanVersion(value) {
|
|
252
304
|
const version = String(value ?? "").trim().replace(/^v/, "");
|
|
253
305
|
if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(version)) {
|
|
254
|
-
throw new Error(`Could not resolve a valid
|
|
306
|
+
throw new Error(`Could not resolve a valid filegrc version from "${value}".`);
|
|
255
307
|
}
|
|
256
308
|
return version;
|
|
257
309
|
}
|
package/template/AGENTS.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# filegrc SOC 2 Workspace Instructions
|
|
2
2
|
|
|
3
3
|
## Purpose
|
|
4
4
|
|
|
5
|
-
This repository is {{company_name}}’s
|
|
5
|
+
This repository is {{company_name}}’s filegrc workspace for its SOC 2 program. Engineers and agents maintain the source records under `data/`. The `filegrc` package validates, searches, edits, and renders those files.
|
|
6
6
|
|
|
7
7
|
Using this repository does not establish compliance by itself. Records must match actual practice and evidence must prove that controls operated during the audit period.
|
|
8
8
|
|
|
@@ -15,7 +15,7 @@ npx filegrc guide --json
|
|
|
15
15
|
npx filegrc program-path --json
|
|
16
16
|
npx filegrc guide risk-assessment --json
|
|
17
17
|
npx filegrc list person --json
|
|
18
|
-
npx filegrc program-readiness --json
|
|
18
|
+
npx filegrc program-readiness --summary --json
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
`program-path` gives agents the same six-step order, exact page Instructions, Use, Policy Basis, commands, current state, and next actions shown in the renderer. The general guide lists every supported action and record type. A type guide repeats that page guidance and adds timing, required and conditional fields, current relationship candidates, JSON location, and Markdown slots.
|
|
@@ -46,7 +46,7 @@ Read `data/AGENTS.md` before changing records. More specific instructions inside
|
|
|
46
46
|
- Let the local app generate IDs from each record’s name or title. When editing JSON directly, keep IDs globally unique, human-readable, and lowercase kebab-case.
|
|
47
47
|
- Use ISO 8601 dates and RFC 3339 timestamps.
|
|
48
48
|
- Store relationships as resource IDs.
|
|
49
|
-
- Put policies, plans, charters, procedures, meeting minutes, training, assertions, narratives, templates, and audit responses in Markdown beside their JSON records.
|
|
49
|
+
- Put policies, plans, charters, procedures, meeting minutes, training, assertions, narratives, templates, and audit responses in Markdown beside their JSON records. filegrc derives the Markdown name, so records do not contain file paths.
|
|
50
50
|
- Put signed forms, screenshots, third-party reports, and immutable exports behind evidence records. These files may be PDF, image, CSV, or another fixed format.
|
|
51
51
|
- Never fetch an external evidence reference automatically.
|
|
52
52
|
- Do not store secrets, credentials, session data, or personal data that may need to be erased from Git history.
|
|
@@ -95,7 +95,7 @@ Headless agents get the same protection by exporting an edit payload with `fileg
|
|
|
95
95
|
|
|
96
96
|
`data/renderer.json` stores committed renderer preferences. New workspaces set `showOnboarding` to `true`. Completing or skipping onboarding sets it to `false`; the app does not commit that change.
|
|
97
97
|
|
|
98
|
-
Onboarding explains the file and Git workflow, the program path, policy obligations, and Policy Events before covering report types and the final audit stage. It then collects the initial service boundary, owner, business criticality, highest data classification, internet exposure, and optional program goal. It creates or updates a `system` record and stores the management goal and program scope on `workspace`. Selecting Type 1 or Type 2 does not create an audit engagement. Completing onboarding opens the Step 1 overview so the user can
|
|
98
|
+
Onboarding explains the file and Git workflow, the program path, policy obligations, and Policy Events before covering report types and the final audit stage. It then collects the initial service boundary, owner, business criticality, highest data classification, internet exposure, and optional program goal. It creates or updates a `system` record and stores the management goal and program scope on `workspace`. Selecting Type 1 or Type 2 does not create an audit engagement. Completing onboarding opens the Step 1 overview so the user can add the real reviewers and operators, finish the oversight team, and confirm the criteria, commitments, vendors, and systems before approving policies.
|
|
99
99
|
|
|
100
100
|
The renderer is optional. Agents may set `showOnboarding` to `false` and maintain all records headlessly. Restart onboarding from Repository when useful. Read-only builds never run it.
|
|
101
101
|
|
|
@@ -111,7 +111,7 @@ The generated workspace starts with the SOC 2 Security category:
|
|
|
111
111
|
- Recurring obligations for the reviews, scans, tests, training, and meetings required by the included policies
|
|
112
112
|
- A default 5x5 risk method and Public, Internal, Confidential, and Restricted data classifications
|
|
113
113
|
|
|
114
|
-
Treat every planned control as a proposal until its owner, actual procedure in Record Markdown, system scope, cadence, authoritative evidence sources, implementation date, and mappings match actual practice. For a control linked to
|
|
114
|
+
Treat every planned control as a proposal until its owner, actual procedure in Record Markdown, system scope, cadence, authoritative evidence sources, implementation date, and mappings match actual practice. For a control linked to filegrc obligations, every non-retired Work Queue schedule must be enabled and its governing policies effective. Marking the control implemented starts eligible schedules. Do not mark a control implemented because a policy describes it. Add Availability, Processing Integrity, Confidentiality, or Privacy criteria only when they are in scope.
|
|
115
115
|
|
|
116
116
|
The recurring obligations mirror the fixed cadences in the starter policies. They remain proposals until every governing policy is active and effective and, when they name controls, at least one linked control is implemented. Update the policy, control, and obligation together when an approved cadence changes. Create separate completion records, such as meetings, reviews, scans, tests, exercises, and attestations, for each period.
|
|
117
117
|
|
|
@@ -141,7 +141,7 @@ npx filegrc trigger person-started --occurred-on 2026-07-25 --subject person-new
|
|
|
141
141
|
npx filegrc trigger person-ended --occurred-at 2026-07-25T16:30:00-05:00 --subject person-departing-worker --json
|
|
142
142
|
```
|
|
143
143
|
|
|
144
|
-
Run `npx filegrc obligations` first to preview every task, owner, deadline, and requested proof for each available Policy Event. The trigger command creates one `obligation-event` and adds its full set of Action Items to the Work Queue in a single validated write. Its success output names the event, task count, task IDs, and deadlines. Hour-based deadlines require an RFC 3339 event timestamp so an immediate or 24-hour cutoff is exact. Day-based deadlines use the event’s calendar date. Link the requested completion resources and evidence to each action item, then mark the actions done and the event complete. Every generated action has a cutoff.
|
|
144
|
+
Run `npx filegrc obligations` first to preview every task, owner, deadline, and requested proof for each available Policy Event. The trigger command creates one `obligation-event` and adds its full set of Action Items to the Work Queue in a single validated write. Its success output names the event, task count, task IDs, and deadlines. Hour-based deadlines require an RFC 3339 event timestamp so an immediate or 24-hour cutoff is exact. Day-based deadlines use the event’s calendar date. Link the requested completion resources and evidence to each action item, then mark the actions done and the event complete. Every generated action has a cutoff. filegrc applies a 30-day deadline when a custom event obligation omits one.
|
|
145
145
|
|
|
146
146
|
Complete an event action and link its new proof in one validated write:
|
|
147
147
|
|
|
@@ -150,7 +150,7 @@ npx filegrc complete-action action-item-id completion-record.json --completed-on
|
|
|
150
150
|
npx filegrc complete-event obligation-event-id --completed-on 2026-07-25
|
|
151
151
|
```
|
|
152
152
|
|
|
153
|
-
|
|
153
|
+
filegrc rejects a completion resource whose type does not match the obligation. It will close the event only after every action has its requested proof.
|
|
154
154
|
|
|
155
155
|
## Headless Markdown
|
|
156
156
|
|
|
@@ -161,7 +161,7 @@ npx filegrc content risk-assessment risk-assessment-2026 --json
|
|
|
161
161
|
npx filegrc content risk-assessment risk-assessment-2026 --write updated-assessment.md
|
|
162
162
|
```
|
|
163
163
|
|
|
164
|
-
Run `filegrc guide <type>` to get slot names. Policies use `content`, meetings use `agenda` and `minutes`, and implicit long-form work uses `record`.
|
|
164
|
+
Run `filegrc guide <type>` to get slot names. Policies use `content`, meetings use `agenda` and `minutes`, and implicit long-form work uses `record`. filegrc derives the path and rejects content that does not belong to the record.
|
|
165
165
|
|
|
166
166
|
## Program readiness and the candidate period
|
|
167
167
|
|
|
@@ -169,7 +169,7 @@ Prepare the management program before creating an audit engagement:
|
|
|
169
169
|
|
|
170
170
|
```sh
|
|
171
171
|
npx filegrc program-readiness
|
|
172
|
-
npx filegrc program-readiness --require-ready --json
|
|
172
|
+
npx filegrc program-readiness --require-ready --summary --json
|
|
173
173
|
```
|
|
174
174
|
|
|
175
175
|
The Evidence Ready gate requires:
|
|
@@ -178,15 +178,15 @@ The Evidence Ready gate requires:
|
|
|
178
178
|
2. Active policies with completed text, separate management approval, real approval and effective dates, and linked controls.
|
|
179
179
|
3. Implemented controls with an owner, actual procedure, scope, cadence, evidence source, mappings, implementation date, and every eligible linked Work Queue schedule running.
|
|
180
180
|
4. Active authoritative systems with evidence source roles, access owners, and repeatable extraction instructions in Record Markdown.
|
|
181
|
-
5. A verified `test-export` or `test-capture` evidence record for each selected control family that relies on evidence from outside
|
|
181
|
+
5. A verified `test-export` or `test-capture` evidence record for each selected control family that relies on evidence from outside filegrc.
|
|
182
182
|
|
|
183
|
-
Completing onboarding creates draft External Evidence records only for evidence that must come from other systems and does not already have a dedicated Step 5 record.
|
|
183
|
+
Completing onboarding creates draft External Evidence records only for evidence that must come from other systems and does not already have a dedicated Step 5 record. filegrc-managed records, such as risk assessments, meetings, vendor reviews, attestations, vulnerability scans, penetration tests, backup tests, exercises, exceptions, and findings, do not need a separate collection test. Put any fixed external artifact in an External Evidence record and link it from the operating record. For each generated draft, choose its authoritative source System, attach or reference the real result, record its collector and classification, then have another person verify it. Run `npx filegrc evidence-test-drafts` to create any drafts needed after the control set changes.
|
|
184
184
|
|
|
185
185
|
When the gate passes, set `workspace.candidatePeriodStart` to the date reliable evidence collection begins. Do not backdate it. `candidatePeriodStart` and `candidatePeriodEnd` express management’s target. They do not establish the final report period.
|
|
186
186
|
|
|
187
187
|
Maintain risk assessments and the risk register while the program operates. Complete assessments on schedule and after material changes, and add or update controls when the conclusions require a different response. Audit preparation still checks for a current, independently reviewed assessment.
|
|
188
188
|
|
|
189
|
-
Record complementary customer or subservice controls after the internal control set is defined. `complementary-control.relatedControlIds` is the source of truth for those links.
|
|
189
|
+
Record complementary customer or subservice controls after the internal control set is defined. `complementary-control.relatedControlIds` is the source of truth for those links. filegrc derives the reverse connections for Control pages and evidence packets.
|
|
190
190
|
|
|
191
191
|
## Audit preparation and evidence packets
|
|
192
192
|
|
|
@@ -204,16 +204,16 @@ Preparation creates a separate system description, management assertion, and man
|
|
|
204
204
|
|
|
205
205
|
Review both evidence paths against the exact firm-agreed date or period:
|
|
206
206
|
|
|
207
|
-
1.
|
|
207
|
+
1. filegrc Evidence consists of dated Step 5 operating records. Complete each applicable record, link it to the Controls it supports, record the result in structured fields or Markdown, and link any external artifact needed to support that result.
|
|
208
208
|
2. External Evidence consists of verified `evidence` records from authoritative Systems. Confirm the source System, audit date or period, Control links, collector, verifier, and fixed attachment or approved external reference.
|
|
209
209
|
|
|
210
|
-
Audit Readiness reports coverage for both paths. The packet includes the matching
|
|
210
|
+
Audit Readiness reports coverage for both paths. The packet includes the matching filegrc records and Markdown with Git history, plus External Evidence records, retained attachments, delivery indexes, and checksums.
|
|
211
211
|
|
|
212
212
|
Near the end of fieldwork, link a verified fixed-format copy of the signed management representation letter to its engagement-specific document. Date it on or after the Type 1 date or Type 2 period end. A representation that is still marked for later blocks packet delivery.
|
|
213
213
|
|
|
214
214
|
Catalog each authoritative source under Systems and assign its `evidenceSourceKinds`. A third-party application is still a System because it operates controls or produces evidence. Create a separate Vendor for its provider and connect the System through `vendorId`; keep contracts, due diligence, and supplier risk on the Vendor. Name the people who can access system reports and keep extraction instructions in the System's Record Markdown. For each Type 2 population, select one source system and export the exact audit period. Split a population when different systems or queries produce its items. Link a verified `population-export` evidence record that names the same source system and stores the query or report parameters, generation time, timezone, count, completeness check, and accuracy check. A zero count still requires the source export and query. A population linked to an in-scope control cannot be marked not applicable.
|
|
215
215
|
|
|
216
|
-
Every evidence record names its collector. Verified evidence also names its verifier and verification date. Use `sourceSystemId` for system exports, `sourceResourceIds` for
|
|
216
|
+
Every evidence record names its collector. Verified evidence also names its verifier and verification date. Use `sourceSystemId` for system exports, `sourceResourceIds` for filegrc records, and `sourceCommit` to bind the evidence to repository state.
|
|
217
217
|
|
|
218
218
|
Preview coverage before writing output:
|
|
219
219
|
|
|
@@ -223,15 +223,15 @@ npx filegrc evidence-packet --audit audit-2026-type-2
|
|
|
223
223
|
npx filegrc evidence-packet --audit audit-2026-type-2 --preview --require-ready
|
|
224
224
|
```
|
|
225
225
|
|
|
226
|
-
The packet includes records explicitly related to the selected engagement, its systems, controls, criteria, policies, evidence, and dependencies. It does not include unrelated dated records from the workspace. A Type 2 packet adds
|
|
226
|
+
The packet includes records explicitly related to the selected engagement, its systems, controls, criteria, policies, evidence, and dependencies. It does not include unrelated dated records from the workspace. A Type 2 packet adds filegrc Evidence, recurring obligation occurrences, event workflows, and management population reconciliations. Output includes a control matrix with separate filegrc Evidence and External Evidence columns, source-system index, external-evidence delivery index, population index, evidence index, committed historical source versions, and SHA-256 checksums. Output under `.filegrc/evidence-packets/` is derived and must not be hand-edited or committed.
|
|
227
227
|
|
|
228
|
-
Treat a packet as ready for management delivery only when its status is `delivery-ready`, its review list is clear, and its manifest names a clean Git revision. This means
|
|
228
|
+
Treat a packet as ready for management delivery only when its status is `delivery-ready`, its review list is clear, and its manifest names a clean Git revision. This means filegrc's management checks passed. It does not mean the engagement team found the evidence sufficient or appropriate. The generator copies raw records, Markdown, and local fixed attachments. It never fetches external references. Reconcile `external-evidence-index.csv` to the auditor portal or other approved delivery system before telling the engagement team that submission is complete.
|
|
229
229
|
|
|
230
|
-
Link a control test to its `audit-population` record when sampling applies. Link item-level sample evidence separately. Management owns population completeness and accuracy. The auditor owns sample selection, independent testing, exception evaluation, and the report opinion. The auditor or publisher also supplies the authoritative criteria and examination guidance.
|
|
230
|
+
Link a control test to its `audit-population` record when sampling applies. Link item-level sample evidence separately. Management owns population completeness and accuracy. The auditor owns sample selection, independent testing, exception evaluation, and the report opinion. The auditor or publisher also supplies the authoritative criteria and examination guidance. filegrc stores references and orientation text, not licensed criteria.
|
|
231
231
|
|
|
232
232
|
## Content and approvals
|
|
233
233
|
|
|
234
|
-
The seed policy owner is {{policy_owner_name}} and the reporting address is {{security_contact_email}}. Replace ownership or contacts when responsibilities change.
|
|
234
|
+
The seed policy owner is {{policy_owner_name}} at {{policy_owner_email}}, and the security reporting address is {{security_contact_email}}. Replace ownership or contacts when responsibilities change.
|
|
235
235
|
|
|
236
236
|
Appoint an independent management reviewer during policy review, not as a condition of defining the service boundary. The reviewer must be separate from the policy owner and able to challenge the owner’s decisions. Most organizations assign another internal leader or manager. An external reviewer is also allowed, and a one-person company needs one because no second internal person is available. The reviewer chairs Security and Risk Oversight and approves policies and governed documents.
|
|
237
237
|
|
package/template/README.md
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
#
|
|
1
|
+
# filegrc
|
|
2
|
+
|
|
3
|
+

|
|
2
4
|
|
|
3
5
|
Run a SOC 2 program as files in Git.
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
filegrc gives a founder-led engineering team one place to adopt policies, implement controls, test External Evidence collection, run recurring compliance work, and prepare an audit. JSON holds structured records, Markdown holds long-form work, and Git supplies the change history.
|
|
6
8
|
|
|
7
9
|
There is no separate application database. The repository is the program, so engineers and agents can use the same data through the web app, a text editor, or the CLI.
|
|
8
10
|
|
|
9
|
-

|
|
10
|
-
|
|
11
11
|
## Why it exists
|
|
12
12
|
|
|
13
13
|
SOC 2 work tends to scatter across documents, calendars, tickets, screenshots, and the auditor’s request list. That makes it hard to answer basic questions: What is due? Which policy requires it? What changed during the audit period? Is the evidence complete?
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
filegrc keeps that work connected:
|
|
16
16
|
|
|
17
17
|
- A starter Security program links criteria references, policies, planned controls, owners, and schedules.
|
|
18
18
|
- Work Queue turns policy timing into upcoming, due, and overdue work.
|
|
@@ -34,11 +34,11 @@ npm run validate
|
|
|
34
34
|
npm run serve
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
Setup asks for the
|
|
37
|
+
Setup asks for the legal organization name, the initial policy owner and their email, a security reporting address, and the program timezone. It initializes Git when needed. The first local run then defines the initial service boundary and an optional program goal. A Type 2 choice records management intent, not an audit engagement. Completing onboarding opens Step 1 so you can add the real reviewers and operators, finish the oversight team, and confirm the criteria, commitments, vendors, and systems before moving on.
|
|
38
38
|
|
|
39
39
|
Open the printed local URL. You can commit locally from Repository without configuring a remote. Add a remote when the team is ready to share the workspace, then the browser can pull with rebase and push reviewed commits.
|
|
40
40
|
|
|
41
|
-
The creation summary reports the resolved engine version, install result, and whether the target joined an existing Git worktree. Generated workspaces receive an organization-specific README with their engine version, validation commands, and remaining setup work.
|
|
41
|
+
The creation summary reports the resolved engine version, program timezone, starter record counts, install result, and whether the target joined an existing Git worktree. Generated workspaces receive an organization-specific README with their engine version, validation commands, and remaining setup work.
|
|
42
42
|
|
|
43
43
|
## How it works
|
|
44
44
|
|
|
@@ -46,8 +46,8 @@ The creation summary reports the resolved engine version, install result, and wh
|
|
|
46
46
|
2. Review and activate the policies with a separate management reviewer, who is usually internal and may be external.
|
|
47
47
|
3. Tailor the starter controls, add each owner, actual procedure, scope, cadence, evidence source, and implementation date, and confirm any linked Work Queue schedules are enabled. Marking a control implemented starts eligible schedules. Then record any complementary customer or subservice controls.
|
|
48
48
|
4. Open each generated External Evidence draft, choose its authoritative source System, collect the named artifact, and have another person verify it.
|
|
49
|
-
5. Start the management candidate period, maintain risk assessments and risks, update controls when needed, work the
|
|
50
|
-
6. Engage a CPA firm, record the separate firm-agreed period, review
|
|
49
|
+
5. Start the management candidate period, maintain risk assessments and risks, update controls when needed, work the filegrc queue, and preserve dated evidence.
|
|
50
|
+
6. Engage a CPA firm, record the separate firm-agreed period, review filegrc Evidence and External Evidence, prepare fieldwork, and generate the evidence packet.
|
|
51
51
|
|
|
52
52
|
Long-form policies, procedures, plans, minutes, training, assertions, and audit responses are Markdown companions beside their JSON records. Screenshots, signed acknowledgements, reports, and fixed exports are attachments linked through evidence records.
|
|
53
53
|
|
|
@@ -57,7 +57,9 @@ Third-party software is usually both a System and a Vendor. The application is t
|
|
|
57
57
|
|
|
58
58
|
Use Overview to follow one six-step path: define scope, approve policies, implement controls, test External Evidence, operate the program, then complete the audit. Steps 1 through 4 and Step 6 open an overview with instructions, record links, progress, and completion status. Step 5 opens Policy Events and the Work Queue because operation is ongoing rather than a one-time checklist. The progress tracker opens the first incomplete step.
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+

|
|
61
|
+
|
|
62
|
+
Use Work Queue for recurring work, Policy Event tasks, and other assigned follow-up. Trigger a Policy Event when the underlying change occurs, and filegrc adds its required actions to the queue with their owners and deadlines. Create a separate Action Item only when follow-up needs its own assignee, deadline, and completion proof. Each queue item shows its due window or deadline. Link dated proof to close the work.
|
|
61
63
|
|
|
62
64
|
Use the resource pages to maintain systems, people, vendors, risks, controls, tests, incidents, training, meetings, and External Evidence. The question-mark guide on each list explains what the record type is for, which policies call for it, and when to update it.
|
|
63
65
|
|
|
@@ -69,7 +71,7 @@ npx filegrc program-path --json
|
|
|
69
71
|
npx filegrc scaffold risk-assessment --title "2026 Annual Risk Assessment"
|
|
70
72
|
npx filegrc list risk --json
|
|
71
73
|
npx filegrc obligations --json
|
|
72
|
-
npx filegrc program-readiness --json
|
|
74
|
+
npx filegrc program-readiness --summary --json
|
|
73
75
|
npx filegrc complete obligation-id completion-record.json
|
|
74
76
|
npx filegrc trigger person-started --occurred-on 2026-07-25 --subject person-id
|
|
75
77
|
npx filegrc complete-action action-item-id completion-record.json --completed-on 2026-07-25
|
|
@@ -77,7 +79,7 @@ npx filegrc complete-event obligation-event-id --completed-on 2026-07-25
|
|
|
77
79
|
npx filegrc search "access review"
|
|
78
80
|
```
|
|
79
81
|
|
|
80
|
-
`program-path` reports the same six steps, current status, page order, exact Instructions, Use, Policy Basis, and next actions shown in the renderer. `guide` reports that same page guidance for one resource, plus timing, required fields, valid values, relationship candidates, and Markdown locations. `scaffold` produces the same JSON and Markdown mutation shape used by the browser. Read `AGENTS.md` and `data/AGENTS.md` for the full headless workflow.
|
|
82
|
+
`program-path` reports the same six steps, current status, page order, exact Instructions, Use, Policy Basis, and next actions shown in the renderer. `program-readiness --summary --json` reports compact stage counts and next actions; omit `--summary` when you need every readiness item. `guide` reports that same page guidance for one resource, plus timing, required fields, valid values, relationship candidates, and Markdown locations. `scaffold` produces the same JSON and Markdown mutation shape used by the browser. Read `AGENTS.md` and `data/AGENTS.md` for the full headless workflow.
|
|
81
83
|
|
|
82
84
|
## Start the evidence period
|
|
83
85
|
|
|
@@ -88,17 +90,17 @@ npx filegrc program-readiness --json
|
|
|
88
90
|
npx filegrc program-readiness --require-ready
|
|
89
91
|
```
|
|
90
92
|
|
|
91
|
-
The Evidence Ready gate requires defined scope, effective policies, implemented controls, configured authoritative systems, and verified collection for external evidence that does not already have a dedicated Step 5 record. Put scan reports, backup output, and other fixed artifacts in External Evidence records, then link them from the applicable Step 5 operating records. Starter obligations remain enabled proposals until their governing policies are effective and at least one linked control is implemented. A
|
|
93
|
+
The Evidence Ready gate requires defined scope, effective policies, implemented controls, configured authoritative systems, and verified collection for external evidence that does not already have a dedicated Step 5 record. Put scan reports, backup output, and other fixed artifacts in External Evidence records, then link them from the applicable Step 5 operating records. Starter obligations remain enabled proposals until their governing policies are effective and at least one linked control is implemented. A filegrc-managed control cannot be implemented while one of its linked Work Queue schedules is paused or waiting for policy approval.
|
|
92
94
|
|
|
93
95
|
When the gate passes, record `candidatePeriodStart` on the workspace on the date reliable collection begins. This is management’s candidate Type 2 period. Do not backdate it. The later audit record keeps the separate period agreed with the CPA firm.
|
|
94
96
|
|
|
95
97
|
## Prepare the audit
|
|
96
98
|
|
|
97
|
-
After engaging a CPA firm, create the audit record with the firm, scope, and exact agreed date or period. Audit Readiness checks the program foundation, engagement, formal scope and dates, management documents,
|
|
99
|
+
After engaging a CPA firm, create the audit record with the firm, scope, and exact agreed date or period. Audit Readiness checks the program foundation, engagement, formal scope and dates, management documents, filegrc Evidence, External Evidence, and Type 2 populations.
|
|
98
100
|
|
|
99
|
-

|
|
100
102
|
|
|
101
|
-
For a Type 2 audit, reconcile each complete period population to its authoritative system after the period closes. A zero-item population still needs its source export and query.
|
|
103
|
+
For a Type 2 audit, reconcile each complete period population to its authoritative system after the period closes. A zero-item population still needs its source export and query. filegrc Evidence consists of dated operating records and their Markdown and Git history. External Evidence consists of verified exports, reports, screenshots, signed files, and approved external references. The packet compiles both paths with the selected records, attachments, indexes, historical versions, and SHA-256 checksums.
|
|
102
104
|
|
|
103
105
|
```sh
|
|
104
106
|
npx filegrc prepare-audit audit-id
|
|
@@ -106,15 +108,15 @@ npx filegrc audit-readiness audit-id --json
|
|
|
106
108
|
npx filegrc evidence-packet --audit audit-id
|
|
107
109
|
```
|
|
108
110
|
|
|
109
|
-
|
|
111
|
+
filegrc checks management preparation and packet integrity. The independent CPA firm still selects samples, tests controls, evaluates exceptions, decides whether evidence is sufficient, and issues the SOC 2 report.
|
|
110
112
|
|
|
111
113
|
Early CPA engagement remains available when a customer deadline, unusual scope, or other timing risk needs input before the program reaches Evidence Ready. It is optional, not the default first action.
|
|
112
114
|
|
|
113
115
|
## What belongs elsewhere
|
|
114
116
|
|
|
115
|
-
|
|
117
|
+
filegrc does not replace workforce, identity, source-control, deployment, infrastructure, monitoring, endpoint, backup, vulnerability, training, signature, procurement, contract, or vendor-risk systems.
|
|
116
118
|
|
|
117
|
-
Catalog each authoritative system in
|
|
119
|
+
Catalog each authoritative system in filegrc, record how to export from it, and attach or reference the fixed evidence when Audit Readiness asks for it. The generated external-delivery index identifies files that still need to be supplied through an auditor portal or another approved channel.
|
|
118
120
|
|
|
119
121
|
The starter uses the SOC 2 Security category and does not include licensed criteria text. Add Availability, Processing Integrity, Confidentiality, or Privacy only when they are in scope.
|
|
120
122
|
|
package/template/WORKSPACE.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
This private workspace holds {{company_name}}'s SOC 2 program records and audit evidence. JSON under `data/` stores structured records, Markdown stores long-form work, and Git records reviewed changes.
|
|
4
4
|
|
|
5
|
-
The workspace uses
|
|
5
|
+
The workspace uses filegrc {{filegrc_version}} through the dependency range `{{filegrc_version_range}}`.
|
|
6
6
|
|
|
7
7
|
## Work locally
|
|
8
8
|
|
|
@@ -31,11 +31,11 @@ Read `AGENTS.md` and `data/AGENTS.md` before broad changes.
|
|
|
31
31
|
|
|
32
32
|
The starter policies, controls, and obligations are proposals. They do not state that {{company_name}} operates the described controls.
|
|
33
33
|
|
|
34
|
-
1.
|
|
34
|
+
1. Run `npx filegrc setup` for guided service and goal setup, or use browser onboarding. Then finish Step 1 by adding the real reviewers and operators, finishing the oversight team, and confirming applicable criteria, commitments, material vendors, and in-scope systems.
|
|
35
35
|
2. Review the starter policies, appoint a reviewer who is separate from the policy owner, and activate only the policies that match current practice. The reviewer will usually be another person in the organization, but may be external.
|
|
36
36
|
3. Review the starter control set, implement each applicable control with its actual procedure, scope, cadence, evidence sources, and implementation date, and confirm any linked Work Queue schedules are enabled. Marking a control implemented starts eligible schedules. Then record any complementary customer or subservice controls.
|
|
37
37
|
4. Open each generated External Evidence draft, choose its authoritative source System, collect the named artifact, and have another person verify it.
|
|
38
38
|
5. Run `npx filegrc program-readiness --require-ready`, record the management candidate period start when reliable evidence collection begins, maintain risk assessments and risks, update controls when needed, use Work Queue for scheduled work, and trigger Policy Events when changes create required actions. `npx filegrc obligations` previews every event task, owner, deadline, and requested proof before the trigger creates anything.
|
|
39
|
-
6. Engage a CPA firm, record the separate firm-agreed period in an audit record, review
|
|
39
|
+
6. Engage a CPA firm, record the separate firm-agreed period in an audit record, review filegrc Evidence and External Evidence, and prepare fieldwork.
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
filegrc manages GRC records and audit evidence. It does not replace infrastructure logging, monitoring, identity, backup, endpoint, or incident-detection systems.
|
package/template/data/AGENTS.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# filegrc Data Instructions
|
|
2
2
|
|
|
3
3
|
These instructions apply to every file under `data/`. The root `AGENTS.md` explains the program and Git workflow. A collection-level `AGENTS.md`, when present, adds rules for that resource.
|
|
4
4
|
|
|
@@ -24,7 +24,7 @@ Use `program-path` to find the current lifecycle step and see the renderer’s e
|
|
|
24
24
|
- Work required on a schedule or event belongs in `obligation`.
|
|
25
25
|
- A dated instance of work belongs in its activity type, such as `meeting`, `risk-assessment`, `access-review`, `vulnerability-scan`, `backup-test`, or `exercise`.
|
|
26
26
|
- A fact that may change over time belongs in an inventory record, such as `person`, `system`, `asset`, `vendor`, or `access-grant`.
|
|
27
|
-
- A dated Step 5 operating record proves that
|
|
27
|
+
- A dated Step 5 operating record proves that filegrc-managed work occurred. Put each fixed external artifact in an `evidence` record and link it from the operating record; never add an unexplained attachment.
|
|
28
28
|
- Follow-up work belongs in `action-item`. A gap belongs in `finding`, a known threat belongs in `risk`, and an approved temporary departure belongs in `exception`.
|
|
29
29
|
- An auditor request belongs in `audit-request`; the engagement itself belongs in `audit`.
|
|
30
30
|
|
|
@@ -61,7 +61,7 @@ npx filegrc create /tmp/filegrc-mutation.json
|
|
|
61
61
|
npx filegrc validate --json
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
Creation is atomic. If JSON, Markdown, relationships, or validation fail,
|
|
64
|
+
Creation is atomic. If JSON, Markdown, relationships, or validation fail, filegrc rolls back the write. IDs are globally unique and immutable after commit.
|
|
65
65
|
|
|
66
66
|
## Read and update
|
|
67
67
|
|
|
@@ -77,7 +77,7 @@ Edit the exported mutation, then run:
|
|
|
77
77
|
npx filegrc update RESOURCE_TYPE RESOURCE_ID /tmp/filegrc-mutation.json
|
|
78
78
|
```
|
|
79
79
|
|
|
80
|
-
The mutation includes the complete record, current Markdown, and revision hashes.
|
|
80
|
+
The mutation includes the complete record, current Markdown, and revision hashes. filegrc rejects the update if another person or agent changed either source after export. Reload and reapply the intended change instead of overwriting it.
|
|
81
81
|
|
|
82
82
|
To update JSON and Markdown together, pass `{ "record": {...}, "content": {...}, "revision": "...", "contentRevisions": {...} }`. To change one Markdown slot:
|
|
83
83
|
|
|
@@ -121,7 +121,7 @@ Delete only an uncommitted draft or a mistake:
|
|
|
121
121
|
npx filegrc delete RESOURCE_TYPE RESOURCE_ID --yes
|
|
122
122
|
```
|
|
123
123
|
|
|
124
|
-
|
|
124
|
+
filegrc rejects deletion that breaks references and removes owned Markdown with the JSON. Retire, close, cancel, supersede, or replace committed records that explain historical operation.
|
|
125
125
|
|
|
126
126
|
## Evidence and attachments
|
|
127
127
|
|
|
@@ -148,7 +148,7 @@ Remove a local attachment explicitly before deleting its evidence record:
|
|
|
148
148
|
npx filegrc detach EVIDENCE_ID source-export.csv --yes
|
|
149
149
|
```
|
|
150
150
|
|
|
151
|
-
|
|
151
|
+
filegrc will not delete an evidence record that still has local attachments.
|
|
152
152
|
|
|
153
153
|
Never invent evidence, dates, approvals, results, people, or source-system details. If a required fact is unavailable, leave the record in a non-final state and report the missing input.
|
|
154
154
|
|
|
@@ -167,13 +167,13 @@ Run `obligations` before `trigger` to preview every Policy Event task, owner, de
|
|
|
167
167
|
## Audit work
|
|
168
168
|
|
|
169
169
|
```sh
|
|
170
|
-
npx filegrc program-readiness --json
|
|
170
|
+
npx filegrc program-readiness --summary --json
|
|
171
171
|
npx filegrc prepare-audit AUDIT_ID
|
|
172
172
|
npx filegrc audit-readiness AUDIT_ID --json
|
|
173
173
|
npx filegrc evidence-packet --audit AUDIT_ID --preview --json
|
|
174
174
|
```
|
|
175
175
|
|
|
176
|
-
Run Program Readiness before creating the normal audit engagement. It checks scope, effective policies, implemented controls, evidence sources, and test captures without an audit ID. Fix readiness errors in source records. Do not edit packet output under `.filegrc/`. A delivery-ready
|
|
176
|
+
Run Program Readiness before creating the normal audit engagement. It checks scope, effective policies, implemented controls, evidence sources, and test captures without an audit ID. Fix readiness errors in source records. Do not edit packet output under `.filegrc/`. A delivery-ready filegrc packet means the management checks passed; the engagement team still judges evidence and performs the examination.
|
|
177
177
|
|
|
178
178
|
## Finish every change
|
|
179
179
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Action Item Instructions
|
|
2
2
|
|
|
3
|
-
Create an Action Item only when follow-up needs its own assignee, deadline, and completion proof. Keep simpler remediation on the Finding or other source record. Set `sourceResourceId` to the record that created the work;
|
|
3
|
+
Create an Action Item only when follow-up needs its own assignee, deadline, and completion proof. Keep simpler remediation on the Finding or other source record. Set `sourceResourceId` to the record that created the work; filegrc derives the backlink and adds every open Action Item to Work Queue. Keep the assignee, due date or policy window, blockers, completion records, and evidence explicit.
|
|
4
4
|
|
|
5
5
|
For an event-generated action, do not weaken or extend its policy deadline by hand. Create the requested completion resource and close the action atomically:
|
|
6
6
|
|
|
@@ -8,4 +8,4 @@ For an event-generated action, do not weaken or extend its policy deadline by ha
|
|
|
8
8
|
npx filegrc complete-action ACTION_ITEM_ID completion-mutation.json --completed-on YYYY-MM-DD
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
filegrc rejects the wrong completion type. Mark ordinary Action Items `done` only after the work occurred, set `completedOn`, and link the completion record or evidence. Use `blocked` while a named dependency prevents work, and link that dependency with `blockingResourceIds`.
|
|
@@ -17,10 +17,10 @@ Preparation creates engagement-specific management documents and, for Type 2, po
|
|
|
17
17
|
|
|
18
18
|
Review both evidence paths for the exact formal date or period:
|
|
19
19
|
|
|
20
|
-
1.
|
|
20
|
+
1. filegrc Evidence consists of dated Step 5 operating records. Complete the record, link it to the applicable Controls, record the result in its fields or Markdown, and link any external artifact needed to support that result.
|
|
21
21
|
2. External Evidence consists of verified `evidence` records from other Systems. Confirm the source System, date or period, Control links, collector, verifier, and fixed attachment or approved external reference.
|
|
22
22
|
|
|
23
|
-
The packet compiles both paths. It includes
|
|
23
|
+
The packet compiles both paths. It includes filegrc records and Markdown with Git history, plus External Evidence records, retained attachments, delivery indexes, and checksums.
|
|
24
24
|
|
|
25
25
|
Run readiness repeatedly and fix source records. Preview the packet before writing it:
|
|
26
26
|
|
|
@@ -29,4 +29,4 @@ npx filegrc evidence-packet --audit AUDIT_ID --preview --json
|
|
|
29
29
|
npx filegrc evidence-packet --audit AUDIT_ID
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
Do not state that an auditor accepted evidence, selected a sample, cleared an exception, or issued a report unless that fact came from the engagement team.
|
|
32
|
+
Do not state that an auditor accepted evidence, selected a sample, cleared an exception, or issued a report unless that fact came from the engagement team. filegrc tracks management preparation; the CPA firm owns examination judgments and the report.
|
|
@@ -6,7 +6,7 @@ Reporting period: [start date] through [end date]
|
|
|
6
6
|
|
|
7
7
|
Management reconciled every audit-population record linked to this engagement to its authoritative source and included every item relevant to the in-scope system and controls. The generated `population-index.csv` is incorporated into this statement by reference and records each population ID, source system, query, timezone, count, validation, reviewer, conclusion, and fixed export.
|
|
8
8
|
|
|
9
|
-
| Population |
|
|
9
|
+
| Population | filegrc population ID | Result or exception |
|
|
10
10
|
| --- | --- | --- |
|
|
11
11
|
| Workforce starts, role changes, and departures | [Population ID] | [Result] |
|
|
12
12
|
| Access grants, changes, reviews, and removals | [Population ID] | [Result] |
|
|
@@ -27,6 +27,6 @@ For a population with zero items, retain the source-system export or report that
|
|
|
27
27
|
|
|
28
28
|
## Management Confirmation
|
|
29
29
|
|
|
30
|
-
To the best of management's knowledge after the reconciliations above,
|
|
30
|
+
To the best of management's knowledge after the reconciliations above, filegrc and the linked evidence contain the complete populations and reportable events relevant to the engagement period.
|
|
31
31
|
|
|
32
32
|
[Identify the responsible signer, title, signature or approval method, and date.]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# {{company_name}} SOC 2 System Description
|
|
2
2
|
|
|
3
|
-
> Draft preparation document. Complete every bracketed item, reconcile it to the
|
|
3
|
+
> Draft preparation document. Complete every bracketed item, reconcile it to the filegrc records, and have the service auditor review the final presentation.
|
|
4
4
|
|
|
5
5
|
## Reporting Period and Scope
|
|
6
6
|
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
## DC2: Service Commitments and System Requirements
|
|
18
18
|
|
|
19
|
-
[Summarize customer commitments, contractual security promises, internal objectives, and the system requirements needed to meet them. Link the
|
|
19
|
+
[Summarize customer commitments, contractual security promises, internal objectives, and the system requirements needed to meet them. Link the filegrc commitment records.]
|
|
20
20
|
|
|
21
21
|
## DC3: System Components
|
|
22
22
|
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
|
|
47
47
|
## DC5: Applicable Criteria and Controls
|
|
48
48
|
|
|
49
|
-
[Reference the selected criteria and control matrix generated by
|
|
49
|
+
[Reference the selected criteria and control matrix generated by filegrc.]
|
|
50
50
|
|
|
51
51
|
## DC6: Complementary User Entity Controls
|
|
52
52
|
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
An evidence record explains what a proof item is, where it came from, what period it supports, who collected it, and which records or controls it supports. The attachment alone is not enough.
|
|
4
4
|
|
|
5
|
-
Completing onboarding creates draft collection tests only for evidence that must come from systems outside
|
|
5
|
+
Completing onboarding creates draft collection tests only for evidence that must come from systems outside filegrc and does not already have a dedicated Step 5 record. Risk assessments, meetings, vendor reviews, attestations, vulnerability scans, penetration tests, backup tests, exercises, exceptions, and findings do not need a separate test. When one of those operating records needs a fixed external artifact, create or update an External Evidence record for the artifact and link its ID from the operating record. Keep a generated collection test as `draft` until the artifact has actually been captured. Set it to `collected` only after selecting the source System, attaching or referencing the result, and recording the source, date, classification, and collector. Set it to `verified` only after another named person checks it.
|
|
6
6
|
|
|
7
7
|
## Create evidence
|
|
8
8
|
|
|
9
9
|
1. Run `npx filegrc guide evidence --json`.
|
|
10
10
|
2. Use one evidence record for one coherent proof item or fixed export.
|
|
11
11
|
3. Put local attachments under `data/evidence/EVIDENCE_ID/` and list their data-relative paths in `filePaths`.
|
|
12
|
-
4. Use `externalReference` only when the file must remain in an approved external system.
|
|
12
|
+
4. Use `externalReference` only when the file must remain in an approved external system. filegrc never fetches it.
|
|
13
13
|
5. Link `sourceResourceIds`, `controlIds`, and `auditIds` as applicable. Use `sourceCommit` when the evidence represents repository state.
|
|
14
14
|
6. Name the actual collector. A `verified` record also needs the actual verifier and verification date.
|
|
15
15
|
|
|
@@ -21,7 +21,7 @@ npx filegrc attach EVIDENCE_ID /path/to/source-file --name auditor-facing-name.c
|
|
|
21
21
|
|
|
22
22
|
The command never overwrites an existing attachment.
|
|
23
23
|
|
|
24
|
-
Use `npx filegrc detach EVIDENCE_ID FILE_NAME --yes` when removing a mistaken attachment.
|
|
24
|
+
Use `npx filegrc detach EVIDENCE_ID FILE_NAME --yes` when removing a mistaken attachment. filegrc will not delete an evidence record while local attachments remain.
|
|
25
25
|
|
|
26
26
|
For a rendered page capture, record the route, filters, audit period, exact Git commit, capture time and method, source resource IDs, and screenshot. A current screenshot cannot prove an earlier state unless it is rendered from or bound to that revision.
|
|
27
27
|
|
|
@@ -15,4 +15,4 @@ Complete each action with the requested resource type and proof. Then close the
|
|
|
15
15
|
npx filegrc complete-event OBLIGATION_EVENT_ID --completed-on YYYY-MM-DD
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
filegrc refuses to close an event with unfinished or unproved actions. Cancel an event only when the triggering event itself was entered in error or did not occur; explain the reason in related records or the commit message.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
#
|
|
1
|
+
# filegrc Program Repository
|
|
2
2
|
|
|
3
|
-
This Git repository is the system of record for
|
|
3
|
+
This Git repository is the system of record for filegrc governance records and their revision history. It can supply the training and acknowledgement catalog, exception and finding populations, policy and document approvals, obligation history, Policy Event workflows, and management evidence indexes.
|
|
4
4
|
|
|
5
5
|
## Evidence Extraction
|
|
6
6
|
|
|
7
|
-
Run
|
|
7
|
+
Run filegrc from a clean commit. Use resource dates and audit links to select the exact engagement date or period, save the query or agent instructions with the export, and retain the fixed result behind an evidence record. Record a zero count when the committed source query returns no relevant items.
|
|
8
8
|
|
|
9
9
|
The repository is authoritative only for records stored here. Identity, workforce, source-control, deployment, monitoring, endpoint, backup, vulnerability, and vendor systems remain authoritative for the activity they perform.
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"type": "workspace",
|
|
6
6
|
"title": "{{company_name}} SOC 2 Program",
|
|
7
7
|
"organizationName": "{{company_name}}",
|
|
8
|
-
"timezone": "
|
|
8
|
+
"timezone": "{{timezone}}",
|
|
9
9
|
"description": "SOC 2 Security program based on the AICPA Trust Services Criteria.",
|
|
10
10
|
"riskMethodology": {
|
|
11
11
|
"method": "5x5 likelihood and impact",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/template/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "{{project_name}}",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"private": true,
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "filegrc workspace for a SOC 2 program",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"serve": "filegrc serve",
|
package/template-parameters.json
CHANGED
|
@@ -2,18 +2,30 @@
|
|
|
2
2
|
"parameters": [
|
|
3
3
|
{
|
|
4
4
|
"key": "company_name",
|
|
5
|
-
"prompt": "
|
|
5
|
+
"prompt": "Legal organization name",
|
|
6
6
|
"required": true
|
|
7
7
|
},
|
|
8
8
|
{
|
|
9
9
|
"key": "policy_owner_name",
|
|
10
|
-
"prompt": "
|
|
10
|
+
"prompt": "Policy owner name",
|
|
11
11
|
"required": true
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
14
|
"key": "security_contact_email",
|
|
15
15
|
"prompt": "Security contact email",
|
|
16
16
|
"required": true
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"key": "policy_owner_email",
|
|
20
|
+
"prompt": "Policy owner email",
|
|
21
|
+
"required": true,
|
|
22
|
+
"defaultFrom": "security_contact_email"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"key": "timezone",
|
|
26
|
+
"prompt": "Program timezone",
|
|
27
|
+
"required": true,
|
|
28
|
+
"defaultSource": "local-timezone"
|
|
17
29
|
}
|
|
18
30
|
],
|
|
19
31
|
"generated": [
|