filegrc 0.13.4 → 0.13.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/model/v10.json CHANGED
@@ -1436,9 +1436,9 @@
1436
1436
  "policyBasis": "Policies rely on governed documents for detailed plans, schedules, procedures, charters, and reports. Approval accepts the intended values and exact content. Activation records that the linked requirements were implemented and the approved Document was put into use.",
1437
1437
  "cadence": "Complete required program Documents in Step 2, obtain approval from a reviewer who is separate from the owner, implement their linked requirements in Step 3, then activate the unchanged approved revision. Follow the linked review Obligation after activation. Prepare Audit Documents in Step 5, then approve and activate each one there as separate revision-bound updates.",
1438
1438
  "reviewPoints": [
1439
- "Keep companion Markdown to the policy, procedure, evidence, or narrative the Document records. Put FileGRC instructions and derived actions in the UI or guides unless FileGRC is the subject.",
1439
+ "Make the companion Markdown read as a finished policy, procedure, evidence record, or narrative.",
1440
1440
  "Replace every bracketed prompt with a reviewed fact before approval, activation, signing, or delivery.",
1441
- "Use ordinary business language; keep resource relationships in this record and its supporting records."
1441
+ "Write in ordinary business language. Add resource relationships to this record, not its Markdown."
1442
1442
  ],
