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 +14 -14
- package/package.json +1 -1
- package/src/program-readiness.js +1 -0
- package/src/web.js +2 -2
- package/src/workflow.js +9 -9
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
|
-
"
|
|
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
|
-
"
|
|
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,
|
|
1775
|
-
"
|
|
1776
|
-
"For a final CPA report,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
2870
|
-
"Use
|
|
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
|
-
"
|
|
4393
|
-
"
|
|
4394
|
-
"
|
|
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
|
|
8068
|
+
"Use \"Not Applicable\" or \"Zero Population\" only when it is true."
|
|
8069
8069
|
]
|
|
8070
8070
|
},
|
|
8071
8071
|
"required": [
|
package/package.json
CHANGED
package/src/program-readiness.js
CHANGED
|
@@ -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
|
|
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>
|
|
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: "
|
|
464
|
-
planned: "Check this planned record against
|
|
465
|
-
proposed: "
|
|
466
|
-
"in-review": "
|
|
467
|
-
open: "Complete
|
|
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
|
|
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
|
|
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: "
|
|
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
|
|
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
|