1443
1443
  "sourceResourceIds": [
1444
1444
  "policy-information-security",
@@ -1771,9 +1771,9 @@
1771
1771
  "cadence": "Create an Evidence Artifact only for a real retained artifact or approved reference. Identify its source Component or source records, Controls, collection and verification facts, coverage, revision, and classification.",
1772
1772
  "emptyState": "No Evidence Artifacts have been collected. Add one only when a real retained artifact or approved external reference exists.",
1773
1773
  "reviewPoints": [
1774
- "For a signed management representation, use artifactKind signed-record and artifactSubtype signed-management-representation.",
1775
- "For that representation, record the signing time in businessEventAt; use collectedOn for when FileGRC received it.",
1776
- "For a final CPA report, use artifactKind third-party-report and artifactSubtype soc2-report, then record its issuance time in sourceGeneratedAt."
1774
+ "For a signed management representation, choose \"Signed Record\" for \"Artifact Kind\" and enter \"signed-management-representation\" for \"Artifact Subtype\".",
1775
+ "Enter when the representation was signed in \"Business event time\". Use \"Collected On\" for the date you received it.",
1776
+ "For a final CPA report, choose \"Third Party Report\" for \"Artifact Kind\", enter \"soc2-report\" for \"Artifact Subtype\", and enter when the CPA firm issued it in \"Source generation time\"."
1777
1777
  ],
1778
1778
  "sourceResourceIds": [
1779
1779
  "policy-information-security"
@@ -2545,7 +2545,7 @@
2545
2545
  "reviewPoints": [
2546
2546
  "Decide whether this criterion applies to the selected service, Trust Services Categories, customer commitments, and planned audit.",
2547
2547
  "Explain the decision using current service and system scope facts, not a generic statement.",
2548
- "Before marking it not applicable, confirm that no in-scope promise or control objective depends on it."
2548
+ "Before choosing \"Not Applicable\", confirm that no in-scope promise or Control objective depends on it."
2549
2549
  ]
2550
2550
  },
2551
2551
  "required": [
@@ -2592,7 +2592,7 @@
2592
2592
  "reviewPoints": [
2593
2593
  "Confirm the statement reflects a real customer promise, service requirement, or approved business objective that applies to the current scope.",
2594
2594
  "Confirm which parts of the service the promise or objective affects.",
2595
- "Use an external, zero-population, or not-applicable conclusion only when it is factually true for the current scope."
2595
+ "Use \"External\", \"Zero Population\", or \"Not Applicable\" only when it is true for the current scope."
2596
2596
  ],
2597
2597
  "sourceResourceIds": [
2598
2598
  "policy-information-security"
@@ -2737,7 +2737,7 @@
2737
2737
  "reviewPoints": [
2738
2738
  "Confirm that the linked Control actually depends on a customer or carved-out provider action.",
2739
2739
  "Make the statement specific enough for the responsible party to perform and for the system description to explain.",
2740
- "Before marking it not applicable, confirm that management is not responsible for the action."
2740
+ "Before choosing \"Not Applicable\", confirm that management is not responsible for the action."
2741
2741
  ],
2742
2742
  "sourceResourceIds": [
2743
2743
  "policy-information-security"
@@ -2866,8 +2866,8 @@
2866
2866
  "cadence": "A Control may be implemented while its governing Policy, required program Document, or Training is approved but inactive. Before marking it implemented, record its owner, actual procedure in Record Markdown, bounded System scope, operation pattern, authoritative evidence-source Components, implementation date, and enabled calendar or event Obligations. Confirm each source Component is active, has the evidence role required by the Control family and current access owners, and includes repeatable retrieval instructions in Record Markdown. Enabled Obligations remain dormant until all of their governing content is active and effective.",
2867
2867
  "reviewPoints": [
2868
2868
  "Confirm the Control is needed for the applicable Requirements, Commitments, and service boundary.",
2869
- "Describe the actual procedure. Put starter-selection and FileGRC record-entry instructions in the UI or guides, unless FileGRC is an operating Component or evidence source.",
2870
- "Use not applicable, external, or zero population only when it is true for the current scope."
2869
+ "Describe what people actually do to operate the Control.",
2870
+ "Use \"Not Applicable\", \"External\", or \"Zero Population\" only when it is true for the current scope."
2871
2871
  ],
2872
2872
  "sourceResourceIds": [
2873
2873
  "policy-information-security"
@@ -4389,9 +4389,9 @@
4389
4389
  "policyBasis": "The information security policy requires security training and added role-specific instruction when a person’s responsibilities or data access warrant it.",
4390
4390
  "cadence": "Approve the exact training content in Step 2. During Step 3, finish the linked Controls and Obligations, then activate the unchanged approved revision. Assign training through Obligations at onboarding, annually, and after relevant material changes or incidents.",
4391
4391
  "reviewPoints": [
4392
- "Keep workforce material focused on required behavior. Put FileGRC commands, record-entry instructions, and data-model terms in guides and assignments.",
4393
- "Do not imply every user needs a paid product or that customer MFA applies without an approved requirement.",
4394
- "Bind each completion to the exact revision the person reviewed."
4392
+ "Write the training for the people who must follow it and state the behavior you expect.",
4393
+ "Include product-license or customer MFA requirements only when an approved requirement calls for them.",
4394
+ "Link each completion to the exact Training revision the person completed."
4395
4395
  ],
4396
4396
  "sourceResourceIds": [
4397
4397
  "policy-information-security"
@@ -8065,7 +8065,7 @@
8065
8065
  "reviewPoints": [
8066
8066
  "Decide whether this source family applies to the current scope and audit period.",
8067
8067
  "Confirm the chosen source can produce the complete population or evidence needed.",
8068
- "Use not applicable or zero population only when that conclusion is factually true."
8068
+ "Use \"Not Applicable\" or \"Zero Population\" only when it is true."
8069
8069
  ]
8070
8070
  },
8071
8071
  "required": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "filegrc",
3
- "version": "0.13.4",
3
+ "version": "0.13.5",
4
4
  "description": "Zero-dependency Git-native GRC engine",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -194,6 +194,7 @@ function programScope(program, records, byId, model, loaded) {
194
194
  return records.filter(fallback);
195
195
  };
196
196
  return {
197
+ program,
197
198
  systems: (program?.systemIds || [])
198
199
  .map((id) => byId.get(id))
199
200
  .filter((record) => record?.type === "system" && record.status !== "retired"),
package/src/web.js CHANGED
@@ -880,7 +880,7 @@ function workflowGuidance(options = {}) {
880
880
  const rows = visible.map(renderRow).join("");
881
881
  const remaining = items.slice(visible.length);
882
882
  const more = remaining.length
883
- ? '<details class="workflow-guidance-more"><summary>Show ' + remaining.length + ' more ' + pluralize("item", remaining.length) + '</summary><div class="workflow-findings workflow-findings-more">' + remaining.map(renderRow).join("") + '</div><p><code>filegrc workflow --json</code> returns this same checklist for CLI and agent use.</p></details>'
883
+ ? '<details class="workflow-guidance-more"><summary>Show ' + remaining.length + ' more ' + pluralize("item", remaining.length) + '</summary><div class="workflow-findings workflow-findings-more">' + remaining.map(renderRow).join("") + '</div></details>'
884
884
  : "";
885
885
  const completionRequirements = options.type && resourceReviewCriteria(options.type, { trigger: true });
886
886
  return '<section class="workflow-guidance panel detail-support-panel detail-workflow-panel"><div class="panel-head"><div><p class="kicker">To-do</p><h3>' + esc(options.title || "Checklist") + '</h3></div><span class="badge ' + (blocking.length ? "warn" : "good") + '">' + (blocking.length ? "Needs work" : "Current") + '</span></div><p class="workflow-status">' + esc(status) + (completionRequirements ? '. ' + completionRequirements : "") + '</p><div class="workflow-findings">' + rows + '</div>' + more + '</section>';
@@ -964,7 +964,7 @@ function openCompletionRequirementsDialog(type) {
964
964
  if (!reviewPoints.length) return;
965
965
  const dialog = document.createElement("dialog");
966
966
  dialog.className = "alert-dialog completion-requirements-dialog";
967
- dialog.innerHTML = '<div class="dialog-head"><div><p class="kicker">Completion requirements</p><h2>' + esc(titleCase(definition.title)) + '</h2></div><button type="button" class="icon-button" aria-label="Close">×</button></div><p>Check these before considering this record complete.</p><ul>' + reviewPoints.map((point) => '<li>' + esc(point) + '</li>').join("") + '</ul><div class="dialog-actions"><button type="button" class="button primary">Close</button></div>';
967
+ dialog.innerHTML = '<div class="dialog-head"><div><p class="kicker">Completion requirements</p><h2>' + esc(titleCase(definition.title)) + '</h2></div><button type="button" class="icon-button" aria-label="Close">×</button></div><p>Before you finish this record, make sure:</p><ul>' + reviewPoints.map((point) => '<li>' + esc(point) + '</li>').join("") + '</ul><div class="dialog-actions"><button type="button" class="button primary">Close</button></div>';
968
968
  document.body.append(dialog);
969
969
  const close = () => dialog.close();
970
970
  dialog.querySelectorAll("button").forEach((button) => button.addEventListener("click", close));
package/src/workflow.js CHANGED
@@ -460,14 +460,14 @@ function recordIncompleteReason(record, loaded, program) {
460
460
  };
461
461
  }
462
462
  const messages = {
463
- draft: "Complete the record, its relationships, and required Markdown before review.",
464
- planned: "Check this planned record against the actual program, then complete its finalization checks.",
465
- proposed: "Review the proposed work, owner, schedule, and completion requirements before activation.",
466
- "in-review": "Complete independent review and bind the approval to the exact content revision.",
467
- open: "Complete or formally dispose of this open work with the required proof.",
463
+ draft: "Add the required details, relationships, and Markdown before review.",
464
+ planned: "Check this planned record against how your program works, then add the missing details.",
465
+ proposed: "Confirm the work, owner, schedule, and completion requirements before activation.",
466
+ "in-review": "Have an independent reviewer approve the exact content revision.",
467
+ open: "Complete this work with the required proof, or formally close it without completion.",
468
468
  "in-progress": "Finish the work, record the result, and link the completion proof.",
469
469
  blocked: "Resolve the recorded blockers before completing this work.",
470
- "partially-implemented": "Finish the remaining control design, operation, source, and scheduling work."
470
+ "partially-implemented": "Finish the Control procedure, evidence sources, and schedules."
471
471
  };
472
472
  if (!messages[record.status]) return null;
473
473
  const requiredness = recordFinalizationRequiredness(record, loaded, program);
@@ -484,7 +484,7 @@ function recordIncompleteReason(record, loaded, program) {
484
484
  state: requiredness === "conditional" ? "scheduled" : "ready",
485
485
  requiredness,
486
486
  message: requiredness === "conditional"
487
- ? "Keep this starter in draft until its recorded audience, program role, or audit stage applies. Finalize or retire it when that decision is made."
487
+ ? "Keep this starter in \"Draft\" until its audience, program role, or audit stage applies. Complete it when it applies; otherwise retire it."
488
488
  : messages[record.status]
489
489
  };
490
490
  }
@@ -533,7 +533,7 @@ function finalizationFields(record, model, resources, program) {
533
533
  fields.push({
534
534
  field: "applicabilityReview",
535
535
  requiredness: "required",
536
- message: "Record or refresh the applicability decision, rationale, reviewer, and date. FileGRC records the current material scope automatically."
536
+ message: "Review applicability against the current service scope, then record the decision, rationale, reviewer, and date."
537
537
  });
538
538
  }
539
539
  if (record.type === "policy" && model.resources.policy?.fields?.programRole && !record.programRole) {
@@ -694,7 +694,7 @@ async function sourceCoverageFindings(loaded, program) {
694
694
  ? record.status === "active"
695
695
  ? "Add missing source details and link a passed retrieval test after setting a candidate period."
696
696
  : "Finish the source decision, retrieval method, retention, validity dates, and pre-period dry run after setting a candidate period."
697
- : "Create a source-coverage record and choose FileGRC, an external authoritative System, zero population, or not applicable.",
697
+ : "Create a Source Coverage record and choose FileGRC, an external authoritative System, \"Zero Population\", or \"Not Applicable\".",
698
698
  subject: { type: "source-coverage", ...(record ? { id: record.id } : {}) },
699
699
  dependencies: [],
700
700
  actions: record